[dawn] Disable subgroups for intel gen-9 devices for all OS
The subgroupBroadcast(f16) function (and possibly others) has
implementation issues on gen-9 devices. It may be possible to fix this
issue by polyfill or bitcasting at a later date.
Bug: 391680973, 373415240
Change-Id: Id7c48f118faf8f7b55759a17da5c8eabacbfda94
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/223074
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
diff --git a/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp b/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
index e76509f..e1fac6f 100644
--- a/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
+++ b/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
@@ -164,8 +164,11 @@
shaderF16Enabled = true;
}
+ // The function subgroupBroadcast(f16) fails for some edge cases on intel gen-9 devices.
+ // See crbug.com/391680973
+ const bool kForceDisableSubgroups = gpu_info::IsIntelGen9(GetVendorId(), GetDeviceId());
// Subgroups feature requires SM >= 6.0 and capabilities flags.
- if (GetBackend()->IsDXCAvailable() && mDeviceInfo.supportsWaveOps) {
+ if (!kForceDisableSubgroups && GetBackend()->IsDXCAvailable() && mDeviceInfo.supportsWaveOps) {
EnableFeature(Feature::Subgroups);
// D3D12 devices that support both native f16 and wave ops can support subgroups-f16.
// TODO(crbug.com/380244620): Remove when 'subgroups_f16' has been fully deprecated.
diff --git a/src/dawn/native/metal/PhysicalDeviceMTL.mm b/src/dawn/native/metal/PhysicalDeviceMTL.mm
index 38a1508..cd03277 100644
--- a/src/dawn/native/metal/PhysicalDeviceMTL.mm
+++ b/src/dawn/native/metal/PhysicalDeviceMTL.mm
@@ -662,6 +662,10 @@
EnableFeature(Feature::Float32Blendable);
EnableFeature(Feature::FlexibleTextureViews);
+ // The function subgroupBroadcast(f16) fails for some edge cases on intel gen-9 devices.
+ // See crbug.com/391680973
+ const bool kForceDisableSubgroups = gpu_info::IsIntelGen9(GetVendorId(), GetDeviceId());
+
// SIMD-scoped permute operations is supported by GPU family Metal3, Apple6, Apple7, Apple8,
// and Mac2.
// https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
@@ -672,8 +676,8 @@
// Note that supportsFamily: method requires macOS 10.15+ or iOS 13.0+
// TODO(380326541): Check that reduction operations are supported in Apple6. The support
// table says Apple7.
- if ([*mDevice supportsFamily:MTLGPUFamilyApple6] ||
- [*mDevice supportsFamily:MTLGPUFamilyMac2]) {
+ if (!kForceDisableSubgroups && ([*mDevice supportsFamily:MTLGPUFamilyApple6] ||
+ [*mDevice supportsFamily:MTLGPUFamilyMac2])) {
EnableFeature(Feature::Subgroups);
// TODO(crbug.com/380244620) remove SubgroupsF16
EnableFeature(Feature::SubgroupsF16);
diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
index 7bffff1..7fa5313 100644
--- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
+++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
@@ -387,6 +387,10 @@
EnableFeature(Feature::AdapterPropertiesVk);
EnableFeature(Feature::DawnLoadResolveTexture);
+ // The function subgroupBroadcast(f16) fails for some edge cases on intel gen-9 devices.
+ // See crbug.com/391680973
+ const bool kForceDisableSubgroups = gpu_info::IsIntelGen9(GetVendorId(), GetDeviceId());
+
// Enable Subgroups feature if:
// 1. Vulkan API version is 1.1 or later, and
// 2. subgroupSupportedStages includes compute and fragment stage bit, and
@@ -394,7 +398,7 @@
// and quad bits, and
// 4. VK_EXT_subgroup_size_control extension is valid, and both subgroupSizeControl
// and computeFullSubgroups is TRUE in VkPhysicalDeviceSubgroupSizeControlFeaturesEXT.
- if ((mDeviceInfo.properties.apiVersion >= VK_API_VERSION_1_1) &&
+ if (!kForceDisableSubgroups && (mDeviceInfo.properties.apiVersion >= VK_API_VERSION_1_1) &&
(mDeviceInfo.subgroupProperties.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT) &&
(mDeviceInfo.subgroupProperties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT) &&
(mDeviceInfo.subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_BASIC_BIT) &&