Module: Mesa
Branch: main
Commit: 9d814c405bb3a40cea7556a61fe35aad3e24b020
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d814c405bb3a40cea7556a61fe35aad3e24b020

Author: Pedro J. Estébanez <[email protected]>
Date:   Tue Jan 10 14:02:38 2023 +0100

microsoft/spirv_to_dxil: Let linking report the need of runtime data

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20608>

---

 src/microsoft/spirv_to_dxil/dxil_spirv_nir.c | 5 ++++-
 src/microsoft/spirv_to_dxil/dxil_spirv_nir.h | 7 ++++++-
 src/microsoft/spirv_to_dxil/spirv2dxil.c     | 3 ++-
 src/microsoft/vulkan/dzn_pipeline.c          | 3 ++-
 4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c 
b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c
index 605e204c385..8349d805b20 100644
--- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c
+++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c
@@ -737,10 +737,12 @@ dxil_spirv_compute_pntc(nir_shader *nir)
 
 void
 dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
-                    const struct dxil_spirv_runtime_conf *conf)
+                    const struct dxil_spirv_runtime_conf *conf,
+                    bool *requires_runtime_data)
 {
    glsl_type_singleton_init_or_ref();
 
+   *requires_runtime_data = false;
    if (prev_stage_nir) {
       if (nir->info.stage == MESA_SHADER_FRAGMENT) {
          nir->info.clip_distance_array_size = 
prev_stage_nir->info.clip_distance_array_size;
@@ -748,6 +750,7 @@ dxil_spirv_nir_link(nir_shader *nir, nir_shader 
*prev_stage_nir,
          if (nir->info.inputs_read & VARYING_BIT_PNTC) {
             NIR_PASS_V(prev_stage_nir, dxil_spirv_write_pntc, conf);
             NIR_PASS_V(nir, dxil_spirv_compute_pntc);
+            *requires_runtime_data = true;
          }
       }
 
diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h 
b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h
index 3531d2aef1c..cdb4d00b5b3 100644
--- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h
+++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h
@@ -31,9 +31,14 @@
 void
 dxil_spirv_nir_prep(nir_shader *nir);
 
+/* The pipeline will require runtime data if, and only if, any of the multiple 
reported
+ * runtime data required flags is true.
+ */
+
 void
 dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
-                    const struct dxil_spirv_runtime_conf *conf);
+                    const struct dxil_spirv_runtime_conf *conf,
+                    bool *requires_runtime_data);
 
 void
 dxil_spirv_nir_passes(nir_shader *nir,
diff --git a/src/microsoft/spirv_to_dxil/spirv2dxil.c 
b/src/microsoft/spirv_to_dxil/spirv2dxil.c
index 2598551468e..45227885d04 100644
--- a/src/microsoft/spirv_to_dxil/spirv2dxil.c
+++ b/src/microsoft/spirv_to_dxil/spirv2dxil.c
@@ -255,7 +255,8 @@ main(int argc, char **argv)
       for (int32_t prev = cur - 1; prev >= MESA_SHADER_VERTEX; --prev) {
          if (!shaders[prev].nir)
             continue;
-         dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf);
+         bool requires_runtime_data;
+         dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, 
&requires_runtime_data);
          break;
       }
    }
diff --git a/src/microsoft/vulkan/dzn_pipeline.c 
b/src/microsoft/vulkan/dzn_pipeline.c
index 757743f37d3..1f1708ba40e 100644
--- a/src/microsoft/vulkan/dzn_pipeline.c
+++ b/src/microsoft/vulkan/dzn_pipeline.c
@@ -830,10 +830,11 @@ dzn_graphics_pipeline_compile_shaders(struct dzn_device 
*device,
       }};
 
       assert(pipeline->templates.shaders[stage].nir);
+      bool requires_runtime_data;
       dxil_spirv_nir_link(pipeline->templates.shaders[stage].nir,
                           prev_stage != MESA_SHADER_NONE ?
                           pipeline->templates.shaders[prev_stage].nir : NULL,
-                          &conf);
+                          &conf, &requires_runtime_data);
    }
 
    u_foreach_bit(stage, active_stage_mask) {

Reply via email to