Fullfill pipe_winsys->user_buffer_create. Aggregate winsys functions.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Sun, 27 Jan 2008 10:20:48 +0000 (19:20 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Sun, 27 Jan 2008 10:20:48 +0000 (19:20 +0900)
src/mesa/pipe/pipebuffer/Makefile
src/mesa/pipe/pipebuffer/pb_buffer.c [deleted file]
src/mesa/pipe/pipebuffer/pb_buffer.h
src/mesa/pipe/pipebuffer/pb_buffer_client.c [deleted file]
src/mesa/pipe/pipebuffer/pb_winsys.c [new file with mode: 0644]

index ea8c3440c36f91ff04bf5d77d5b56d366b118619..75764a9a18815af36efd7e5791e248e074f377d6 100644 (file)
@@ -5,13 +5,12 @@ include $(TOP)/configs/current
 LIBNAME = pipebuffer
 
 DRIVER_SOURCES = \
-       pb_buffer.c \
-       pb_buffer_client.c \
        pb_buffer_fenced.c \
        pb_buffer_malloc.c \
        pb_bufmgr_fenced.c \
        pb_bufmgr_mm.c \
-       pb_bufmgr_pool.c
+       pb_bufmgr_pool.c \
+       pb_winsys.c
 
 C_SOURCES = \
        $(DRIVER_SOURCES)
diff --git a/src/mesa/pipe/pipebuffer/pb_buffer.c b/src/mesa/pipe/pipebuffer/pb_buffer.c
deleted file mode 100644 (file)
index 90ab904..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * 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
- * 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.
- *
- **************************************************************************/
-
-/**
- * \file
- * Buffer implementation.
- * 
- * \author José Fonseca <jrfonseca@tungstengraphics.com>
- */
-
-
-#include "pb_buffer.h"
-#include "pipe/p_winsys.h"
-
-
-
-static void *
-pb_winsys_map(struct pipe_winsys *winsys,
-             struct pipe_buffer *ws_buf,
-             unsigned flags)
-{
-   struct pb_buffer *buf = pb_buffer(ws_buf);
-
-   return buf->vtbl->map(buf, flags);
-}
-
-static void
-pb_winsys_unmap(struct pipe_winsys *winsys,
-               struct pipe_buffer *ws_buf)
-{
-   struct pb_buffer *buf = pb_buffer(ws_buf);
-
-   buf->vtbl->unmap(buf);
-}
-
-static void
-pb_winsys_destroy(struct pipe_winsys *winsys,
-                 struct pipe_buffer *ws_buf)
-{
-   struct pb_buffer *buf = pb_buffer(ws_buf);
-
-   buf->vtbl->destroy(buf);
-}
-
-
-
-void 
-pb_init_winsys(struct pipe_winsys *winsys)
-{
-   winsys->buffer_map = pb_winsys_map;
-   winsys->buffer_unmap = pb_winsys_unmap;
-   winsys->buffer_destroy = pb_winsys_destroy;
-}
index 2f570ef9de3e1a699cede9748836985da8f05284..17551b3b50e000b350112859adbf4da21559dbc9 100644 (file)
@@ -48,8 +48,9 @@
 #include <stdlib.h>
 
 #include "pipe/p_compiler.h"
-
 #include "pipe/p_state.h"
+#include "pipe/p_inlines.h"
+
 
 struct pb_vtbl;
 
@@ -81,6 +82,7 @@ struct pb_buffer
    const struct pb_vtbl *vtbl;
 };
 
