X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_program.c;h=555fc5d5ad9bc3c7c4f55a5d7b91d4c7448d0a8d;hb=bbfad34606b8fc91c3671bb9a6e6545d669e6f81;hp=fb0bdd2ded345738bfaf9e5b67a29ba90fa5fc6d;hpb=81faead818a0b2fde131df019f5dfb0baef49273;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index fb0bdd2ded3..555fc5d5ad9 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -54,32 +54,31 @@ * fragment program. */ static struct gl_program * -st_new_program(struct gl_context *ctx, GLenum target, GLuint id) +st_new_program(struct gl_context *ctx, GLenum target, GLuint id, + bool is_arb_asm) { switch (target) { case GL_VERTEX_PROGRAM_ARB: { - struct st_vertex_program *prog = ST_CALLOC_STRUCT(st_vertex_program); - return _mesa_init_gl_program(&prog->Base, target, id); + struct st_vertex_program *prog = rzalloc(NULL, + struct st_vertex_program); + return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm); } case GL_FRAGMENT_PROGRAM_ARB: { - struct st_fragment_program *prog = ST_CALLOC_STRUCT(st_fragment_program); - return _mesa_init_gl_program(&prog->Base.Base, target, id); + struct st_fragment_program *prog = rzalloc(NULL, + struct st_fragment_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: { - struct st_geometry_program *prog = ST_CALLOC_STRUCT(st_geometry_program); - return _mesa_init_gl_program(&prog->Base, target, id); - } - case GL_TESS_CONTROL_PROGRAM_NV: { - struct st_tessctrl_program *prog = ST_CALLOC_STRUCT(st_tessctrl_program); - return _mesa_init_gl_program(&prog->Base, target, id); - } - case GL_TESS_EVALUATION_PROGRAM_NV: { - struct st_tesseval_program *prog = ST_CALLOC_STRUCT(st_tesseval_program); - return _mesa_init_gl_program(&prog->Base, target, id); + struct st_common_program *prog = rzalloc(NULL, + struct st_common_program); + return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm); } case GL_COMPUTE_PROGRAM_NV: { - struct st_compute_program *prog = ST_CALLOC_STRUCT(st_compute_program); - return _mesa_init_gl_program(&prog->Base.Base, target, id); + struct st_compute_program *prog = rzalloc(NULL, + struct st_compute_program); + return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm); } default: assert(0); @@ -106,16 +105,17 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog) free_glsl_to_tgsi_visitor(stvp->glsl_to_tgsi); } break; + case GL_TESS_CONTROL_PROGRAM_NV: + case GL_TESS_EVALUATION_PROGRAM_NV: case GL_GEOMETRY_PROGRAM_NV: { - struct st_geometry_program *stgp = - (struct st_geometry_program *) prog; + struct st_common_program *p = st_common_program(prog); - st_release_basic_variants(st, stgp->Base.Target, &stgp->variants, - &stgp->tgsi); + st_release_basic_variants(st, p->Base.Target, &p->variants, + &p->tgsi); - if (stgp->glsl_to_tgsi) - free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi); + if (p->glsl_to_tgsi) + free_glsl_to_tgsi_visitor(p->glsl_to_tgsi); } break; case GL_FRAGMENT_PROGRAM_ARB: @@ -129,30 +129,6 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog) free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi); } break; - case GL_TESS_CONTROL_PROGRAM_NV: - { - struct st_tessctrl_program *sttcp = - (struct st_tessctrl_program *) prog; - - st_release_basic_variants(st, sttcp->Base.Target, &sttcp->variants, - &sttcp->tgsi); - - if (sttcp->glsl_to_tgsi) - free_glsl_to_tgsi_visitor(sttcp->glsl_to_tgsi); - } - break; - case GL_TESS_EVALUATION_PROGRAM_NV: - { - struct st_tesseval_program *sttep = - (struct st_tesseval_program *) prog; - - st_release_basic_variants(st, sttep->Base.Target, - &sttep->variants, &sttep->tgsi); - - if (sttep->glsl_to_tgsi) - free_glsl_to_tgsi_visitor(sttep->glsl_to_tgsi); - } - break; case GL_COMPUTE_PROGRAM_NV: { struct st_compute_program *stcp = @@ -197,7 +173,7 @@ st_program_string_notify( struct gl_context *ctx, st->dirty |= stfp->affected_states; } else if (target == GL_GEOMETRY_PROGRAM_NV) { - struct st_geometry_program *stgp = (struct st_geometry_program *) prog; + struct st_common_program *stgp = st_common_program(prog); st_release_basic_variants(st, stgp->Base.Target, &stgp->variants, &stgp->tgsi); @@ -218,8 +194,8 @@ st_program_string_notify( struct gl_context *ctx, st->dirty |= ST_NEW_VERTEX_PROGRAM(st, stvp); } else if (target == GL_TESS_CONTROL_PROGRAM_NV) { - struct st_tessctrl_program *sttcp = - (struct st_tessctrl_program *) prog; + struct st_common_program *sttcp = + st_common_program(prog); st_release_basic_variants(st, sttcp->Base.Target, &sttcp->variants, &sttcp->tgsi); @@ -230,8 +206,8 @@ st_program_string_notify( struct gl_context *ctx, st->dirty |= sttcp->affected_states; } else if (target == GL_TESS_EVALUATION_PROGRAM_NV) { - struct st_tesseval_program *sttep = - (struct st_tesseval_program *) prog; + struct st_common_program *sttep = + st_common_program(prog); st_release_basic_variants(st, sttep->Base.Target, &sttep->variants, &sttep->tgsi); @@ -284,7 +260,7 @@ 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, - curProg->Id); + curProg->Id, true); struct st_fragment_program *stfp = (struct st_fragment_program *)prog; stfp->ati_fs = curProg; return prog;