15a0915870c7e994d20334042b7647db749e79224Ben Skeggs
25a0915870c7e994d20334042b7647db749e79224Ben Skeggs#ifndef __NOUVEAU_FENCE_H__
35a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define __NOUVEAU_FENCE_H__
45a0915870c7e994d20334042b7647db749e79224Ben Skeggs
55a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "util/u_inlines.h"
65a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "util/u_double_list.h"
75a0915870c7e994d20334042b7647db749e79224Ben Skeggs
85a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_AVAILABLE 0
99849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_EMITTING  1
109849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_EMITTED   2
119849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_FLUSHED   3
129849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_SIGNALLED 4
135a0915870c7e994d20334042b7647db749e79224Ben Skeggs
145a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence_work {
155a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct list_head list;
165a0915870c7e994d20334042b7647db749e79224Ben Skeggs   void (*func)(void *);
175a0915870c7e994d20334042b7647db749e79224Ben Skeggs   void *data;
185a0915870c7e994d20334042b7647db749e79224Ben Skeggs};
195a0915870c7e994d20334042b7647db749e79224Ben Skeggs
205a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence {
215a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct nouveau_fence *next;
225a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct nouveau_screen *screen;
235a0915870c7e994d20334042b7647db749e79224Ben Skeggs   int state;
245a0915870c7e994d20334042b7647db749e79224Ben Skeggs   int ref;
255a0915870c7e994d20334042b7647db749e79224Ben Skeggs   uint32_t sequence;
265a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct list_head work;
275a0915870c7e994d20334042b7647db749e79224Ben Skeggs};
285a0915870c7e994d20334042b7647db749e79224Ben Skeggs
295a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_emit(struct nouveau_fence *);
305a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_del(struct nouveau_fence *);
315a0915870c7e994d20334042b7647db749e79224Ben Skeggs
325a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **,
335a0915870c7e994d20334042b7647db749e79224Ben Skeggs                          boolean emit);
345a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
355a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid    nouveau_fence_update(struct nouveau_screen *, boolean flushed);
365a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid    nouveau_fence_next(struct nouveau_screen *);
375a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_wait(struct nouveau_fence *);
385a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_signalled(struct nouveau_fence *);
395a0915870c7e994d20334042b7647db749e79224Ben Skeggs
405a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE void
415a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
425a0915870c7e994d20334042b7647db749e79224Ben Skeggs{
433a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs   if (fence)
443a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs      ++fence->ref;
453a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs
465a0915870c7e994d20334042b7647db749e79224Ben Skeggs   if (*ref) {
475a0915870c7e994d20334042b7647db749e79224Ben Skeggs      if (--(*ref)->ref == 0)
485a0915870c7e994d20334042b7647db749e79224Ben Skeggs         nouveau_fence_del(*ref);
495a0915870c7e994d20334042b7647db749e79224Ben Skeggs   }
505a0915870c7e994d20334042b7647db749e79224Ben Skeggs
515a0915870c7e994d20334042b7647db749e79224Ben Skeggs   *ref = fence;
525a0915870c7e994d20334042b7647db749e79224Ben Skeggs}
535a0915870c7e994d20334042b7647db749e79224Ben Skeggs
545a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE struct nouveau_fence *
555a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence(struct pipe_fence_handle *fence)
565a0915870c7e994d20334042b7647db749e79224Ben Skeggs{
575a0915870c7e994d20334042b7647db749e79224Ben Skeggs   return (struct nouveau_fence *)fence;
585a0915870c7e994d20334042b7647db749e79224Ben Skeggs}
595a0915870c7e994d20334042b7647db749e79224Ben Skeggs
605a0915870c7e994d20334042b7647db749e79224Ben Skeggs#endif // __NOUVEAU_FENCE_H__
61