zink: cap max shader variants with inlined uniforms

avoid making a new shader for every frame forever

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12842>
This commit is contained in:
Mike Blumenkrantz 2021-09-01 16:56:52 -04:00
parent 1aa0b2777d
commit 0418b98569
2 changed files with 11 additions and 3 deletions

View File

@ -85,18 +85,21 @@ shader_module_hash(const struct zink_shader_module *zm)
static struct zink_shader_module * static struct zink_shader_module *
get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen, get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen,
struct zink_shader *zs, struct zink_gfx_program *prog, struct zink_shader *zs, struct zink_gfx_program *prog,
const struct zink_gfx_pipeline_state *state) struct zink_gfx_pipeline_state *state)
{ {
gl_shader_stage stage = zs->nir->info.stage; gl_shader_stage stage = zs->nir->info.stage;
enum pipe_shader_type pstage = pipe_shader_type_from_mesa(stage); enum pipe_shader_type pstage = pipe_shader_type_from_mesa(stage);
VkShaderModule mod; VkShaderModule mod;
struct zink_shader_module *zm = NULL; struct zink_shader_module *zm = NULL;
unsigned base_size = 0; unsigned base_size = 0;
const struct zink_shader_key *key = &state->shader_keys.key[pstage]; struct zink_shader_key *key = &state->shader_keys.key[pstage];
if (ctx && zs->nir->info.num_inlinable_uniforms && if (ctx && zs->nir->info.num_inlinable_uniforms &&
ctx->inlinable_uniforms_valid_mask & BITFIELD64_BIT(pstage)) { ctx->inlinable_uniforms_valid_mask & BITFIELD64_BIT(pstage)) {
base_size = zs->nir->info.num_inlinable_uniforms; if (prog->inlined_variant_count[pstage] < ZINK_MAX_INLINED_VARIANTS)
base_size = zs->nir->info.num_inlinable_uniforms;
else
key->inline_uniforms = false;
} }
struct zink_shader_module *iter, *next; struct zink_shader_module *iter, *next;
@ -127,6 +130,8 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen
memcpy(zm->key + key->size, &key->base, base_size * sizeof(uint32_t)); memcpy(zm->key + key->size, &key->base, base_size * sizeof(uint32_t));
zm->hash = shader_module_hash(zm); zm->hash = shader_module_hash(zm);
zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage][0]); zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage][0]);
if (base_size)
prog->inlined_variant_count[pstage]++;
} }
list_add(&zm->list, &prog->shader_cache[pstage][!!base_size]); list_add(&zm->list, &prog->shader_cache[pstage][!!base_size]);
return zm; return zm;

View File

@ -91,6 +91,8 @@ struct zink_program {
bool removed; bool removed;
}; };
#define ZINK_MAX_INLINED_VARIANTS 5
struct zink_gfx_program { struct zink_gfx_program {
struct zink_program base; struct zink_program base;
@ -102,6 +104,7 @@ struct zink_gfx_program {
struct zink_shader *last_vertex_stage; struct zink_shader *last_vertex_stage;
struct list_head shader_cache[ZINK_SHADER_COUNT][2]; //normal, inline uniforms struct list_head shader_cache[ZINK_SHADER_COUNT][2]; //normal, inline uniforms
unsigned inlined_variant_count[ZINK_SHADER_COUNT];
struct zink_shader *shaders[ZINK_SHADER_COUNT]; struct zink_shader *shaders[ZINK_SHADER_COUNT];
struct hash_table pipelines[11]; // number of draw modes we support struct hash_table pipelines[11]; // number of draw modes we support