1
2#ifndef __NOUVEAU_FENCE_H__
3#define __NOUVEAU_FENCE_H__
4
5#include "util/u_inlines.h"
6#include "util/u_double_list.h"
7
8#define NOUVEAU_FENCE_STATE_AVAILABLE 0
9#define NOUVEAU_FENCE_STATE_EMITTING  1
10#define NOUVEAU_FENCE_STATE_EMITTED   2
11#define NOUVEAU_FENCE_STATE_FLUSHED   3
12#define NOUVEAU_FENCE_STATE_SIGNALLED 4
13
14struct nouveau_fence_work {
15   struct list_head list;
16   void (*func)(void *);
17   void *data;
18};
19
20struct nouveau_fence {
21   struct nouveau_fence *next;
22   struct nouveau_screen *screen;
23   int state;
24   int ref;
25   uint32_t sequence;
26   struct list_head work;
27};
28
29void nouveau_fence_emit(struct nouveau_fence *);
30void nouveau_fence_del(struct nouveau_fence *);
31
32boolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **,
33                          boolean emit);
34boolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
35void    nouveau_fence_update(struct nouveau_screen *, boolean flushed);
36void    nouveau_fence_next(struct nouveau_screen *);
37boolean nouveau_fence_wait(struct nouveau_fence *);
38boolean nouveau_fence_signalled(struct nouveau_fence *);
39
40static INLINE void
41nouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
42{
43   if (fence)
44      ++fence->ref;
45
46   if (*ref) {
47      if (--(*ref)->ref == 0)
48         nouveau_fence_del(*ref);
49   }
50
51   *ref = fence;
52}
53
54static INLINE struct nouveau_fence *
55nouveau_fence(struct pipe_fence_handle *fence)
56{
57   return (struct nouveau_fence *)fence;
58}
59
60#endif // __NOUVEAU_FENCE_H__
61