radv/winsys: always allow GTT placements on APUs
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 30 Apr 2020 18:47:46 +0000 (20:47 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 20 Jul 2020 11:41:07 +0000 (11:41 +0000)
When the VRAM size is small and the preferred heap only VRAM,
the kernel tries to always honor the requested heap and it does
a ton of evictions which is a disaster for performance.

On APUs, VRAM and GTT have similar performance, so allow the
kernel to choose the best placement (GTT or VRAM) itself.

This gives a huge performance boost with Doom Eternal on RAVEN.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5665>

src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c

index 5afb274f1e66af67c8d32a0b38a45505407890cb..2d153873bfd3655c6c8a1e608f27761ec2620b3d 100644 (file)
@@ -379,8 +379,19 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws,
        request.alloc_size = size;
        request.phys_alignment = alignment;
 
-       if (initial_domain & RADEON_DOMAIN_VRAM)
+       if (initial_domain & RADEON_DOMAIN_VRAM) {
                request.preferred_heap |= AMDGPU_GEM_DOMAIN_VRAM;
+
+               /* Since VRAM and GTT have almost the same performance on
+                * APUs, we could just set GTT. However, in order to decrease
+                * GTT(RAM) usage, which is shared with the OS, allow VRAM
+                * placements too. The idea is not to use VRAM usefully, but
+                * to use it so that it's not unused and wasted.
+                */
+               if (!ws->info.has_dedicated_vram)
+                       request.preferred_heap |= AMDGPU_GEM_DOMAIN_GTT;
+       }
+
        if (initial_domain & RADEON_DOMAIN_GTT)
                request.preferred_heap |= AMDGPU_GEM_DOMAIN_GTT;
        if (initial_domain & RADEON_DOMAIN_GDS)