Module: Mesa
Branch: master
Commit: da953b641d806cdb8031ff8fe7ce458963a3fe4f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=da953b641d806cdb8031ff8fe7ce458963a3fe4f

Author: Timothy Arceri <tarc...@itsqueeze.com>
Date:   Thu Nov  9 17:32:08 2017 +1100

st/glsl: move nir linking loop to new function st_link_nir()

This will allow us to refactor linking and include some nir link
time optimisations.

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

---

 src/mesa/state_tracker/st_glsl_to_nir.cpp  | 25 +++++++++++++++++++++++++
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 26 +++++++++++++-------------
 src/mesa/state_tracker/st_nir.h            |  7 +++----
 3 files changed, 41 insertions(+), 17 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp 
b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index d0375dd3aa..8b66f8277a 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -508,4 +508,29 @@ st_nir_get_mesa_program(struct gl_context *ctx,
    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];
+      if (shader == NULL)
+         continue;
+
+      struct gl_program *linked_prog =
+         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;
+         }
+      }
+   }
+
+   return true;
+}
+
 } /* extern "C" */
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index fa51fef343..8eeae86dab 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -6901,6 +6901,7 @@ st_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
    struct pipe_screen *pscreen = ctx->st->pipe->screen;
    assert(prog->data->LinkStatus);
 
+   bool use_nir = false;
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       if (prog->_LinkedShaders[i] == NULL)
          continue;
@@ -6920,6 +6921,12 @@ st_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
       unsigned if_threshold = pscreen->get_shader_param(pscreen, ptarget,
                                                         
PIPE_SHADER_CAP_LOWER_IF_THRESHOLD);
 
+      enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir)
+         pscreen->get_shader_param(pscreen, ptarget,
+                                   PIPE_SHADER_CAP_PREFERRED_IR);
+      if (preferred_ir == PIPE_SHADER_IR_NIR)
+         use_nir = true;
+
       /* If there are forms of indirect addressing that the driver
        * cannot handle, perform the lowering pass.
        */
@@ -7023,24 +7030,17 @@ st_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
 
    build_program_resource_list(ctx, prog);
 
+   if (use_nir)
+      return st_link_nir(ctx, prog);
+
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       struct gl_linked_shader *shader = prog->_LinkedShaders[i];
       if (shader == NULL)
          continue;
 
-      enum pipe_shader_type ptarget =
-         pipe_shader_type_from_mesa(shader->Stage);
-      enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir)
-         pscreen->get_shader_param(pscreen, ptarget,
-                                   PIPE_SHADER_CAP_PREFERRED_IR);
-
-      struct gl_program *linked_prog = NULL;
-      if (preferred_ir == PIPE_SHADER_IR_NIR) {
-         linked_prog = st_nir_get_mesa_program(ctx, prog, shader);
-      } else {
-         linked_prog = get_mesa_program_tgsi(ctx, prog, shader);
-         st_set_prog_affected_state_flags(linked_prog);
-      }
+      struct gl_program *linked_prog =
+         get_mesa_program_tgsi(ctx, prog, shader);
+      st_set_prog_affected_state_flags(linked_prog);
 
       if (linked_prog) {
          if (!ctx->Driver.ProgramStringNotify(ctx,
diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h
index 9302a7c786..c65e753f9b 100644
--- a/src/mesa/state_tracker/st_nir.h
+++ b/src/mesa/state_tracker/st_nir.h
@@ -45,10 +45,9 @@ void st_finalize_nir(struct st_context *st, struct 
gl_program *prog,
                      struct gl_shader_program *shader_program,
                      struct nir_shader *nir);
 
-struct gl_program *
-st_nir_get_mesa_program(struct gl_context *ctx,
-                        struct gl_shader_program *shader_program,
-                        struct gl_linked_shader *shader);
+bool
+st_link_nir(struct gl_context *ctx,
+            struct gl_shader_program *shader_program);
 
 #ifdef __cplusplus
 }

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to