From 67de4b54fef36114f5ded7ca886a992929b39356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 16 Mar 2023 13:25:16 -0700 Subject: [PATCH] radv: Move radv_nir_lower_view_index to new file. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also ran clang-format on the affected code. Signed-off-by: Timur Kristóf Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meson.build | 1 + src/amd/vulkan/nir/radv_nir.h | 2 + .../vulkan/nir/radv_nir_lower_view_index.c | 94 +++++++++++++++++++ src/amd/vulkan/radv_pipeline.c | 2 +- src/amd/vulkan/radv_shader.c | 66 ------------- src/amd/vulkan/radv_shader.h | 2 - 6 files changed, 98 insertions(+), 69 deletions(-) create mode 100644 src/amd/vulkan/nir/radv_nir_lower_view_index.c diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build index 0770d7fbb9b..6d2927cb455 100644 --- a/src/amd/vulkan/meson.build +++ b/src/amd/vulkan/meson.build @@ -77,6 +77,7 @@ libradv_files = files( 'nir/radv_nir_lower_intrinsics_early.c', 'nir/radv_nir_lower_primitive_shading_rate.c', 'nir/radv_nir_lower_ray_queries.c', + 'nir/radv_nir_lower_view_index.c', 'nir/radv_nir_lower_vs_inputs.c', 'winsys/null/radv_null_bo.c', 'winsys/null/radv_null_bo.h', diff --git a/src/amd/vulkan/nir/radv_nir.h b/src/amd/vulkan/nir/radv_nir.h index 43da0d661fc..e4b63e192ce 100644 --- a/src/amd/vulkan/nir/radv_nir.h +++ b/src/amd/vulkan/nir/radv_nir.h @@ -64,6 +64,8 @@ bool radv_nir_lower_fs_intrinsics(nir_shader *nir, const struct radv_pipeline_st bool radv_nir_lower_intrinsics_early(nir_shader *nir, const struct radv_pipeline_key *key); +bool radv_nir_lower_view_index(nir_shader *nir, bool per_primitive); + #ifdef __cplusplus } #endif diff --git a/src/amd/vulkan/nir/radv_nir_lower_view_index.c b/src/amd/vulkan/nir/radv_nir_lower_view_index.c new file mode 100644 index 00000000000..baf28fcd7a5 --- /dev/null +++ b/src/amd/vulkan/nir/radv_nir_lower_view_index.c @@ -0,0 +1,94 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * Copyright © 2023 Valve Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "nir.h" +#include "nir_builder.h" +#include "radv_nir.h" + +static nir_variable * +find_layer_in_var(nir_shader *nir) +{ + nir_variable *var = nir_find_variable_with_location(nir, nir_var_shader_in, VARYING_SLOT_LAYER); + if (var != NULL) + return var; + + var = nir_variable_create(nir, nir_var_shader_in, glsl_int_type(), "layer id"); + var->data.location = VARYING_SLOT_LAYER; + var->data.interpolation = INTERP_MODE_FLAT; + return var; +} + +/** + * We use layered rendering to implement multiview, which means we need to map + * view_index to gl_Layer. The code generates a load from the layer_id sysval, + * but since we don't have a way to get at this information from the fragment + * shader, we also need to lower this to the gl_Layer varying. This pass + * lowers both to a varying load from the LAYER slot, before lowering io, so + * that nir_assign_var_locations() will give the LAYER varying the correct + * driver_location. + */ +bool +radv_nir_lower_view_index(nir_shader *nir, bool per_primitive) +{ + bool progress = false; + nir_function_impl *entry = nir_shader_get_entrypoint(nir); + nir_builder b; + nir_builder_init(&b, entry); + + nir_variable *layer = NULL; + nir_foreach_block (block, entry) { + nir_foreach_instr_safe (instr, block) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *load = nir_instr_as_intrinsic(instr); + if (load->intrinsic != nir_intrinsic_load_view_index) + continue; + + if (!layer) + layer = find_layer_in_var(nir); + + layer->data.per_primitive = per_primitive; + b.cursor = nir_before_instr(instr); + nir_ssa_def *def = nir_load_var(&b, layer); + nir_ssa_def_rewrite_uses(&load->dest.ssa, def); + + /* Update inputs_read to reflect that the pass added a new input. */ + nir->info.inputs_read |= VARYING_BIT_LAYER; + if (per_primitive) + nir->info.per_primitive_inputs |= VARYING_BIT_LAYER; + + nir_instr_remove(instr); + progress = true; + } + } + + if (progress) + nir_metadata_preserve(entry, nir_metadata_block_index | nir_metadata_dominance); + else + nir_metadata_preserve(entry, nir_metadata_all); + + return progress; +} \ No newline at end of file diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 1bcc43d0d87..e3a35bd07c2 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1763,7 +1763,7 @@ radv_pipeline_link_shaders(const struct radv_device *device, } /* Lower the view index to map on the layer. */ - NIR_PASS(_, consumer, radv_lower_view_index, producer->info.stage == MESA_SHADER_MESH); + NIR_PASS(_, consumer, radv_nir_lower_view_index, producer->info.stage == MESA_SHADER_MESH); } if (pipeline_key->optimisations_disabled) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 4c77cf7ed03..bc30252324d 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -765,72 +765,6 @@ type_size_vec4(const struct glsl_type *type, bool bindless) return glsl_count_attribute_slots(type, false); } -static nir_variable * -find_layer_in_var(nir_shader *nir) -{ - nir_variable *var = nir_find_variable_with_location(nir, nir_var_shader_in, VARYING_SLOT_LAYER); - if (var != NULL) - return var; - - var = nir_variable_create(nir, nir_var_shader_in, glsl_int_type(), "layer id"); - var->data.location = VARYING_SLOT_LAYER; - var->data.interpolation = INTERP_MODE_FLAT; - return var; -} - -/* We use layered rendering to implement multiview, which means we need to map - * view_index to gl_Layer. The code generates a load from the layer_id sysval, - * but since we don't have a way to get at this information from the fragment - * shader, we also need to lower this to the gl_Layer varying. This pass - * lowers both to a varying load from the LAYER slot, before lowering io, so - * that nir_assign_var_locations() will give the LAYER varying the correct - * driver_location. - */ - -bool -radv_lower_view_index(nir_shader *nir, bool per_primitive) -{ - bool progress = false; - nir_function_impl *entry = nir_shader_get_entrypoint(nir); - nir_builder b; - nir_builder_init(&b, entry); - - nir_variable *layer = NULL; - nir_foreach_block (block, entry) { - nir_foreach_instr_safe (instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *load = nir_instr_as_intrinsic(instr); - if (load->intrinsic != nir_intrinsic_load_view_index) - continue; - - if (!layer) - layer = find_layer_in_var(nir); - - layer->data.per_primitive = per_primitive; - b.cursor = nir_before_instr(instr); - nir_ssa_def *def = nir_load_var(&b, layer); - nir_ssa_def_rewrite_uses(&load->dest.ssa, def); - - /* Update inputs_read to reflect that the pass added a new input. */ - nir->info.inputs_read |= VARYING_BIT_LAYER; - if (per_primitive) - nir->info.per_primitive_inputs |= VARYING_BIT_LAYER; - - nir_instr_remove(instr); - progress = true; - } - } - - if (progress) - nir_metadata_preserve(entry, nir_metadata_block_index | nir_metadata_dominance); - else - nir_metadata_preserve(entry, nir_metadata_all); - - return progress; -} - void radv_lower_io(struct radv_device *device, nir_shader *nir) { diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 1dbdd14696a..94123b05163 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -748,8 +748,6 @@ void radv_lower_io(struct radv_device *device, nir_shader *nir); bool radv_lower_io_to_mem(struct radv_device *device, struct radv_pipeline_stage *stage); -bool radv_lower_view_index(nir_shader *nir, bool per_primitive); - void radv_lower_ngg(struct radv_device *device, struct radv_pipeline_stage *ngg_stage, const struct radv_pipeline_key *pl_key);