* fragment program.
*/
static struct gl_program *
-st_new_program(struct gl_context *ctx, GLenum target, GLuint id,
+st_new_program(struct gl_context *ctx, gl_shader_stage stage, GLuint id,
bool is_arb_asm)
{
- switch (target) {
- case GL_VERTEX_PROGRAM_ARB: {
- struct st_vertex_program *prog = rzalloc(NULL, struct st_vertex_program);
- return _mesa_init_gl_program(&prog->Base.Base, target, id, is_arb_asm);
- }
- case GL_TESS_CONTROL_PROGRAM_NV:
- case GL_TESS_EVALUATION_PROGRAM_NV:
- case GL_GEOMETRY_PROGRAM_NV:
- case GL_FRAGMENT_PROGRAM_ARB:
- case GL_COMPUTE_PROGRAM_NV: {
- struct st_program *prog = rzalloc(NULL, struct st_program);
- return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
- }
+ struct st_program *prog;
+
+ switch (stage) {
+ case MESA_SHADER_VERTEX:
+ prog = (struct st_program*)rzalloc(NULL, struct st_vertex_program);
+ break;
default:
- assert(0);
- return NULL;
+ prog = rzalloc(NULL, struct st_program);
+ break;
}
+
+ return _mesa_init_gl_program(&prog->Base, stage, id, is_arb_asm);
}
struct st_context *st = st_context(ctx);
struct st_program *stp = st_program(prog);
- if (prog->Target == GL_VERTEX_PROGRAM_ARB)
- st_release_vp_variants(st, stp);
- if (prog->Target == GL_FRAGMENT_PROGRAM_ARB)
- st_release_fp_variants(st, stp);
- else
- st_release_common_variants(st, stp);
+ st_release_variants(st, stp);
if (stp->glsl_to_tgsi)
free_glsl_to_tgsi_visitor(stp->glsl_to_tgsi);
+ free(stp->serialized_nir);
+
/* delete base class */
_mesa_delete_program( ctx, prog );
}
/* GLSL-to-NIR should not end up here. */
assert(!stp->shader_program);
+ st_release_variants(st, stp);
+
if (target == GL_FRAGMENT_PROGRAM_ARB ||
target == GL_FRAGMENT_SHADER_ATI) {
if (target == GL_FRAGMENT_SHADER_ATI) {
st_init_atifs_prog(ctx, prog);
}
- st_release_fp_variants(st, stp);
if (!st_translate_fragment_program(st, stp))
return false;
} else if (target == GL_VERTEX_PROGRAM_ARB) {
- st_release_vp_variants(st, stp);
if (!st_translate_vertex_program(st, stp))
return false;
} else {
- st_release_common_variants(st, stp);
if (!st_translate_common_program(st, stp))
return false;
}
static struct gl_program *
st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg)
{
- struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
+ struct gl_program *prog = ctx->Driver.NewProgram(ctx, MESA_SHADER_FRAGMENT,
curProg->Id, true);
struct st_program *stfp = (struct st_program *)prog;
stfp->ati_fs = curProg;
if (!linked || !linked->Program)
continue;
- switch (i) {
- case MESA_SHADER_VERTEX:
- if (st_program(linked->Program)->vp_variants)
- sh = st_program(linked->Program)->vp_variants->driver_shader;
- break;
- case MESA_SHADER_FRAGMENT:
- if (st_program(linked->Program)->fp_variants)
- sh = st_program(linked->Program)->fp_variants->driver_shader;
- break;
- case MESA_SHADER_TESS_CTRL:
- case MESA_SHADER_TESS_EVAL:
- case MESA_SHADER_GEOMETRY:
- case MESA_SHADER_COMPUTE:
- if (st_program(linked->Program)->variants)
- sh = st_program(linked->Program)->variants->driver_shader;
- break;
- }
+ if (st_program(linked->Program)->variants)
+ sh = st_program(linked->Program)->variants->driver_shader;
unsigned type = pipe_shader_type_from_mesa(i);