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