mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-09 08:20:12 +01:00
svga: add svga shader type in the shader variant
With this patch, the svga shader type will be saved in the shader variant, and there is no need to pass in the shader type to the define/destroy variant functions. Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
ac6b33a50d
commit
daf567f797
10 changed files with 33 additions and 31 deletions
|
|
@ -108,7 +108,7 @@ svga_delete_fs_state(struct pipe_context *pipe, void *shader)
|
|||
svga->state.hw_draw.fs = NULL;
|
||||
}
|
||||
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
}
|
||||
|
||||
FREE((void *)fs->base.tokens);
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ svga_delete_gs_state(struct pipe_context *pipe, void *shader)
|
|||
svga->state.hw_draw.gs = NULL;
|
||||
}
|
||||
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
}
|
||||
|
||||
FREE((void *)gs->base.tokens);
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@ svga_delete_vs_state(struct pipe_context *pipe, void *shader)
|
|||
svga->state.hw_draw.vs = NULL;
|
||||
}
|
||||
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
}
|
||||
|
||||
FREE((void *)vs->base.tokens);
|
||||
|
|
|
|||
|
|
@ -366,7 +366,6 @@ svga_search_shader_token_key(struct svga_shader *pshader,
|
|||
*/
|
||||
static enum pipe_error
|
||||
define_gb_shader_vgpu9(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant,
|
||||
unsigned codeLen)
|
||||
{
|
||||
|
|
@ -378,7 +377,7 @@ define_gb_shader_vgpu9(struct svga_context *svga,
|
|||
* Kernel module will allocate an id for the shader and issue
|
||||
* the DefineGBShader command.
|
||||
*/
|
||||
variant->gb_shader = sws->shader_create(sws, type,
|
||||
variant->gb_shader = sws->shader_create(sws, variant->type,
|
||||
variant->tokens, codeLen);
|
||||
|
||||
if (!variant->gb_shader)
|
||||
|
|
@ -394,7 +393,6 @@ define_gb_shader_vgpu9(struct svga_context *svga,
|
|||
*/
|
||||
static enum pipe_error
|
||||
define_gb_shader_vgpu10(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant,
|
||||
unsigned codeLen)
|
||||
{
|
||||
|
|
@ -413,7 +411,7 @@ define_gb_shader_vgpu10(struct svga_context *svga,
|
|||
|
||||
/* Create gb memory for the shader and upload the shader code */
|
||||
variant->gb_shader = swc->shader_create(swc,
|
||||
variant->id, type,
|
||||
variant->id, variant->type,
|
||||
variant->tokens, codeLen);
|
||||
|
||||
if (!variant->gb_shader) {
|
||||
|
|
@ -431,7 +429,7 @@ define_gb_shader_vgpu10(struct svga_context *svga,
|
|||
* the shader creation and return an error.
|
||||
*/
|
||||
ret = SVGA3D_vgpu10_DefineAndBindShader(swc, variant->gb_shader,
|
||||
variant->id, type, codeLen);
|
||||
variant->id, variant->type, codeLen);
|
||||
|
||||
if (ret != PIPE_OK)
|
||||
goto fail;
|
||||
|
|
@ -456,7 +454,6 @@ fail_no_allocation:
|
|||
*/
|
||||
enum pipe_error
|
||||
svga_define_shader(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant)
|
||||
{
|
||||
unsigned codeLen = variant->nr_tokens * sizeof(variant->tokens[0]);
|
||||
|
|
@ -468,9 +465,9 @@ svga_define_shader(struct svga_context *svga,
|
|||
|
||||
if (svga_have_gb_objects(svga)) {
|
||||
if (svga_have_vgpu10(svga))
|
||||
ret = define_gb_shader_vgpu10(svga, type, variant, codeLen);
|
||||
ret = define_gb_shader_vgpu10(svga, variant, codeLen);
|
||||
else
|
||||
ret = define_gb_shader_vgpu9(svga, type, variant, codeLen);
|
||||
ret = define_gb_shader_vgpu9(svga, variant, codeLen);
|
||||
}
|
||||
else {
|
||||
/* Allocate an integer ID for the shader */
|
||||
|
|
@ -483,7 +480,7 @@ svga_define_shader(struct svga_context *svga,
|
|||
/* Issue SVGA3D device command to define the shader */
|
||||
ret = SVGA3D_DefineShader(svga->swc,
|
||||
variant->id,
|
||||
type,
|
||||
variant->type,
|
||||
variant->tokens,
|
||||
codeLen);
|
||||
if (ret != PIPE_OK) {
|
||||
|
|
@ -534,16 +531,20 @@ svga_set_shader(struct svga_context *svga,
|
|||
|
||||
|
||||
struct svga_shader_variant *
|
||||
svga_new_shader_variant(struct svga_context *svga)
|
||||
svga_new_shader_variant(struct svga_context *svga, enum pipe_shader_type type)
|
||||
{
|
||||
svga->hud.num_shaders++;
|
||||
return CALLOC_STRUCT(svga_shader_variant);
|
||||
struct svga_shader_variant *variant = CALLOC_STRUCT(svga_shader_variant);
|
||||
|
||||
if (variant) {
|
||||
variant->type = svga_shader_type(type);
|
||||
svga->hud.num_shaders++;
|
||||
}
|
||||
return variant;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
svga_destroy_shader_variant(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant)
|
||||
{
|
||||
enum pipe_error ret = PIPE_OK;
|
||||
|
|
@ -569,11 +570,11 @@ svga_destroy_shader_variant(struct svga_context *svga,
|
|||
}
|
||||
else {
|
||||
if (variant->id != UTIL_BITMASK_INVALID_INDEX) {
|
||||
ret = SVGA3D_DestroyShader(svga->swc, variant->id, type);
|
||||
ret = SVGA3D_DestroyShader(svga->swc, variant->id, variant->type);
|
||||
if (ret != PIPE_OK) {
|
||||
/* flush and try again */
|
||||
svga_context_flush(svga, NULL);
|
||||
ret = SVGA3D_DestroyShader(svga->swc, variant->id, type);
|
||||
ret = SVGA3D_DestroyShader(svga->swc, variant->id, variant->type);
|
||||
assert(ret == PIPE_OK);
|
||||
}
|
||||
util_bitmask_clear(svga->shader_id_bm, variant->id);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,9 @@ struct svga_shader_variant
|
|||
/** Parameters used to generate this variant */
|
||||
struct svga_compile_key key;
|
||||
|
||||
/* svga shader type */
|
||||
SVGA3dShaderType type;
|
||||
|
||||
/* Compiled shader tokens:
|
||||
*/
|
||||
const unsigned *tokens;
|
||||
|
|
@ -274,7 +277,6 @@ svga_search_shader_token_key(struct svga_shader *shader,
|
|||
|
||||
enum pipe_error
|
||||
svga_define_shader(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant);
|
||||
|
||||
enum pipe_error
|
||||
|
|
@ -283,11 +285,10 @@ svga_set_shader(struct svga_context *svga,
|
|||
struct svga_shader_variant *variant);
|
||||
|
||||
struct svga_shader_variant *
|
||||
svga_new_shader_variant(struct svga_context *svga);
|
||||
svga_new_shader_variant(struct svga_context *svga, enum pipe_shader_type type);
|
||||
|
||||
void
|
||||
svga_destroy_shader_variant(struct svga_context *svga,
|
||||
SVGA3dShaderType type,
|
||||
struct svga_shader_variant *variant);
|
||||
|
||||
enum pipe_error
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ compile_fs(struct svga_context *svga,
|
|||
(unsigned) (variant->nr_tokens
|
||||
* sizeof(variant->tokens[0])));
|
||||
/* Free the too-large variant */
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
/* Use simple pass-through shader instead */
|
||||
variant = get_compiled_dummy_shader(svga, fs, key);
|
||||
}
|
||||
|
|
@ -158,9 +158,9 @@ compile_fs(struct svga_context *svga,
|
|||
return PIPE_ERROR;
|
||||
}
|
||||
|
||||
ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_PS, variant);
|
||||
ret = svga_define_shader(svga, variant);
|
||||
if (ret != PIPE_OK) {
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -87,9 +87,9 @@ compile_gs(struct svga_context *svga,
|
|||
}
|
||||
}
|
||||
|
||||
ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_GS, variant);
|
||||
ret = svga_define_shader(svga, variant);
|
||||
if (ret != PIPE_OK) {
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ compile_vs(struct svga_context *svga,
|
|||
(unsigned) (variant->nr_tokens
|
||||
* sizeof(variant->tokens[0])));
|
||||
/* Free the too-large variant */
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
/* Use simple pass-through shader instead */
|
||||
variant = get_compiled_dummy_vertex_shader(svga, vs, key);
|
||||
}
|
||||
|
|
@ -147,9 +147,9 @@ compile_vs(struct svga_context *svga,
|
|||
return PIPE_ERROR;
|
||||
}
|
||||
|
||||
ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_VS, variant);
|
||||
ret = svga_define_shader(svga, variant);
|
||||
if (ret != PIPE_OK) {
|
||||
svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
|
||||
svga_destroy_shader_variant(svga, variant);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ svga_tgsi_vgpu9_translate(struct svga_context *svga,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
variant = svga_new_shader_variant(svga);
|
||||
variant = svga_new_shader_variant(svga, unit);
|
||||
if (!variant)
|
||||
goto fail;
|
||||
|
||||
|
|
|
|||
|
|
@ -7066,7 +7066,7 @@ svga_tgsi_vgpu10_translate(struct svga_context *svga,
|
|||
/*
|
||||
* Create, initialize the 'variant' object.
|
||||
*/
|
||||
variant = svga_new_shader_variant(svga);
|
||||
variant = svga_new_shader_variant(svga, unit);
|
||||
if (!variant)
|
||||
goto cleanup;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue