diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index d7b4108a2ec..5635cbfa742 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -174,6 +174,10 @@ radv_pipeline_get_shader_key(const struct radv_device *device, const VkPipelineS key.subgroup_require_full = 1; } + if (stage->flags & VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT) { + key.subgroup_allow_varying = 1; + } + return key; } diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 8e237df6133..c407f220e04 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -70,6 +70,7 @@ enum radv_required_subgroup_size { struct radv_shader_stage_key { uint8_t subgroup_required_size : 2; /* radv_required_subgroup_size */ uint8_t subgroup_require_full : 1; /* whether full subgroups are required */ + uint8_t subgroup_allow_varying : 1; /* whether subgroup size can differ from the api constant */ uint8_t storage_robustness2 : 1; uint8_t uniform_robustness2 : 1; diff --git a/src/amd/vulkan/radv_shader_object.c b/src/amd/vulkan/radv_shader_object.c index bb551e2a817..496444704d0 100644 --- a/src/amd/vulkan/radv_shader_object.c +++ b/src/amd/vulkan/radv_shader_object.c @@ -111,6 +111,10 @@ radv_shader_stage_init(const VkShaderCreateInfoEXT *sinfo, struct radv_shader_st out_stage->key.subgroup_require_full = 1; } + if (sinfo->flags & VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT) { + out_stage->key.subgroup_allow_varying = 1; + } + if (sinfo->flags & VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT) out_stage->key.indirect_bindable = 1;