Mesa (main): radv: Use larger arena sizes.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Feb 11 23:44:20 UTC 2022


Module: Mesa
Branch: main
Commit: 7adb3c0f7f96f2c95f903de5a59815e772061b63
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7adb3c0f7f96f2c95f903de5a59815e772061b63

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Tue Jan 18 11:42:28 2022 +0100

radv: Use larger arena sizes.

For some games that take like 400 MiB of shader binaries, the
number of shader arenas ends up going >1500. Cut that down a bit
by using larger arenas.

8 MiB should still be decent with small BAR and should still cut
things down from ~1500 to ~50 buffers.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14591>

---

 src/amd/vulkan/radv_constants.h | 2 ++
 src/amd/vulkan/radv_private.h   | 1 +
 src/amd/vulkan/radv_shader.c    | 6 +++++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_constants.h b/src/amd/vulkan/radv_constants.h
index 9cc911eb8d5..5787f042316 100644
--- a/src/amd/vulkan/radv_constants.h
+++ b/src/amd/vulkan/radv_constants.h
@@ -99,6 +99,8 @@
 
 #define RADV_SHADER_ALLOC_ALIGNMENT      256
 #define RADV_SHADER_ALLOC_MIN_ARENA_SIZE (256 * 1024)
+/* 256 KiB << 5 = 8 MiB */
+#define RADV_SHADER_ALLOC_MAX_ARENA_SIZE_SHIFT 5u
 #define RADV_SHADER_ALLOC_MIN_SIZE_CLASS 8
 #define RADV_SHADER_ALLOC_MAX_SIZE_CLASS 15
 #define RADV_SHADER_ALLOC_NUM_FREE_LISTS                                                           \
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 7c7d90e749b..7a56d08f5ec 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -798,6 +798,7 @@ struct radv_device {
    uint32_t fmask_mrt_offset_counter;
 
    struct list_head shader_arenas;
+   unsigned shader_arena_shift;
    uint8_t shader_free_list_mask;
    struct list_head shader_free_lists[RADV_SHADER_ALLOC_NUM_FREE_LISTS];
    struct list_head shader_block_obj_pool;
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index e951c772378..f915d947137 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -1299,7 +1299,10 @@ radv_alloc_shader_memory(struct radv_device *device, uint32_t size, void *ptr)
    if (!arena)
       goto fail;
 
-   unsigned arena_size = MAX2(RADV_SHADER_ALLOC_MIN_ARENA_SIZE, size);
+   unsigned arena_size =
+      MAX2(RADV_SHADER_ALLOC_MIN_ARENA_SIZE
+              << MIN2(RADV_SHADER_ALLOC_MAX_ARENA_SIZE_SHIFT, device->shader_arena_shift),
+           size);
    VkResult result = device->ws->buffer_create(
       device->ws, arena_size, RADV_SHADER_ALLOC_ALIGNMENT, RADEON_DOMAIN_VRAM,
       RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_32BIT |
@@ -1335,6 +1338,7 @@ radv_alloc_shader_memory(struct radv_device *device, uint32_t size, void *ptr)
       add_hole(device, hole);
    }
 
+   ++device->shader_arena_shift;
    list_addtail(&arena->list, &device->shader_arenas);
 
    mtx_unlock(&device->shader_arena_mutex);



More information about the mesa-commit mailing list