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 14 struct nouveau_fence_work { 15 struct list_head list; 16 void (*func)(void *); 17 void *data; 18 }; 19 20 struct 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 29 void nouveau_fence_emit(struct nouveau_fence *); 30 void nouveau_fence_del(struct nouveau_fence *); 31 32 boolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **, 33 boolean emit); 34 boolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); 35 void nouveau_fence_update(struct nouveau_screen *, boolean flushed); 36 void nouveau_fence_next(struct nouveau_screen *); 37 boolean nouveau_fence_wait(struct nouveau_fence *); 38 boolean nouveau_fence_signalled(struct nouveau_fence *); 39 40 static INLINE void nouveau_fence_ref(struct nouveau_fence * fence,struct nouveau_fence ** ref)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 54 static INLINE struct nouveau_fence * nouveau_fence(struct pipe_fence_handle * fence)55nouveau_fence(struct pipe_fence_handle *fence) 56 { 57 return (struct nouveau_fence *)fence; 58 } 59 60 #endif // __NOUVEAU_FENCE_H__ 61