summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/x11/xm_winsys.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/mesa/drivers/x11/xm_winsys.c b/src/mesa/drivers/x11/xm_winsys.c
index b7b2941490c..7e29580b502 100644
--- a/src/mesa/drivers/x11/xm_winsys.c
+++ b/src/mesa/drivers/x11/xm_winsys.c
@@ -58,8 +58,9 @@ struct xm_winsys
*/
struct xm_buffer
{
+ boolean userBuffer; /** Is this a user-space buffer? */
int refcount;
- int size;
+ unsigned size;
void *data;
void *mapped;
};
@@ -119,7 +120,8 @@ xm_buffer_reference(struct pipe_winsys *pws,
assert(oldBuf->refcount >= 0);
if (oldBuf->refcount == 0) {
if (oldBuf->data) {
- free(oldBuf->data);
+ if (!oldBuf->userBuffer)
+ free(oldBuf->data);
oldBuf->data = NULL;
}
free(oldBuf);
@@ -141,6 +143,7 @@ xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
unsigned size, const void *data )
{
struct xm_buffer *xm_buf = xm_bo(buf);
+ assert(!xm_buf->userBuffer);
if (xm_buf->size != size) {
if (xm_buf->data)
free(xm_buf->data);
@@ -157,6 +160,7 @@ xm_buffer_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
{
struct xm_buffer *xm_buf = xm_bo(buf);
GLubyte *b = (GLubyte *) xm_buf->data;
+ assert(!xm_buf->userBuffer);
assert(b);
memcpy(b + offset, data, size);
}
@@ -167,6 +171,7 @@ xm_buffer_get_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
{
const struct xm_buffer *xm_buf = xm_bo(buf);
const GLubyte *b = (GLubyte *) xm_buf->data;
+ assert(!xm_buf->userBuffer);
assert(b);
memcpy(data, b + offset, size);
}
@@ -204,9 +209,6 @@ xm_get_name(struct pipe_winsys *pws)
}
-/* Softpipe has no concept of pools. We choose the tex/region pool
- * for all buffers.
- */
static struct pipe_buffer_handle *
xm_buffer_create(struct pipe_winsys *pws, unsigned alignment)
{
@@ -216,6 +218,21 @@ xm_buffer_create(struct pipe_winsys *pws, unsigned alignment)
}
+/**
+ * Create buffer which wraps user-space data.
+ */
+static struct pipe_buffer_handle *
+xm_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
+{
+ struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
+ buffer->userBuffer = TRUE;
+ buffer->refcount = 1;
+ buffer->data = ptr;
+ buffer->size = bytes;
+ return pipe_bo(buffer);
+}
+
+
struct xmesa_pipe_winsys
{
struct pipe_winsys winsys;
@@ -235,6 +252,7 @@ xmesa_create_pipe_winsys( XMesaContext xmesa )
* that rendering be done to an appropriate _DriBufferObject.
*/
xws->winsys.buffer_create = xm_buffer_create;
+ xws->winsys.user_buffer_create = xm_user_buffer_create;
xws->winsys.buffer_map = xm_buffer_map;
xws->winsys.buffer_unmap = xm_buffer_unmap;
xws->winsys.buffer_reference = xm_buffer_reference;