Mesa (gallium-resources): gallium: remove inline_read transfer
Keith Whitwell
keithw at kemper.freedesktop.org
Sun Mar 14 06:51:37 PDT 2010
Module: Mesa
Branch: gallium-resources
Commit: 9a0235864252929a8eedd44dbd2fe30fe54c531d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a0235864252929a8eedd44dbd2fe30fe54c531d
Author: Keith Whitwell <keithw at vmware.com>
Date: Sun Mar 14 13:51:16 2010 +0000
gallium: remove inline_read transfer
---
src/gallium/auxiliary/util/u_inlines.h | 26 +++++++-----
src/gallium/auxiliary/util/u_transfer.c | 57 +++----------------------
src/gallium/auxiliary/util/u_transfer.h | 10 +---
src/gallium/drivers/identity/id_context.c | 29 +++----------
src/gallium/drivers/softpipe/sp_texture.c | 1 -
src/mesa/state_tracker/st_cb_bufferobjects.c | 25 +++++++++---
6 files changed, 51 insertions(+), 97 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h
index f57a1fc..b6f7b2c 100644
--- a/src/gallium/auxiliary/util/u_inlines.h
+++ b/src/gallium/auxiliary/util/u_inlines.h
@@ -230,7 +230,9 @@ pipe_buffer_write(struct pipe_context *pipe,
u_subresource(0,0),
PIPE_TRANSFER_WRITE,
&box,
- data);
+ data,
+ size,
+ 0);
}
/**
@@ -255,7 +257,8 @@ pipe_buffer_write_nooverlap(struct pipe_context *pipe,
(PIPE_TRANSFER_WRITE |
PIPE_TRANSFER_NOOVERWRITE),
&box,
- data);
+ data,
+ 0, 0);
}
static INLINE void
@@ -264,16 +267,19 @@ pipe_buffer_read(struct pipe_context *pipe,
unsigned offset, unsigned size,
void *data)
{
- struct pipe_box box;
+ struct pipe_transfer *src_transfer;
+ ubyte *map;
- u_box_1d(offset, size, &box);
+ map = (ubyte *) pipe_buffer_map_range(pipe,
+ buf,
+ offset, size,
+ PIPE_TRANSFER_READ,
+ &src_transfer);
- pipe->transfer_inline_read( pipe,
- buf,
- u_subresource(0,0),
- PIPE_TRANSFER_READ,
- &box,
- data);
+ if (map)
+ memcpy(data, map, size);
+
+ pipe_buffer_unmap(pipe, buf, src_transfer);
}
static INLINE struct pipe_transfer *
diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c
index f82b031..1ffad94 100644
--- a/src/gallium/auxiliary/util/u_transfer.c
+++ b/src/gallium/auxiliary/util/u_transfer.c
@@ -7,11 +7,13 @@
* pointer. XXX: strides??
*/
void u_transfer_inline_write( struct pipe_context *pipe,
- struct pipe_resource *resource,
- struct pipe_subresource sr,
- enum pipe_transfer_usage usage,
- const struct pipe_box *box,
- const void *data )
+ struct pipe_resource *resource,
+ struct pipe_subresource sr,
+ enum pipe_transfer_usage usage,
+ const struct pipe_box *box,
+ const void *data,
+ unsigned stride,
+ unsigned slice_stride)
{
struct pipe_transfer *transfer = NULL;
uint8_t *map = NULL;
@@ -50,51 +52,6 @@ out:
-/* One-shot read transfer operation with data returned in a user
- * pointer. XXX: strides??
- */
-void u_transfer_inline_read( struct pipe_context *pipe,
- struct pipe_resource *resource,
- struct pipe_subresource sr,
- enum pipe_transfer_usage usage,
- const struct pipe_box *box,
- void *data )
-{
- struct pipe_transfer *transfer = NULL;
- uint8_t *map = NULL;
-
- transfer = pipe->get_transfer(pipe,
- resource,
- sr,
- usage,
- box );
- if (transfer == NULL)
- goto out;
-
- map = pipe_transfer_map(pipe, transfer);
- if (map == NULL)
- goto out;
-
- assert(box->depth == 1); /* XXX: fix me */
-
- util_copy_rect(data,
- resource->format,
- transfer->stride, /* bytes? */
- 0, 0,
- box->width,
- box->height,
- map,
- box->width, /* bytes? texels? */
- 0, 0);
-
-
-out:
- if (map)
- pipe_transfer_unmap(pipe, transfer);
-
- if (transfer)
- pipe_transfer_destroy(pipe, transfer);
-}
void u_transfer_flush_region_noop( struct pipe_context *pipe,
diff --git a/src/gallium/auxiliary/util/u_transfer.h b/src/gallium/auxiliary/util/u_transfer.h
index 2e1ad31..5318702 100644
--- a/src/gallium/auxiliary/util/u_transfer.h
+++ b/src/gallium/auxiliary/util/u_transfer.h
@@ -11,17 +11,13 @@ struct pipe_context;
void u_transfer_inline_write( struct pipe_context *pipe,
- struct pipe_resource *resource,
- struct pipe_subresource sr,
- enum pipe_transfer_usage usage,
- const struct pipe_box *box,
- const void *data );
-void u_transfer_inline_read( struct pipe_context *pipe,
struct pipe_resource *resource,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
- void *data );
+ const void *data,
+ unsigned stride,
+ unsigned slice_stride);
void u_transfer_flush_region_noop( struct pipe_context *pipe,
struct pipe_transfer *transfer,
diff --git a/src/gallium/drivers/identity/id_context.c b/src/gallium/drivers/identity/id_context.c
index a243c46..fc5aec0 100644
--- a/src/gallium/drivers/identity/id_context.c
+++ b/src/gallium/drivers/identity/id_context.c
@@ -817,7 +817,9 @@ identity_context_transfer_inline_write( struct pipe_context *_context,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
- const void *data )
+ const void *data,
+ unsigned stride,
+ unsigned slice_stride)
{
struct identity_context *id_context = identity_context(_context);
struct identity_resource *id_resource = identity_resource(_resource);
@@ -829,29 +831,11 @@ identity_context_transfer_inline_write( struct pipe_context *_context,
sr,
usage,
box,
- data);
+ data,
+ stride,
+ slice_stride);
}
-static void
-identity_context_transfer_inline_read( struct pipe_context *_context,
- struct pipe_resource *_resource,
- struct pipe_subresource sr,
- enum pipe_transfer_usage usage,
- const struct pipe_box *box,
- void *data )
-{
- struct identity_context *id_context = identity_context(_context);
- struct identity_resource *id_resource = identity_resource(_resource);
- struct pipe_context *context = id_context->pipe;
- struct pipe_resource *texture = id_resource->resource;
-
- context->transfer_inline_read(context,
- texture,
- sr,
- usage,
- box,
- data);
-}
struct pipe_context *
identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
@@ -925,7 +909,6 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
id_pipe->base.transfer_unmap = identity_context_transfer_unmap;
id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
id_pipe->base.transfer_inline_write = identity_context_transfer_inline_write;
- id_pipe->base.transfer_inline_read = identity_context_transfer_inline_read;
id_pipe->pipe = pipe;
diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c
index 993e791..7d34b5c 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -421,7 +421,6 @@ softpipe_init_texture_funcs(struct pipe_context *pipe)
pipe->transfer_flush_region = u_transfer_flush_region_noop;
pipe->transfer_inline_write = u_transfer_inline_write;
- pipe->transfer_inline_read = u_transfer_inline_read;
}
void
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index af3bc4f..554b756 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -139,19 +139,32 @@ st_bufferobj_get_subdata(GLcontext *ctx,
GLsizeiptrARB size,
GLvoid * data, struct gl_buffer_object *obj)
{
+ struct pipe_context *pipe = st_context(ctx)->pipe;
struct st_buffer_object *st_obj = st_buffer_object(obj);
+ struct pipe_transfer *src_transfer;
+ ubyte *srcPtr;
+
+ if(!size)
+ return;
/* we may be called from VBO code, so double-check params here */
ASSERT(offset >= 0);
ASSERT(size >= 0);
ASSERT(offset + size <= obj->Size);
- if (!size)
- return;
+ /* buffer should not already be mapped */
+ assert(!obj->Pointer);
+
+ srcPtr = (ubyte *) pipe_buffer_map_range(pipe,
+ st_obj->buffer,
+ offset, size,
+ PIPE_TRANSFER_READ,
+ &src_transfer);
+
+ if (srcPtr)
+ memcpy(data, srcPtr, size);
- st_cond_flush_pipe_buffer_read(st_context(ctx),
- st_obj->buffer,
- offset, size, data);
+ pipe_buffer_unmap(pipe, st_obj->buffer, src_transfer);
}
@@ -426,7 +439,7 @@ st_copy_buffer_subdata(GLcontext *ctx,
&dst_transfer);
if (srcPtr && dstPtr)
- memcpy(dstPtr + writeOffset, srcPtr + readOffset, size);
+ memcpy(dstPtr, srcPtr, size);
pipe_buffer_unmap(pipe, srcObj->buffer, src_transfer);
pipe_buffer_unmap(pipe, dstObj->buffer, dst_transfer);
More information about the mesa-commit
mailing list