diff options
author | asuonpaa <34128694+asuonpaa@users.noreply.github.com> | 2021-10-24 13:01:40 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-24 11:01:40 +0100 |
commit | 972b60e3f2eb4e9537f15df139a5e6fb80570474 (patch) | |
tree | 0d116d59ebbd6da5b69504a9a20114d24e692ee4 | |
parent | 93e89eed2c22deb62b2d0a46a2e376c5132775cd (diff) | |
download | amber-972b60e3f2eb4e9537f15df139a5e6fb80570474.tar.gz |
Query subgroup size control features only if VK_EXT_subgroup_size_control is supported (#966)
Running standalone Amber using SwiftShader was causing an assert because VkPhysicalDeviceSubgroupSizeControlFeaturesEXT struct was added to a pNext chain for vkGetPhysicalDeviceFeatures2 although SwiftShader doesn't support VK_EXT_subgroup_size_control extension. Now the struct is added to the chain only when the extension is supported.
-rw-r--r-- | samples/config_helper_vulkan.cc | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 964926e..6a82a4a 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -758,12 +758,28 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( const VkPhysicalDevice physical_device, const std::vector<std::string>& required_features, const std::vector<std::string>& required_extensions) { + available_device_extensions_ = GetAvailableDeviceExtensions(physical_device); + if (!AreAllExtensionsSupported(available_device_extensions_, + required_extensions)) { + return amber::Result("Device does not support all required extensions"); + } + for (const auto& ext : available_device_extensions_) { + if (ext == "VK_KHR_shader_float16_int8") + supports_shader_float16_int8_ = true; + else if (ext == "VK_KHR_8bit_storage") + supports_shader_8bit_storage_ = true; + else if (ext == "VK_KHR_16bit_storage") + supports_shader_16bit_storage_ = true; + else if (ext == "VK_EXT_subgroup_size_control") + supports_subgroup_size_control_ = true; + } + VkPhysicalDeviceFeatures required_vulkan_features = VkPhysicalDeviceFeatures(); if (supports_get_physical_device_properties2_) { VkPhysicalDeviceSubgroupSizeControlFeaturesEXT - subgroup_size_control_features; + subgroup_size_control_features = {}; VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers_features = {}; VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {}; VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {}; @@ -773,9 +789,13 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT; subgroup_size_control_features.pNext = nullptr; + // Add subgroup size control struct into the chain only if + // VK_EXT_subgroup_size_control is supported. variable_pointers_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR; - variable_pointers_features.pNext = &subgroup_size_control_features; + variable_pointers_features.pNext = supports_subgroup_size_control_ + ? &subgroup_size_control_features + : nullptr; float16_int8_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR; @@ -859,22 +879,6 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( return amber::Result("Device does not support all required features"); } - available_device_extensions_ = GetAvailableDeviceExtensions(physical_device); - if (!AreAllExtensionsSupported(available_device_extensions_, - required_extensions)) { - return amber::Result("Device does not support all required extensions"); - } - for (const auto& ext : available_device_extensions_) { - if (ext == "VK_KHR_shader_float16_int8") - supports_shader_float16_int8_ = true; - else if (ext == "VK_KHR_8bit_storage") - supports_shader_8bit_storage_ = true; - else if (ext == "VK_KHR_16bit_storage") - supports_shader_16bit_storage_ = true; - else if (ext == "VK_EXT_subgroup_size_control") - supports_subgroup_size_control_ = true; - } - vulkan_queue_family_index_ = ChooseQueueFamilyIndex(physical_device); if (vulkan_queue_family_index_ == std::numeric_limits<uint32_t>::max()) { return amber::Result("Device does not support required queue flags"); |