13464ebd5Sriastradh 23464ebd5Sriastradh#ifndef __NOUVEAU_FENCE_H__ 33464ebd5Sriastradh#define __NOUVEAU_FENCE_H__ 43464ebd5Sriastradh 53464ebd5Sriastradh#include "util/u_inlines.h" 601e04c3fSmrg#include "util/list.h" 73464ebd5Sriastradh 83464ebd5Sriastradh#define NOUVEAU_FENCE_STATE_AVAILABLE 0 93464ebd5Sriastradh#define NOUVEAU_FENCE_STATE_EMITTING 1 103464ebd5Sriastradh#define NOUVEAU_FENCE_STATE_EMITTED 2 113464ebd5Sriastradh#define NOUVEAU_FENCE_STATE_FLUSHED 3 123464ebd5Sriastradh#define NOUVEAU_FENCE_STATE_SIGNALLED 4 133464ebd5Sriastradh 1401e04c3fSmrgstruct pipe_debug_callback; 1501e04c3fSmrg 163464ebd5Sriastradhstruct nouveau_fence_work { 173464ebd5Sriastradh struct list_head list; 183464ebd5Sriastradh void (*func)(void *); 193464ebd5Sriastradh void *data; 203464ebd5Sriastradh}; 213464ebd5Sriastradh 223464ebd5Sriastradhstruct nouveau_fence { 233464ebd5Sriastradh struct nouveau_fence *next; 243464ebd5Sriastradh struct nouveau_screen *screen; 253464ebd5Sriastradh int state; 263464ebd5Sriastradh int ref; 273464ebd5Sriastradh uint32_t sequence; 2801e04c3fSmrg uint32_t work_count; 293464ebd5Sriastradh struct list_head work; 303464ebd5Sriastradh}; 313464ebd5Sriastradh 323464ebd5Sriastradhvoid nouveau_fence_emit(struct nouveau_fence *); 333464ebd5Sriastradhvoid nouveau_fence_del(struct nouveau_fence *); 343464ebd5Sriastradh 3501e04c3fSmrgbool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **); 367ec681f3Smrgvoid nouveau_fence_cleanup(struct nouveau_screen *); 3701e04c3fSmrgbool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); 3801e04c3fSmrgvoid nouveau_fence_update(struct nouveau_screen *, bool flushed); 3901e04c3fSmrgvoid nouveau_fence_next(struct nouveau_screen *); 4001e04c3fSmrgbool nouveau_fence_wait(struct nouveau_fence *, struct pipe_debug_callback *); 4101e04c3fSmrgbool nouveau_fence_signalled(struct nouveau_fence *); 4201e04c3fSmrg 4301e04c3fSmrgvoid nouveau_fence_unref_bo(void *data); /* generic unref bo callback */ 4401e04c3fSmrg 453464ebd5Sriastradh 4601e04c3fSmrgstatic inline void 473464ebd5Sriastradhnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref) 483464ebd5Sriastradh{ 493464ebd5Sriastradh if (fence) 503464ebd5Sriastradh ++fence->ref; 513464ebd5Sriastradh 523464ebd5Sriastradh if (*ref) { 533464ebd5Sriastradh if (--(*ref)->ref == 0) 543464ebd5Sriastradh nouveau_fence_del(*ref); 553464ebd5Sriastradh } 563464ebd5Sriastradh 573464ebd5Sriastradh *ref = fence; 583464ebd5Sriastradh} 593464ebd5Sriastradh 6001e04c3fSmrgstatic inline struct nouveau_fence * 613464ebd5Sriastradhnouveau_fence(struct pipe_fence_handle *fence) 623464ebd5Sriastradh{ 633464ebd5Sriastradh return (struct nouveau_fence *)fence; 643464ebd5Sriastradh} 653464ebd5Sriastradh 663464ebd5Sriastradh#endif // __NOUVEAU_FENCE_H__ 67