summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jrfonseca@tungstengraphics.com>2008-01-27 19:20:48 +0900
committerJosé Fonseca <jrfonseca@tungstengraphics.com>2008-01-27 19:20:48 +0900
commite6c8278c04518b8b8b0960a9e21b48b6816fcc20 (patch)
tree1f59f21dd6221805f3b33c0c3d706dcbc7305429
parent87a8a339d7c8973168ffb5e5506f7ec4b3a524ba (diff)
Fullfill pipe_winsys->user_buffer_create. Aggregate winsys functions.
-rw-r--r--src/mesa/pipe/pipebuffer/Makefile5
-rw-r--r--src/mesa/pipe/pipebuffer/pb_buffer.c77
-rw-r--r--src/mesa/pipe/pipebuffer/pb_buffer.h62
-rw-r--r--src/mesa/pipe/pipebuffer/pb_winsys.c (renamed from src/mesa/pipe/pipebuffer/pb_buffer_client.c)69
4 files changed, 99 insertions, 114 deletions
diff --git a/src/mesa/pipe/pipebuffer/Makefile b/src/mesa/pipe/pipebuffer/Makefile
index ea8c3440c3..75764a9a18 100644
--- a/src/mesa/pipe/pipebuffer/Makefile
+++ b/src/mesa/pipe/pipebuffer/Makefile
@@ -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
index 90ab9044ff..0000000000
--- a/src/mesa/pipe/pipebuffer/pb_buffer.c
+++ /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;
-}
diff --git a/src/mesa/pipe/pipebuffer/pb_buffer.h b/src/mesa/pipe/pipebuffer/pb_buffer.h
index 2f570ef9de..17551b3b50 100644
--- a/src/mesa/pipe/pipebuffer/pb_buffer.h
+++ b/src/mesa/pipe/pipebuffer/pb_buffer.h
@@ -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_winsys.c
index c316aabd32..978944091f 100644
--- a/src/mesa/pipe/pipebuffer/pb_buffer_client.c
+++ b/src/mesa/pipe/pipebuffer/pb_winsys.c
@@ -34,10 +34,21 @@
*/
+#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;
@@ -67,7 +78,7 @@ pb_user_buffer_destroy(struct pb_buffer *buf)
static void *
pb_user_buffer_map(struct pb_buffer *buf,
- unsigned flags)
+ unsigned flags)
{
return pb_user_buffer(buf)->data;
}
@@ -82,8 +93,8 @@ pb_user_buffer_unmap(struct pb_buffer *buf)
static void
pb_user_buffer_get_base_buffer(struct pb_buffer *buf,
- struct pb_buffer **base_buf,
- unsigned *offset)
+ struct pb_buffer **base_buf,
+ unsigned *offset)
{
*base_buf = buf;
*offset = 0;
@@ -99,17 +110,61 @@ pb_user_buffer_vtbl = {
};
-struct pb_buffer *
-pb_user_buffer_create(void *data, unsigned bytes)
+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.vtbl = &pb_user_buffer_vtbl;
+ 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;
+ 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;
}