[Mesa-dev] [PATCH 05/14] st/glsl_to_nir: split linking loop in two in prep of nir linking opts

Timothy Arceri tarceri at itsqueeze.com
Tue Nov 21 03:37:26 UTC 2017


---
 src/mesa/state_tracker/st_glsl_to_nir.cpp | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index bb0ba07012..8c22bde835 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -470,21 +470,21 @@ set_st_program(struct gl_program *prog,
       stcp = (struct st_compute_program *)prog;
       stcp->shader_program = shader_program;
       stcp->tgsi.ir_type = PIPE_SHADER_IR_NIR;
       stcp->tgsi.prog = nir_shader_clone(NULL, nir);
       break;
    default:
       unreachable("unknown shader stage");
    }
 }
 
-struct gl_program *
+static nir_shader *
 st_nir_get_mesa_program(struct gl_context *ctx,
                         struct gl_shader_program *shader_program,
                         struct gl_linked_shader *shader)
 {
    struct st_context *st = st_context(ctx);
    struct gl_program *prog;
 
    validate_ir_tree(shader->ir);
 
    prog = shader->Program;
@@ -504,39 +504,43 @@ st_nir_get_mesa_program(struct gl_context *ctx,
       _mesa_log("\n\n");
    }
 
    prog->ExternalSamplersUsed = gl_external_samplers(prog);
    _mesa_update_shader_textures_used(shader_program, prog);
 
    nir_shader *nir = st_glsl_to_nir(st, prog, shader_program, shader->Stage);
 
    set_st_program(prog, shader_program, nir);
 
-   return prog;
+   return nir;
 }
 
 bool
 st_link_nir(struct gl_context *ctx,
             struct gl_shader_program *shader_program)
 {
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       struct gl_linked_shader *shader = shader_program->_LinkedShaders[i];
       if (shader == NULL)
          continue;
 
-      struct gl_program *linked_prog =
-         st_nir_get_mesa_program(ctx, shader_program, shader);
+      nir_shader *nir = st_nir_get_mesa_program(ctx, shader_program, shader);
+   }
 
-      if (linked_prog) {
-         if (!ctx->Driver.ProgramStringNotify(ctx,
-                                              _mesa_shader_stage_to_program(i),
-                                              linked_prog)) {
-            _mesa_reference_program(ctx, &shader->Program, NULL);
-            return false;
-         }
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+      struct gl_linked_shader *shader = shader_program->_LinkedShaders[i];
+      if (shader == NULL)
+         continue;
+
+      assert(shader->Program);
+      if (!ctx->Driver.ProgramStringNotify(ctx,
+                                           _mesa_shader_stage_to_program(i),
+                                           shader->Program)) {
+         _mesa_reference_program(ctx, &shader->Program, NULL);
+         return false;
       }
    }
 
    return true;
 }
 
 } /* extern "C" */
-- 
2.14.3



More information about the mesa-dev mailing list