gallium/radeon: Do not use u_upload_mgr for buffer downloads
authorNiels Ole Salscheider <niels_ole@salscheider-online.de>
Thu, 14 Aug 2014 18:22:26 +0000 (20:22 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 19 Aug 2014 10:56:04 +0000 (12:56 +0200)
Instead create a staging texture with pipe_buffer_create and
PIPE_USAGE_STAGING.

u_upload_mgr sets the usage of its staging buffer to PIPE_USAGE_STREAM.
But since 150ac07b855b5c5f879bf6ce9ca421ccd1a6c938 CPU -> GPU streaming buffers
are created in VRAM. Therefore the staging texture (in VRAM) does not offer any
performance improvements for buffer downloads.

Signed-off-by: Niels Ole Salscheider <niels_ole@salscheider-online.de>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_buffer_common.c

index 22bc97e109d1e48b7cd983ac43983d1f1f6d4f5b..ee05776aed41d894cc65a8580c88101f1dc93600 100644 (file)
@@ -303,26 +303,22 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
                 !(usage & PIPE_TRANSFER_WRITE) &&
                 rbuffer->domains == RADEON_DOMAIN_VRAM &&
                 r600_can_dma_copy_buffer(rctx, 0, box->x, box->width)) {
-               unsigned offset;
-               struct r600_resource *staging = NULL;
-
-               u_upload_alloc(rctx->uploader, 0,
-                              box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT),
-                              &offset, (struct pipe_resource**)&staging, (void**)&data);
+               struct r600_resource *staging;
 
+               staging = (struct r600_resource*) pipe_buffer_create(
+                               ctx->screen, PIPE_BIND_TRANSFER_READ, PIPE_USAGE_STAGING,
+                               box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT));
                if (staging) {
-                       data += box->x % R600_MAP_BUFFER_ALIGNMENT;
-
                        /* Copy the VRAM buffer to the staging buffer. */
                        rctx->dma_copy(ctx, &staging->b.b, 0,
-                                      offset + box->x % R600_MAP_BUFFER_ALIGNMENT,
+                                      box->x % R600_MAP_BUFFER_ALIGNMENT,
                                       0, 0, resource, level, box);
 
-                       /* Just do the synchronization. The buffer is mapped already. */
-                       r600_buffer_map_sync_with_rings(rctx, staging, PIPE_TRANSFER_READ);
+                       data = r600_buffer_map_sync_with_rings(rctx, staging, PIPE_TRANSFER_READ);
+                       data += box->x % R600_MAP_BUFFER_ALIGNMENT;
 
                        return r600_buffer_get_transfer(ctx, resource, level, usage, box,
-                                                       ptransfer, data, staging, offset);
+                                                       ptransfer, data, staging, 0);
                }
        }