radv/rt: use precompiled stages to create RT shader
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22100>
This commit is contained in:

committed by
Marge Bot

parent
7836e32778
commit
8ec81a43cb
@@ -643,6 +643,13 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache,
|
|||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
goto pipeline_fail;
|
goto pipeline_fail;
|
||||||
|
|
||||||
|
struct radv_ray_tracing_stage *stages = calloc(local_create_info.stageCount, sizeof(*stages));
|
||||||
|
if (!stages) {
|
||||||
|
result = VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||||
|
goto pipeline_fail;
|
||||||
|
}
|
||||||
|
radv_rt_fill_stage_info(pCreateInfo, stages);
|
||||||
|
|
||||||
const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
|
const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
|
||||||
vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
|
vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
|
||||||
|
|
||||||
@@ -664,7 +671,11 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache,
|
|||||||
if (pCreateInfo->flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT)
|
if (pCreateInfo->flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT)
|
||||||
goto pipeline_fail;
|
goto pipeline_fail;
|
||||||
|
|
||||||
shader = create_rt_shader(device, &local_create_info, rt_pipeline->groups, &key);
|
result = radv_rt_precompile_shaders(device, cache, pCreateInfo, &key, stages);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
goto shader_fail;
|
||||||
|
|
||||||
|
shader = create_rt_shader(device, &local_create_info, stages, rt_pipeline->groups, &key);
|
||||||
module.nir = shader;
|
module.nir = shader;
|
||||||
result = radv_rt_pipeline_compile(rt_pipeline, pipeline_layout, device, cache, &key, &stage,
|
result = radv_rt_pipeline_compile(rt_pipeline, pipeline_layout, device, cache, &key, &stage,
|
||||||
pCreateInfo->flags, hash, creation_feedback,
|
pCreateInfo->flags, hash, creation_feedback,
|
||||||
@@ -688,8 +699,15 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache,
|
|||||||
radv_rmv_log_compute_pipeline_create(device, pCreateInfo->flags, &rt_pipeline->base.base, false);
|
radv_rmv_log_compute_pipeline_create(device, pCreateInfo->flags, &rt_pipeline->base.base, false);
|
||||||
|
|
||||||
*pPipeline = radv_pipeline_to_handle(&rt_pipeline->base.base);
|
*pPipeline = radv_pipeline_to_handle(&rt_pipeline->base.base);
|
||||||
|
|
||||||
shader_fail:
|
shader_fail:
|
||||||
|
for (unsigned i = 0; stages && i < local_create_info.stageCount; i++) {
|
||||||
|
if (stages[i].shader)
|
||||||
|
vk_pipeline_cache_object_unref(&device->vk, stages[i].shader);
|
||||||
|
}
|
||||||
ralloc_free(shader);
|
ralloc_free(shader);
|
||||||
|
free(stages);
|
||||||
|
|
||||||
pipeline_fail:
|
pipeline_fail:
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
radv_pipeline_destroy(device, &rt_pipeline->base.base, pAllocator);
|
radv_pipeline_destroy(device, &rt_pipeline->base.base, pAllocator);
|
||||||
|
@@ -1190,6 +1190,7 @@ struct traversal_data {
|
|||||||
nir_variable *barycentrics;
|
nir_variable *barycentrics;
|
||||||
|
|
||||||
struct radv_ray_tracing_group *groups;
|
struct radv_ray_tracing_group *groups;
|
||||||
|
struct radv_ray_tracing_stage *stages;
|
||||||
const struct radv_pipeline_key *key;
|
const struct radv_pipeline_key *key;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1226,8 +1227,9 @@ visit_any_hit_shaders(struct radv_device *device,
|
|||||||
if (is_dup)
|
if (is_dup)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const VkPipelineShaderStageCreateInfo *stage = &pCreateInfo->pStages[shader_id];
|
nir_shader *nir_stage =
|
||||||
nir_shader *nir_stage = radv_parse_rt_stage(device, stage, data->key);
|
radv_pipeline_cache_handle_to_nir(device, data->stages[shader_id].shader);
|
||||||
|
assert(nir_stage);
|
||||||
|
|
||||||
insert_rt_case(b, nir_stage, vars, sbt_idx, 0, data->groups[i].handle.any_hit_index,
|
insert_rt_case(b, nir_stage, vars, sbt_idx, 0, data->groups[i].handle.any_hit_index,
|
||||||
shader_id, data->groups);
|
shader_id, data->groups);
|
||||||
@@ -1363,13 +1365,15 @@ handle_candidate_aabb(nir_builder *b, struct radv_leaf_intersection *intersectio
|
|||||||
if (is_dup)
|
if (is_dup)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const VkPipelineShaderStageCreateInfo *stage = &data->createInfo->pStages[shader_id];
|
nir_shader *nir_stage =
|
||||||
nir_shader *nir_stage = radv_parse_rt_stage(data->device, stage, data->key);
|
radv_pipeline_cache_handle_to_nir(data->device, data->stages[shader_id].shader);
|
||||||
|
assert(nir_stage);
|
||||||
|
|
||||||
nir_shader *any_hit_stage = NULL;
|
nir_shader *any_hit_stage = NULL;
|
||||||
if (any_hit_shader_id != VK_SHADER_UNUSED_KHR) {
|
if (any_hit_shader_id != VK_SHADER_UNUSED_KHR) {
|
||||||
stage = &data->createInfo->pStages[any_hit_shader_id];
|
any_hit_stage =
|
||||||
any_hit_stage = radv_parse_rt_stage(data->device, stage, data->key);
|
radv_pipeline_cache_handle_to_nir(data->device, data->stages[any_hit_shader_id].shader);
|
||||||
|
assert(any_hit_stage);
|
||||||
|
|
||||||
nir_lower_intersection_shader(nir_stage, any_hit_stage);
|
nir_lower_intersection_shader(nir_stage, any_hit_stage);
|
||||||
ralloc_free(any_hit_stage);
|
ralloc_free(any_hit_stage);
|
||||||
@@ -1421,7 +1425,7 @@ load_stack_entry(nir_builder *b, nir_ssa_def *index, const struct radv_ray_trave
|
|||||||
}
|
}
|
||||||
|
|
||||||
static nir_shader *
|
static nir_shader *
|
||||||
build_traversal_shader(struct radv_device *device,
|
build_traversal_shader(struct radv_device *device, struct radv_ray_tracing_stage *stages,
|
||||||
const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
||||||
struct radv_ray_tracing_group *groups, const struct radv_pipeline_key *key)
|
struct radv_ray_tracing_group *groups, const struct radv_pipeline_key *key)
|
||||||
{
|
{
|
||||||
@@ -1515,6 +1519,7 @@ build_traversal_shader(struct radv_device *device,
|
|||||||
.trav_vars = &trav_vars,
|
.trav_vars = &trav_vars,
|
||||||
.barycentrics = barycentrics,
|
.barycentrics = barycentrics,
|
||||||
.groups = groups,
|
.groups = groups,
|
||||||
|
.stages = stages,
|
||||||
.key = key,
|
.key = key,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1619,7 +1624,8 @@ move_rt_instructions(nir_shader *shader)
|
|||||||
|
|
||||||
nir_shader *
|
nir_shader *
|
||||||
create_rt_shader(struct radv_device *device, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
create_rt_shader(struct radv_device *device, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
||||||
struct radv_ray_tracing_group *groups, const struct radv_pipeline_key *key)
|
struct radv_ray_tracing_stage *stages, struct radv_ray_tracing_group *groups,
|
||||||
|
const struct radv_pipeline_key *key)
|
||||||
{
|
{
|
||||||
nir_builder b = radv_meta_init_shader(device, MESA_SHADER_RAYGEN, "rt_combined");
|
nir_builder b = radv_meta_init_shader(device, MESA_SHADER_RAYGEN, "rt_combined");
|
||||||
b.shader->info.internal = false;
|
b.shader->info.internal = false;
|
||||||
@@ -1635,7 +1641,7 @@ create_rt_shader(struct radv_device *device, const VkRayTracingPipelineCreateInf
|
|||||||
nir_ssa_def *idx = nir_load_var(&b, vars.idx);
|
nir_ssa_def *idx = nir_load_var(&b, vars.idx);
|
||||||
|
|
||||||
/* Insert traversal shader */
|
/* Insert traversal shader */
|
||||||
nir_shader *traversal = build_traversal_shader(device, pCreateInfo, groups, key);
|
nir_shader *traversal = build_traversal_shader(device, stages, pCreateInfo, groups, key);
|
||||||
b.shader->info.shared_size = MAX2(b.shader->info.shared_size, traversal->info.shared_size);
|
b.shader->info.shared_size = MAX2(b.shader->info.shared_size, traversal->info.shared_size);
|
||||||
assert(b.shader->info.shared_size <= 32768);
|
assert(b.shader->info.shared_size <= 32768);
|
||||||
insert_rt_case(&b, traversal, &vars, idx, 0, 1, -1u, groups);
|
insert_rt_case(&b, traversal, &vars, idx, 0, 1, -1u, groups);
|
||||||
@@ -1657,13 +1663,12 @@ create_rt_shader(struct radv_device *device, const VkRayTracingPipelineCreateInf
|
|||||||
if (is_dup)
|
if (is_dup)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const VkPipelineShaderStageCreateInfo *stage = &pCreateInfo->pStages[stage_idx];
|
nir_shader *nir_stage = radv_pipeline_cache_handle_to_nir(device, stages[stage_idx].shader);
|
||||||
ASSERTED gl_shader_stage type = vk_to_mesa_shader_stage(stage->stage);
|
assert(nir_stage);
|
||||||
|
ASSERTED gl_shader_stage type = nir_stage->info.stage;
|
||||||
assert(type == MESA_SHADER_RAYGEN || type == MESA_SHADER_CALLABLE ||
|
assert(type == MESA_SHADER_RAYGEN || type == MESA_SHADER_CALLABLE ||
|
||||||
type == MESA_SHADER_CLOSEST_HIT || type == MESA_SHADER_MISS);
|
type == MESA_SHADER_CLOSEST_HIT || type == MESA_SHADER_MISS);
|
||||||
|
|
||||||
nir_shader *nir_stage = radv_parse_rt_stage(device, stage, key);
|
|
||||||
|
|
||||||
/* Move ray tracing system values to the top that are set by rt_trace_ray
|
/* Move ray tracing system values to the top that are set by rt_trace_ray
|
||||||
* to prevent them from being overwritten by other rt_trace_ray calls.
|
* to prevent them from being overwritten by other rt_trace_ray calls.
|
||||||
*/
|
*/
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
struct radv_physical_device;
|
struct radv_physical_device;
|
||||||
struct radv_device;
|
struct radv_device;
|
||||||
struct radv_pipeline;
|
struct radv_pipeline;
|
||||||
|
struct radv_ray_tracing_stage;
|
||||||
struct radv_ray_tracing_group;
|
struct radv_ray_tracing_group;
|
||||||
struct radv_pipeline_key;
|
struct radv_pipeline_key;
|
||||||
struct radv_shader_args;
|
struct radv_shader_args;
|
||||||
@@ -765,6 +766,7 @@ void radv_get_nir_options(struct radv_physical_device *device);
|
|||||||
|
|
||||||
nir_shader *create_rt_shader(struct radv_device *device,
|
nir_shader *create_rt_shader(struct radv_device *device,
|
||||||
const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
|
||||||
|
struct radv_ray_tracing_stage *stages,
|
||||||
struct radv_ray_tracing_group *groups,
|
struct radv_ray_tracing_group *groups,
|
||||||
const struct radv_pipeline_key *key);
|
const struct radv_pipeline_key *key);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user