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:
Mike Blumenkrantz 2021-01-23 11:02:59 -05:00 committed by Marge Bot
parent 1ff40cedf0
commit 6dab5898db
4 changed files with 30 additions and 0 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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];

View file

@ -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 *