+
 /**
  * Virtual function table for the buffer storage operations.
  * 
@@ -116,6 +118,24 @@ struct pb_vtbl
 };
 
 
+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 *
@@ -143,6 +163,7 @@ pb_get_base_buffer( struct pb_buffer *buf,
    buf->vtbl->get_base_buffer(buf, base_buf, offset);
 }
 
+
 static INLINE void 
 pb_destroy(struct pb_buffer *buf)
 {
@@ -151,19 +172,20 @@ pb_destroy(struct pb_buffer *buf)
 }
 
 
+/* XXX: thread safety issues!
+ */
+static INLINE void
+pb_reference(struct pb_buffer **dst,
+             struct pb_buffer *src)
+{
+   if (src) 
+      src->base.refcount++;
 
+   if (*dst && --(*dst)->base.refcount == 0)
+      pb_destroy( *dst );
 
-/**
- * User buffers are special buffers that initially reference memory
- * held by the user but which may if necessary copy that memory into
- * device memory behind the scenes, for submission to hardware.
- *
- * These are particularly useful when the referenced data is never
- * submitted to hardware at all, in the particular case of software
- * vertex processing.
- */
-struct pb_buffer *
-pb_user_buffer_create(void *data, unsigned bytes);
+   *dst = src;
+}
 
 
 /**
@@ -175,22 +197,8 @@ pb_malloc_buffer_create(size_t size,
                         const struct pb_desc *desc);
 
 
-static INLINE struct pipe_buffer *
-pb_pipe_buffer( struct pb_buffer *pbuf )
-{
-   return &pbuf->base;
-}
-
-static INLINE struct pb_buffer *
-pb_buffer( struct pipe_buffer *buf )
-{
-   /* Could add a magic cookie check on debug builds.
-    */
-   return (struct pb_buffer *)buf;
-}
-
-
 void 
 pb_init_winsys(struct pipe_winsys *winsys);
 
+
 #endif /*PB_BUFFER_H_*/
