nouveau_fence.h revision 3a38a4b0a8caae9be9a66f10e12ad41a1806037f
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
95a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_EMITTED   1
105a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_FLUSHED   2
115a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_SIGNALLED 3
125a0915870c7e994d20334042b7647db749e79224Ben Skeggs
135a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence_work {
145a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct list_head list;
155a0915870c7e994d20334042b7647db749e79224Ben Skeggs   void (*func)(void *);
165a0915870c7e994d20334042b7647db749e79224Ben Skeggs   void *data;
175a0915870c7e994d20334042b7647db749e79224Ben Skeggs};
185a0915870c7e994d20334042b7647db749e79224Ben Skeggs
195a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence {
205a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct nouveau_fence *next;
215a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct nouveau_screen *screen;
225a0915870c7e994d20334042b7647db749e79224Ben Skeggs   int state;
235a0915870c7e994d20334042b7647db749e79224Ben Skeggs   int ref;
245a0915870c7e994d20334042b7647db749e79224Ben Skeggs   uint32_t sequence;
255a0915870c7e994d20334042b7647db749e79224Ben Skeggs   struct list_head work;
265a0915870c7e994d20334042b7647db749e79224Ben Skeggs};
275a0915870c7e994d20334042b7647db749e79224Ben Skeggs
285a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_emit(struct nouveau_fence *);
295a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_del(struct nouveau_fence *);
305a0915870c7e994d20334042b7647db749e79224Ben Skeggs
315a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **,
325a0915870c7e994d20334042b7647db749e79224Ben Skeggs                          boolean emit);
335a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
345a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid    nouveau_fence_update(struct nouveau_screen *, boolean flushed);
355a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid    nouveau_fence_next(struct nouveau_screen *);
365a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_wait(struct nouveau_fence *);
375a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_signalled(struct nouveau_fence *);
385a0915870c7e994d20334042b7647db749e79224Ben Skeggs
395a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE void
405a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
415a0915870c7e994d20334042b7647db749e79224Ben Skeggs{
423a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs   if (fence)
433a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs      ++fence->ref;
443a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs
455a0915870c7e994d20334042b7647db749e79224Ben Skeggs   if (*ref) {
465a0915870c7e994d20334042b7647db749e79224Ben Skeggs      if (--(*ref)->ref == 0)
475a0915870c7e994d20334042b7647db749e79224Ben Skeggs         nouveau_fence_del(*ref);
485a0915870c7e994d20334042b7647db749e79224Ben Skeggs   }
495a0915870c7e994d20334042b7647db749e79224Ben Skeggs
505a0915870c7e994d20334042b7647db749e79224Ben Skeggs   *ref = fence;
515a0915870c7e994d20334042b7647db749e79224Ben Skeggs}
525a0915870c7e994d20334042b7647db749e79224Ben Skeggs
535a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE struct nouveau_fence *
545a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence(struct pipe_fence_handle *fence)
555a0915870c7e994d20334042b7647db749e79224Ben Skeggs{
565a0915870c7e994d20334042b7647db749e79224Ben Skeggs   return (struct nouveau_fence *)fence;
575a0915870c7e994d20334042b7647db749e79224Ben Skeggs}
585a0915870c7e994d20334042b7647db749e79224Ben Skeggs
595a0915870c7e994d20334042b7647db749e79224Ben Skeggs#endif // __NOUVEAU_FENCE_H__
60