From 476dbec2dd1cc85cda7778897ed0ac2fdb944d32 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Wed, 27 May 2020 19:43:32 -0700 Subject: [PATCH 1/4] Initialize VkPhysicalDeviceSubgroupSizeControlFeaturesEXT Original patch added the member to ConfigHelperVulkan but missed adding the member initialization to the constructor. Otherwise the VkBool32 members may have invalid values. Fixes validation warning VkPhysicalDeviceSubgroupSizeControlFeaturesEXT: value of subgroupSizeControl (1646295404) is neither VK_TRUE nor VK_FALSE --- samples/config_helper_vulkan.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index a239e3de7..4f53ce0fd 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -642,7 +642,9 @@ ConfigHelperVulkan::ConfigHelperVulkan() variable_pointers_feature_(VkPhysicalDeviceVariablePointerFeaturesKHR()), float16_int8_feature_(VkPhysicalDeviceFloat16Int8FeaturesKHR()), storage_8bit_feature_(VkPhysicalDevice8BitStorageFeaturesKHR()), - storage_16bit_feature_(VkPhysicalDevice16BitStorageFeaturesKHR()) {} + storage_16bit_feature_(VkPhysicalDevice16BitStorageFeaturesKHR()), + subgroup_size_control_feature_( + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT()) {} ConfigHelperVulkan::~ConfigHelperVulkan() { if (vulkan_device_) From 3d1c33f63040fdda0c23d94bcd073033759cf585 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Mon, 11 May 2020 07:36:40 -0700 Subject: [PATCH 2/4] Always use VK_KHR_get_physical_device_properties2 when available Don't restrict it to be used only with the `-V` option. This extension is necessary to use other extensions like VK_EXT_subgroup_size_control. Fixes the issue when using "DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups" worked with `-V` but failed without it. --- samples/config_helper_vulkan.cc | 15 ++++++--------- samples/config_helper_vulkan.h | 3 +-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 4f53ce0fd..1283e9d64 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -669,8 +669,7 @@ amber::Result ConfigHelperVulkan::CreateVulkanInstance( uint32_t engine_major, uint32_t engine_minor, std::vector required_extensions, - bool disable_validation_layer, - bool show_version_info) { + bool disable_validation_layer) { VkApplicationInfo app_info = VkApplicationInfo(); app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.apiVersion = VK_MAKE_VERSION(engine_major, engine_minor, 0); @@ -700,12 +699,10 @@ amber::Result ConfigHelperVulkan::CreateVulkanInstance( } } - // If dumping driver info then add useful extensions, if available. - if (show_version_info && - std::find(available_instance_extensions_.begin(), + if (std::find(available_instance_extensions_.begin(), available_instance_extensions_.end(), "VK_KHR_get_physical_device_properties2") != - available_instance_extensions_.end()) { + available_instance_extensions_.end()) { required_extensions.push_back("VK_KHR_get_physical_device_properties2"); } @@ -1153,9 +1150,9 @@ amber::Result ConfigHelperVulkan::CreateConfig( bool disable_validation_layer, bool show_version_info, std::unique_ptr* cfg_holder) { - amber::Result r = CreateVulkanInstance( - engine_major, engine_minor, required_instance_extensions, - disable_validation_layer, show_version_info); + amber::Result r = CreateVulkanInstance(engine_major, engine_minor, + required_instance_extensions, + disable_validation_layer); if (!r.IsSuccess()) return r; diff --git a/samples/config_helper_vulkan.h b/samples/config_helper_vulkan.h index e8d476a4e..70f90e4fe 100644 --- a/samples/config_helper_vulkan.h +++ b/samples/config_helper_vulkan.h @@ -58,8 +58,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl { uint32_t engine_major, uint32_t engine_minor, std::vector required_instance_extensions, - bool disable_validation_layer, - bool show_version_info); + bool disable_validation_layer); /// Create |vulkan_callback_| that reports validation layer errors /// via debugCallback() function in config_helper_vulkan.cc. From eeb5b8c89a7f58a3702d1247e4b1fcf9e1f1a8b3 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Mon, 11 May 2020 07:50:03 -0700 Subject: [PATCH 3/4] Fail if VariablePointerFeatures.* are required but not available --- samples/config_helper_vulkan.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 1283e9d64..97f331755 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -783,13 +783,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( continue; } - if (feature == kVariablePointers && - var_ptrs.variablePointers != VK_TRUE) { - continue; - } - if (feature == kVariablePointersStorageBuffer && - var_ptrs.variablePointersStorageBuffer != VK_TRUE) { - continue; + if ((feature == kVariablePointers && + var_ptrs.variablePointers == VK_FALSE) || + (feature == kVariablePointersStorageBuffer && + var_ptrs.variablePointersStorageBuffer == VK_FALSE)) { + return amber::Result("Device does not support all required features"); } } From 94a40b1d0ecf419e56a4ab774f7da0691d859c06 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Wed, 27 May 2020 10:45:26 -0700 Subject: [PATCH 4/4] Fail if SubgroupSizeControl.* features are required but not available --- samples/config_helper_vulkan.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 97f331755..b4999214a 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -758,11 +758,17 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( VkPhysicalDeviceFeatures(); if (supports_get_physical_device_properties2_) { + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT size_control = + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(); + size_control.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT; + size_control.pNext = nullptr; + VkPhysicalDeviceVariablePointerFeaturesKHR var_ptrs = VkPhysicalDeviceVariablePointerFeaturesKHR(); var_ptrs.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR; - var_ptrs.pNext = nullptr; + var_ptrs.pNext = &size_control; VkPhysicalDeviceFeatures2KHR features2 = VkPhysicalDeviceFeatures2KHR(); features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; @@ -786,7 +792,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( if ((feature == kVariablePointers && var_ptrs.variablePointers == VK_FALSE) || (feature == kVariablePointersStorageBuffer && - var_ptrs.variablePointersStorageBuffer == VK_FALSE)) { + var_ptrs.variablePointersStorageBuffer == VK_FALSE) || + (feature == kSubgroupSizeControl && + size_control.subgroupSizeControl == VK_FALSE) || + (feature == kComputeFullSubgroups && + size_control.computeFullSubgroups == VK_FALSE)) { return amber::Result("Device does not support all required features"); } }