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