From: Daniel Schürmann Date: Tue, 14 Feb 2023 13:17:59 +0000 (+0100) Subject: radv/rt: introduce and set rt_pipeline->stack_size X-Git-Tag: upstream/23.3.3~13066 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2649a1f272cea69b73364d06a3dad21415921056;p=platform%2Fupstream%2Fmesa.git radv/rt: introduce and set rt_pipeline->stack_size Part-of: --- diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c index 7eadc06..01ba897 100644 --- a/src/amd/vulkan/radv_pipeline_rt.c +++ b/src/amd/vulkan/radv_pipeline_rt.c @@ -236,6 +236,63 @@ radv_rt_pipeline_has_dynamic_stack_size(const VkRayTracingPipelineCreateInfoKHR return false; } +unsigned +compute_rt_stack_size(const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, + const struct radv_pipeline_shader_stack_size *stack_sizes) +{ + unsigned raygen_size = 0; + unsigned callable_size = 0; + unsigned chit_size = 0; + unsigned miss_size = 0; + unsigned non_recursive_size = 0; + + for (unsigned i = 0; i < pCreateInfo->groupCount; ++i) { + non_recursive_size = MAX2(stack_sizes[i].non_recursive_size, non_recursive_size); + + const VkRayTracingShaderGroupCreateInfoKHR *group_info = &pCreateInfo->pGroups[i]; + uint32_t shader_id = VK_SHADER_UNUSED_KHR; + unsigned size = stack_sizes[i].recursive_size; + + switch (group_info->type) { + case VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR: + shader_id = group_info->generalShader; + break; + case VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR: + case VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR: + shader_id = group_info->closestHitShader; + break; + default: + break; + } + if (shader_id == VK_SHADER_UNUSED_KHR) + continue; + + const VkPipelineShaderStageCreateInfo *stage = &pCreateInfo->pStages[shader_id]; + switch (stage->stage) { + case VK_SHADER_STAGE_RAYGEN_BIT_KHR: + raygen_size = MAX2(raygen_size, size); + break; + case VK_SHADER_STAGE_MISS_BIT_KHR: + miss_size = MAX2(miss_size, size); + break; + case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR: + chit_size = MAX2(chit_size, size); + break; + case VK_SHADER_STAGE_CALLABLE_BIT_KHR: + callable_size = MAX2(callable_size, size); + break; + default: + unreachable("Invalid stage type in RT shader"); + } + } + return raygen_size + + MIN2(pCreateInfo->maxPipelineRayRecursionDepth, 1) * + MAX2(MAX2(chit_size, miss_size), non_recursive_size) + + MAX2(0, (int)(pCreateInfo->maxPipelineRayRecursionDepth) - 1) * + MAX2(chit_size, miss_size) + + 2 * callable_size; +} + static struct radv_pipeline_key radv_generate_rt_pipeline_key(const struct radv_ray_tracing_pipeline *pipeline, VkPipelineCreateFlags flags) @@ -339,6 +396,7 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache, } rt_pipeline->dynamic_stack_size = radv_rt_pipeline_has_dynamic_stack_size(pCreateInfo); + rt_pipeline->stack_size = compute_rt_stack_size(pCreateInfo, rt_pipeline->stack_sizes); /* For General and ClosestHit shaders, we can use the shader ID directly as handle. * As (potentially different) AnyHit shaders are inlined, for Intersection shaders diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 6850545..5ada65d 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1999,6 +1999,9 @@ uint32_t radv_get_hash_flags(const struct radv_device *device, bool stats); bool radv_rt_pipeline_has_dynamic_stack_size(const VkRayTracingPipelineCreateInfoKHR *pCreateInfo); +unsigned compute_rt_stack_size(const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, + const struct radv_pipeline_shader_stack_size *stack_sizes); + bool radv_enable_rt(const struct radv_physical_device *pdevice, bool rt_pipelines); bool radv_emulate_rt(const struct radv_physical_device *pdevice); @@ -2227,6 +2230,7 @@ struct radv_ray_tracing_pipeline { struct radv_pipeline_group_handle *group_handles; struct radv_pipeline_shader_stack_size *stack_sizes; uint32_t group_count; + uint32_t stack_size; bool dynamic_stack_size; }; diff --git a/src/amd/vulkan/radv_rt_shader.c b/src/amd/vulkan/radv_rt_shader.c index b8b8eb3..15da055 100644 --- a/src/amd/vulkan/radv_rt_shader.c +++ b/src/amd/vulkan/radv_rt_shader.c @@ -1438,63 +1438,6 @@ build_traversal_shader(struct radv_device *device, return b.shader; } -static unsigned -compute_rt_stack_size(const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, - const struct radv_pipeline_shader_stack_size *stack_sizes) -{ - unsigned raygen_size = 0; - unsigned callable_size = 0; - unsigned chit_size = 0; - unsigned miss_size = 0; - unsigned non_recursive_size = 0; - - for (unsigned i = 0; i < pCreateInfo->groupCount; ++i) { - non_recursive_size = MAX2(stack_sizes[i].non_recursive_size, non_recursive_size); - - const VkRayTracingShaderGroupCreateInfoKHR *group_info = &pCreateInfo->pGroups[i]; - uint32_t shader_id = VK_SHADER_UNUSED_KHR; - unsigned size = stack_sizes[i].recursive_size; - - switch (group_info->type) { - case VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR: - shader_id = group_info->generalShader; - break; - case VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR: - case VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR: - shader_id = group_info->closestHitShader; - break; - default: - break; - } - if (shader_id == VK_SHADER_UNUSED_KHR) - continue; - - const VkPipelineShaderStageCreateInfo *stage = &pCreateInfo->pStages[shader_id]; - switch (stage->stage) { - case VK_SHADER_STAGE_RAYGEN_BIT_KHR: - raygen_size = MAX2(raygen_size, size); - break; - case VK_SHADER_STAGE_MISS_BIT_KHR: - miss_size = MAX2(miss_size, size); - break; - case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR: - chit_size = MAX2(chit_size, size); - break; - case VK_SHADER_STAGE_CALLABLE_BIT_KHR: - callable_size = MAX2(callable_size, size); - break; - default: - unreachable("Invalid stage type in RT shader"); - } - } - return raygen_size + - MIN2(pCreateInfo->maxPipelineRayRecursionDepth, 1) * - MAX2(MAX2(chit_size, miss_size), non_recursive_size) + - MAX2(0, (int)(pCreateInfo->maxPipelineRayRecursionDepth) - 1) * - MAX2(chit_size, miss_size) + - 2 * callable_size; -} - static bool should_move_rt_instruction(nir_intrinsic_op intrinsic) {