Mesa (main): mesa/st: delay nir spirv link

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 13 05:12:05 UTC 2021


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

Author: Qiang Yu <yuq825 at gmail.com>
Date:   Wed Sep  8 14:44:11 2021 +0800

mesa/st: delay nir spirv link

Following commit for st_nir_link_shaders->nir_link_opt_varyings
may copy uniform variable from one shader to another, so delay
the nir_spirv link which contains mesa uniform information
update (gl_nir_link_uniforms) after it and align with glsl link.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12613>

---

 src/mesa/state_tracker/st_glsl_to_nir.cpp | 48 +++++++++++--------------------
 1 file changed, 17 insertions(+), 31 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 79c3d8d8359..deface8ad4b 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -766,9 +766,10 @@ st_link_nir(struct gl_context *ctx,
          }
 
          prog->nir = glsl_to_nir(st->ctx, shader_program, shader->Stage, options);
-         st_nir_preprocess(st, prog, shader_program, shader->Stage);
       }
 
+      st_nir_preprocess(st, prog, shader_program, shader->Stage);
+
       if (options->lower_to_scalar) {
          NIR_PASS_V(shader->Program->nir, nir_lower_load_const_to_scalar);
       }
@@ -776,28 +777,6 @@ st_link_nir(struct gl_context *ctx,
 
    st_lower_patch_vertices_in(shader_program);
 
-   /* For SPIR-V, we have to perform the NIR linking before applying
-    * st_nir_preprocess.
-    */
-   if (shader_program->data->spirv) {
-      static const gl_nir_linker_options opts = {
-         true /*fill_parameters */
-      };
-      if (!gl_nir_link_spirv(ctx, shader_program, &opts))
-         return GL_FALSE;
-
-      nir_build_program_resource_list(ctx, shader_program, true);
-
-      for (unsigned i = 0; i < num_shaders; i++) {
-         struct gl_linked_shader *shader = linked_shader[i];
-         struct gl_program *prog = shader->Program;
-
-         prog->ExternalSamplersUsed = gl_external_samplers(prog);
-         _mesa_update_shader_textures_used(shader_program, prog);
-         st_nir_preprocess(st, prog, shader_program, shader->Stage);
-      }
-   }
-
    /* Linking the stages in the opposite order (from fragment to vertex)
     * ensures that inter-shader outputs written to in an earlier stage
     * are eliminated if they are (transitively) not used in a later
@@ -814,19 +793,26 @@ st_link_nir(struct gl_context *ctx,
    if (num_shaders == 1)
       st_nir_opts(linked_shader[0]->Program->nir);
 
-   if (!shader_program->data->spirv) {
+   if (shader_program->data->spirv) {
+      static const gl_nir_linker_options opts = {
+         true /*fill_parameters */
+      };
+      if (!gl_nir_link_spirv(ctx, shader_program, &opts))
+         return GL_FALSE;
+   } else {
       if (!gl_nir_link_glsl(ctx, shader_program))
          return GL_FALSE;
+   }
 
-      for (unsigned i = 0; i < num_shaders; i++) {
-         struct gl_program *prog = linked_shader[i]->Program;
-         prog->ExternalSamplersUsed = gl_external_samplers(prog);
-         _mesa_update_shader_textures_used(shader_program, prog);
-      }
-
-      nir_build_program_resource_list(ctx, shader_program, false);
+   for (unsigned i = 0; i < num_shaders; i++) {
+      struct gl_program *prog = linked_shader[i]->Program;
+      prog->ExternalSamplersUsed = gl_external_samplers(prog);
+      _mesa_update_shader_textures_used(shader_program, prog);
    }
 
+   nir_build_program_resource_list(ctx, shader_program,
+                                   shader_program->data->spirv);
+
    for (unsigned i = 0; i < num_shaders; i++) {
       struct gl_linked_shader *shader = linked_shader[i];
       nir_shader *nir = shader->Program->nir;



More information about the mesa-commit mailing list