From: Marek Olšák <marek.ol...@amd.com>

We want cached GTT for all non-persistent read mappings.
Set level = 0 on purpose.

Use dma_copy, because resource_copy_region causes a failure in the PBO
read of piglit/getteximage-luminance.

If Rocket League used the READ flag, it should get cached GTT.

Cc: 13.0 17.0 <mesa-sta...@lists.freedesktop.org>
---
 src/gallium/drivers/radeon/r600_buffer_common.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c 
b/src/gallium/drivers/radeon/r600_buffer_common.c
index da6f020..11d2319 100644
--- a/src/gallium/drivers/radeon/r600_buffer_common.c
+++ b/src/gallium/drivers/radeon/r600_buffer_common.c
@@ -374,38 +374,38 @@ static void *r600_buffer_transfer_map(struct pipe_context 
*ctx,
                        if (staging) {
                                data += box->x % R600_MAP_BUFFER_ALIGNMENT;
                                return r600_buffer_get_transfer(ctx, resource, 
level, usage, box,
                                                                ptransfer, 
data, staging, offset);
                        }
                } else {
                        /* At this point, the buffer is always idle (we checked 
it above). */
                        usage |= PIPE_TRANSFER_UNSYNCHRONIZED;
                }
        }
-       /* Using a staging buffer in GTT for larger reads is much faster. */
+       /* Use a staging buffer in cached GTT for reads. */
        else if ((usage & PIPE_TRANSFER_READ) &&
-                !(usage & (PIPE_TRANSFER_WRITE |
-                           PIPE_TRANSFER_PERSISTENT)) &&
-                rbuffer->domains & RADEON_DOMAIN_VRAM &&
+                !(usage & PIPE_TRANSFER_PERSISTENT) &&
+                (rbuffer->domains & RADEON_DOMAIN_VRAM ||
+                 rbuffer->flags & RADEON_FLAG_GTT_WC) &&
                 r600_can_dma_copy_buffer(rctx, 0, box->x, box->width)) {
                struct r600_resource *staging;
 
                staging = (struct r600_resource*) pipe_buffer_create(
                                ctx->screen, 0, PIPE_USAGE_STAGING,
                                box->width + (box->x % 
R600_MAP_BUFFER_ALIGNMENT));
                if (staging) {
                        /* Copy the VRAM buffer to the staging buffer. */
-                       ctx->resource_copy_region(ctx, &staging->b.b, 0,
-                                                 box->x % 
R600_MAP_BUFFER_ALIGNMENT,
-                                                 0, 0, resource, level, box);
+                       rctx->dma_copy(ctx, &staging->b.b, 0,
+                                      box->x % R600_MAP_BUFFER_ALIGNMENT,
+                                      0, 0, resource, 0, box);
 
-                       data = r600_buffer_map_sync_with_rings(rctx, staging, 
PIPE_TRANSFER_READ);
+                       data = r600_buffer_map_sync_with_rings(rctx, staging, 
usage);
                        if (!data) {
                                r600_resource_reference(&staging, NULL);
                                return NULL;
                        }
                        data += box->x % R600_MAP_BUFFER_ALIGNMENT;
 
                        return r600_buffer_get_transfer(ctx, resource, level, 
usage, box,
                                                        ptransfer, data, 
staging, 0);
                }
        }
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to