@@ -71,6 +71,10 @@ const char kVulkanMemoryModel_vulkanMemoryModel[] =
7171const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope [] =
7272 " VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" ;
7373
74+ const char kZeroInitializeWorkgroupMemory [] =
75+ " ZeroInitializeWorkgroupMemoryFeatures."
76+ " shaderZeroInitializeWorkgroupMemory" ;
77+
7478const char kSubgroupSizeControl [] = " SubgroupSizeControl.subgroupSizeControl" ;
7579const char kComputeFullSubgroups [] = " SubgroupSizeControl.computeFullSubgroups" ;
7680
@@ -922,6 +926,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
922926 supports_.shader_float_controls = true ;
923927 } else if (ext == VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) {
924928 supports_.vulkan_memory_model = true ;
929+ } else if (ext == VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME) {
930+ supports_.zero_initialize_workgroup_memory = true ;
925931 }
926932 }
927933
@@ -940,6 +946,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
940946 VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {};
941947 VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {};
942948 VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{};
949+ VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR
950+ zero_initialize_workgroup_memory_features{};
943951 VkPhysicalDeviceAccelerationStructureFeaturesKHR
944952 acceleration_structure_features = {};
945953 VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features =
@@ -974,6 +982,12 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
974982 memory_model_structure_features.pNext = next_ptr;
975983 next_ptr = &memory_model_structure_features;
976984
985+ zero_initialize_workgroup_memory_features.sType =
986+ // NOLINTNEXTLINE(whitespace/line_length)
987+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR;
988+ zero_initialize_workgroup_memory_features.pNext = next_ptr;
989+ next_ptr = &zero_initialize_workgroup_memory_features;
990+
977991 shader_subgroup_extended_types_features.sType =
978992 // NOLINTNEXTLINE(whitespace/line_length)
979993 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
@@ -1064,6 +1078,10 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
10641078 (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope &&
10651079 memory_model_structure_features.vulkanMemoryModelDeviceScope
10661080 == VK_FALSE) ||
1081+ (feature ==
1082+ kZeroInitializeWorkgroupMemory &&
1083+ zero_initialize_workgroup_memory_features
1084+ .shaderZeroInitializeWorkgroupMemory == VK_FALSE) ||
10671085 (feature == kVariablePointersStorageBuffer &&
10681086 variable_pointers_features.variablePointersStorageBuffer ==
10691087 VK_FALSE) ||
@@ -1296,6 +1314,19 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
12961314 } else if (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope ) {
12971315 features_.memory_model_structure .vulkanMemoryModelDeviceScope = VK_TRUE;
12981316 }
1317+ } else if (StartsWith (feature, " ZeroInitializeWorkgroupMemoryFeatures." )) {
1318+ init_feature (
1319+ supports_.zero_initialize_workgroup_memory ,
1320+ features_.zero_initialize_workgroup_memory_features ,
1321+ // NOLINTNEXTLINE(whitespace/line_length)
1322+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR,
1323+ // NOLINTNEXTLINE(whitespace/line_length)
1324+ VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME);
1325+ if (feature ==
1326+ kZeroInitializeWorkgroupMemory ) {
1327+ features_.zero_initialize_workgroup_memory_features
1328+ .shaderZeroInitializeWorkgroupMemory = VK_TRUE;
1329+ }
12991330 } else if (StartsWith (feature, " Float16Int8Features." )) {
13001331 init_feature (supports_.shader_float16_int8 , features_.float16_int8 ,
13011332 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,
0 commit comments