Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com>

On 11/11/17 00:46, Rob Clark wrote:
In case the IR is NIR, the driver takes reference to the nir_shader.
Also, because there are no variants, we need to clone the shader,
instead of sharing the reference with gl_program, which would result
in a double free in _mesa_delete_program().

Signed-off-by: Rob Clark <robdcl...@gmail.com>
Reviewed-by: Marek Olšák <marek.ol...@amd.com>
---
This shuffled around a bit and grew an extra fix after c980a3aa
"st/glsl_to_nir: generate NIR earlier"

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

diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp 
b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 7f4651a3ccd..1912da2404a 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -441,34 +441,40 @@ st_nir_get_mesa_program(struct gl_context *ctx,
     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) {
     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;
        stp->shader_program = shader_program;
+      stp->tgsi.type = PIPE_SHADER_IR_NIR;
+      stp->tgsi.ir.nir = nir;
        break;
     case MESA_SHADER_FRAGMENT:
        stfp = (struct st_fragment_program *)prog;
        stfp->shader_program = shader_program;
+      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;
     }
- struct st_common_program *st_comm_prog = (struct st_common_program *)prog;
-   nir_shader *nir = st_glsl_to_nir(st, prog, shader_program, shader->Stage);
-   st_comm_prog->tgsi.type = PIPE_SHADER_IR_NIR;
-   st_comm_prog->tgsi.ir.nir = nir;
return prog;
  }
diff --git a/src/mesa/state_tracker/st_program.c 
b/src/mesa/state_tracker/st_program.c
index e3649a8b7cc..b0c69f30c15 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -360,8 +360,20 @@ st_release_cp_variants(struct st_context *st, struct 
st_compute_program *stcp)
     *variants = NULL;
if (stcp->tgsi.prog) {
-      ureg_free_tokens(stcp->tgsi.prog);
-      stcp->tgsi.prog = NULL;
+      switch (stcp->tgsi.ir_type) {
+      case PIPE_SHADER_IR_TGSI:
+         ureg_free_tokens(stcp->tgsi.prog);
+         stcp->tgsi.prog = NULL;
+         break;
+      case PIPE_SHADER_IR_NIR:
+         /* pipe driver took ownership of prog */
+         break;
+      case PIPE_SHADER_IR_LLVM:
+      case PIPE_SHADER_IR_NATIVE:
+         /* ??? */
+          stcp->tgsi.prog = NULL;
+         break;
+      }
     }
  }
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to