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 llvmpipe_delete_gs_state(struct pipe_context *pipe, void *gs) { struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); struct lp_geometry_shader *state = (struct lp_geometry_shader *)gs; draw_delete_geometry_shader(llvmpipe->draw, (state) ? state->draw_data : 0); FREE( (void *)state->shader.tokens ); FREE(state); }
static void llvmpipe_delete_gs_state(struct pipe_context *pipe, void *gs) { struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); struct lp_geometry_shader *state = (struct lp_geometry_shader *)gs; if (!state) { return; } draw_delete_geometry_shader(llvmpipe->draw, state->dgs); FREE(state); }