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