summaryrefslogtreecommitdiff
path: root/src/amd/vulkan/radv_pipeline_rt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/amd/vulkan/radv_pipeline_rt.c')
-rw-r--r--src/amd/vulkan/radv_pipeline_rt.c61
1 files changed, 27 insertions, 34 deletions
diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c
index 8994a7350c8..a61a073f607 100644
--- a/src/amd/vulkan/radv_pipeline_rt.c
+++ b/src/amd/vulkan/radv_pipeline_rt.c
@@ -774,47 +774,40 @@ lower_rt_derefs(nir_shader *shader)
nir_foreach_block (block, impl) {
nir_foreach_instr_safe (instr, block) {
- switch (instr->type) {
- case nir_instr_type_deref: {
- if (instr->type != nir_instr_type_deref)
- continue;
-
- nir_deref_instr *deref = nir_instr_as_deref(instr);
- if (nir_deref_mode_is(deref, nir_var_shader_call_data)) {
- deref->modes = nir_var_function_temp;
- if (deref->deref_type == nir_deref_type_var) {
- b.cursor = nir_before_instr(&deref->instr);
- nir_deref_instr *cast = nir_build_deref_cast(
- &b, arg_offset, nir_var_function_temp, deref->var->type, 0);
- nir_ssa_def_rewrite_uses(&deref->dest.ssa, &cast->dest.ssa);
- nir_instr_remove(&deref->instr);
- }
- progress = true;
- } else if (nir_deref_mode_is(deref, nir_var_ray_hit_attrib)) {
- deref->modes = nir_var_function_temp;
- if (deref->deref_type == nir_deref_type_var) {
- b.cursor = nir_before_instr(&deref->instr);
- nir_deref_instr *cast =
- nir_build_deref_cast(&b, nir_imm_int(&b, RADV_HIT_ATTRIB_OFFSET),
- nir_var_function_temp, deref->type, 0);
- nir_ssa_def_rewrite_uses(&deref->dest.ssa, &cast->dest.ssa);
- nir_instr_remove(&deref->instr);
- }
- progress = true;
- }
- break;
+ if (instr->type != nir_instr_type_deref)
+ continue;
+
+ nir_deref_instr *deref = nir_instr_as_deref(instr);
+ b.cursor = nir_before_instr(&deref->instr);
+
+ nir_deref_instr *replacement = NULL;
+ if (nir_deref_mode_is(deref, nir_var_shader_call_data)) {
+ deref->modes = nir_var_function_temp;
+ progress = true;
+
+ if (deref->deref_type == nir_deref_type_var)
+ replacement =
+ nir_build_deref_cast(&b, arg_offset, nir_var_function_temp, deref->var->type, 0);
+ } else if (nir_deref_mode_is(deref, nir_var_ray_hit_attrib)) {
+ deref->modes = nir_var_function_temp;
+ progress = true;
+
+ if (deref->deref_type == nir_deref_type_var)
+ replacement = nir_build_deref_cast(&b, nir_imm_int(&b, RADV_HIT_ATTRIB_OFFSET),
+ nir_var_function_temp, deref->type, 0);
}
- default:
- break;
+
+ if (replacement != NULL) {
+ nir_ssa_def_rewrite_uses(&deref->dest.ssa, &replacement->dest.ssa);
+ nir_instr_remove(&deref->instr);
}
}
}
- if (progress) {
+ if (progress)
nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance);
- } else {
+ else
nir_metadata_preserve(impl, nir_metadata_all);
- }
return progress;
}