tgsi/ureg: enable creating tessellation shaders with ureg_create_shader
[mesa.git] / src / gallium / auxiliary / pipebuffer / pb_buffer.h
index 7cba5fa441cb62659c7ad89af5e5f4309879ffd9..03bdce31513e419302a41a045c50aa36e6c6a56f 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 VMware, Inc.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -37,7 +37,7 @@
  * There is no obligation of a winsys driver to use this library. And a pipe
  * driver should be completly agnostic about it.
  * 
- * \author Jose Fonseca <jrfonseca@tungstengraphics.com>
+ * \author Jose Fonseca <jfonseca@vmware.com>
  */
 
 #ifndef PB_BUFFER_H_
 
 
 #include "pipe/p_compiler.h"
-#include "pipe/p_debug.h"
-#include "pipe/p_error.h"
-#include "pipe/p_state.h"
-#include "pipe/p_inlines.h"
+#include "util/u_debug.h"
+#include "util/u_inlines.h"
+#include "pipe/p_defines.h"
 
 
 #ifdef __cplusplus
@@ -58,8 +57,23 @@ extern "C" {
 
 struct pb_vtbl;
 struct pb_validate;
+struct pipe_fence_handle;
 
 
+#define PB_USAGE_CPU_READ  (1 << 0)
+#define PB_USAGE_CPU_WRITE (1 << 1)
+#define PB_USAGE_GPU_READ  (1 << 2)
+#define PB_USAGE_GPU_WRITE (1 << 3)
+#define PB_USAGE_UNSYNCHRONIZED (1 << 10)
+#define PB_USAGE_DONTBLOCK (1 << 9)
+
+#define PB_USAGE_CPU_READ_WRITE \
+   ( PB_USAGE_CPU_READ | PB_USAGE_CPU_WRITE )
+#define PB_USAGE_GPU_READ_WRITE \
+   ( PB_USAGE_GPU_READ | PB_USAGE_GPU_WRITE )
+#define PB_USAGE_WRITE \
+   ( PB_USAGE_CPU_WRITE | PB_USAGE_GPU_WRITE )
+
 /**
  * Buffer description.
  * 
@@ -72,12 +86,21 @@ struct pb_desc
 };
 
 
+/**
+ * Size. Regular (32bit) unsigned for now.
+ */
+typedef unsigned pb_size;
+
+
 /**
  * Base class for all pb_* buffers.
  */
 struct pb_buffer 
 {
-   struct pipe_buffer base;
+   struct pipe_reference  reference;
+   unsigned               size;
+   unsigned               alignment;
+   unsigned               usage;
 
    /**
     * Pointer to the virtual function table.
@@ -100,10 +123,10 @@ struct pb_vtbl
 
    /** 
     * Map the entire data store of a buffer object into the client's address.
-    * flags is bitmask of PIPE_BUFFER_FLAG_READ/WRITE. 
+    * flags is bitmask of PB_USAGE_CPU_READ/WRITE. 
     */
    void *(*map)( struct pb_buffer *buf, 
-                 unsigned flags );
+                 unsigned flags, void *flush_ctx );
    
    void (*unmap)( struct pb_buffer *buf );
 
@@ -127,40 +150,23 @@ struct pb_vtbl
     */
    void (*get_base_buffer)( struct pb_buffer *buf,
                             struct pb_buffer **base_buf,
-                            unsigned *offset );
+                            pb_size *offset );
    
 };
 
 
-static INLINE struct pipe_buffer *
-pb_pipe_buffer( struct pb_buffer *pbuf )
-{
-   assert(pbuf);
-   return &pbuf->base;
-}
-
-
-static INLINE struct pb_buffer *
-pb_buffer( struct pipe_buffer *buf )
-{
-   assert(buf);
-   /* Could add a magic cookie check on debug builds.
-    */
-   return (struct pb_buffer *)buf;
-}
-
 
 /* Accessor functions for pb->vtbl:
  */
 static INLINE void *
 pb_map(struct pb_buffer *buf, 
-       unsigned flags)
+       unsigned flags, void *flush_ctx)
 {
    assert(buf);
    if(!buf)
       return NULL;
-   assert(buf->base.refcount > 0);
-   return buf->vtbl->map(buf, flags);
+   assert(pipe_is_referenced(&buf->reference));
+   return buf->vtbl->map(buf, flags, flush_ctx);
 }
 
 
@@ -170,7 +176,7 @@ pb_unmap(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.refcount > 0);
+   assert(pipe_is_referenced(&buf->reference));
    buf->vtbl->unmap(buf);
 }
 
@@ -178,7 +184,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) {
@@ -186,11 +192,11 @@ pb_get_base_buffer( struct pb_buffer *buf,
       offset = 0;
       return;
    }
-   assert(buf->base.refcount > 0);
+   assert(pipe_is_referenced(&buf->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);
+   assert(*offset < (*base_buf)->size);
 }
 
 
@@ -222,28 +228,18 @@ pb_destroy(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.refcount == 0);
+   assert(!pipe_is_referenced(&buf->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;
 
+   if (pipe_reference(&(*dst)->reference, &src->reference))
+      pb_destroy( old );
    *dst = src;
 }
 
@@ -253,9 +249,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;
 }
 
 
@@ -275,7 +277,7 @@ 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);