freedreno: fix caps harder
[mesa.git] / src / gallium / drivers / nouveau / nouveau_fence.h
index 785fc8d2a0af7e248fa7458244db9b20ad54f1be..e14572bce8f972f406b57148e85a09146543006e 100644 (file)
@@ -3,12 +3,15 @@
 #define __NOUVEAU_FENCE_H__
 
 #include "util/u_inlines.h"
-#include "util/u_double_list.h"
+#include "util/list.h"
 
 #define NOUVEAU_FENCE_STATE_AVAILABLE 0
-#define NOUVEAU_FENCE_STATE_EMITTED   1
-#define NOUVEAU_FENCE_STATE_FLUSHED   2
-#define NOUVEAU_FENCE_STATE_SIGNALLED 3
+#define NOUVEAU_FENCE_STATE_EMITTING  1
+#define NOUVEAU_FENCE_STATE_EMITTED   2
+#define NOUVEAU_FENCE_STATE_FLUSHED   3
+#define NOUVEAU_FENCE_STATE_SIGNALLED 4
+
+struct pipe_debug_callback;
 
 struct nouveau_fence_work {
    struct list_head list;
@@ -22,34 +25,38 @@ struct nouveau_fence {
    int state;
    int ref;
    uint32_t sequence;
+   uint32_t work_count;
    struct list_head work;
 };
 
 void nouveau_fence_emit(struct nouveau_fence *);
 void nouveau_fence_del(struct nouveau_fence *);
 
-boolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **,
-                          boolean emit);
-boolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
-void    nouveau_fence_update(struct nouveau_screen *, boolean flushed);
-void    nouveau_fence_next(struct nouveau_screen *);
-boolean nouveau_fence_wait(struct nouveau_fence *);
-boolean nouveau_fence_signalled(struct nouveau_fence *);
+bool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **);
+bool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
+void nouveau_fence_update(struct nouveau_screen *, bool flushed);
+void nouveau_fence_next(struct nouveau_screen *);
+bool nouveau_fence_wait(struct nouveau_fence *, struct pipe_debug_callback *);
+bool nouveau_fence_signalled(struct nouveau_fence *);
+
+void nouveau_fence_unref_bo(void *data); /* generic unref bo callback */
 
-static INLINE void
+
+static inline void
 nouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
 {
+   if (fence)
+      ++fence->ref;
+
    if (*ref) {
       if (--(*ref)->ref == 0)
          nouveau_fence_del(*ref);
    }
-   if (fence)
-      ++fence->ref;
 
    *ref = fence;
 }
 
-static INLINE struct nouveau_fence *
+static inline struct nouveau_fence *
 nouveau_fence(struct pipe_fence_handle *fence)
 {
    return (struct nouveau_fence *)fence;