From b31994cf67bc1a4f179fae394d3976a5f73ad877 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 2 Sep 2021 13:37:11 +0200 Subject: [PATCH] radv: fix determining the maximum number of waves that can use scratch This estimation was incorrect, the number of waves doesn't only depend of the number of VGPRs. Though, {SPI,COMPUTE}_TMPRING_SIZE.WAVES should limit the number of scratch waves in flight, not sure if limiting it really works. This fixes a GPU hang with an upcoming game, and this might also helps resolving some spurious random GPU hangs. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_pipeline.c | 2 +- src/amd/vulkan/radv_shader.c | 2 +- src/amd/vulkan/radv_shader.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 28bbc0952df..2f39744148d 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -254,7 +254,7 @@ radv_pipeline_init_scratch(const struct radv_device *device, struct radv_pipelin max_stage_waves = MIN2(max_stage_waves, 4 * device->physical_device->rad_info.num_good_compute_units * - (256 / pipeline->shaders[i]->config.num_vgprs)); + radv_get_max_waves(device, pipeline->shaders[i], i)); max_waves = MAX2(max_waves, max_stage_waves); } } diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index a8f63661576..69cce2e7948 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -1737,7 +1737,7 @@ radv_get_shader_name(struct radv_shader_info *info, gl_shader_stage stage) } unsigned -radv_get_max_waves(struct radv_device *device, struct radv_shader_variant *variant, +radv_get_max_waves(const struct radv_device *device, struct radv_shader_variant *variant, gl_shader_stage stage) { struct radeon_info *info = &device->physical_device->rad_info; diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 3a022d8140e..8e2bd8ae105 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -470,7 +470,7 @@ struct radv_shader_variant *radv_create_trap_handler_shader(struct radv_device * void radv_shader_variant_destroy(struct radv_device *device, struct radv_shader_variant *variant); -unsigned radv_get_max_waves(struct radv_device *device, struct radv_shader_variant *variant, +unsigned radv_get_max_waves(const struct radv_device *device, struct radv_shader_variant *variant, gl_shader_stage stage); const char *radv_get_shader_name(struct radv_shader_info *info, gl_shader_stage stage);