svga: change svga_destroy_shader_variant() to return void

svga_destroy_shader_variant() itself flushes and retries the command
if there's a failure.  So no need for the callers to do it.  Other
callers of the function were already ignoring the return value.

This also fixes a corner-case double-free reported by Coverity
(and reported by Dave Airlie).

Tested with various OpenGL apps.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul 2018-10-09 08:55:46 -06:00
parent b781688636
commit 797e34f658
5 changed files with 6 additions and 23 deletions

View file

@ -108,12 +108,7 @@ svga_delete_fs_state(struct pipe_context *pipe, void *shader)
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, SVGA3D_SHADERTYPE_PS, variant);
}
FREE((void *)fs->base.tokens);

View file

@ -120,13 +120,7 @@ svga_delete_gs_state(struct pipe_context *pipe, void *shader)
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);
}
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
}
FREE((void *)gs->base.tokens);

View file

@ -199,12 +199,7 @@ svga_delete_vs_state(struct pipe_context *pipe, void *shader)
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);
}
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
}
FREE((void *)vs->base.tokens);

View file

@ -541,7 +541,7 @@ svga_new_shader_variant(struct svga_context *svga)
}
enum pipe_error
void
svga_destroy_shader_variant(struct svga_context *svga,
SVGA3dShaderType type,
struct svga_shader_variant *variant)
@ -557,6 +557,7 @@ svga_destroy_shader_variant(struct svga_context *svga,
/* flush and try again */
svga_context_flush(svga, NULL);
ret = SVGA3D_vgpu10_DestroyShader(svga->swc, variant->id);
assert(ret == PIPE_OK);
}
util_bitmask_clear(svga->shader_id_bm, variant->id);
}
@ -583,8 +584,6 @@ svga_destroy_shader_variant(struct svga_context *svga,
FREE(variant);
svga->hud.num_shaders--;
return ret;
}
/*

View file

@ -285,7 +285,7 @@ svga_set_shader(struct svga_context *svga,
struct svga_shader_variant *
svga_new_shader_variant(struct svga_context *svga);
enum pipe_error
void
svga_destroy_shader_variant(struct svga_context *svga,
SVGA3dShaderType type,
struct svga_shader_variant *variant);