Mesa (master): r600g: fix ARB_map_buffer_alignment with unaligned offsets and staging buffers

Marek Olšák mareko at kemper.freedesktop.org
Fri Nov 23 00:18:58 UTC 2012


Module: Mesa
Branch: master
Commit: d172fa825b21ce3ff4f5cd83d0de7ef7f3a8d865
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d172fa825b21ce3ff4f5cd83d0de7ef7f3a8d865

Author: Marek Olšák <maraeo at gmail.com>
Date:   Thu Nov 22 22:40:06 2012 +0100

r600g: fix ARB_map_buffer_alignment with unaligned offsets and staging buffers

---

 src/gallium/drivers/r600/r600_buffer.c |    7 +++++--
 src/gallium/drivers/r600/r600_pipe.c   |    2 +-
 src/gallium/drivers/r600/r600_pipe.h   |    2 ++
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c
index 968824e..3b8d227 100644
--- a/src/gallium/drivers/r600/r600_buffer.c
+++ b/src/gallium/drivers/r600/r600_buffer.c
@@ -149,11 +149,14 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
 			/* Do a wait-free write-only transfer using a temporary buffer. */
 			struct r600_resource *staging = (struct r600_resource*)
 				pipe_buffer_create(ctx->screen, PIPE_BIND_VERTEX_BUFFER,
-						   PIPE_USAGE_STAGING, box->width);
+						   PIPE_USAGE_STAGING,
+						   box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT));
 			data = rctx->ws->buffer_map(staging->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
 
 			if (!data)
 				return NULL;
+
+			data += box->x % R600_MAP_BUFFER_ALIGNMENT;
 			return r600_buffer_get_transfer(ctx, resource, level, usage, box,
 							ptransfer, data, staging);
 		}
@@ -177,7 +180,7 @@ static void r600_buffer_transfer_unmap(struct pipe_context *pipe,
 
 	if (rtransfer->staging) {
 		struct pipe_box box;
-		u_box_1d(0, transfer->box.width, &box);
+		u_box_1d(transfer->box.x % R600_MAP_BUFFER_ALIGNMENT, transfer->box.width, &box);
 
 		/* Copy the staging buffer into the original one. */
 		r600_copy_buffer(pipe, transfer->resource, transfer->box.x,
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 296f812..04ddbea 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -401,7 +401,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
 		return 1;
 
         case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
-                return 64;
+                return R600_MAP_BUFFER_ALIGNMENT;
 
 	case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
 		return 256;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 33ccefa..219bd54 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -52,6 +52,8 @@
 #define R600_BIG_ENDIAN 0
 #endif
 
+#define R600_MAP_BUFFER_ALIGNMENT 64
+
 struct r600_bytecode;
 struct r600_shader_key;
 




More information about the mesa-commit mailing list