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,