llvmpipe: fix race between draw and setting fragment shader.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_fence.h
index d9270f5784acb7ed5c5b61471d4ea52d9a7b3dca..5ba746d22d1e791652eab2d7a2a66b3b2c63ec4c 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "os/os_thread.h"
 #include "pipe/p_state.h"
+#include "util/u_inlines.h"
 
 
 struct pipe_screen;
@@ -40,10 +41,12 @@ struct pipe_screen;
 struct lp_fence
 {
    struct pipe_reference reference;
+   unsigned id;
 
-   pipe_mutex mutex;
-   pipe_condvar signalled;
+   mtx_t mutex;
+   cnd_t signalled;
 
+   boolean issued;
    unsigned rank;
    unsigned count;
 };
@@ -56,9 +59,40 @@ lp_fence_create(unsigned rank);
 void
 lp_fence_signal(struct lp_fence *fence);
 
+boolean
+lp_fence_signalled(struct lp_fence *fence);
+
+void
+lp_fence_wait(struct lp_fence *fence);
+
+boolean
+lp_fence_timedwait(struct lp_fence *fence, uint64_t timeout);
 
 void
 llvmpipe_init_screen_fence_funcs(struct pipe_screen *screen);
 
 
+void
+lp_fence_destroy(struct lp_fence *fence);
+
+static inline void
+lp_fence_reference(struct lp_fence **ptr,
+                   struct lp_fence *f)
+{
+   struct lp_fence *old = *ptr;
+
+   if (pipe_reference(&old->reference, &f->reference)) {
+      lp_fence_destroy(old);
+   }
+   
+   *ptr = f;
+}
+
+static inline boolean
+lp_fence_issued(const struct lp_fence *fence)
+{
+   return fence->issued;
+}
+
+
 #endif /* LP_FENCE_H */