Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/amber_script.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ with:
* `Float16Int8Features.shaderInt8`
* `VulkanMemoryModelFeatures.vulkanMemoryModel`
* `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope`
* `ZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory`
* `Storage8BitFeatures.storageBuffer8BitAccess`
* `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess`
* `Storage8BitFeatures.storagePushConstant8`
Expand Down
31 changes: 31 additions & 0 deletions samples/config_helper_vulkan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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;
}
}

Expand All @@ -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 =
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) ||
Expand Down Expand Up @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions samples/config_helper_vulkan.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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_;
};

Expand Down
8 changes: 6 additions & 2 deletions src/amberscript/parser_device_feature_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,16 @@ 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);
ASSERT_TRUE(r.IsSuccess()) << r.Error();

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]);
Expand All @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions src/script.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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" ||
Expand Down