[vulkan] Set VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT
This guarantees that:
- SPIR-V SubgroupSize is the number of invocations in the subgroup, even
if some invocations start out inactive.
- All subgroups in the dispatch have the same SubgroupSize.
Fixed: crbug.com/410595996
Change-Id: Ib6bd941e721ecd2c4f64a12123534e9f6853b261
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/247214
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: David Neto <dneto@google.com>
diff --git a/src/dawn/native/vulkan/ComputePipelineVk.cpp b/src/dawn/native/vulkan/ComputePipelineVk.cpp
index c237679..b633ed2 100644
--- a/src/dawn/native/vulkan/ComputePipelineVk.cpp
+++ b/src/dawn/native/vulkan/ComputePipelineVk.cpp
@@ -94,10 +94,14 @@
createInfo.stage.pName = device->GetIsolatedEntryPointName().data();
createInfo.stage.pSpecializationInfo = nullptr;
+ // This is required to ensure SubgroupSize is reported as the actual size of the subgroups
+ // (even if some invocations may be disabled), and that the subgroup size will be uniform
+ // across the entire dispatch. This becomes unnecessary with SPIR-V 1.6.
+ createInfo.flags |= VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT;
+
// If the shader stage uses subgroup matrix types, we need to enable full subgroups to guarantee
// that all shader invocations are active. This becomes unnecessary with SPIR-V 1.6.
if (computeStage.metadata->usesSubgroupMatrix) {
- createInfo.flags |= VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT;
createInfo.flags |= VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT;
}
diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
index a3bb0b0..48f3c46 100644
--- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
+++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
@@ -447,8 +447,9 @@
// 2. subgroupSupportedStages includes compute and fragment stage bit, and
// 3. subgroupSupportedOperations includes vote, ballot, shuffle, shuffle relative, arithmetic,
// and quad bits, and
- // 4. VK_EXT_subgroup_size_control extension is valid, and both subgroupSizeControl
- // and computeFullSubgroups is TRUE in VkPhysicalDeviceSubgroupSizeControlFeaturesEXT.
+ // 4. VK_EXT_subgroup_size_control extension is valid, and subgroupSizeControl
+ // is TRUE in VkPhysicalDeviceSubgroupSizeControlFeaturesEXT. This is required
+ // to support VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT.
const bool hasBaseSubgroupSupport =
(mDeviceInfo.properties.apiVersion >= VK_API_VERSION_1_1) &&
(mDeviceInfo.subgroupProperties.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT) &&
@@ -461,8 +462,7 @@
(mDeviceInfo.subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_ARITHMETIC_BIT) &&
(mDeviceInfo.subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_QUAD_BIT) &&
(mDeviceInfo.HasExt(DeviceExt::SubgroupSizeControl)) &&
- (mDeviceInfo.subgroupSizeControlFeatures.subgroupSizeControl == VK_TRUE) &&
- (mDeviceInfo.subgroupSizeControlFeatures.computeFullSubgroups == VK_TRUE);
+ (mDeviceInfo.subgroupSizeControlFeatures.subgroupSizeControl == VK_TRUE);
// If shader f16 is enabled we only enable subgroups if we extended subgroup support.
// This means there is a vary narrow number of devices (~4%) will not get subgroup