Implement VK_KHR_shader_subgroup_extended_types
This extension allows subgroup operations to use 8-bit, 16-bit, and
64-bit integers as well as 16-bit floating point types if the
implementation supports those types. So no work is required other
than enabling the extension.
Bug: b/169606946
Tests: dEQP-VK.subgroups.arithmetic.*
Change-Id: I824ad65a1c9d5f9fb98bc5769f97920de5815d0f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49448
Tested-by: Sean Risser <srisser@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index f6bd6ee..3271c04 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -212,6 +212,12 @@
}
template<typename T>
+static void getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(T *features)
+{
+ features->shaderSubgroupExtendedTypes = VK_TRUE;
+}
+
+template<typename T>
static void getPhysicalDeviceVulkan12Features(T *features)
{
features->samplerMirrorClampToEdge = VK_FALSE;
@@ -245,7 +251,7 @@
features->scalarBlockLayout = VK_FALSE;
getPhysicalDeviceImagelessFramebufferFeatures(features);
features->uniformBufferStandardLayout = VK_FALSE;
- features->shaderSubgroupExtendedTypes = VK_FALSE;
+ getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(features);
getPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR(features);
features->hostQueryReset = VK_FALSE;
features->timelineSemaphore = VK_FALSE;
@@ -311,6 +317,9 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
getPhysicalDeviceImagelessFramebufferFeatures(reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures *>(curExtension));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR:
+ getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *>(curExtension));
+ break;
default:
LOG_TRAP("curExtension->pNext->sType = %s", vk::Stringify(curExtension->sType).c_str());
break;
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 41977fd..8755c8d 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -391,7 +391,8 @@
{ VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION },
// Vulkan 1.2 promoted extensions
{ VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION },
- { VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION }
+ { VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION },
+ { VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION }
};
static bool hasExtension(const char *extensionName, const VkExtensionProperties *extensionProperties, uint32_t extensionPropertiesCount)