diff --git a/docs/amber_script.md b/docs/amber_script.md index 60354549..e37a4d1c 100644 --- a/docs/amber_script.md +++ b/docs/amber_script.md @@ -41,6 +41,7 @@ with: * `Float16Int8Features.shaderInt8` * `VulkanMemoryModelFeatures.vulkanMemoryModel` * `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope` + * `ZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory` * `Storage8BitFeatures.storageBuffer8BitAccess` * `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess` * `Storage8BitFeatures.storagePushConstant8` diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index c84fe499..808bd9f8 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -71,6 +71,10 @@ const char kVulkanMemoryModel_vulkanMemoryModel[] = const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] = "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope"; +const char kZeroInitializeWorkgroupMemory[] = + "ZeroInitializeWorkgroupMemoryFeatures." + "shaderZeroInitializeWorkgroupMemory"; + const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl"; const char kComputeFullSubgroups[] = "SubgroupSizeControl.computeFullSubgroups"; @@ -922,6 +926,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( supports_.shader_float_controls = true; } else if (ext == VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) { supports_.vulkan_memory_model = true; + } else if (ext == VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME) { + supports_.zero_initialize_workgroup_memory = true; } } @@ -940,6 +946,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {}; VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {}; VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{}; + VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR + zero_initialize_workgroup_memory_features{}; VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features = {}; VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features = @@ -974,6 +982,12 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( memory_model_structure_features.pNext = next_ptr; next_ptr = &memory_model_structure_features; + zero_initialize_workgroup_memory_features.sType = + // NOLINTNEXTLINE(whitespace/line_length) + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR; + zero_initialize_workgroup_memory_features.pNext = next_ptr; + next_ptr = &zero_initialize_workgroup_memory_features; + shader_subgroup_extended_types_features.sType = // NOLINTNEXTLINE(whitespace/line_length) VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES; @@ -1064,6 +1078,10 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope && memory_model_structure_features.vulkanMemoryModelDeviceScope == VK_FALSE) || + (feature == + kZeroInitializeWorkgroupMemory && + zero_initialize_workgroup_memory_features + .shaderZeroInitializeWorkgroupMemory == VK_FALSE) || (feature == kVariablePointersStorageBuffer && variable_pointers_features.variablePointersStorageBuffer == VK_FALSE) || @@ -1296,6 +1314,19 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2( } else if (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope) { features_.memory_model_structure.vulkanMemoryModelDeviceScope = VK_TRUE; } + } else if (StartsWith(feature, "ZeroInitializeWorkgroupMemoryFeatures.")) { + init_feature( + supports_.zero_initialize_workgroup_memory, + features_.zero_initialize_workgroup_memory_features, + // NOLINTNEXTLINE(whitespace/line_length) + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR, + // NOLINTNEXTLINE(whitespace/line_length) + VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME); + if (feature == + kZeroInitializeWorkgroupMemory) { + features_.zero_initialize_workgroup_memory_features + .shaderZeroInitializeWorkgroupMemory = VK_TRUE; + } } else if (StartsWith(feature, "Float16Int8Features.")) { init_feature(supports_.shader_float16_int8, features_.float16_int8, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, diff --git a/samples/config_helper_vulkan.h b/samples/config_helper_vulkan.h index de29b2fb..fce1649d 100644 --- a/samples/config_helper_vulkan.h +++ b/samples/config_helper_vulkan.h @@ -131,6 +131,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl { bool spirv_1_4 = false; bool shader_float_controls = false; bool vulkan_memory_model = false; + bool zero_initialize_workgroup_memory = false; } supports_; struct { @@ -149,6 +150,8 @@ class ConfigHelperVulkan : public ConfigHelperImpl { VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline{}; VkPhysicalDeviceDescriptorIndexingFeatures descriptor_indexing{}; VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{}; + VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR + zero_initialize_workgroup_memory_features{}; } features_; }; diff --git a/src/amberscript/parser_device_feature_test.cc b/src/amberscript/parser_device_feature_test.cc index d6931ec7..ae677c2a 100644 --- a/src/amberscript/parser_device_feature_test.cc +++ b/src/amberscript/parser_device_feature_test.cc @@ -36,7 +36,8 @@ DEVICE_FEATURE Storage16BitFeatures.storageInputOutput16 DEVICE_FEATURE SubgroupSizeControl.subgroupSizeControl DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModel -DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)"; +DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope +DEVICE_FEATURE ZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory)"; Parser parser; Result r = parser.Parse(in); @@ -44,7 +45,7 @@ DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)"; auto script = parser.GetScript(); const auto& features = script->GetRequiredFeatures(); - ASSERT_EQ(15U, features.size()); + ASSERT_EQ(16U, features.size()); EXPECT_EQ("vertexPipelineStoresAndAtomics", features[0]); EXPECT_EQ("VariablePointerFeatures.variablePointersStorageBuffer", features[1]); @@ -64,6 +65,9 @@ DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)"; EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModel", features[13]); EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope", features[14]); + EXPECT_EQ("ZeroInitializeWorkgroupMemoryFeatures." + "shaderZeroInitializeWorkgroupMemory", + features[15]); } TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) { diff --git a/src/script.cc b/src/script.cc index df9fa5d6..c8dd4140 100644 --- a/src/script.cc +++ b/src/script.cc @@ -108,6 +108,9 @@ bool Script::IsKnownFeature(const std::string& name) const { name == "Float16Int8Features.shaderFloat16" || name == "VulkanMemoryModelFeatures.vulkanMemoryModel" || name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" || + name == + "ZeroInitializeWorkgroupMemoryFeatures." + "shaderZeroInitializeWorkgroupMemory" || name == "Float16Int8Features.shaderInt8" || name == "Storage8BitFeatures.storageBuffer8BitAccess" || name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" ||