clover: Define helper classes for the new object model.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_scene_queue.c
index 8d65a6a6fa218a358eae16ad9c61ee0f70c74ff2..975db43c4e991b1521b3f788806584fd0ac93651 100644 (file)
@@ -32,8 +32,7 @@
  * which are produced by the "rast" code when it finishes rendering a scene.
  */
 
-
-#include "pipe/p_thread.h"
+#include "util/u_ringbuffer.h"
 #include "util/u_memory.h"
 #include "lp_scene_queue.h"
 
 
 #define MAX_SCENE_QUEUE 4
 
+struct scene_packet {
+   struct util_packet header;
+   struct lp_scene *scene;
+};
 
 /**
  * A queue of scenes
  */
 struct lp_scene_queue
 {
-   /** XXX might use a linked list here somedone, but the list will
-    * probably always be pretty short.
-    */
-   struct lp_scene *scenes[MAX_SCENE_QUEUE];
-   unsigned count;
-
-   pipe_condvar count_change;
-   pipe_mutex mutex;
+   struct util_ringbuffer *ring;
 };
 
 
@@ -64,11 +60,19 @@ struct lp_scene_queue *
 lp_scene_queue_create(void)
 {
    struct lp_scene_queue *queue = CALLOC_STRUCT(lp_scene_queue);
-   if (queue) {
-      pipe_condvar_init(queue->count_change);
-      pipe_mutex_init(queue->mutex);
-   }
+   if (queue == NULL)
+      return NULL;
+
+   queue->ring = util_ringbuffer_create( MAX_SCENE_QUEUE * 
+                                         sizeof( struct scene_packet ) / 4);
+   if (queue->ring == NULL)
+      goto fail;
+
    return queue;
+
+fail:
+   FREE(queue);
+   return NULL;
 }
 
 
@@ -76,41 +80,28 @@ lp_scene_queue_create(void)
 void
 lp_scene_queue_destroy(struct lp_scene_queue *queue)
 {
-   pipe_condvar_destroy(queue->count_change);
-   pipe_mutex_destroy(queue->mutex);
+   util_ringbuffer_destroy(queue->ring);
+   FREE(queue);
 }
 
 
 /** Remove first lp_scene from head of queue */
 struct lp_scene *
-lp_scene_dequeue(struct lp_scene_queue *queue)
+lp_scene_dequeue(struct lp_scene_queue *queue, boolean wait)
 {
-   struct lp_scene *scene;
-   unsigned i;
-
-   pipe_mutex_lock(queue->mutex);
-   while (queue->count == 0) {
-      pipe_condvar_wait(queue->count_change, queue->mutex);
-   }
-
-   assert(queue->count >= 1);
-
-   /* get head */
-   scene = queue->scenes[0];
-
-   /* shift entries */
-   for (i = 0; i < queue->count - 1; i++) {
-      queue->scenes[i] = queue->scenes[i + 1];
-   }
+   struct scene_packet packet;
+   enum pipe_error ret;
 
-   queue->count--;
+   packet.scene = NULL;
 
-   /* signal size change */
-   pipe_condvar_signal(queue->count_change);
+   ret = util_ringbuffer_dequeue(queue->ring,
+                                 &packet.header,
+                                 sizeof packet / 4,
+                                 wait );
+   if (ret != PIPE_OK)
+      return NULL;
 
-   pipe_mutex_unlock(queue->mutex);
-
-   return scene;
+   return packet.scene;
 }
 
 
@@ -118,47 +109,16 @@ lp_scene_dequeue(struct lp_scene_queue *queue)
 void
 lp_scene_enqueue(struct lp_scene_queue *queue, struct lp_scene *scene)
 {
-   pipe_mutex_lock(queue->mutex);
-
-   assert(queue->count < MAX_SCENE_QUEUE);
-
-   /* debug: check that scene is not already in the queue */
-   if (0) {
-      unsigned i;
-      for (i = 0; i < queue->count; i++) {
-         assert(queue->scenes[i] != scene);
-      }
-   }
+   struct scene_packet packet;
 
-   /* add to end */
-   queue->scenes[queue->count++] = scene;
+   packet.header.dwords = sizeof packet / 4;
+   packet.header.data24 = 0;
+   packet.scene = scene;
 
-   /* signal size change */
-   pipe_condvar_signal(queue->count_change);
-
-   pipe_mutex_unlock(queue->mutex);
+   util_ringbuffer_enqueue(queue->ring, &packet.header);
 }
 
 
-/** Return number of entries in the queue */
-unsigned
-lp_scene_queue_count(struct lp_scene_queue *queue)
-{
-   unsigned count;
-   pipe_mutex_lock(queue->mutex);
-   count = queue->count;
-   pipe_mutex_unlock(queue->mutex);
-   return count;
-}
 
 
-/** Wait until the queue has exactly 'count' entries */
-void
-lp_scene_queue_wait_count(struct lp_scene_queue *queue, unsigned count)
-{
-   pipe_mutex_lock(queue->mutex);
-   while (queue->count != count) {
-      pipe_condvar_wait(queue->count_change, queue->mutex);
-   }
-   pipe_mutex_unlock(queue->mutex);
-}
+