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
 }

Reply via email to