From 6dab5898db6514dac0c5553396e8f07cece3c292 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 23 Jan 2021 11:02:59 -0500 Subject: [PATCH] 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 Part-of: --- src/gallium/drivers/zink/zink_compiler.h | 1 + src/gallium/drivers/zink/zink_program.c | 26 +++++++++++++++++++++ src/gallium/drivers/zink/zink_program.h | 2 ++ src/gallium/drivers/zink/zink_shader_keys.h | 1 + 4 files changed, 30 insertions(+) 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 *