r600g: fix abysmal performance in Reaction Quake
authorMarek Olšák <maraeo@gmail.com>
Wed, 31 Oct 2012 23:52:19 +0000 (00:52 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 1 Nov 2012 02:17:58 +0000 (03:17 +0100)
The problem was we set VRAM|GTT for relocations of STATIC resources.
Setting just VRAM increases the framerate 4 times on my machine.

I rewrote the switch statement and adjusted the domains for window
framebuffers too.

NOTE: This is a candidate for the stable branches.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_texture.c

index f4566eeb9aaed227121d369eda8745013cab6379..116ab51196f1c0fb9cf03870db9da905d7f00e8c 100644 (file)
@@ -206,29 +206,31 @@ bool r600_init_resource(struct r600_screen *rscreen,
 {
        uint32_t initial_domain, domains;
 
-       /* Staging resources particpate in transfers and blits only
-        * and are used for uploads and downloads from regular
-        * resources.  We generate them internally for some transfers.
-        */
-       if (usage == PIPE_USAGE_STAGING) {
+       switch(usage) {
+       case PIPE_USAGE_STAGING:
+               /* Staging resources participate in transfers, i.e. are used
+                * for uploads and downloads from regular resources.
+                * We generate them internally for some transfers.
+                */
+               initial_domain = RADEON_DOMAIN_GTT;
                domains = RADEON_DOMAIN_GTT;
+               break;
+       case PIPE_USAGE_DYNAMIC:
+       case PIPE_USAGE_STREAM:
+               /* Default to GTT, but allow the memory manager to move it to VRAM. */
                initial_domain = RADEON_DOMAIN_GTT;
-       } else {
                domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
-
-               switch(usage) {
-               case PIPE_USAGE_DYNAMIC:
-               case PIPE_USAGE_STREAM:
-               case PIPE_USAGE_STAGING:
-                       initial_domain = RADEON_DOMAIN_GTT;
-                       break;
-               case PIPE_USAGE_DEFAULT:
-               case PIPE_USAGE_STATIC:
-               case PIPE_USAGE_IMMUTABLE:
-               default:
-                       initial_domain = RADEON_DOMAIN_VRAM;
-                       break;
-               }
+               break;
+       case PIPE_USAGE_DEFAULT:
+       case PIPE_USAGE_STATIC:
+       case PIPE_USAGE_IMMUTABLE:
+       default:
+               /* Don't list GTT here, because the memory manager would put some
+                * resources to GTT no matter what the initial domain is.
+                * Not listing GTT in the domains improves performance a lot. */
+               initial_domain = RADEON_DOMAIN_VRAM;
+               domains = RADEON_DOMAIN_VRAM;
+               break;
        }
 
        res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment, bind, initial_domain);
index 785eeffcab5d83a47b7fc05cec3b929b666fb09b..2df390d50510c9efaf8e6a95c390e138cc72a5f2 100644 (file)
@@ -421,9 +421,10 @@ r600_texture_create_object(struct pipe_screen *screen,
                        return NULL;
                }
        } else if (buf) {
+               /* This is usually the window framebuffer. We want it in VRAM, always. */
                resource->buf = buf;
                resource->cs_buf = rscreen->ws->buffer_get_cs_handle(buf);
-               resource->domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
+               resource->domains = RADEON_DOMAIN_VRAM;
        }
 
        if (rtex->cmask_size) {