aboutsummaryrefslogtreecommitdiff
path: root/samples/config_helper_vulkan.cc
diff options
context:
space:
mode:
Diffstat (limited to 'samples/config_helper_vulkan.cc')
-rw-r--r--samples/config_helper_vulkan.cc98
1 files changed, 69 insertions, 29 deletions
diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc
index 68114ab..6a82a4a 100644
--- a/samples/config_helper_vulkan.cc
+++ b/samples/config_helper_vulkan.cc
@@ -758,25 +758,60 @@ 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 size_control =
- VkPhysicalDeviceSubgroupSizeControlFeaturesEXT();
- size_control.sType =
+ VkPhysicalDeviceSubgroupSizeControlFeaturesEXT
+ subgroup_size_control_features = {};
+ VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers_features = {};
+ VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {};
+ VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {};
+ VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {};
+
+ subgroup_size_control_features.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT;
- size_control.pNext = nullptr;
+ subgroup_size_control_features.pNext = nullptr;
- VkPhysicalDeviceVariablePointerFeaturesKHR var_ptrs =
- VkPhysicalDeviceVariablePointerFeaturesKHR();
- var_ptrs.sType =
+ // 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;
- var_ptrs.pNext = &size_control;
+ 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;
+ float16_int8_features.pNext = &variable_pointers_features;
+
+ storage_8bit_features.sType =
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
+ storage_8bit_features.pNext = &float16_int8_features;
+
+ storage_16bit_features.sType =
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
+ storage_16bit_features.pNext = &storage_8bit_features;
VkPhysicalDeviceFeatures2KHR features2 = VkPhysicalDeviceFeatures2KHR();
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
- features2.pNext = &var_ptrs;
+ features2.pNext = &storage_16bit_features;
auto vkGetPhysicalDeviceFeatures2KHR =
reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
@@ -794,13 +829,34 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
}
if ((feature == kVariablePointers &&
- var_ptrs.variablePointers == VK_FALSE) ||
+ variable_pointers_features.variablePointers == VK_FALSE) ||
(feature == kVariablePointersStorageBuffer &&
- var_ptrs.variablePointersStorageBuffer == VK_FALSE) ||
+ variable_pointers_features.variablePointersStorageBuffer ==
+ VK_FALSE) ||
(feature == kSubgroupSizeControl &&
- size_control.subgroupSizeControl == VK_FALSE) ||
+ subgroup_size_control_features.subgroupSizeControl == VK_FALSE) ||
(feature == kComputeFullSubgroups &&
- size_control.computeFullSubgroups == VK_FALSE)) {
+ subgroup_size_control_features.computeFullSubgroups == VK_FALSE) ||
+ (feature == kFloat16Int8_Float16 &&
+ float16_int8_features.shaderFloat16 == VK_FALSE) ||
+ (feature == kFloat16Int8_Int8 &&
+ float16_int8_features.shaderInt8 == VK_FALSE) ||
+ (feature == k8BitStorage_Storage &&
+ storage_8bit_features.storageBuffer8BitAccess == VK_FALSE) ||
+ (feature == k8BitStorage_UniformAndStorage &&
+ storage_8bit_features.uniformAndStorageBuffer8BitAccess ==
+ VK_FALSE) ||
+ (feature == k8BitStorage_PushConstant &&
+ storage_8bit_features.storagePushConstant8 == VK_FALSE) ||
+ (feature == k16BitStorage_Storage &&
+ storage_16bit_features.storageBuffer16BitAccess == VK_FALSE) ||
+ (feature == k16BitStorage_InputOutput &&
+ storage_16bit_features.storageInputOutput16 == VK_FALSE) ||
+ (feature == k16BitStorage_PushConstant &&
+ storage_16bit_features.storagePushConstant16 == VK_FALSE) ||
+ (feature == k16BitStorage_UniformAndStorage &&
+ storage_16bit_features.uniformAndStorageBuffer16BitAccess ==
+ VK_FALSE)) {
return amber::Result("Device does not support all required features");
}
}
@@ -823,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");