Module: Mesa Branch: main Commit: 727e10d290edd4994ed518b51bee8c944544628d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=727e10d290edd4994ed518b51bee8c944544628d
Author: Mike Blumenkrantz <[email protected]> Date: Mon Sep 13 09:30:21 2021 -0400 zink: use smallest int type possible for decompose shader key this reduces the component key size for decomposition by up to 75%, down to as low as 2 bytes, which is more optimal for both hashing and memcmp of the key it will become more useful as further changes are added to improve vertex format support, enabling the keysize to remain relatively small Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12771> --- src/gallium/drivers/zink/zink_compiler.c | 17 +++++++++++++++-- src/gallium/drivers/zink/zink_program.c | 21 ++++++++++++++++++--- src/gallium/drivers/zink/zink_shader_keys.h | 18 ++++++++++++++++-- src/gallium/drivers/zink/zink_state.c | 1 + src/gallium/drivers/zink/zink_state.h | 1 + 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 17d5f9d29f5..c0689983a8e 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -807,8 +807,21 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad case MESA_SHADER_VERTEX: { uint32_t decomposed_attrs = 0, decomposed_attrs_without_w = 0; const struct zink_vs_key *vs_key = zink_vs_key(key); - decomposed_attrs = vs_key->decomposed_attrs; - decomposed_attrs_without_w = vs_key->decomposed_attrs_without_w; + switch (vs_key->size) { + case 4: + decomposed_attrs = vs_key->u32.decomposed_attrs; + decomposed_attrs_without_w = vs_key->u32.decomposed_attrs_without_w; + break; + case 2: + decomposed_attrs = vs_key->u16.decomposed_attrs; + decomposed_attrs_without_w = vs_key->u16.decomposed_attrs_without_w; + break; + case 1: + decomposed_attrs = vs_key->u8.decomposed_attrs; + decomposed_attrs_without_w = vs_key->u8.decomposed_attrs_without_w; + break; + default: break; + } if (decomposed_attrs || decomposed_attrs_without_w) NIR_PASS_V(nir, decompose_attribs, decomposed_attrs, decomposed_attrs_without_w); FALLTHROUGH; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index fd569f449d1..4a74d63b93f 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -134,9 +134,24 @@ shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs, { struct zink_vs_key *vs_key = &key->key.vs; shader_key_vs_base_gen(ctx, zs, shaders, key); - vs_key->decomposed_attrs = ctx->element_state->decomposed_attrs; - vs_key->decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w; - key->size += 2 * 4; + unsigned size = MAX2(ctx->element_state->decomposed_attrs_size, ctx->element_state->decomposed_attrs_without_w_size); + switch (size) { + case 1: + vs_key->u8.decomposed_attrs = ctx->element_state->decomposed_attrs; + vs_key->u8.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w; + break; + case 2: + vs_key->u16.decomposed_attrs = ctx->element_state->decomposed_attrs; + vs_key->u16.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w; + break; + case 4: + vs_key->u32.decomposed_attrs = ctx->element_state->decomposed_attrs; + vs_key->u32.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w; + break; + default: break; + } + vs_key->size = size; + key->size += 2 * size; } static void diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index 61ad37f542f..a0731f81f1a 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -35,8 +35,22 @@ struct zink_vs_key_base { struct zink_vs_key { struct zink_vs_key_base base; uint8_t pad; - uint32_t decomposed_attrs; - uint32_t decomposed_attrs_without_w; + union { + struct { + uint32_t decomposed_attrs; + uint32_t decomposed_attrs_without_w; + } u32; + struct { + uint16_t decomposed_attrs; + uint16_t decomposed_attrs_without_w; + } u16; + struct { + uint8_t decomposed_attrs; + uint8_t decomposed_attrs_without_w; + } u8; + }; + // not hashed + unsigned size; }; struct zink_fs_key { diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 9810f5c1f8e..00b4b3864e6 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -99,6 +99,7 @@ zink_create_vertex_elements_state(struct pipe_context *pctx, ves->decomposed_attrs_size = size; } else { ves->decomposed_attrs_without_w |= BITFIELD_BIT(i); + ves->decomposed_attrs_without_w_size = size; } } diff --git a/src/gallium/drivers/zink/zink_state.h b/src/gallium/drivers/zink/zink_state.h index 9efcadf4a4c..1254498377c 100644 --- a/src/gallium/drivers/zink/zink_state.h +++ b/src/gallium/drivers/zink/zink_state.h @@ -55,6 +55,7 @@ struct zink_vertex_elements_state { uint32_t decomposed_attrs; unsigned decomposed_attrs_size; uint32_t decomposed_attrs_without_w; + unsigned decomposed_attrs_without_w_size; struct zink_vertex_elements_hw_state hw_state; };
