From 7b9bb309f2716ce25609d98094b44484af358220 Mon Sep 17 00:00:00 2001 From: Peter McNeeley Date: Fri, 19 Dec 2025 14:47:48 -0500 Subject: [PATCH 1/3] init --- samples/config_helper_vulkan.cc | 19 +++++++++++++++++++ samples/config_helper_vulkan.h | 2 ++ src/script.cc | 1 + 3 files changed, 22 insertions(+) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index e85ffcdc..29e890ed 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -915,7 +915,11 @@ 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) { + printf(" TEST TEST TEST this is working \n"); + supports_.vulkan_memory_model = true; } + } VkPhysicalDeviceFeatures required_vulkan_features = @@ -932,6 +936,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 +966,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 +1056,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( if ((feature == kVariablePointers && variable_pointers_features.variablePointers == VK_FALSE) || + (memory_model_structure_features.vulkanMemoryModel == VK_FALSE) || (feature == kVariablePointersStorageBuffer && variable_pointers_features.variablePointersStorageBuffer == VK_FALSE) || @@ -1268,6 +1279,14 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2( } else if (feature == kVariablePointersStorageBuffer) { features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE; } + } 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); + features_.memory_model_structure.vulkanMemoryModel = VK_TRUE; + features_.memory_model_structure.vulkanMemoryModelDeviceScope = VK_TRUE; + printf( " ok this is now working? \n"); } 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/script.cc b/src/script.cc index 9e97a9b3..c27d4c7d 100644 --- a/src/script.cc +++ b/src/script.cc @@ -106,6 +106,7 @@ bool Script::IsKnownFeature(const std::string& name) const { name == "VariablePointerFeatures.variablePointers" || name == "VariablePointerFeatures.variablePointersStorageBuffer" || name == "Float16Int8Features.shaderFloat16" || + name == "VulkanMemoryModelFeatures.xxx" || name == "Float16Int8Features.shaderInt8" || name == "Storage8BitFeatures.storageBuffer8BitAccess" || name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" || From 90c17803d29f51ac6d900a0df40cc121004c0f61 Mon Sep 17 00:00:00 2001 From: Peter McNeeley Date: Sat, 20 Dec 2025 17:00:34 -0500 Subject: [PATCH 2/3] Add vulkan memory model (feature) --- docs/amber_script.md | 2 + samples/config_helper_vulkan.cc | 43 +++++++++++-------- src/amberscript/parser_device_feature_test.cc | 8 +++- src/script.cc | 3 +- 4 files changed, 35 insertions(+), 21 deletions(-) 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 29e890ed..24f8867e 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -66,6 +66,9 @@ 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 +890,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; @@ -916,7 +919,6 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( } 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) { - printf(" TEST TEST TEST this is working \n"); supports_.vulkan_memory_model = true; } @@ -936,7 +938,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {}; VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {}; VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {}; - VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{}; + VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{}; VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features = {}; VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features = @@ -966,11 +968,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.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; @@ -1056,7 +1058,10 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( if ((feature == kVariablePointers && variable_pointers_features.variablePointers == VK_FALSE) || - (memory_model_structure_features.vulkanMemoryModel == 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) || @@ -1284,9 +1289,11 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2( 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); - features_.memory_model_structure.vulkanMemoryModel = VK_TRUE; - features_.memory_model_structure.vulkanMemoryModelDeviceScope = VK_TRUE; - printf( " ok this is now working? \n"); + 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/src/amberscript/parser_device_feature_test.cc b/src/amberscript/parser_device_feature_test.cc index 1020f2f0..f2cf342c 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,8 @@ 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 c27d4c7d..77c52fbc 100644 --- a/src/script.cc +++ b/src/script.cc @@ -106,7 +106,8 @@ bool Script::IsKnownFeature(const std::string& name) const { name == "VariablePointerFeatures.variablePointers" || name == "VariablePointerFeatures.variablePointersStorageBuffer" || name == "Float16Int8Features.shaderFloat16" || - name == "VulkanMemoryModelFeatures.xxx" || + name == "VulkanMemoryModelFeatures.vulkanMemoryModel" || + name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" || name == "Float16Int8Features.shaderInt8" || name == "Storage8BitFeatures.storageBuffer8BitAccess" || name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" || From 1895c8c15ff223660dea569e4ec362219f4a760b Mon Sep 17 00:00:00 2001 From: Peter McNeeley Date: Sat, 20 Dec 2025 17:53:06 -0500 Subject: [PATCH 3/3] formatting --- samples/config_helper_vulkan.cc | 14 ++++++++------ src/amberscript/parser_device_feature_test.cc | 3 ++- src/script.cc | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 24f8867e..c84fe499 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -66,8 +66,10 @@ const char k16BitStorage_PushConstant[] = const char k16BitStorage_InputOutput[] = "Storage16BitFeatures.storageInputOutput16"; -const char kVulkanMemoryModel_vulkanMemoryModel[] = "VulkanMemoryModelFeatures.vulkanMemoryModel"; -const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] = "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope"; +const char kVulkanMemoryModel_vulkanMemoryModel[] = + "VulkanMemoryModelFeatures.vulkanMemoryModel"; +const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] = + "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope"; const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl"; const char kComputeFullSubgroups[] = "SubgroupSizeControl.computeFullSubgroups"; @@ -921,7 +923,6 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( } else if (ext == VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) { supports_.vulkan_memory_model = true; } - } VkPhysicalDeviceFeatures required_vulkan_features = @@ -968,7 +969,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( variable_pointers_features.pNext = next_ptr; next_ptr = &variable_pointers_features; - memory_model_structure_features.sType = + 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; @@ -1061,7 +1062,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( (feature == kVulkanMemoryModel_vulkanMemoryModel && memory_model_structure_features.vulkanMemoryModel == VK_FALSE) || (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope && - memory_model_structure_features.vulkanMemoryModelDeviceScope == VK_FALSE) || + memory_model_structure_features.vulkanMemoryModelDeviceScope + == VK_FALSE) || (feature == kVariablePointersStorageBuffer && variable_pointers_features.variablePointersStorageBuffer == VK_FALSE) || @@ -1284,7 +1286,7 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2( } else if (feature == kVariablePointersStorageBuffer) { features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE; } - } if (StartsWith(feature, "VulkanMemoryModelFeatures.")) { + } 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, diff --git a/src/amberscript/parser_device_feature_test.cc b/src/amberscript/parser_device_feature_test.cc index f2cf342c..d6931ec7 100644 --- a/src/amberscript/parser_device_feature_test.cc +++ b/src/amberscript/parser_device_feature_test.cc @@ -62,7 +62,8 @@ DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)"; EXPECT_EQ("SubgroupSizeControl.subgroupSizeControl", features[11]); EXPECT_EQ("SubgroupSizeControl.computeFullSubgroups", features[12]); EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModel", features[13]); - EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope", features[14]); + EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope", + features[14]); } TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) { diff --git a/src/script.cc b/src/script.cc index 77c52fbc..df9fa5d6 100644 --- a/src/script.cc +++ b/src/script.cc @@ -106,8 +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 == "VulkanMemoryModelFeatures.vulkanMemoryModel" || + name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" || name == "Float16Int8Features.shaderInt8" || name == "Storage8BitFeatures.storageBuffer8BitAccess" || name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" ||