summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Seurer <konstantin.seurer@gmail.com>2022-06-20 20:27:31 +0200
committerMarge Bot <emma+marge@anholt.net>2022-06-29 00:33:26 +0000
commit098b5804a0923df29eae8e11e11f510f8b8c10ac (patch)
tree8e98f2bbc73cca4c179c5cb7311945bb31a45af2
parent9196fd3e1f551328f2d47a18471aa4fcbffee683 (diff)
radv: Refactor lower_rt_derefs
Signed-off-by: Konstantin Seurer <konstantin.seurer@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17123>
-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;
}