diff --git a/src/mesa/pipe/pipebuffer/pb_buffer_client.c b/src/mesa/pipe/pipebuffer/pb_buffer_client.c
deleted file mode 100644 (file)
index c316aab..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * 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
- * 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.
- *
- **************************************************************************/
-
-/**
- * \file
- * Implementation of client buffer (also designated as "user buffers"), which
- * are just state-tracker owned data masqueraded as buffers.
- * 
- * \author José Fonseca <jrfonseca@tungstengraphics.com>
- */
-
-
-#include "pipe/p_util.h"
-#include "pb_buffer.h"
-
-
-struct pb_user_buffer 
-{
-   struct pb_buffer base;
-   void *data;
-};
-
-
-extern const struct pb_vtbl pb_user_buffer_vtbl;
-
-
-static INLINE struct pb_user_buffer *
-pb_user_buffer(struct pb_buffer *buf)
-{
-   assert(buf);
-   assert(buf->vtbl == &pb_user_buffer_vtbl);
-   return (struct pb_user_buffer *)buf;
-}
-
-
-static void
-pb_user_buffer_destroy(struct pb_buffer *buf)
-{
-   assert(buf);
-   FREE(buf);
-}
-
-
-static void *
-pb_user_buffer_map(struct pb_buffer *buf, 
-                  unsigned flags)
-{
-   return pb_user_buffer(buf)->data;
-}
-
-
-static void
-pb_user_buffer_unmap(struct pb_buffer *buf)
-{
-   /* No-op */
-}
-
-
-static void
-pb_user_buffer_get_base_buffer(struct pb_buffer *buf,
-                              struct pb_buffer **base_buf,
-                              unsigned *offset)
-{
-   *base_buf = buf;
-   *offset = 0;
-}
-
-
-const struct pb_vtbl 
-pb_user_buffer_vtbl = {
-      pb_user_buffer_destroy,
-      pb_user_buffer_map,
-      pb_user_buffer_unmap,
-      pb_user_buffer_get_base_buffer
-};
-
-
-struct pb_buffer *
-pb_user_buffer_create(void *data, unsigned bytes) 
-{
-   struct pb_user_buffer *buf = CALLOC_STRUCT(pb_user_buffer);
-
-   if(!buf)
-      return NULL;
-   
-   buf->base.vtbl = &pb_user_buffer_vtbl;   
-   buf->base.base.size = bytes;
-   buf->data = data;
-   
-   return &buf->base;
-}
diff --git a/src/mesa/pipe/pipebuffer/pb_winsys.c b/src/mesa/pipe/pipebuffer/pb_winsys.c
new file mode 100644 (file)
index 0000000..9789440
--- /dev/null
@@ -0,0 +1,170 @@
+/**************************************************************************
+ *
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * 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
+ * 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.
+ *
+ **************************************************************************/
+
+/**
+ * \file
+ * Implementation of client buffer (also designated as "user buffers"), which
+ * are just state-tracker owned data masqueraded as buffers.
+ * 
+ * \author José Fonseca <jrfonseca@tungstengraphics.com>
+ */
+
+
+#include "pipe/p_winsys.h"
+#include "pipe/p_util.h"
+
+#include "pb_buffer.h"
+
+
+/**
+ * User buffers are special buffers that initially reference memory
+ * held by the user but which may if necessary copy that memory into
+ * device memory behind the scenes, for submission to hardware.
+ *
+ * These are particularly useful when the referenced data is never
+ * submitted to hardware at all, in the particular case of software
+ * vertex processing.
+ */
+struct pb_user_buffer 
+{
+   struct pb_buffer base;
+   void *data;
+};
+
+
+extern const struct pb_vtbl pb_user_buffer_vtbl;
+
+
+static INLINE struct pb_user_buffer *
+pb_user_buffer(struct pb_buffer *buf)
+{
+   assert(buf);
+   assert(buf->vtbl == &pb_user_buffer_vtbl);
+   return (struct pb_user_buffer *)buf;
+}
+
+
+static void
+pb_user_buffer_destroy(struct pb_buffer *buf)
+{
+   assert(buf);
+   FREE(buf);
+}
+
+
+static void *
+pb_user_buffer_map(struct pb_buffer *buf, 
+                   unsigned flags)
+{
+   return pb_user_buffer(buf)->data;
+}
+
+
+static void
+pb_user_buffer_unmap(struct pb_buffer *buf)
+{
+   /* No-op */
+}
+
+
+static void
+pb_user_buffer_get_base_buffer(struct pb_buffer *buf,
+                               struct pb_buffer **base_buf,
+                               unsigned *offset)
+{
+   *base_buf = buf;
+   *offset = 0;
+}
+
+
+const struct pb_vtbl 
+pb_user_buffer_vtbl = {
+      pb_user_buffer_destroy,
+      pb_user_buffer_map,
+      pb_user_buffer_unmap,
+      pb_user_buffer_get_base_buffer
+};
+
+
+static struct pipe_buffer *
+pb_winsys_user_buffer_create(struct pipe_winsys *winsys,
+                             void *data, 
+                             unsigned bytes) 
+{
+   struct pb_user_buffer *buf = CALLOC_STRUCT(pb_user_buffer);
+
+   if(!buf)
+      return NULL;
+   
+   buf->base.base.refcount = 1;
+   buf->base.base.size = bytes;
+   buf->base.base.alignment = 0;
+   buf->base.base.usage = 0;
+
+   buf->base.vtbl = &pb_user_buffer_vtbl;   
+   buf->data = data;
+   
+   return &buf->base.base;
+}
+
+
+static void *
+pb_winsys_buffer_map(struct pipe_winsys *winsys,
+                     struct pipe_buffer *buf,
+                     unsigned flags)
+{
+   (void)winsys;
+   return pb_map(pb_buffer(buf), flags);
+}
+
+
+static void
+pb_winsys_buffer_unmap(struct pipe_winsys *winsys,
+                       struct pipe_buffer *buf)
+{
+   (void)winsys;
+   pb_unmap(pb_buffer(buf));
+}
+
+
+static void
+pb_winsys_buffer_destroy(struct pipe_winsys *winsys,
+                         struct pipe_buffer *buf)
+{
+   (void)winsys;
+   pb_destroy(pb_buffer(buf));
+}
+
+
+void 
+pb_init_winsys(struct pipe_winsys *winsys)
+{
+   winsys->user_buffer_create = pb_winsys_user_buffer_create;
+   winsys->buffer_map = pb_winsys_buffer_map;
+   winsys->buffer_unmap = pb_winsys_buffer_unmap;
+   winsys->buffer_destroy = pb_winsys_buffer_destroy;
+}