Skip to content

Commit 6102fab

Browse files
petermcneeleychromiumPeter McNeeley
andauthored
Add zero init memory feature to amber (#1099)
* Add zero init memory feature * minor line length fixes --------- Co-authored-by: Peter McNeeley <petermcneeley@google.com>
1 parent 83c140b commit 6102fab

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

docs/amber_script.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ with:
4141
* `Float16Int8Features.shaderInt8`
4242
* `VulkanMemoryModelFeatures.vulkanMemoryModel`
4343
* `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope`
44+
* `ZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory`
4445
* `Storage8BitFeatures.storageBuffer8BitAccess`
4546
* `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess`
4647
* `Storage8BitFeatures.storagePushConstant8`

samples/config_helper_vulkan.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ const char kVulkanMemoryModel_vulkanMemoryModel[] =
7171
const char kVulkanMemoryModel_vulkanMemoryModelDeviceScope[] =
7272
"VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope";
7373

74+
const char kZeroInitializeWorkgroupMemory[] =
75+
"ZeroInitializeWorkgroupMemoryFeatures."
76+
"shaderZeroInitializeWorkgroupMemory";
77+
7478
const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl";
7579
const 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,

samples/config_helper_vulkan.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
131131
bool spirv_1_4 = false;
132132
bool shader_float_controls = false;
133133
bool vulkan_memory_model = false;
134+
bool zero_initialize_workgroup_memory = false;
134135
} supports_;
135136

136137
struct {
@@ -149,6 +150,8 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
149150
VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline{};
150151
VkPhysicalDeviceDescriptorIndexingFeatures descriptor_indexing{};
151152
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{};
153+
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR
154+
zero_initialize_workgroup_memory_features{};
152155
} features_;
153156
};
154157

src/amberscript/parser_device_feature_test.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ DEVICE_FEATURE Storage16BitFeatures.storageInputOutput16
3636
DEVICE_FEATURE SubgroupSizeControl.subgroupSizeControl
3737
DEVICE_FEATURE SubgroupSizeControl.computeFullSubgroups
3838
DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModel
39-
DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)";
39+
DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope
40+
DEVICE_FEATURE ZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory)";
4041

4142
Parser parser;
4243
Result r = parser.Parse(in);
4344
ASSERT_TRUE(r.IsSuccess()) << r.Error();
4445

4546
auto script = parser.GetScript();
4647
const auto& features = script->GetRequiredFeatures();
47-
ASSERT_EQ(15U, features.size());
48+
ASSERT_EQ(16U, features.size());
4849
EXPECT_EQ("vertexPipelineStoresAndAtomics", features[0]);
4950
EXPECT_EQ("VariablePointerFeatures.variablePointersStorageBuffer",
5051
features[1]);
@@ -64,6 +65,9 @@ DEVICE_FEATURE VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope)";
6465
EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModel", features[13]);
6566
EXPECT_EQ("VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope",
6667
features[14]);
68+
EXPECT_EQ("ZeroInitializeWorkgroupMemoryFeatures."
69+
"shaderZeroInitializeWorkgroupMemory",
70+
features[15]);
6771
}
6872

6973
TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) {

src/script.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ bool Script::IsKnownFeature(const std::string& name) const {
108108
name == "Float16Int8Features.shaderFloat16" ||
109109
name == "VulkanMemoryModelFeatures.vulkanMemoryModel" ||
110110
name == "VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope" ||
111+
name ==
112+
"ZeroInitializeWorkgroupMemoryFeatures."
113+
"shaderZeroInitializeWorkgroupMemory" ||
111114
name == "Float16Int8Features.shaderInt8" ||
112115
name == "Storage8BitFeatures.storageBuffer8BitAccess" ||
113116
name == "Storage8BitFeatures.uniformAndStorageBuffer8BitAccess" ||

0 commit comments

Comments
 (0)