mesa/st: move cloning of NIR shader for compute
authorRob Clark <robdclark@gmail.com>
Tue, 5 Dec 2017 14:53:56 +0000 (09:53 -0500)
committerRob Clark <robdclark@gmail.com>
Tue, 5 Dec 2017 21:03:38 +0000 (16:03 -0500)
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@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_glsl_to_nir.cpp
src/mesa/state_tracker/st_program.c

index 5d18e7b62bf465479dc114841a359796a5bed7c3..36adf55cd45c7438cc699399f3d124b8c1045a5a 100644 (file)
@@ -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");
index 5c0a58104fc0a66aa98808839acf5a054f5397d5..05e6042f4250ea2a2f44aa5483cd48362ff1eaf5 100644 (file)
@@ -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 */