mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 03:08:05 +02:00
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:
parent
b781688636
commit
797e34f658
5 changed files with 6 additions and 23 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue