diff options
author | Marek Olšák <[email protected]> | 2012-11-22 22:40:06 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-11-22 22:40:06 +0100 |
commit | d172fa825b21ce3ff4f5cd83d0de7ef7f3a8d865 (patch) | |
tree | 64b89e11beeec34378a98984440cdf428eb3626d /src/gallium/drivers/r600/r600_buffer.c | |
parent | f8840057710041e2d43fddfe4ef9f392c475e129 (diff) |
r600g: fix ARB_map_buffer_alignment with unaligned offsets and staging buffers
Diffstat (limited to 'src/gallium/drivers/r600/r600_buffer.c')
-rw-r--r-- | src/gallium/drivers/r600/r600_buffer.c | 7 |
1 files changed, 5 insertions, 2 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, |