summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2012-11-22 22:40:06 +0100
committerMarek Olšák <[email protected]>2012-11-22 22:40:06 +0100
commitd172fa825b21ce3ff4f5cd83d0de7ef7f3a8d865 (patch)
tree64b89e11beeec34378a98984440cdf428eb3626d
parentf8840057710041e2d43fddfe4ef9f392c475e129 (diff)
r600g: fix ARB_map_buffer_alignment with unaligned offsets and staging buffers
-rw-r--r--src/gallium/drivers/r600/r600_buffer.c7
-rw-r--r--src/gallium/drivers/r600/r600_pipe.c2
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h2
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 968824ea1bb..3b8d227bd38 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 296f812551d..04ddbeabde4 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 33ccefa13ca..219bd54304a 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;