static void svga_delete_gs_state(struct pipe_context *pipe, void *shader) { struct svga_context *svga = svga_context(pipe); struct svga_geometry_shader *gs = (struct svga_geometry_shader *)shader; struct svga_geometry_shader *next_gs; struct svga_shader_variant *variant, *tmp; enum pipe_error ret; svga_hwtnl_flush_retry(svga); /* Start deletion from the original geometry shader state */ if (gs->base.parent != NULL) gs = (struct svga_geometry_shader *)gs->base.parent; /* Free the list of geometry shaders */ while (gs) { next_gs = (struct svga_geometry_shader *)gs->base.next; if (gs->base.stream_output != NULL) svga_delete_stream_output(svga, gs->base.stream_output); draw_delete_geometry_shader(svga->swtnl.draw, gs->draw_shader); for (variant = gs->base.variants; variant; variant = tmp) { tmp = variant->next; /* Check if deleting currently bound shader */ if (variant == svga->state.hw_draw.gs) { ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_GS, NULL); if (ret != PIPE_OK) { svga_context_flush(svga, NULL); ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_GS, NULL); assert(ret == PIPE_OK); } svga->state.hw_draw.gs = NULL; } ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant); if (ret != PIPE_OK) { svga_context_flush(svga, NULL); ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant); assert(ret == PIPE_OK); } } FREE((void *)gs->base.tokens); FREE(gs); gs = next_gs; } }
static void svga_delete_vs_state(struct pipe_context *pipe, void *shader) { struct svga_context *svga = svga_context(pipe); struct svga_vertex_shader *vs = (struct svga_vertex_shader *)shader; struct svga_shader_variant *variant, *tmp; enum pipe_error ret; svga_hwtnl_flush_retry(svga); 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); } if (vs->base.stream_output != NULL) svga_delete_stream_output(svga, vs->base.stream_output); draw_delete_vertex_shader(svga->swtnl.draw, vs->draw_shader); 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); 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; } ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant); if (ret != PIPE_OK) { svga_context_flush(svga, NULL); ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant); assert(ret == PIPE_OK); } } FREE((void *)vs->base.tokens); FREE(vs); }