From 06b9660baf49a69d69fb0f299277fccd12e05fd8 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 24 Mar 2026 11:53:55 +0000 Subject: [PATCH] radv: move radv_shader_create out of radv_compute_pipeline_compile Signed-off-by: Rhys Perry Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_pipeline_compute.c | 46 ++++++++++++-------------- src/amd/vulkan/radv_pipeline_compute.h | 8 ++--- src/amd/vulkan/radv_shader_object.c | 5 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_compute.c b/src/amd/vulkan/radv_pipeline_compute.c index 0db1542f9ec..27a8e308112 100644 --- a/src/amd/vulkan/radv_pipeline_compute.c +++ b/src/amd/vulkan/radv_pipeline_compute.c @@ -88,16 +88,13 @@ radv_compute_pipeline_init(struct radv_compute_pipeline *pipeline, const struct pipeline->base.dynamic_offset_count = layout->dynamic_offset_count; } -struct radv_shader * -radv_compile_cs(struct radv_device *device, struct vk_pipeline_cache *cache, struct radv_shader_stage *cs_stage, - bool keep_executable_info, bool keep_statistic_info, bool is_internal, bool skip_shaders_cache, - struct radv_shader_binary **cs_binary) +struct radv_shader_binary * +radv_compile_cs(struct radv_device *device, struct radv_shader_stage *cs_stage, bool keep_executable_info, + bool keep_statistic_info, bool is_internal, struct radv_shader_debug_info *dbg) { struct radv_physical_device *pdev = radv_device_physical(device); struct radv_instance *instance = radv_physical_device_instance(pdev); - struct radv_shader *cs_shader; - /* Compile SPIR-V shader to NIR. */ cs_stage->nir = radv_shader_spirv_to_nir(device, cs_stage, NULL, is_internal); @@ -116,10 +113,10 @@ radv_compile_cs(struct radv_device *device, struct vk_pipeline_cache *cache, str /* Postprocess NIR. */ radv_postprocess_nir(device, NULL, cs_stage); - bool dump_shader = radv_can_dump_shader(device, cs_stage->nir); - bool dump_nir = dump_shader && (instance->debug_flags & RADV_DEBUG_DUMP_NIR); + dbg->dump_shader = radv_can_dump_shader(device, cs_stage->nir); + bool dump_nir = dbg->dump_shader && (instance->debug_flags & RADV_DEBUG_DUMP_NIR); - if (dump_shader) { + if (dbg->dump_shader) { simple_mtx_lock(&instance->shader_dump_mtx); if (dump_nir) { @@ -128,33 +125,31 @@ radv_compile_cs(struct radv_device *device, struct vk_pipeline_cache *cache, str } /* Compile NIR shader to AMD assembly. */ - *cs_binary = + struct radv_shader_binary *cs_binary = radv_shader_nir_to_asm(device, cs_stage, &cs_stage->nir, 1, NULL, keep_executable_info, keep_statistic_info); /* Dump NIR after nir_to_asm, because ACO modifies it. */ char *nir_string = NULL; - if (keep_executable_info || dump_shader) + if (keep_executable_info || dbg->dump_shader) nir_string = radv_dump_nir_shaders(instance, &cs_stage->nir, 1); - cs_shader = radv_shader_create(device, cache, *cs_binary, skip_shaders_cache || dump_shader, NULL); - radv_parse_binary_debug_info(device, *cs_binary, &cs_shader->dbg); + radv_parse_binary_debug_info(device, cs_binary, dbg); - cs_shader->dbg.nir_string = nir_string; - cs_shader->dbg.stages = 1 << MESA_SHADER_COMPUTE; - cs_shader->dbg.dump_shader = dump_shader; + dbg->nir_string = nir_string; + dbg->stages = 1 << MESA_SHADER_COMPUTE; - radv_shader_dump_asm(device, &cs_shader->dbg, &cs_stage->info); + radv_shader_dump_asm(device, dbg, &cs_stage->info); - if (dump_shader) + if (dbg->dump_shader) simple_mtx_unlock(&instance->shader_dump_mtx); if (keep_executable_info && cs_stage->spirv.size) { - cs_shader->dbg.spirv = malloc(cs_stage->spirv.size); - memcpy(cs_shader->dbg.spirv, cs_stage->spirv.data, cs_stage->spirv.size); - cs_shader->dbg.spirv_size = cs_stage->spirv.size; + dbg->spirv = malloc(cs_stage->spirv.size); + memcpy(dbg->spirv, cs_stage->spirv.data, cs_stage->spirv.size); + dbg->spirv_size = cs_stage->spirv.size; } - return cs_shader; + return cs_binary; } void @@ -181,7 +176,6 @@ radv_compute_pipeline_compile(const VkComputePipelineCreateInfo *pCreateInfo, st struct vk_pipeline_cache *cache, const VkPipelineShaderStageCreateInfo *pStage, const VkPipelineCreationFeedbackCreateInfo *creation_feedback) { - struct radv_shader_binary *cs_binary = NULL; bool keep_executable_info = radv_pipeline_capture_shaders(device, pipeline->base.create_flags); bool keep_statistic_info = radv_pipeline_capture_shader_stats(device, pipeline->base.create_flags); const bool skip_shaders_cache = radv_pipeline_skip_shaders_cache(device, &pipeline->base); @@ -216,9 +210,11 @@ radv_compute_pipeline_compile(const VkComputePipelineCreateInfo *pCreateInfo, st radv_pipeline_stage_init(pipeline->base.create_flags, pStage, pipeline_layout, &stage_key, &cs_stage); + struct radv_shader_debug_info cs_dbg = {}; + struct radv_shader_binary *cs_binary = radv_compile_cs(device, &cs_stage, keep_executable_info, keep_statistic_info, + pipeline->base.is_internal, &cs_dbg); pipeline->base.shaders[MESA_SHADER_COMPUTE] = - radv_compile_cs(device, cache, &cs_stage, keep_executable_info, keep_statistic_info, pipeline->base.is_internal, - skip_shaders_cache, &cs_binary); + radv_shader_create(device, cache, cs_binary, skip_shaders_cache, &cs_dbg); cs_stage.feedback.duration += os_time_get_nano() - stage_start; diff --git a/src/amd/vulkan/radv_pipeline_compute.h b/src/amd/vulkan/radv_pipeline_compute.h index 4751d48911d..e6754615ce5 100644 --- a/src/amd/vulkan/radv_pipeline_compute.h +++ b/src/amd/vulkan/radv_pipeline_compute.h @@ -15,6 +15,7 @@ struct radv_physical_device; struct radv_shader_binary; +struct radv_shader_debug_info; struct radv_shader_info; struct radv_compute_pipeline { @@ -39,10 +40,9 @@ void radv_get_compute_shader_metadata(const struct radv_device *device, const st void radv_compute_pipeline_init(struct radv_compute_pipeline *pipeline, const struct radv_pipeline_layout *layout, struct radv_shader *shader); -struct radv_shader *radv_compile_cs(struct radv_device *device, struct vk_pipeline_cache *cache, - struct radv_shader_stage *cs_stage, bool keep_executable_info, - bool keep_statistic_info, bool is_internal, bool skip_shaders_cache, - struct radv_shader_binary **cs_binary); +struct radv_shader_binary *radv_compile_cs(struct radv_device *device, struct radv_shader_stage *cs_stage, + bool keep_executable_info, bool keep_statistic_info, bool is_internal, + struct radv_shader_debug_info *dbg); VkResult radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache, const VkComputePipelineCreateInfo *pCreateInfo, diff --git a/src/amd/vulkan/radv_shader_object.c b/src/amd/vulkan/radv_shader_object.c index 529cc073676..c4b0452c49e 100644 --- a/src/amd/vulkan/radv_shader_object.c +++ b/src/amd/vulkan/radv_shader_object.c @@ -231,12 +231,13 @@ static VkResult radv_shader_object_init_compute(struct radv_shader_object *shader_obj, struct radv_device *device, const VkShaderCreateInfoEXT *pCreateInfo) { - struct radv_shader_binary *cs_binary; struct radv_shader_stage stage = {0}; radv_shader_stage_init(pCreateInfo, &stage); - struct radv_shader *cs_shader = radv_compile_cs(device, NULL, &stage, false, false, false, true, &cs_binary); + struct radv_shader_debug_info cs_dbg = {}; + struct radv_shader_binary *cs_binary = radv_compile_cs(device, &stage, false, false, false, &cs_dbg); + struct radv_shader *cs_shader = radv_shader_create(device, NULL, cs_binary, true, &cs_dbg); ralloc_free(stage.nir);