pipebuffer: Release the lock during map wait. Cleanups.
[mesa.git] / src / gallium / auxiliary / pipebuffer / pb_buffer.h
index dd22ef34ecc110c8fc7876f0a1623ada59d1607f..4ef372233f0dbd50db920959aa042f293833a1b6 100644 (file)
 
 
 #include "pipe/p_compiler.h"
-#include "pipe/p_debug.h"
-#include "pipe/p_error.h"
+#include "util/u_debug.h"
+#include "pipe/p_defines.h"
 #include "pipe/p_state.h"
-#include "pipe/p_inlines.h"
 
 
 #ifdef __cplusplus
@@ -72,6 +71,12 @@ struct pb_desc
 };
 
 
+/**
+ * Size. Regular (32bit) unsigned for now.
+ */
+typedef unsigned pb_size;
+
+
 /**
  * Base class for all pb_* buffers.
  */
@@ -127,7 +132,7 @@ struct pb_vtbl
     */
    void (*get_base_buffer)( struct pb_buffer *buf,
                             struct pb_buffer **base_buf,
-                            unsigned *offset );
+                            pb_size *offset );
    
 };
 
@@ -159,6 +164,7 @@ pb_map(struct pb_buffer *buf,
    assert(buf);
    if(!buf)
       return NULL;
+   assert(pipe_is_referenced(&buf->base.reference));
    return buf->vtbl->map(buf, flags);
 }
 
@@ -169,6 +175,7 @@ pb_unmap(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
+   assert(pipe_is_referenced(&buf->base.reference));
    buf->vtbl->unmap(buf);
 }
 
@@ -176,7 +183,7 @@ pb_unmap(struct pb_buffer *buf)
 static INLINE void
 pb_get_base_buffer( struct pb_buffer *buf,
                    struct pb_buffer **base_buf,
-                   unsigned *offset )
+                   pb_size *offset )
 {
    assert(buf);
    if(!buf) {
@@ -184,8 +191,11 @@ pb_get_base_buffer( struct pb_buffer *buf,
       offset = 0;
       return;
    }
+   assert(pipe_is_referenced(&buf->base.reference));
    assert(buf->vtbl->get_base_buffer);
    buf->vtbl->get_base_buffer(buf, base_buf, offset);
+   assert(*base_buf);
+   assert(*offset < (*base_buf)->base.size);
 }
 
 
@@ -217,29 +227,18 @@ pb_destroy(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.refcount == 0);
+   assert(!pipe_is_referenced(&buf->base.reference));
    buf->vtbl->destroy(buf);
 }
 
-
-/* XXX: thread safety issues!
- */
 static INLINE void
 pb_reference(struct pb_buffer **dst,
              struct pb_buffer *src)
 {
-   if (src) {
-      assert(src->base.refcount);
-      src->base.refcount++;
-   }
-
-   if (*dst) {
-      assert((*dst)->base.refcount);
-      if(--(*dst)->base.refcount == 0)
-         pb_destroy( *dst );
-   }
+   struct pb_buffer *old = *dst;
 
-   *dst = src;
+   if (pipe_reference((struct pipe_reference**)dst, &src->base.reference))
+      pb_destroy( old );
 }
 
 
@@ -248,9 +247,15 @@ pb_reference(struct pb_buffer **dst,
  * the requested or not.
  */
 static INLINE boolean
-pb_check_alignment(size_t requested, size_t provided)
+pb_check_alignment(pb_size requested, pb_size provided)
 {
-   return requested <= provided && (provided % requested) == 0 ? TRUE : FALSE;
+   if(!requested)
+      return TRUE;
+   if(requested > provided)
+      return FALSE;
+   if(provided % requested != 0)
+      return FALSE;
+   return TRUE;
 }
 
 
@@ -270,14 +275,10 @@ pb_check_usage(unsigned requested, unsigned provided)
  * hardware.
  */
 struct pb_buffer *
-pb_malloc_buffer_create(size_t size, 
+pb_malloc_buffer_create(pb_size size, 
                         const struct pb_desc *desc);
 
 
-void 
-pb_init_winsys(struct pipe_winsys *winsys);
-
-
 #ifdef __cplusplus
 }
 #endif