From 546442a751cd6a8bcfcd1e87dd700ce59110e42e Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 10 Jun 2026 16:25:56 +0100 Subject: [PATCH] radv: rework creation of traveral radv_shader_stage_key It doesn't make sense to use a key from a random intersection shader. fossil-db (gfx1201): Totals from 3 (0.00% of 210263) affected shaders: Instrs: 9728 -> 10024 (+3.04%) CodeSize: 60140 -> 60012 (-0.21%) Latency: 95724 -> 95905 (+0.19%) InvThroughput: 15015 -> 15044 (+0.19%) VALU: 2985 -> 2997 (+0.40%) VMEM: 345 -> 429 (+24.35%) VOPD: 307 -> 323 (+5.21%) Signed-off-by: Rhys Perry Reviewed-by: Konstantin Seurer Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_pipeline_rt.c | 64 +++++++++++++++++-------------- src/amd/vulkan/radv_pipeline_rt.h | 5 --- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c index 24a4b90895d..7882d660df4 100644 --- a/src/amd/vulkan/radv_pipeline_rt.c +++ b/src/amd/vulkan/radv_pipeline_rt.c @@ -75,6 +75,36 @@ handle_from_stages(struct radv_device *device, const unsigned char *shader_blake return ret; } +static struct radv_shader_stage_key +radv_generate_traversal_shader_key(const struct radv_device *device, + const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, + const struct radv_ray_tracing_pipeline *pipeline, bool inline_any_hit_shaders) +{ + VkPipelineCreateFlags2 create_flags = vk_rt_pipeline_create_flags(pCreateInfo); + VkPipelineShaderStageCreateInfo stage = {0}; + stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + stage.pNext = NULL; + stage.stage = VK_SHADER_STAGE_RAYGEN_BIT_KHR; + struct radv_shader_stage_key key = + radv_pipeline_get_shader_key(&device->compiler_info, &stage, create_flags, pCreateInfo->pNext); + + if (inline_any_hit_shaders) { + for (uint32_t idx = 0; idx < pipeline->group_count; idx++) { + if (pipeline->groups[idx].type == VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR) + continue; + + uint32_t ahit_idx = pipeline->groups[idx].any_hit_shader; + uint32_t isec_idx = pipeline->groups[idx].intersection_shader; + if (ahit_idx != VK_SHADER_UNUSED_KHR) + radv_merge_shader_stage_key(&key, &pipeline->stages[ahit_idx].key); + if (isec_idx != VK_SHADER_UNUSED_KHR) + radv_merge_shader_stage_key(&key, &pipeline->stages[isec_idx].key); + } + } + + return key; +} + static VkResult radv_create_group_handles(struct radv_device *device, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, const struct radv_ray_tracing_stage *stages, struct radv_ray_tracing_group *groups) @@ -240,24 +270,16 @@ radv_rt_fill_group_info(struct radv_device *device, const VkRayTracingPipelineCr static void radv_rt_fill_stage_info(const struct radv_device *device, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, - struct radv_ray_tracing_stage *stages, struct radv_ray_tracing_state_key *rt_state) + struct radv_ray_tracing_stage *stages) { VkPipelineCreateFlags2 create_flags = vk_rt_pipeline_create_flags(pCreateInfo); - rt_state->traversal_stage_key.keep_statistic_info = - radv_pipeline_capture_shader_stats(&device->compiler_info, create_flags); - rt_state->traversal_stage_key.keep_executable_info = - radv_pipeline_capture_shaders(&device->compiler_info, create_flags); - uint32_t idx; for (idx = 0; idx < pCreateInfo->stageCount; idx++) { const VkPipelineShaderStageCreateInfo *stage = &pCreateInfo->pStages[idx]; stages[idx].key = radv_pipeline_get_shader_key(&device->compiler_info, stage, create_flags, pCreateInfo->pNext); stages[idx].stage = vk_to_mesa_shader_stage(stage->stage); stages[idx].needs_nir = true; - - if (stages[idx].stage == MESA_SHADER_INTERSECTION) - rt_state->traversal_stage_key = stages[idx].key; } if (pCreateInfo->pLibraryInfo) { @@ -277,13 +299,6 @@ radv_rt_fill_stage_info(const struct radv_device *device, const VkRayTracingPipe memcpy(stages[idx].blake3, library_pipeline->stages[j].blake3, BLAKE3_KEY_LEN); idx++; } - - /* apply shader robustness from merged shaders */ - if (library_pipeline->traversal_storage_robustness2) - rt_state->traversal_stage_key.storage_robustness2 = true; - - if (library_pipeline->traversal_uniform_robustness2) - rt_state->traversal_stage_key.uniform_robustness2 = true; } } } @@ -673,7 +688,7 @@ static VkResult radv_rt_compile_shaders(struct radv_device *device, struct vk_pipeline_cache *cache, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, const VkPipelineCreationFeedbackCreateInfo *creation_feedback, - const struct radv_ray_tracing_state_key *rt_state, struct radv_ray_tracing_pipeline *pipeline, + struct radv_ray_tracing_pipeline *pipeline, struct radv_serialized_shader_arena_block *capture_replay_handles, bool skip_shaders_cache) { VK_FROM_HANDLE(radv_pipeline_layout, pipeline_layout, pCreateInfo->layout); @@ -932,7 +947,7 @@ radv_rt_compile_shaders(struct radv_device *device, struct vk_pipeline_cache *ca struct radv_shader_stage traversal_stage = { .stage = MESA_SHADER_INTERSECTION, .nir = traversal_nir, - .key = rt_state->traversal_stage_key, + .key = radv_generate_traversal_shader_key(device, pCreateInfo, pipeline, inline_any_hit_shaders), }; radv_shader_layout_init(pipeline_layout, MESA_SHADER_INTERSECTION, &traversal_stage.layout); result = radv_rt_compile_nir(device, cache, pipeline, recursive_lowering_mode, &traversal_stage, &payload_size, @@ -1188,8 +1203,8 @@ radv_rt_pipeline_compile(struct radv_device *device, const VkRayTracingPipelineC goto done; } - result = radv_rt_compile_shaders(device, cache, pCreateInfo, creation_feedback, rt_state, pipeline, - capture_replay_blocks, skip_shaders_cache); + result = radv_rt_compile_shaders(device, cache, pCreateInfo, creation_feedback, pipeline, capture_replay_blocks, + skip_shaders_cache); if (result != VK_SUCCESS) return result; @@ -1246,7 +1261,7 @@ radv_generate_ray_tracing_state_key(struct radv_device *device, const VkRayTraci } /* Initialize stages/groups info. */ - radv_rt_fill_stage_info(device, pCreateInfo, rt_state->stages, rt_state); + radv_rt_fill_stage_info(device, pCreateInfo, rt_state->stages); VkPipelineCreateFlags2 create_flags = vk_rt_pipeline_create_flags(pCreateInfo); radv_init_rt_stage_hashes(device, create_flags, pCreateInfo, rt_state->stages); @@ -1361,13 +1376,6 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache, const VkRayTra memcpy(pipeline->stages, rt_state.stages, rt_state.stage_count * sizeof(struct radv_ray_tracing_stage)); memcpy(pipeline->groups, rt_state.groups, rt_state.group_count * sizeof(struct radv_ray_tracing_group)); - /* cache robustness state for making merged shaders */ - if (rt_state.traversal_stage_key.storage_robustness2) - pipeline->traversal_storage_robustness2 = true; - - if (rt_state.traversal_stage_key.uniform_robustness2) - pipeline->traversal_uniform_robustness2 = true; - result = radv_rt_init_capture_replay(device, pCreateInfo, stages, pipeline->groups, capture_replay_blocks); if (result != VK_SUCCESS) goto fail; diff --git a/src/amd/vulkan/radv_pipeline_rt.h b/src/amd/vulkan/radv_pipeline_rt.h index 5547ab517a5..6f800629a1d 100644 --- a/src/amd/vulkan/radv_pipeline_rt.h +++ b/src/amd/vulkan/radv_pipeline_rt.h @@ -29,10 +29,6 @@ struct radv_ray_tracing_pipeline { uint32_t stack_size; uint32_t traversal_stack_size; - - /* set if any shaders from this pipeline require robustness2 in the merged traversal shader */ - bool traversal_storage_robustness2 : 1; - bool traversal_uniform_robustness2 : 1; }; RADV_DECL_PIPELINE_DOWNCAST(ray_tracing, RADV_PIPELINE_RAY_TRACING) @@ -111,7 +107,6 @@ struct radv_ray_tracing_stage { struct radv_ray_tracing_state_key { uint32_t stage_count; struct radv_ray_tracing_stage *stages; - struct radv_shader_stage_key traversal_stage_key; uint32_t group_count; struct radv_ray_tracing_group *groups;