From fb9e9401c9ec4d9a2c41df52a9140530c1af7cf4 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 1 Sep 2021 16:55:32 -0400 Subject: [PATCH] zink: split out inlined uniform shader variants into separate cache Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_program.c | 12 +++++++----- src/gallium/drivers/zink/zink_program.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 9c1999c..bc206c1 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -100,7 +100,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen } struct zink_shader_module *iter, *next; - LIST_FOR_EACH_ENTRY_SAFE(iter, next, &prog->shader_cache[pstage], list) { + LIST_FOR_EACH_ENTRY_SAFE(iter, next, &prog->shader_cache[pstage][!!base_size], list) { if (!shader_key_matches(iter, key, base_size)) continue; list_delinit(&iter->list); @@ -126,9 +126,9 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen if (base_size) memcpy(zm->key + key->size, &key->base, base_size * sizeof(uint32_t)); zm->hash = shader_module_hash(zm); - zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage]); + zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage][0]); } - list_add(&zm->list, &prog->shader_cache[pstage]); + list_add(&zm->list, &prog->shader_cache[pstage][!!base_size]); return zm; } @@ -319,7 +319,8 @@ zink_create_gfx_program(struct zink_context *ctx, pipe_reference_init(&prog->base.reference, 1); for (int i = 0; i < ZINK_SHADER_COUNT; ++i) { - list_inithead(&prog->shader_cache[i]); + list_inithead(&prog->shader_cache[i][0]); + list_inithead(&prog->shader_cache[i][1]); if (stages[i]) { prog->shaders[i] = stages[i]; prog->stages_present |= BITFIELD_BIT(i); @@ -561,7 +562,8 @@ zink_destroy_gfx_program(struct zink_screen *screen, _mesa_set_remove_key(prog->shaders[i]->programs, prog); prog->shaders[i] = NULL; } - destroy_shader_cache(screen, &prog->shader_cache[i]); + destroy_shader_cache(screen, &prog->shader_cache[i][0]); + destroy_shader_cache(screen, &prog->shader_cache[i][1]); ralloc_free(prog->nir[i]); } diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 86f8810..f0d478e 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -101,7 +101,7 @@ struct zink_gfx_program { struct zink_shader *last_vertex_stage; - struct list_head shader_cache[ZINK_SHADER_COUNT]; + struct list_head shader_cache[ZINK_SHADER_COUNT][2]; //normal, inline uniforms struct zink_shader *shaders[ZINK_SHADER_COUNT]; struct hash_table pipelines[11]; // number of draw modes we support -- 2.7.4