Revert "Vulkan: Report and enable subgroup size control device extension."
This reverts commit 4ae315b0d11882f341c22147672e1661bcb3b7d7.
Reason for revert: crbug.com/1059205
Bug: chromium:1059205
Original change's description:
> Vulkan: Report and enable subgroup size control device extension.
>
> Certain Vulkan ICDs (Intel ones notably) will compile SPIR-V
> shaders with an liberal, compiler-selected, subgroup size (i.e.
> either 8, 16 or 32). For more context, see [1].
>
> This can be a problem for compute, when one shader stores data
> in device memory using a subgroup-size dependent layout, to be
> consumed by a another shader. Problems arise when the compiler
> decides to compile both shaders with different subgroup sizes.
>
> To work-around this, the VK_EXT_subgroup_size_control device
> extension was introduced recently: it allows the device to
> report the min/max subgroup sizes it provides, and allows
> the Vulkan program to control the subgroup size precisely
> if it wants to.
>
> This patch adds support to the Vulkan backend to report and
> enable the extension if it is available. Note that:
>
> - The corresponding VkStructureType enum values and
> struct types are not rolled to the third-party Vulkan
> headers used by Dawn yet, so vulkan_platform.h has been
> modified to define them if necessary. This can be
> removed in the future when the Vulkan-Headers are
> updated in a different patch.
>
> - This modifies VulkanDeviceInfo::GatherDeviceInfo() to
> use VkGetPhysicalDevice{Properties2,Features2} if the
> VK_KHR_get_device_properties2 instance extension is
> available. Otherwise, the Vulkan 1.0 APIs
> VkGetPhysicalDevice{Properties,Features} are used instead
> (and it is assumed that no subgroup size control is
> possible).
>
> - This changes the definition of VulkanDeviceKnobs to
> make room for the required pNext-linked chains of
> extensions.
>
> - A helper class, PNextChainBuilder is also provided in
> UtilsVulkan.h to make it easy to build pNext-linked
> extension struct chains at runtime, as required when
> probing device propertires/features, or when
> creating a new VkDevice handle.
>
> Apart from that, there is no change in behaviour in this CL.
> I.e. a later CL might force a specific subgroup size for
> consistency, or introduce a new API to let Dawn clients
> select a fixed subgroup size.
>
> [1] https://bugs.freedesktop.org/show_bug.cgi?id=108875
>
> Change-Id: I524af6ff3479f25b0a8bb139a062fe632c826893
> Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/16020
> Reviewed-by: Austin Eng <enga@chromium.org>
> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
TBR=cwallez@google.com,cwallez@chromium.org,enga@chromium.org,enga@google.com,david.turner.dev@gmail.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I893d771d7effdf83685dda3edac8a08f98d2f6e5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/16522
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/vulkan/DeviceVk.cpp b/src/dawn_native/vulkan/DeviceVk.cpp
index 2c7e40f..e78718e 100644
--- a/src/dawn_native/vulkan/DeviceVk.cpp
+++ b/src/dawn_native/vulkan/DeviceVk.cpp
@@ -40,7 +40,6 @@
#include "dawn_native/vulkan/StagingBufferVk.h"
#include "dawn_native/vulkan/SwapChainVk.h"
#include "dawn_native/vulkan/TextureVk.h"
-#include "dawn_native/vulkan/UtilsVulkan.h"
#include "dawn_native/vulkan/VulkanError.h"
namespace dawn_native { namespace vulkan {
@@ -309,22 +308,6 @@
ResultOrError<VulkanDeviceKnobs> Device::CreateDevice(VkPhysicalDevice physicalDevice) {
VulkanDeviceKnobs usedKnobs = {};
- // Some device features can only be enabled using a VkPhysicalDeviceFeatures2
- // struct, which is supported by the VK_EXT_get_physical_properties2 instance
- // extension, which was promoted as a core API in Vulkan 1.1.
- //
- // Prepare a VkPhysicalDeviceFeatures2 struct for this use case, it will
- // only be populated if |hasPhysicalDeviceFeatures2| is true.
- //
- bool hasPhysicalDeviceFeatures2 =
- ToBackend(GetAdapter())->GetBackend()->GetGlobalInfo().getPhysicalDeviceProperties2;
-
- VkPhysicalDeviceFeatures2 features2 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
- .pNext = nullptr,
- };
- PNextChainBuilder featuresChain(&features2);
-
float zero = 0.0f;
std::vector<const char*> layersToRequest;
std::vector<const char*> extensionsToRequest;
@@ -374,21 +357,6 @@
extensionsToRequest.push_back(kExtensionNameKhrMaintenance1);
usedKnobs.maintenance1 = true;
}
- if (mDeviceInfo.subgroupSizeControl) {
- // This extension is part of Vulkan 1.1 which always provides support
- // for VkPhysicalDeviceFeatures2.
- ASSERT(hasPhysicalDeviceFeatures2);
-
- // Always require subgroup size control if available.
- extensionsToRequest.push_back(kExtensionNameExtSubgroupSizeControl);
- usedKnobs.subgroupSizeControl = true;
-
- VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* dst =
- &usedKnobs.featuresExtensions.subgroupSizeControl;
-
- *dst = mDeviceInfo.featuresExtensions.subgroupSizeControl;
- featuresChain.Add(dst);
- }
// Always require independentBlend because it is a core Dawn feature
usedKnobs.features.independentBlend = VK_TRUE;
@@ -447,15 +415,6 @@
createInfo.ppEnabledExtensionNames = extensionsToRequest.data();
createInfo.pEnabledFeatures = &usedKnobs.features;
- if (hasPhysicalDeviceFeatures2 && features2.pNext != nullptr) {
- // IMPORTANT: To enable features that are not covered by VkPhysicalDeviceFeatures,
- // one should include a VkPhysicalDeviceFeatures2 struct in the
- // VkDeviceCreateInfo.pNext chain, and set VkDeviceCreateInfo.pEnabledFeatures to null.
- features2.features = usedKnobs.features;
- createInfo.pNext = &features2;
- createInfo.pEnabledFeatures = nullptr;
- }
-
DAWN_TRY(CheckVkSuccess(fn.CreateDevice(physicalDevice, &createInfo, nullptr, &mVkDevice),
"vkCreateDevice"));
diff --git a/src/dawn_native/vulkan/UtilsVulkan.h b/src/dawn_native/vulkan/UtilsVulkan.h
index cdd89ba..02ef6d3 100644
--- a/src/dawn_native/vulkan/UtilsVulkan.h
+++ b/src/dawn_native/vulkan/UtilsVulkan.h
@@ -21,70 +21,6 @@
namespace dawn_native { namespace vulkan {
- // A Helper type used to build a pNext chain of extension structs.
- // Usage is:
- // 1) Create instance, passing the address of the first struct in the
- // chain. This will parse the existing |pNext| chain in it to find
- // its tail.
- //
- // 2) Call Add(vk_struct) everytime a new struct needs to be appended
- // to the chain.
- //
- // 3) Alternatively, call Add(vk_struct, VK_STRUCTURE_TYPE_XXX) to
- // initialize the struct with a given VkStructeType value while
- // appending it to the chain.
- //
- // Examples:
- // VkPhysicalFeatures2 features2 = {
- // .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
- // .pNext = nullptr,
- // };
- //
- // PNextChainBuilder featuresChain(&features2);
- //
- // featuresChain.Add(&featuresExtensions.subgroupSizeControl,
- // VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT);
- //
- struct PNextChainBuilder {
- // Constructor takes the address of a Vulkan structure instance, and
- // walks its pNext chain to record the current location of its tail.
- //
- // NOTE: Some VK_STRUCT_TYPE define their pNext field as a const void*
- // which is why the VkBaseOutStructure* casts below are necessary.
- template <typename VK_STRUCT_TYPE>
- explicit PNextChainBuilder(VK_STRUCT_TYPE* head)
- : mTailPtr(&reinterpret_cast<VkBaseOutStructure*>(head)->pNext) {
- // Find the end of the current chain.
- while (*mTailPtr) {
- mTailPtr = &(*mTailPtr)->pNext;
- }
- }
-
- // Add one item to the chain. |vk_struct| must be a Vulkan structure
- // that is already initialized.
- template <typename VK_STRUCT_TYPE>
- void Add(VK_STRUCT_TYPE* vkStruct) {
- // Sanity checks to ensure proper type safety.
- static_assert(
- offsetof(VK_STRUCT_TYPE, sType) == offsetof(VkBaseOutStructure, sType) &&
- offsetof(VK_STRUCT_TYPE, pNext) == offsetof(VkBaseOutStructure, pNext),
- "Argument type is not a proper Vulkan structure type");
- vkStruct->pNext = nullptr;
- *mTailPtr = reinterpret_cast<VkBaseOutStructure*>(vkStruct);
- mTailPtr = &(*mTailPtr)->pNext;
- }
-
- // A variant of Add() above that also initializes the |sType| field in |vk_struct|.
- template <typename VK_STRUCT_TYPE>
- void Add(VK_STRUCT_TYPE* vkStruct, VkStructureType sType) {
- vkStruct->sType = sType;
- Add(vkStruct);
- }
-
- private:
- VkBaseOutStructure** mTailPtr;
- };
-
VkCompareOp ToVulkanCompareOp(wgpu::CompareFunction op);
Extent3D ComputeTextureCopyExtent(const TextureCopy& textureCopy, const Extent3D& copySize);
diff --git a/src/dawn_native/vulkan/VulkanInfo.cpp b/src/dawn_native/vulkan/VulkanInfo.cpp
index be01707..9bc68ee 100644
--- a/src/dawn_native/vulkan/VulkanInfo.cpp
+++ b/src/dawn_native/vulkan/VulkanInfo.cpp
@@ -17,7 +17,6 @@
#include "common/Log.h"
#include "dawn_native/vulkan/AdapterVk.h"
#include "dawn_native/vulkan/BackendVk.h"
-#include "dawn_native/vulkan/UtilsVulkan.h"
#include "dawn_native/vulkan/VulkanError.h"
#include <cstring>
@@ -80,7 +79,6 @@
const char kExtensionNameKhrXlibSurface[] = "VK_KHR_xlib_surface";
const char kExtensionNameFuchsiaImagePipeSurface[] = "VK_FUCHSIA_imagepipe_surface";
const char kExtensionNameKhrMaintenance1[] = "VK_KHR_maintenance1";
- const char kExtensionNameExtSubgroupSizeControl[] = "VK_EXT_subgroup_size_control";
ResultOrError<VulkanGlobalInfo> GatherGlobalInfo(const Backend& backend) {
VulkanGlobalInfo info = {};
@@ -226,43 +224,8 @@
const VulkanFunctions& vkFunctions = adapter.GetBackend()->GetFunctions();
// Gather general info about the device
-
- // Use VkGetPhysicalDeviceFeatures2() when available, otherwise fallback
- // to VkGetPhysicalDeviceFeatures().
- if (adapter.GetBackend()->GetGlobalInfo().getPhysicalDeviceProperties2) {
- // NOTE: VkGetPhysicalDevice{Features2,Properties2} will populate
- // the |features2.features| and |properties2.properties| struct, as
- // well as the extension structs in their respective pNext chains.
- VkPhysicalDeviceFeatures2 features2 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
- };
-
- VkPhysicalDeviceProperties2 properties2 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
- };
-
- PNextChainBuilder propsChain(&properties2);
- PNextChainBuilder featuresChain(&features2);
-
- // Add all known properties extension structs to the chain.
- propsChain.Add(&info.propertiesExtensions.subgroupSizeControl,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT);
-
- vkFunctions.GetPhysicalDeviceProperties2(physicalDevice, &properties2);
-
- // Add all known features extension structs to the chain.
- featuresChain.Add(&info.featuresExtensions.subgroupSizeControl,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT);
-
- vkFunctions.GetPhysicalDeviceFeatures2(physicalDevice, &features2);
-
- info.features = features2.features;
- info.properties = properties2.properties;
- } else {
- // There is no way to query extensions, do read |properties| and |features| directly.
- vkFunctions.GetPhysicalDeviceProperties(physicalDevice, &info.properties);
- vkFunctions.GetPhysicalDeviceFeatures(physicalDevice, &info.features);
- }
+ vkFunctions.GetPhysicalDeviceProperties(physicalDevice, &info.properties);
+ vkFunctions.GetPhysicalDeviceFeatures(physicalDevice, &info.features);
// Gather info about device memory.
{
@@ -348,9 +311,6 @@
if (IsExtensionName(extension, kExtensionNameKhrMaintenance1)) {
info.maintenance1 = true;
}
- if (IsExtensionName(extension, kExtensionNameExtSubgroupSizeControl)) {
- info.subgroupSizeControl = true;
- }
}
}
diff --git a/src/dawn_native/vulkan/VulkanInfo.h b/src/dawn_native/vulkan/VulkanInfo.h
index 82ecea3..13a0fdd 100644
--- a/src/dawn_native/vulkan/VulkanInfo.h
+++ b/src/dawn_native/vulkan/VulkanInfo.h
@@ -52,7 +52,6 @@
extern const char kExtensionNameKhrXlibSurface[];
extern const char kExtensionNameFuchsiaImagePipeSurface[];
extern const char kExtensionNameKhrMaintenance1[];
- extern const char kExtensionNameExtSubgroupSizeControl[];
// Global information - gathered before the instance is created
struct VulkanGlobalKnobs {
@@ -87,12 +86,6 @@
struct VulkanDeviceKnobs {
VkPhysicalDeviceFeatures features;
- // The physical device features that are only accessible when
- // getPhysicalDeviceProperties2 is true.
- struct {
- VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroupSizeControl;
- } featuresExtensions;
-
// Extensions, promoted extensions are set to true if their core version is supported.
bool debugMarker = false;
bool externalMemory = false;
@@ -105,18 +98,10 @@
bool externalSemaphoreZirconHandle = false;
bool swapchain = false;
bool maintenance1 = false;
- bool subgroupSizeControl = false;
};
struct VulkanDeviceInfo : VulkanDeviceKnobs {
VkPhysicalDeviceProperties properties;
-
- // The physical device properties that are only accessible when
- // getPhysicalDeviceProperties2 is true.
- struct {
- VkPhysicalDeviceSubgroupSizeControlPropertiesEXT subgroupSizeControl;
- } propertiesExtensions;
-
std::vector<VkQueueFamilyProperties> queueFamilies;
std::vector<VkMemoryType> memoryTypes;