{
struct svga_context *svga = svga_context(pipe);
struct svga_vertex_shader *vs = (struct svga_vertex_shader *)shader;
+ struct svga_vertex_shader *next_vs;
struct svga_shader_variant *variant, *tmp;
enum pipe_error ret;
assert(vs->base.parent == NULL);
- /* Check if there is a generated geometry shader to go with this
- * vertex shader. If there is, then delete the geometry shader as well.
- */
- if (vs->gs != NULL) {
- svga->pipe.delete_gs_state(&svga->pipe, vs->gs);
- }
+ while (vs) {
+ next_vs = (struct svga_vertex_shader *)vs->base.next;
- if (vs->base.stream_output != NULL)
- svga_delete_stream_output(svga, vs->base.stream_output);
+ /* Check if there is a generated geometry shader to go with this
+ * vertex shader. If there is, then delete the geometry shader as well.
+ */
+ if (vs->gs != NULL) {
+ svga->pipe.delete_gs_state(&svga->pipe, vs->gs);
+ }
- draw_delete_vertex_shader(svga->swtnl.draw, vs->draw_shader);
+ if (vs->base.stream_output != NULL)
+ svga_delete_stream_output(svga, vs->base.stream_output);
- for (variant = vs->base.variants; variant; variant = tmp) {
- tmp = variant->next;
+ draw_delete_vertex_shader(svga->swtnl.draw, vs->draw_shader);
- /* Check if deleting currently bound shader */
- if (variant == svga->state.hw_draw.vs) {
- ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_VS, NULL);
- if (ret != PIPE_OK) {
- svga_context_flush(svga, NULL);
+ for (variant = vs->base.variants; variant; variant = tmp) {
+ tmp = variant->next;
+
+ /* Check if deleting currently bound shader */
+ if (variant == svga->state.hw_draw.vs) {
ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_VS, NULL);
- assert(ret == PIPE_OK);
+ if (ret != PIPE_OK) {
+ svga_context_flush(svga, NULL);
+ ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_VS, NULL);
+ assert(ret == PIPE_OK);
+ }
+ svga->state.hw_draw.vs = NULL;
}
- svga->state.hw_draw.vs = NULL;
+
+ svga_destroy_shader_variant(svga, variant);
}
- svga_destroy_shader_variant(svga, variant);
+ FREE((void *)vs->base.tokens);
+ FREE(vs);
+ vs = next_vs;
}
-
- FREE((void *)vs->base.tokens);
- FREE(vs);
}