X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_program.c;h=f01e1374ebf1ee31490ac739d766588f22fd183e;hb=500b0735c0caa293d22fb3728cb76d267a016834;hp=2eb9c13d929f91a822e59516042d8255241a886b;hpb=16e5f13b64c1acbfbb637c06f1ebd138c08eec0e;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index 2eb9c13d929..f01e1374ebf 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -55,28 +55,21 @@ * 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_program *prog = rzalloc(NULL, - struct st_program); - return _mesa_init_gl_program(&prog->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); } @@ -89,16 +82,13 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog) 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 ); } @@ -116,6 +106,11 @@ st_program_string_notify( struct gl_context *ctx, struct st_context *st = st_context(ctx); struct st_program *stp = (struct st_program *) 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) { @@ -125,19 +120,13 @@ st_program_string_notify( struct gl_context *ctx, st_init_atifs_prog(ctx, prog); } - st_release_fp_variants(st, stp); - if (!stp->shader_program && /* not GLSL->NIR */ - !st_translate_fragment_program(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 (!stp->shader_program && /* not GLSL->NIR */ - !st_translate_vertex_program(st, stp)) + if (!st_translate_vertex_program(st, stp)) return false; } else { - st_release_common_variants(st, stp); - if (!stp->shader_program && /* not GLSL->NIR */ - !st_translate_common_program(st, stp)) + if (!st_translate_common_program(st, stp)) return false; } @@ -152,7 +141,7 @@ st_program_string_notify( struct gl_context *ctx, 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; @@ -184,23 +173,8 @@ st_get_shader_program_completion_status(struct gl_context *ctx, 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);