Skip to content
Merged
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
2 changes: 2 additions & 0 deletions docs/amber_script.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ with:
* `VariablePointerFeatures.variablePointersStorageBuffer`
* `Float16Int8Features.shaderFloat16`
* `Float16Int8Features.shaderInt8`
* `VulkanMemoryModelFeatures.vulkanMemoryModel`
* `VulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope`
* `Storage8BitFeatures.storageBuffer8BitAccess`
* `Storage8BitFeatures.uniformAndStorageBuffer8BitAccess`
* `Storage8BitFeatures.storagePushConstant8`
Expand Down
48 changes: 38 additions & 10 deletions samples/config_helper_vulkan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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";

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

Expand All @@ -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 =
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) ||
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions samples/config_helper_vulkan.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -147,6 +148,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address{};
VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline{};
VkPhysicalDeviceDescriptorIndexingFeatures descriptor_indexing{};
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{};
} features_;
};

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

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