Skip to content

Commit 83c140b

Browse files
Adding Vulkan memory model feature (#1098)
Adds support for requesting the vulkan memory model to be used.
1 parent 9482448 commit 83c140b

File tree

5 files changed

+51
-12
lines changed

5 files changed

+51
-12
lines changed

docs/amber_script.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ with:
3939
* `VariablePointerFeatures.variablePointersStorageBuffer`
4040
* `Float16Int8Features.shaderFloat16`
4141
* `Float16Int8Features.shaderInt8`
42+
* `VulkanMemoryModelFeatures.vulkanMemoryModel`
43+
* `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope`
4244
* `Storage8BitFeatures.storageBuffer8BitAccess`
4345
* `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess`
4446
* `Storage8BitFeatures.storagePushConstant8`

samples/config_helper_vulkan.cc

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ const char k16BitStorage_PushConstant[] =
6666
const char k16BitStorage_InputOutput[] =
6767
"Storage16BitFeatures.storageInputOutput16";
6868

69+
const char kVulkanMemoryModel_vulkanMemoryModel[] =
70+
"VulkanMemoryModelFeatures.vulkanMemoryModel";
71+
const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] =
72+
"VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope";
73+
6974
const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl";
7075
const char kComputeFullSubgroups[] = "SubgroupSizeControl.computeFullSubgroups";
7176

@@ -887,25 +892,25 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
887892
return amber::Result("Device does not support all required extensions");
888893
}
889894
for (const auto& ext : vk_.available_device_extensions) {
890-
if (ext == "VK_KHR_shader_float16_int8") {
895+
if (ext == VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME) {
891896
supports_.shader_float16_int8 = true;
892-
} else if (ext == "VK_KHR_8bit_storage") {
897+
} else if (ext == VK_KHR_8BIT_STORAGE_EXTENSION_NAME) {
893898
supports_.shader_8bit_storage = true;
894-
} else if (ext == "VK_KHR_16bit_storage") {
899+
} else if (ext == VK_KHR_16BIT_STORAGE_EXTENSION_NAME) {
895900
supports_.shader_16bit_storage = true;
896-
} else if (ext == "VK_EXT_subgroup_size_control") {
901+
} else if (ext == VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME) {
897902
supports_.subgroup_size_control = true;
898-
} else if (ext == "VK_EXT_depth_clamp_zero_one") {
903+
} else if (ext == VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME) {
899904
supports_.depth_clamp_zero_one = true;
900-
} else if (ext == "VK_KHR_shader_subgroup_extended_types") {
905+
} else if (ext == VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME) {
901906
supports_.shader_subgroup_extended_types = true;
902-
} else if (ext == "VK_KHR_variable_pointers") {
907+
} else if (ext == VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME) {
903908
supports_.variable_pointers = true;
904-
} else if (ext == "VK_KHR_acceleration_structure") {
909+
} else if (ext == VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) {
905910
supports_.acceleration_structure = true;
906-
} else if (ext == "VK_KHR_buffer_device_address") {
911+
} else if (ext == VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) {
907912
supports_.buffer_device_address = true;
908-
} else if (ext == "VK_KHR_ray_tracing_pipeline") {
913+
} else if (ext == VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME) {
909914
supports_.ray_tracing_pipeline = true;
910915
} else if (ext == VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME) {
911916
supports_.descriptor_indexing = true;
@@ -915,6 +920,8 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
915920
supports_.spirv_1_4 = true;
916921
} else if (ext == VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME) {
917922
supports_.shader_float_controls = true;
923+
} else if (ext == VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) {
924+
supports_.vulkan_memory_model = true;
918925
}
919926
}
920927

@@ -932,6 +939,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
932939
VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {};
933940
VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {};
934941
VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {};
942+
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{};
935943
VkPhysicalDeviceAccelerationStructureFeaturesKHR
936944
acceleration_structure_features = {};
937945
VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features =
@@ -961,6 +969,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
961969
variable_pointers_features.pNext = next_ptr;
962970
next_ptr = &variable_pointers_features;
963971

972+
memory_model_structure_features.sType =
973+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR;
974+
memory_model_structure_features.pNext = next_ptr;
975+
next_ptr = &memory_model_structure_features;
976+
964977
shader_subgroup_extended_types_features.sType =
965978
// NOLINTNEXTLINE(whitespace/line_length)
966979
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
@@ -1046,6 +1059,11 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
10461059

10471060
if ((feature == kVariablePointers &&
10481061
variable_pointers_features.variablePointers == VK_FALSE) ||
1062+
(feature == kVulkanMemoryModel_vulkanMemoryModel &&
1063+
memory_model_structure_features.vulkanMemoryModel == VK_FALSE) ||
1064+
(feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope &&
1065+
memory_model_structure_features.vulkanMemoryModelDeviceScope
1066+
== VK_FALSE) ||
10491067
(feature == kVariablePointersStorageBuffer &&
10501068
variable_pointers_features.variablePointersStorageBuffer ==
10511069
VK_FALSE) ||
@@ -1268,6 +1286,16 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
12681286
} else if (feature == kVariablePointersStorageBuffer) {
12691287
features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE;
12701288
}
1289+
} else if (StartsWith(feature, "VulkanMemoryModelFeatures.")) {
1290+
init_feature(
1291+
supports_.vulkan_memory_model, features_.memory_model_structure,
1292+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR,
1293+
VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME);
1294+
if (feature == kVulkanMemoryModel_vulkanMemoryModel) {
1295+
features_.memory_model_structure.vulkanMemoryModel = VK_TRUE;
1296+
} else if (feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope) {
1297+
features_.memory_model_structure.vulkanMemoryModelDeviceScope = VK_TRUE;
1298+
}
12711299
} else if (StartsWith(feature, "Float16Int8Features.")) {
12721300
init_feature(supports_.shader_float16_int8, features_.float16_int8,
12731301
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,

samples/config_helper_vulkan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
130130
bool deferred_host_operations = false;
131131
bool spirv_1_4 = false;
132132
bool shader_float_controls = false;
133+
bool vulkan_memory_model = false;
133134
} supports_;
134135

135136
struct {
@@ -147,6 +148,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
147148
VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address{};
148149
VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline{};
149150
VkPhysicalDeviceDescriptorIndexingFeatures descriptor_indexing{};
151+
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{};
150152
} features_;
151153
};
152154

