- if (gpv->driver_shader)
- cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
-
- free(gpv);
-}
-
-
-/**
- * Free all variants of a geometry program.
- */
-void
-st_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
-{
- struct st_gp_variant *gpv;
-
- for (gpv = stgp->variants; gpv; ) {
- struct st_gp_variant *next = gpv->next;
- delete_gp_variant(st, gpv);
- gpv = next;
- }
-
- stgp->variants = NULL;
-
- if (stgp->tgsi.tokens) {
- ureg_free_tokens(stgp->tgsi.tokens);
- stgp->tgsi.tokens = NULL;
- }
-}
-
-
-/**
- * Delete a tessellation control program variant. Note the caller must unlink
- * the variant from the linked list.
- */
-static void
-delete_tcp_variant(struct st_context *st, struct st_tcp_variant *tcpv)
-{
- if (tcpv->driver_shader)
- cso_delete_tessctrl_shader(st->cso_context, tcpv->driver_shader);
-
- free(tcpv);
-}
-
-
-/**
- * Free all variants of a tessellation control program.
- */
-void
-st_release_tcp_variants(struct st_context *st, struct st_tessctrl_program *sttcp)
-{
- struct st_tcp_variant *tcpv;
-
- for (tcpv = sttcp->variants; tcpv; ) {
- struct st_tcp_variant *next = tcpv->next;
- delete_tcp_variant(st, tcpv);
- tcpv = next;
- }
-
- sttcp->variants = NULL;
-
- if (sttcp->tgsi.tokens) {
- ureg_free_tokens(sttcp->tgsi.tokens);
- sttcp->tgsi.tokens = NULL;
+ if (v->driver_shader) {
+ switch (target) {
+ case GL_TESS_CONTROL_PROGRAM_NV:
+ cso_delete_tessctrl_shader(st->cso_context, v->driver_shader);
+ break;
+ case GL_TESS_EVALUATION_PROGRAM_NV:
+ cso_delete_tesseval_shader(st->cso_context, v->driver_shader);
+ break;
+ case GL_GEOMETRY_PROGRAM_NV:
+ cso_delete_geometry_shader(st->cso_context, v->driver_shader);
+ break;
+ default:
+ assert(!"this shouldn't occur");
+ }