radv/rt: introduce and set rt_pipeline->stack_size
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21159>
This commit is contained in:
committed by
Marge Bot
parent
b338d59047
commit
2649a1f272
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user