gallium/radeon: relax requirements on VRAM placements on APUs
authorMarek Olšák <marek.olsak@amd.com>
Mon, 11 Apr 2016 17:56:07 +0000 (19:56 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 12 Apr 2016 12:29:48 +0000 (14:29 +0200)
This makes Tonga with vramlimit=128 2x faster in Heaven.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
src/gallium/drivers/radeon/r600_buffer_common.c
src/gallium/drivers/radeon/radeon_winsys.h
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c

index 0f892c0e6e4b9ac0b77e138890eac931a17d9c32..ae4b57904f4e8b55119069a57b45960e3756729d 100644 (file)
@@ -163,6 +163,14 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
                flags |= RADEON_FLAG_NO_CPU_ACCESS;
        }
 
+       /* If VRAM is just stolen system memory, allow both VRAM and GTT,
+        * whichever has free space. If a buffer is evicted from VRAM to GTT,
+        * it will stay there.
+        */
+       if (!rscreen->info.has_dedicated_vram &&
+           res->domains == RADEON_DOMAIN_VRAM)
+               res->domains = RADEON_DOMAIN_VRAM_GTT;
+
        if (rscreen->debug_flags & DBG_NO_WC)
                flags &= ~RADEON_FLAG_GTT_WC;
 
index 743dbd1fb462a8fe56b4622867d799bcfbf7ff01..0c03652081c9543d224fa11e624201fb5382b3bf 100644 (file)
@@ -245,6 +245,7 @@ struct radeon_info {
     enum chip_class             chip_class;
     uint64_t                    gart_size;
     uint64_t                    vram_size;
+    bool                        has_dedicated_vram;
     boolean                     has_virtual_memory;
     bool                        gfx_ib_pad_with_type2;
     boolean                     has_sdma;
index 87d9a6aebecb39cf7b44733bfd02abc18c50a122..1177d3e3c3ae91839c7dfce4f8e6c15052885424 100644 (file)
@@ -256,6 +256,10 @@ static boolean do_winsys_init(struct amdgpu_winsys *ws, int fd)
       goto fail;
    }
 
+   /* Set which chips have dedicated VRAM. */
+   ws->info.has_dedicated_vram =
+      !(ws->amdinfo.ids_flags & AMDGPU_IDS_FLAGS_FUSION);
+
    /* Set hardware information. */
    ws->info.gart_size = gtt.heap_size;
    ws->info.vram_size = vram.heap_size;
index 1accc6a1863900fbbde0b27b5a6438aa80d6a246..2d9ec8cee0939d9c7f41d5c6f58171da7657ce31 100644 (file)
@@ -297,6 +297,30 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
         break;
     }
 
+    /* Set which chips don't have dedicated VRAM. */
+    switch (ws->info.family) {
+    case CHIP_RS400:
+    case CHIP_RC410:
+    case CHIP_RS480:
+    case CHIP_RS600:
+    case CHIP_RS690:
+    case CHIP_RS740:
+    case CHIP_RS780:
+    case CHIP_RS880:
+    case CHIP_PALM:
+    case CHIP_SUMO:
+    case CHIP_SUMO2:
+    case CHIP_ARUBA:
+    case CHIP_KAVERI:
+    case CHIP_KABINI:
+    case CHIP_MULLINS:
+       ws->info.has_dedicated_vram = false;
+       break;
+
+    default:
+       ws->info.has_dedicated_vram = true;
+    }
+
     /* Check for dma */
     ws->info.has_sdma = FALSE;
     /* DMA is disabled on R700. There is IB corruption and hangs. */