summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker/st_program.c')
-rw-r--r--src/mesa/state_tracker/st_program.c66
1 files changed, 16 insertions, 50 deletions
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index d8b7f376a02..624586e6d67 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -1431,65 +1431,31 @@ destroy_program_variants(struct st_context *st, struct gl_program *target)
}
break;
case GL_GEOMETRY_PROGRAM_NV:
- {
- struct st_geometry_program *stgp =
- (struct st_geometry_program *) target;
- struct st_basic_variant *gpv, **prevPtr = &stgp->variants;
-
- for (gpv = stgp->variants; gpv; ) {
- struct st_basic_variant *next = gpv->next;
- if (gpv->key.st == st) {
- /* unlink from list */
- *prevPtr = next;
- /* destroy this variant */
- delete_basic_variant(st, gpv, stgp->Base.Base.Target);
- }
- else {
- prevPtr = &gpv->next;
- }
- gpv = next;
- }
- }
- break;
case GL_TESS_CONTROL_PROGRAM_NV:
- {
- struct st_tessctrl_program *sttcp =
- (struct st_tessctrl_program *) target;
- struct st_basic_variant *tcpv, **prevPtr = &sttcp->variants;
-
- for (tcpv = sttcp->variants; tcpv; ) {
- struct st_basic_variant *next = tcpv->next;
- if (tcpv->key.st == st) {
- /* unlink from list */
- *prevPtr = next;
- /* destroy this variant */
- delete_basic_variant(st, tcpv, sttcp->Base.Base.Target);
- }
- else {
- prevPtr = &tcpv->next;
- }
- tcpv = next;
- }
- }
- break;
case GL_TESS_EVALUATION_PROGRAM_NV:
{
- struct st_tesseval_program *sttep =
- (struct st_tesseval_program *) target;
- struct st_basic_variant *tepv, **prevPtr = &sttep->variants;
-
- for (tepv = sttep->variants; tepv; ) {
- struct st_basic_variant *next = tepv->next;
- if (tepv->key.st == st) {
+ struct st_geometry_program *gp = (struct st_geometry_program*)target;
+ struct st_tessctrl_program *tcp = (struct st_tessctrl_program*)target;
+ struct st_tesseval_program *tep = (struct st_tesseval_program*)target;
+ struct st_basic_variant **variants =
+ target->Target == GL_GEOMETRY_PROGRAM_NV ? &gp->variants :
+ target->Target == GL_TESS_CONTROL_PROGRAM_NV ? &tcp->variants :
+ target->Target == GL_TESS_EVALUATION_PROGRAM_NV ? &tep->variants :
+ NULL;
+ struct st_basic_variant *v, **prevPtr = variants;
+
+ for (v = *variants; v; ) {
+ struct st_basic_variant *next = v->next;
+ if (v->key.st == st) {
/* unlink from list */
*prevPtr = next;
/* destroy this variant */
- delete_basic_variant(st, tepv, sttep->Base.Base.Target);
+ delete_basic_variant(st, v, target->Target);
}
else {
- prevPtr = &tepv->next;
+ prevPtr = &v->next;
}
- tepv = next;
+ v = next;
}
}
break;