Mesa (master): mesa/st: move cloning of NIR shader for compute

Rob Clark robclark at kemper.freedesktop.org
Tue Dec 5 21:17:47 UTC 2017


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

Author: Rob Clark <robdclark at gmail.com>
Date:   Tue Dec  5 09:53:56 2017 -0500

mesa/st: move cloning of NIR shader for compute

Since in the NIR case, driver takes ownership of the NIR shader, we need
to clone what is passed to the driver.  Normally this is done as part of
creating the shader variant (where is clone is anyways needed).  But
compute shaders have no variants, so we were cloning earlier.

The problem is that after the NIR linking optimizations, we ended up
cloning *before* all the lowering passes where done.

So move this into st_get_cp_variant(), to make compute shaders work more
like other shader stages.

Signed-off-by: Rob Clark <robdclark at gmail.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +-
 src/mesa/state_tracker/st_program.c       | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 5d18e7b62b..36adf55cd4 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -431,7 +431,7 @@ 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);
+      stcp->tgsi.prog = nir;
       break;
    default:
       unreachable("unknown shader stage");
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 5c0a58104f..05e6042f42 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -1659,7 +1659,10 @@ st_get_cp_variant(struct st_context *st,
       v = CALLOC_STRUCT(st_basic_variant);
       if (v) {
          /* fill in new variant */
-         v->driver_shader = pipe->create_compute_state(pipe, tgsi);
+         struct pipe_compute_state cs = *tgsi;
+         if (tgsi->ir_type == PIPE_SHADER_IR_NIR)
+            cs.prog = nir_shader_clone(NULL, tgsi->prog);
+         v->driver_shader = pipe->create_compute_state(pipe, &cs);
          v->key = key;
 
          /* insert into list */




More information about the mesa-commit mailing list