diff --git a/docs/amber_script.md b/docs/amber_script.md index 20574a3b..60354549 100644 --- a/docs/amber_script.md +++ b/docs/amber_script.md @@ -39,6 +39,8 @@ with: * `VariablePointerFeatures.variablePointersStorageBuffer` * `Float16Int8Features.shaderFloat16` * `Float16Int8Features.shaderInt8` + * `VulkanMemoryModelFeatures.vulkanMemoryModel` + * `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope` * `Storage8BitFeatures.storageBuffer8BitAccess` * `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess` * `Storage8BitFeatures.storagePushConstant8` diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index e85ffcdc..c84fe499 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -66,6 +66,11 @@ const char k16BitStorage_PushConstant[] = const char k16BitStorage_InputOutput[] = "Storage16BitFeatures.storageInputOutput16"; +const char kVulkanMemoryModel_vulkanMemoryModel[] = + "VulkanMemoryModelFeatures.vulkanMemoryModel"; +const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] = + "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope"; + const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl"; const char kComputeFullSubgroups[] = "SubgroupSizeControl.computeFullSubgroups"; @@ -887,25 +892,25 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( return amber::Result("Device does not support all required extensions"); } for (const auto& ext : vk_.available_device_extensions) { - if (ext == "VK_KHR_shader_float16_int8") { + if (ext == VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME) { supports_.shader_float16_int8 = true; - } else if (ext == "VK_KHR_8bit_storage") { + } else if (ext == VK_KHR_8BIT_STORAGE_EXTENSION_NAME) { supports_.shader_8bit_storage = true; - } else if (ext == "VK_KHR_16bit_storage") { + } else if (ext == VK_KHR_16BIT_STORAGE_EXTENSION_NAME) { supports_.shader_16bit_storage = true; - } else if (ext == "VK_EXT_subgroup_size_control") { + } else if (ext == VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME) { supports_.subgroup_size_control = true; - } else if (ext == "VK_EXT_depth_clamp_zero_one") { + } else if (ext == VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME) { supports_.depth_clamp_zero_one = true; - } else if (ext == "VK_KHR_shader_subgroup_extended_types") { + } else if (ext == VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME) { supports_.shader_subgroup_extended_types = true; - } else if (ext == "VK_KHR_variable_pointers") { + } else if (ext == VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME) { supports_.variable_pointers = true; - } else if (ext == "VK_KHR_acceleration_structure") { + } else if (ext == VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) { supports_.acceleration_structure = true; - } else if (ext == "VK_KHR_buffer_device_address") { + } else if (ext == VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) { supports_.buffer_device_address = true; - } else if (ext == "VK_KHR_ray_tracing_pipeline") { + } else if (ext == VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME) { supports_.ray_tracing_pipeline = true; } else if (ext == VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME) { supports_.descriptor_indexing = true; @@ -915,6 +920,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( supports_.spirv_1_4 = true; } else if (ext == VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME) { supports_.shader_float_controls = true; + } else if (ext == VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) { + supports_.vulkan_memory_model = true; } } @@ -932,6 +939,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {}; VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {}; VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {}; + VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{}; VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features = {}; VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features = @@ -961,6 +969,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( variable_pointers_features.pNext = next_ptr; next_ptr = &variable_pointers_features; + memory_model_structure_features.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR; + memory_model_structure_features.pNext = next_ptr; + next_ptr = &memory_model_structure_features; + shader_subgroup_extended_types_features.sType = // NOLINTNEXTLINE(whitespace/line_length) VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES; @@ -1046,6 +1059,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( if ((feature == kVariablePointers && variable_pointers_features.variablePointers == VK_FALSE) || + (feature == kVulkanMemoryModel_vulkanMemoryModel && + memory_model_structure_features.vulkanMemoryModel == VK_FALSE) || + (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope && + memory_model_structure_features.vulkanMemoryModelDeviceScope + == VK_FALSE) || (feature == kVariablePointersStorageBuffer && variable_pointers_features.variablePointersStorageBuffer == VK_FALSE) || @@ -1268,6 +1286,16 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2( } else if (feature == kVariablePointersStorageBuffer) { features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE; } + } else if (StartsWith(feature, "VulkanMemoryModelFeatures.")) { + init_feature( + supports_.vulkan_memory_model, features_.memory_model_structure, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, + VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME); + if (feature == kVulkanMemoryModel_vulkanMemoryModel) { + features_.memory_model_structure.vulkanMemoryModel = VK_TRUE; + } else if (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope) { + features_.memory_model_structure.vulkanMemoryModelDeviceScope = 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 e414beaa..de29b2fb 100644 --- a/samples/config_helper_vulkan.h +++ b/samples/config_helper_vulkan.h @@ -130,6 +130,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl { bool deferred_host_operations = false; bool spirv_1_4 = false; bool shader_float_controls = false; + bool vulkan_memory_model = false; } supports_; struct { @@ -147,6 +148,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl { VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address{}; VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline{}; VkPhysicalDeviceDescriptorIndexingFeatures descriptor_indexing{}; + VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{}; } features_; }; diff --git a/src/amberscript/parser_device_feature_test.cc b/src/amberscript/parser_device_feature_test.cc index 1020f2f0..d6931ec7 100644 --- a/src/amberscript/parser_device_feature_test.cc +++ b/src/amberscript/parser_device_feature_test.cc @@ -34,7 +34,9 @@ DEVICE_FEATURE Storage16BitFeatures.uniformAndStorageBuffer16BitAccess DEVICE_FEATURE Storage16BitFeatures.storagePushConstant16 DEVICE_FEATURE Storage16BitFeatures.storageInputOutput16 DEVICE_FEATURE SubgroupSizeControl.subgroupSizeControl -DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups)"; +DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups +DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModel +DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)"; Parser parser; Result r = parser.Parse(in); @@ -42,7 +44,7 @@ DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups)"; auto script = parser.GetScript(); const auto& features = script->GetRequiredFeatures(); - ASSERT_EQ(13U, features.size()); + ASSERT_EQ(15U, features.size()); EXPECT_EQ("vertexPipelineStoresAndAtomics", features[0]); EXPECT_EQ("VariablePointerFeatures.variablePointersStorageBuffer", features[1]); @@ -59,6 +61,9 @@ DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups)"; EXPECT_EQ("Storage16BitFeatures.storageInputOutput16", features[10]); EXPECT_EQ("SubgroupSizeControl.subgroupSizeControl", features[11]); EXPECT_EQ("SubgroupSizeControl.computeFullSubgroups", features[12]); + EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModel", features[13]); + EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope", + features[14]); } TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) { diff --git a/src/script.cc b/src/script.cc index 9e97a9b3..df9fa5d6 100644 --- a/src/script.cc +++ b/src/script.cc @@ -106,6 +106,8 @@ bool Script::IsKnownFeature(const std::string& name) const { name == "VariablePointerFeatures.variablePointers" || name == "VariablePointerFeatures.variablePointersStorageBuffer" || name == "Float16Int8Features.shaderFloat16" || + name == "VulkanMemoryModelFeatures.vulkanMemoryModel" || + name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" || name == "Float16Int8Features.shaderInt8" || name == "Storage8BitFeatures.storageBuffer8BitAccess" || name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" ||