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_result *result, *tmp; enum pipe_error ret; svga_hwtnl_flush_retry( svga ); draw_delete_vertex_shader(svga->swtnl.draw, vs->draw_shader); for (result = vs->base.results; result; result = tmp ) { tmp = result->next; ret = SVGA3D_DestroyShader(svga->swc, result->id, SVGA3D_SHADERTYPE_VS ); if(ret != PIPE_OK) { svga_context_flush(svga, NULL); ret = SVGA3D_DestroyShader(svga->swc, result->id, SVGA3D_SHADERTYPE_VS ); assert(ret == PIPE_OK); } svga_destroy_shader_result( result ); } FREE((void *)vs->base.tokens); FREE(vs); }
static void svga_delete_fs_state(struct pipe_context *pipe, void *shader) { struct svga_context *svga = svga_context(pipe); struct svga_fragment_shader *fs = (struct svga_fragment_shader *) shader; struct svga_shader_result *result, *tmp; enum pipe_error ret; svga_hwtnl_flush_retry( svga ); draw_delete_fragment_shader(svga->swtnl.draw, fs->draw_shader); for (result = fs->base.results; result; result = tmp ) { tmp = result->next; ret = SVGA3D_DestroyShader(svga->swc, result->id, SVGA3D_SHADERTYPE_PS ); if(ret != PIPE_OK) { svga_context_flush(svga, NULL); ret = SVGA3D_DestroyShader(svga->swc, result->id, SVGA3D_SHADERTYPE_PS ); assert(ret == PIPE_OK); } util_bitmask_clear( svga->fs_bm, result->id ); svga_destroy_shader_result( result ); /* * Remove stale references to this result to ensure a new result on the * same address will be detected as a change. */ if(result == svga->state.hw_draw.fs) svga->state.hw_draw.fs = NULL; } FREE((void *)fs->base.tokens); FREE(fs); }
static enum pipe_error compile_vs( struct svga_context *svga, struct svga_vertex_shader *vs, const struct svga_vs_compile_key *key, struct svga_shader_result **out_result ) { struct svga_shader_result *result; enum pipe_error ret = PIPE_ERROR; result = svga_translate_vertex_program( vs, key ); if (result == NULL) { ret = PIPE_ERROR_OUT_OF_MEMORY; goto fail; } result->id = util_bitmask_add(svga->vs_bm); if(result->id == UTIL_BITMASK_INVALID_INDEX) { ret = PIPE_ERROR_OUT_OF_MEMORY; goto fail; } ret = SVGA3D_DefineShader(svga->swc, result->id, SVGA3D_SHADERTYPE_VS, result->tokens, result->nr_tokens * sizeof result->tokens[0]); if (ret) goto fail; *out_result = result; result->next = vs->base.results; vs->base.results = result; return PIPE_OK; fail: if (result) { if (result->id != UTIL_BITMASK_INVALID_INDEX) util_bitmask_clear( svga->vs_bm, result->id ); svga_destroy_shader_result( result ); } return ret; }