radeon: use staging for mapping linear textures
authorGrigori Goronzy <greg@chown.ath.cx>
Sun, 13 Oct 2013 16:08:44 +0000 (18:08 +0200)
committerChristian König <christian.koenig@amd.com>
Sun, 13 Oct 2013 18:09:34 +0000 (20:09 +0200)
Textures that likely reside in VRAM, are mapped for reading and
don't require direct mapping should be staged into GTT, to avoid bad
performance. This fixes readback performance of VDPAU surfaces.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_texture.c

index ebb7090697d7577a10295a5ddc680200d9ec82c3..9ba1e363e27e78137bb6b79b20b8b8e0e861b956 100644 (file)
@@ -852,6 +852,12 @@ static void *r600_texture_transfer_map(struct pipe_context *ctx,
        if (rtex->surface.level[level].mode >= RADEON_SURF_MODE_1D)
                use_staging_texture = TRUE;
 
+       /* Untiled buffers in VRAM, which is slow for CPU reads */
+       if ((usage & PIPE_TRANSFER_READ) && !(usage & PIPE_TRANSFER_MAP_DIRECTLY) &&
+           (rtex->resource.domains == RADEON_DOMAIN_VRAM)) {
+               use_staging_texture = TRUE;
+       }
+
        /* Use a staging texture for uploads if the underlying BO is busy. */
        if (!(usage & PIPE_TRANSFER_READ) &&
            (r600_rings_is_buffer_referenced(rctx, rtex->resource.cs_buf, RADEON_USAGE_READWRITE) ||