st/program: fix compute shader nir references

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>
This commit is contained in:
Rob Clark 2017-10-30 09:56:43 -04:00
parent 5009dc55f2
commit ecbe1e976f
2 changed files with 24 additions and 6 deletions

View 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;
}

View 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;
}
}
}