r600g: fix ARB_map_buffer_alignment with unaligned offsets and staging buffers
authorMarek Olšák <maraeo@gmail.com>
Thu, 22 Nov 2012 21:40:06 +0000 (22:40 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 22 Nov 2012 21:40:06 +0000 (22:40 +0100)
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_pipe.h

index 968824ea1bb042ae60d6f6607b043def44c4e150..3b8d227bd386f5a488fa4d372d67476c6603d602 100644 (file)
@@ -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,
index 296f812551d94b99f4263006714e76b8f56fa95f..04ddbeabde49272c127df0d4725b76955732cf1a 100644 (file)
@@ -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;
index 33ccefa13ca0b468a21d141246e829dd00c240a8..219bd54304a923eacc5579919df6e8f80061b289 100644 (file)
@@ -52,6 +52,8 @@
 #define R600_BIG_ENDIAN 0
 #endif
 
+#define R600_MAP_BUFFER_ALIGNMENT 64
+
 struct r600_bytecode;
 struct r600_shader_key;