#include "svga_shader.h"
-static void *
+void *
svga_create_fs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
{
if (!fs)
return NULL;
+ SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_CREATEFS);
+
fs->base.tokens = tgsi_dup_tokens(templ->tokens);
/* Collect basic info that we'll need later:
fs->draw_shader = draw_create_fragment_shader(svga->swtnl.draw, templ);
+ SVGA_STATS_TIME_POP(svga_sws(svga));
return fs;
}
-static void
+void
svga_bind_fs_state(struct pipe_context *pipe, void *shader)
{
struct svga_fragment_shader *fs = (struct svga_fragment_shader *) shader;
{
struct svga_context *svga = svga_context(pipe);
struct svga_fragment_shader *fs = (struct svga_fragment_shader *) shader;
+ struct svga_fragment_shader *next_fs;
struct svga_shader_variant *variant, *tmp;
- enum pipe_error ret;
svga_hwtnl_flush_retry(svga);
assert(fs->base.parent == NULL);
- draw_delete_fragment_shader(svga->swtnl.draw, fs->draw_shader);
+ while (fs) {
+ next_fs = (struct svga_fragment_shader *) fs->base.next;
+
+ draw_delete_fragment_shader(svga->swtnl.draw, fs->draw_shader);
- for (variant = fs->base.variants; variant; variant = tmp) {
- tmp = variant->next;
+ for (variant = fs->base.variants; variant; variant = tmp) {
+ tmp = variant->next;
- /* Check if deleting currently bound shader */
- if (variant == svga->state.hw_draw.fs) {
- ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_PS, NULL);
- if (ret != PIPE_OK) {
- svga_context_flush(svga, NULL);
- ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_PS, NULL);
- assert(ret == PIPE_OK);
+ /* Check if deleting currently bound shader */
+ if (variant == svga->state.hw_draw.fs) {
+ SVGA_RETRY(svga, svga_set_shader(svga, SVGA3D_SHADERTYPE_PS, NULL));
+ svga->state.hw_draw.fs = NULL;
}
- svga->state.hw_draw.fs = NULL;
- }
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
- if (ret != PIPE_OK) {
- svga_context_flush(svga, NULL);
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
- assert(ret == PIPE_OK);
+ svga_destroy_shader_variant(svga, variant);
}
- }
- FREE((void *)fs->base.tokens);
- FREE(fs);
+ FREE((void *)fs->base.tokens);
+ FREE(fs);
+ fs = next_fs;
+ }
}