src/amberscript/parser_device_feature_test.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ DEVICE_FEATURE Storage16BitFeatures.uniformAndStorageBuffer16BitAccess
3434
DEVICE_FEATURE Storage16BitFeatures.storagePushConstant16
3535
DEVICE_FEATURE Storage16BitFeatures.storageInputOutput16
3636
DEVICE_FEATURE SubgroupSizeControl.subgroupSizeControl
37-
DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups)";
37+
DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups
38+
DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModel
39+
DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)";
3840

3941
Parser parser;
4042
Result r = parser.Parse(in);
4143
ASSERT_TRUE(r.IsSuccess()) << r.Error();
4244

4345
auto script = parser.GetScript();
4446
const auto& features = script->GetRequiredFeatures();
45-
ASSERT_EQ(13U, features.size());
47+
ASSERT_EQ(15U, features.size());
4648
EXPECT_EQ("vertexPipelineStoresAndAtomics", features[0]);
4749
EXPECT_EQ("VariablePointerFeatures.variablePointersStorageBuffer",
4850
features[1]);
@@ -59,6 +61,9 @@ DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups)";
5961
EXPECT_EQ("Storage16BitFeatures.storageInputOutput16", features[10]);
6062
EXPECT_EQ("SubgroupSizeControl.subgroupSizeControl", features[11]);
6163
EXPECT_EQ("SubgroupSizeControl.computeFullSubgroups", features[12]);
64+
EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModel", features[13]);
65+
EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope",
66+
features[14]);
6267
}
6368

6469
TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) {

src/script.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ bool Script::IsKnownFeature(const std::string& name) const {
106106
name == "VariablePointerFeatures.variablePointers" ||
107107
name == "VariablePointerFeatures.variablePointersStorageBuffer" ||
108108
name == "Float16Int8Features.shaderFloat16" ||
109+
name == "VulkanMemoryModelFeatures.vulkanMemoryModel" ||
110+
name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" ||
109111
name == "Float16Int8Features.shaderInt8" ||
110112
name == "Storage8BitFeatures.storageBuffer8BitAccess" ||
111113
name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" ||

0 commit comments

Comments
 (0)