summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/nouveau_fence.h
blob: 680c75e99f962ec17862da79c44fba46ebc050f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

#ifndef __NOUVEAU_FENCE_H__
#define __NOUVEAU_FENCE_H__

#include "util/u_inlines.h"
#include "util/u_double_list.h"

#define NOUVEAU_FENCE_STATE_AVAILABLE 0
#define NOUVEAU_FENCE_STATE_EMITTED   1
#define NOUVEAU_FENCE_STATE_FLUSHED   2
#define NOUVEAU_FENCE_STATE_SIGNALLED 3

struct nouveau_fence_work {
   struct list_head list;
   void (*func)(void *);
   void *data;
};

struct nouveau_fence {
   struct nouveau_fence *next;
   struct nouveau_screen *screen;
   int state;
   int ref;
   uint32_t sequence;
   struct list_head work;
};

void nouveau_fence_emit(struct nouveau_fence *);
void nouveau_fence_del(struct nouveau_fence *);

boolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **,
                          boolean emit);
boolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
void    nouveau_fence_update(struct nouveau_screen *, boolean flushed);
void    nouveau_fence_next(struct nouveau_screen *);
boolean nouveau_fence_wait(struct nouveau_fence *);
boolean nouveau_fence_signalled(struct nouveau_fence *);

static INLINE void
nouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
{
   if (fence)
      ++fence->ref;

   if (*ref) {
      if (--(*ref)->ref == 0)
         nouveau_fence_del(*ref);
   }

   *ref = fence;
}

static INLINE struct nouveau_fence *
nouveau_fence(struct pipe_fence_handle *fence)
{
   return (struct nouveau_fence *)fence;
}

#endif // __NOUVEAU_FENCE_H__