mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
zink: add fastpath for getting default shader variants
no need for hashing or lookups if this is the default variant also have an alt variant for vertex stages to account for streamout and halfz lowering Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10513>
This commit is contained in:
parent
1ff40cedf0
commit
6dab5898db
4 changed files with 30 additions and 0 deletions
|
|
@ -41,6 +41,7 @@ struct pipe_screen;
|
|||
struct zink_context;
|
||||
struct zink_screen;
|
||||
struct zink_shader_key;
|
||||
struct zink_shader_module;
|
||||
struct zink_gfx_program;
|
||||
|
||||
struct nir_shader_compiler_options;
|
||||
|
|
|
|||
|
|
@ -218,6 +218,7 @@ shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
|||
default:
|
||||
unreachable("impossible case");
|
||||
}
|
||||
key->is_default_variant = !vs_key->clip_halfz && vs_key->push_drawid;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -244,6 +245,8 @@ shader_key_fs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
|||
fs_key->coord_replace_bits = ctx->rast_state->base.sprite_coord_enable;
|
||||
fs_key->coord_replace_yinvert = !!ctx->rast_state->base.sprite_coord_mode;
|
||||
}
|
||||
key->is_default_variant = !fs_key->samples && !fs_key->force_dual_color_blend &&
|
||||
!fs_key->coord_replace_bits && !fs_key->coord_replace_yinvert;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -271,6 +274,19 @@ static zink_shader_key_gen shader_key_vtbl[] =
|
|||
[MESA_SHADER_FRAGMENT] = shader_key_fs_gen,
|
||||
};
|
||||
|
||||
/* return pointer to make function reusable */
|
||||
static inline struct zink_shader_module **
|
||||
get_default_shader_module_ptr(struct zink_gfx_program *prog, struct zink_shader *zs, struct zink_shader_key *key)
|
||||
{
|
||||
if (zs->nir->info.stage == MESA_SHADER_VERTEX ||
|
||||
zs->nir->info.stage == MESA_SHADER_TESS_EVAL) {
|
||||
/* no streamout or halfz */
|
||||
if (!zink_vs_key(key)->last_vertex_stage)
|
||||
return &prog->default_variants[zs->nir->info.stage][1];
|
||||
}
|
||||
return &prog->default_variants[zs->nir->info.stage][0];
|
||||
}
|
||||
|
||||
static struct zink_shader_module *
|
||||
get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, struct zink_gfx_program *prog)
|
||||
{
|
||||
|
|
@ -279,6 +295,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
|
|||
struct zink_shader_key key = {};
|
||||
VkShaderModule mod;
|
||||
struct zink_shader_module *zm;
|
||||
struct zink_shader_module **default_zm = NULL;
|
||||
struct keybox *keybox;
|
||||
uint32_t hash;
|
||||
bool needs_base_size = false;
|
||||
|
|
@ -292,6 +309,12 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
|
|||
ctx->inlinable_uniforms[pstage],
|
||||
zs->nir->info.num_inlinable_uniforms * 4);
|
||||
needs_base_size = true;
|
||||
key.is_default_variant = false;
|
||||
}
|
||||
if (key.is_default_variant) {
|
||||
default_zm = get_default_shader_module_ptr(prog, zs, &key);
|
||||
if (*default_zm)
|
||||
return *default_zm;
|
||||
}
|
||||
if (needs_base_size)
|
||||
key.size += sizeof(struct zink_shader_key_base);
|
||||
|
|
@ -320,6 +343,9 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
|
|||
zm->shader = mod;
|
||||
|
||||
_mesa_hash_table_insert_pre_hashed(prog->shader_cache->shader_cache, hash, keybox, zm);
|
||||
if (key.is_default_variant)
|
||||
/* previously returned */
|
||||
*default_zm = zm;
|
||||
}
|
||||
return zm;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ struct zink_gfx_program {
|
|||
struct zink_program base;
|
||||
|
||||
struct zink_shader_module *modules[ZINK_SHADER_COUNT]; // compute stage doesn't belong here
|
||||
|
||||
struct zink_shader_module *default_variants[ZINK_SHADER_COUNT][2]; //[default, no streamout]
|
||||
struct zink_shader *shaders[ZINK_SHADER_COUNT];
|
||||
struct zink_shader_cache *shader_cache;
|
||||
unsigned char shader_slot_map[VARYING_SLOT_MAX];
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ struct zink_shader_key {
|
|||
struct zink_shader_key_base base;
|
||||
unsigned inline_uniforms:1;
|
||||
uint32_t size;
|
||||
bool is_default_variant;
|
||||
};
|
||||
|
||||
static inline const struct zink_fs_key *
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue