| |
| #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_EMITTING 1 |
| #define NOUVEAU_FENCE_STATE_EMITTED 2 |
| #define NOUVEAU_FENCE_STATE_FLUSHED 3 |
| #define NOUVEAU_FENCE_STATE_SIGNALLED 4 |
| |
| 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__ |