From fa7fbdb0883a8f523ddf4206ad0a13a334a2f5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Wed, 19 Aug 2020 23:49:50 +0200 Subject: [PATCH] v3dv/pipeline: set 16bit return_size for shadows always So far we were pre-generating two variants, an all 16 bit return_size and an all 32-bit return_size, as at pipeline creation time we don't know the texture format that it would be used finally used. But it is possible to override or at least refine the 32bit case, as we know in advance that all shadow textures can (and in fact should) use return_size 16bit. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 3 ++- src/broadcom/vulkan/v3dv_pipeline.c | 19 ++++++++++++++----- src/broadcom/vulkan/v3dv_private.h | 4 +++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index d0484c85454..4fe54733f5e 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -2851,7 +2851,8 @@ cmd_buffer_populate_v3d_key(struct v3d_key *key, } } } - v3dv_update_v3d_key(key, v3d_key_return_size); + v3d_key_update_return_size(cmd_buffer->state.pipeline, key, + v3d_key_return_size); } } diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index b3f9dbc08a7..b0a5c0dcff7 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -1589,16 +1589,25 @@ v3dv_get_shader_variant(struct v3dv_pipeline_stage *p_stage, /* This methods updates the return size for a given key. It assumes that it * was already properly populated. So for example values for key->num_tex_used * should be correct at this point + * + * Note that even the @return_size to set is 32bit, it could be overriden to + * 16bit, like for shadow textures, that we know in advance that they are + * always 16bit. */ void -v3dv_update_v3d_key(struct v3d_key *key, - uint32_t return_size) +v3d_key_update_return_size(struct v3dv_pipeline *pipeline, + struct v3d_key *key, + uint32_t return_size) { assert(return_size == 32 || return_size == 16); + struct v3dv_descriptor_map *texture_map = &pipeline->texture_map; for (uint32_t tex_idx = 0; tex_idx < key->num_tex_used; tex_idx++) { - key->tex[tex_idx].return_size = return_size; - key->tex[tex_idx].return_channels = return_size == 16 ? 2 : 4; + key->tex[tex_idx].return_size = + texture_map->is_shadow[tex_idx] ? 16 : return_size; + + key->tex[tex_idx].return_channels = + key->tex[tex_idx].return_size == 16 ? 2 : 4; } } @@ -1632,7 +1641,7 @@ pregenerate_shader_variants(struct v3dv_pipeline_stage *p_stage, return variant_16; } - v3dv_update_v3d_key(key, 32); + v3d_key_update_return_size(p_stage->pipeline, key, 32); struct v3dv_shader_variant *variant_32 = v3dv_get_shader_variant(p_stage, cache, key, key_size, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index b5048c0c4bc..aea3789ee42 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1739,7 +1739,9 @@ struct v3dv_cl_reloc v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_ struct v3dv_pipeline_stage *p_stage, uint32_t **wg_count_offsets); -void v3dv_update_v3d_key(struct v3d_key *key, uint32_t return_size); +void v3d_key_update_return_size(struct v3dv_pipeline *pipeline, + struct v3d_key *key, + uint32_t return_size); struct v3dv_shader_variant * v3dv_get_shader_variant(struct v3dv_pipeline_stage *p_stage,