1848b8605Smrg
2848b8605Smrg#ifndef __NOUVEAU_FENCE_H__
3848b8605Smrg#define __NOUVEAU_FENCE_H__
4848b8605Smrg
5848b8605Smrg#include "util/u_inlines.h"
6b8e80941Smrg#include "util/list.h"
7848b8605Smrg
8848b8605Smrg#define NOUVEAU_FENCE_STATE_AVAILABLE 0
9848b8605Smrg#define NOUVEAU_FENCE_STATE_EMITTING  1
10848b8605Smrg#define NOUVEAU_FENCE_STATE_EMITTED   2
11848b8605Smrg#define NOUVEAU_FENCE_STATE_FLUSHED   3
12848b8605Smrg#define NOUVEAU_FENCE_STATE_SIGNALLED 4
13848b8605Smrg
14b8e80941Smrgstruct pipe_debug_callback;
15b8e80941Smrg
16848b8605Smrgstruct nouveau_fence_work {
17848b8605Smrg   struct list_head list;
18848b8605Smrg   void (*func)(void *);
19848b8605Smrg   void *data;
20848b8605Smrg};
21848b8605Smrg
22848b8605Smrgstruct nouveau_fence {
23848b8605Smrg   struct nouveau_fence *next;
24848b8605Smrg   struct nouveau_screen *screen;
25848b8605Smrg   int state;
26848b8605Smrg   int ref;
27848b8605Smrg   uint32_t sequence;
28b8e80941Smrg   uint32_t work_count;
29848b8605Smrg   struct list_head work;
30848b8605Smrg};
31848b8605Smrg
32848b8605Smrgvoid nouveau_fence_emit(struct nouveau_fence *);
33848b8605Smrgvoid nouveau_fence_del(struct nouveau_fence *);
34848b8605Smrg
35b8e80941Smrgbool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **);
36b8e80941Smrgbool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
37b8e80941Smrgvoid nouveau_fence_update(struct nouveau_screen *, bool flushed);
38b8e80941Smrgvoid nouveau_fence_next(struct nouveau_screen *);
39b8e80941Smrgbool nouveau_fence_wait(struct nouveau_fence *, struct pipe_debug_callback *);
40b8e80941Smrgbool nouveau_fence_signalled(struct nouveau_fence *);
41b8e80941Smrg
42b8e80941Smrgvoid nouveau_fence_unref_bo(void *data); /* generic unref bo callback */
43b8e80941Smrg
44848b8605Smrg
45b8e80941Smrgstatic inline void
46848b8605Smrgnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
47848b8605Smrg{
48848b8605Smrg   if (fence)
49848b8605Smrg      ++fence->ref;
50848b8605Smrg
51848b8605Smrg   if (*ref) {
52848b8605Smrg      if (--(*ref)->ref == 0)
53848b8605Smrg         nouveau_fence_del(*ref);
54848b8605Smrg   }
55848b8605Smrg
56848b8605Smrg   *ref = fence;
57848b8605Smrg}
58848b8605Smrg
59b8e80941Smrgstatic inline struct nouveau_fence *
60848b8605Smrgnouveau_fence(struct pipe_fence_handle *fence)
61848b8605Smrg{
62848b8605Smrg   return (struct nouveau_fence *)fence;
63848b8605Smrg}
64848b8605Smrg
65848b8605Smrg#endif // __NOUVEAU_FENCE_H__
66