Module: Mesa Branch: main Commit: b723962418cee94070997fd8c15548dfeebf88ee URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b723962418cee94070997fd8c15548dfeebf88ee
Author: Jesse Natalie <[email protected]> Date: Mon Apr 3 15:56:26 2023 -0700 d3d12: Move forward-front-face pass to common DXIL code Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22277> --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 2 +- src/gallium/drivers/d3d12/d3d12_nir_passes.c | 47 ---------------------------- src/gallium/drivers/d3d12/d3d12_nir_passes.h | 3 -- src/microsoft/compiler/dxil_nir.c | 36 +++++++++++++++++++++ src/microsoft/compiler/dxil_nir.h | 1 + 5 files changed, 38 insertions(+), 51 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 2880d673e1d..c37f9d5811f 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -1248,7 +1248,7 @@ select_shader_variant(struct d3d12_selection_context *sel_ctx, d3d12_shader_sele } if (key.fs.remap_front_facing) { - d3d12_forward_front_face(new_nir_variant); + dxil_nir_forward_front_face(new_nir_variant); nir_function_impl *impl = nir_shader_get_entrypoint(new_nir_variant); nir_shader_gather_info(new_nir_variant, impl); diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.c b/src/gallium/drivers/d3d12/d3d12_nir_passes.c index 0f1cdce37b6..5eb67be4d91 100644 --- a/src/gallium/drivers/d3d12/d3d12_nir_passes.c +++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.c @@ -117,53 +117,6 @@ d3d12_lower_yflip(nir_shader *nir) } } -static void -lower_load_face(nir_builder *b, struct nir_instr *instr, nir_variable *var) -{ - if (instr->type != nir_instr_type_intrinsic) - return; - - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - if (intr->intrinsic != nir_intrinsic_load_front_face) - return; - - b->cursor = nir_before_instr(&intr->instr); - - nir_ssa_def *load = nir_ine_imm(b, nir_load_var(b, var), 0); - - nir_ssa_def_rewrite_uses(&intr->dest.ssa, load); - nir_instr_remove(instr); -} - -void -d3d12_forward_front_face(nir_shader *nir) -{ - assert(nir->info.stage == MESA_SHADER_FRAGMENT); - - nir_variable *var = nir_variable_create(nir, nir_var_shader_in, - glsl_uint_type(), - "gl_FrontFacing"); - var->data.location = VARYING_SLOT_VAR12; - var->data.interpolation = INTERP_MODE_FLAT; - - - nir_foreach_function(function, nir) { - if (function->impl) { - nir_builder b; - nir_builder_init(&b, function->impl); - - nir_foreach_block(block, function->impl) { - nir_foreach_instr_safe(instr, block) { - lower_load_face(&b, instr, var); - } - } - - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } - } -} - static void lower_pos_read(nir_builder *b, struct nir_instr *instr, nir_variable **depth_transform_var) diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.h b/src/gallium/drivers/d3d12/d3d12_nir_passes.h index 47c85b22377..8a39717ab7e 100644 --- a/src/gallium/drivers/d3d12/d3d12_nir_passes.h +++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.h @@ -63,9 +63,6 @@ d3d12_lower_state_vars(struct nir_shader *s, struct d3d12_shader *shader); void d3d12_lower_yflip(nir_shader *s); -void -d3d12_forward_front_face(nir_shader *nir); - void d3d12_lower_depth_range(nir_shader *nir); diff --git a/src/microsoft/compiler/dxil_nir.c b/src/microsoft/compiler/dxil_nir.c index 53bdaf53947..c7acafa2099 100644 --- a/src/microsoft/compiler/dxil_nir.c +++ b/src/microsoft/compiler/dxil_nir.c @@ -2343,3 +2343,39 @@ dxil_nir_lower_unsupported_subgroup_scan(nir_shader *s) } return ret; } + +static bool +lower_load_face(nir_builder *b, nir_instr *instr, void *data) +{ + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + if (intr->intrinsic != nir_intrinsic_load_front_face) + return false; + + b->cursor = nir_before_instr(&intr->instr); + + nir_variable *var = data; + nir_ssa_def *load = nir_ine_imm(b, nir_load_var(b, var), 0); + + nir_ssa_def_rewrite_uses(&intr->dest.ssa, load); + nir_instr_remove(instr); + return true; +} + +bool +dxil_nir_forward_front_face(nir_shader *nir) +{ + assert(nir->info.stage == MESA_SHADER_FRAGMENT); + + nir_variable *var = nir_variable_create(nir, nir_var_shader_in, + glsl_uint_type(), + "gl_FrontFacing"); + var->data.location = VARYING_SLOT_VAR12; + var->data.interpolation = INTERP_MODE_FLAT; + + return nir_shader_instructions_pass(nir, lower_load_face, + nir_metadata_block_index | nir_metadata_dominance, + var); +} diff --git a/src/microsoft/compiler/dxil_nir.h b/src/microsoft/compiler/dxil_nir.h index df0d66817c0..38ec90244ae 100644 --- a/src/microsoft/compiler/dxil_nir.h +++ b/src/microsoft/compiler/dxil_nir.h @@ -83,6 +83,7 @@ bool dxil_nir_lower_subgroup_id(nir_shader *s); bool dxil_nir_lower_num_subgroups(nir_shader *s); bool dxil_nir_split_unaligned_loads_stores(nir_shader *shader, nir_variable_mode modes); bool dxil_nir_lower_unsupported_subgroup_scan(nir_shader *s); +bool dxil_nir_forward_front_face(nir_shader *s); #ifdef __cplusplus }
