1
2#ifndef __NOUVEAU_FENCE_H__
3#define __NOUVEAU_FENCE_H__
4
5#include "util/u_inlines.h"
6#include "util/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 pipe_debug_callback;
15
16struct nouveau_fence_work {
17   struct list_head list;
18   void (*func)(void *);
19   void *data;
20};
21
22struct nouveau_fence {
23   struct nouveau_fence *next;
24   struct nouveau_screen *screen;
25   int state;
26   int ref;
27   uint32_t sequence;
28   uint32_t work_count;
29   struct list_head work;
30};
31
32void nouveau_fence_emit(struct nouveau_fence *);
33void nouveau_fence_del(struct nouveau_fence *);
34
35bool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **);
36void nouveau_fence_cleanup(struct nouveau_screen *);
37bool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
38void nouveau_fence_update(struct nouveau_screen *, bool flushed);
39void nouveau_fence_next(struct nouveau_screen *);
40bool nouveau_fence_wait(struct nouveau_fence *, struct pipe_debug_callback *);
41bool nouveau_fence_signalled(struct nouveau_fence *);
42
43void nouveau_fence_unref_bo(void *data); /* generic unref bo callback */
44
45
46static inline void
47nouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
48{
49   if (fence)
50      ++fence->ref;
51
52   if (*ref) {
53      if (--(*ref)->ref == 0)
54         nouveau_fence_del(*ref);
55   }
56
57   *ref = fence;
58}
59
60static inline struct nouveau_fence *
61nouveau_fence(struct pipe_fence_handle *fence)
62{
63   return (struct nouveau_fence *)fence;
64}
65
66#endif // __NOUVEAU_FENCE_H__
67