[Mesa-dev] [PATCH 04/14] st/glsl_to_nir: create set_st_program() helper

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


---
 src/mesa/state_tracker/st_glsl_to_nir.cpp | 74 +++++++++++++++++--------------
 1 file changed, 40 insertions(+), 34 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 8b66f8277a..bb0ba07012 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -428,58 +428,31 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
 
    st_nir_assign_uniform_locations(prog, shader_program,
                                    &nir->uniforms, &nir->num_uniforms);
 
    if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF))
       NIR_PASS_V(nir, nir_lower_samplers_as_deref, shader_program);
    else
       NIR_PASS_V(nir, nir_lower_samplers, shader_program);
 }
 
-struct gl_program *
-st_nir_get_mesa_program(struct gl_context *ctx,
-                        struct gl_shader_program *shader_program,
-                        struct gl_linked_shader *shader)
+static void
+set_st_program(struct gl_program *prog,
+               struct gl_shader_program *shader_program,
+               nir_shader *nir)
 {
-   struct st_context *st = st_context(ctx);
-   struct gl_program *prog;
-
-   validate_ir_tree(shader->ir);
-
-   prog = shader->Program;
-
-   prog->Parameters = _mesa_new_parameter_list();
-
-   _mesa_copy_linked_program_data(shader_program, shader);
-   _mesa_generate_parameters_list_for_uniforms(ctx, shader_program, shader,
-                                               prog->Parameters);
-
-   if (ctx->_Shader->Flags & GLSL_DUMP) {
-      _mesa_log("\n");
-      _mesa_log("GLSL IR for linked %s program %d:\n",
-             _mesa_shader_stage_to_string(shader->Stage),
-             shader_program->Name);
-      _mesa_print_ir(_mesa_get_log_file(), shader->ir, NULL);
-      _mesa_log("\n\n");
-   }
-
-   prog->ExternalSamplersUsed = gl_external_samplers(prog);
-   _mesa_update_shader_textures_used(shader_program, prog);
-
    struct st_vertex_program *stvp;
    struct st_common_program *stp;
    struct st_fragment_program *stfp;
    struct st_compute_program *stcp;
 
-   nir_shader *nir = st_glsl_to_nir(st, prog, shader_program, shader->Stage);
-
-   switch (shader->Stage) {
+   switch (prog->info.stage) {
    case MESA_SHADER_VERTEX:
       stvp = (struct st_vertex_program *)prog;
       stvp->shader_program = shader_program;
       stvp->tgsi.type = PIPE_SHADER_IR_NIR;
       stvp->tgsi.ir.nir = nir;
       break;
    case MESA_SHADER_GEOMETRY:
    case MESA_SHADER_TESS_CTRL:
    case MESA_SHADER_TESS_EVAL:
       stp = (struct st_common_program *)prog;
@@ -493,24 +466,57 @@ st_nir_get_mesa_program(struct gl_context *ctx,
       stfp->tgsi.type = PIPE_SHADER_IR_NIR;
       stfp->tgsi.ir.nir = nir;
       break;
    case MESA_SHADER_COMPUTE:
       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:
-      assert(!"should not be reached");
-      return NULL;
+      unreachable("unknown shader stage");
    }
+}
+
+struct gl_program *
+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;
+
+   prog->Parameters = _mesa_new_parameter_list();
+
+   _mesa_copy_linked_program_data(shader_program, shader);
+   _mesa_generate_parameters_list_for_uniforms(ctx, shader_program, shader,
+                                               prog->Parameters);
+
+   if (ctx->_Shader->Flags & GLSL_DUMP) {
+      _mesa_log("\n");
+      _mesa_log("GLSL IR for linked %s program %d:\n",
+             _mesa_shader_stage_to_string(shader->Stage),
+             shader_program->Name);
+      _mesa_print_ir(_mesa_get_log_file(), shader->ir, NULL);
+      _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;
 }
 
 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];
-- 
2.14.3



More information about the mesa-dev mailing list