diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index fbd75cdc211..7352b0aa11d 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -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; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 90e58b60359..7b966492ffe 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -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; } diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 168efbc424a..b3a56450057 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -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]; diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index 660ad4c4d1c..6ce0a5ff4b7 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -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 *