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