st/program: fix compute shader nir references
authorRob Clark <robdclark@gmail.com>
Mon, 30 Oct 2017 13:56:43 +0000 (09:56 -0400)
committerRob Clark <robdclark@gmail.com>
Sun, 12 Nov 2017 17:28:59 +0000 (12:28 -0500)
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 <robdclark@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/mesa/state_tracker/st_glsl_to_nir.cpp
src/mesa/state_tracker/st_program.c

index 7f4651a3ccdc325956efb4deec28fc35b02d6b73..1912da2404a3546a5250c36dbdec0fce101fe804 100644 (file)
@@ -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;
 }
index e3649a8b7cca03b433ec870b0f9df0d4e2090ee7..70b63a374717b4ccb6a0bcf384ddb0a73051cc3a 100644 (file)
@@ -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;
+      }
    }
 }