Skip to content

Commit 3f078e4

Browse files
authored
Add feature structures only for requires features (#1087)
This not done in the most efficient way. However, we have a device and driver that seems to have an issue with an extension it claims to support. This works around that issue by not having using the physical device features for features that are not required.
1 parent 1bfa1aa commit 3f078e4

File tree

2 files changed

+105
-95
lines changed

2 files changed

+105
-95
lines changed

samples/config_helper_vulkan.cc

Lines changed: 103 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,13 @@ std::string stageFlagBitsToNames(const VkShaderStageFlags bits) {
739739
return result.str();
740740
}
741741

742+
bool StartsWith(const std::string& str, const std::string& prefix) {
743+
if (prefix.size() > str.size()) {
744+
return false;
745+
}
746+
return std::equal(prefix.begin(), prefix.end(), str.begin());
747+
}
748+
742749
} // namespace
743750

744751
ConfigHelperVulkan::ConfigHelperVulkan() = default;
@@ -1242,52 +1249,103 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
12421249
}
12431250
};
12441251

1245-
init_feature(supports_.variable_pointers, features_.variable_pointers,
1246-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR,
1247-
VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME);
1248-
1249-
init_feature(supports_.shader_float16_int8, features_.float16_int8,
1250-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,
1251-
VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
1252-
1253-
init_feature(supports_.shader_8bit_storage, features_.storage_8bit,
1254-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR,
1255-
VK_KHR_8BIT_STORAGE_EXTENSION_NAME);
1256-
1257-
init_feature(supports_.shader_16bit_storage, features_.storage_16bit,
1258-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,
1259-
VK_KHR_16BIT_STORAGE_EXTENSION_NAME);
1260-
1261-
init_feature(
1262-
supports_.subgroup_size_control, features_.subgroup_size_control,
1263-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT,
1264-
VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME);
1265-
1266-
init_feature(
1267-
supports_.shader_subgroup_extended_types,
1268-
features_.shader_subgroup_extended_types,
1269-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
1270-
VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME);
1271-
1272-
init_feature(
1273-
supports_.depth_clamp_zero_one, features_.depth_clamp_zero_one,
1274-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT,
1275-
VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME);
1276-
1277-
init_feature(
1278-
supports_.acceleration_structure, features_.acceleration_structure,
1279-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR,
1280-
VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME);
1281-
1282-
init_feature(supports_.buffer_device_address, features_.buffer_device_address,
1283-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
1284-
VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
1285-
1286-
init_feature(
1287-
supports_.ray_tracing_pipeline, features_.ray_tracing_pipeline,
1288-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR,
1289-
VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME);
1252+
// Initialize physical device features only for the required features.
1253+
std::vector<std::string> feature1_names;
1254+
for (const auto& feature : required_features) {
1255+
// No dot means this is a features1 feature.
1256+
if (feature.find_first_of('.') == std::string::npos) {
1257+
feature1_names.push_back(feature);
1258+
continue;
1259+
}
12901260

1261+
if (StartsWith(feature, "VariablePointersFeatures.")) {
1262+
init_feature(
1263+
supports_.variable_pointers, features_.variable_pointers,
1264+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR,
1265+
VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME);
1266+
if (feature == kVariablePointers) {
1267+
features_.variable_pointers.variablePointers = VK_TRUE;
1268+
} else if (feature == kVariablePointersStorageBuffer) {
1269+
features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE;
1270+
}
1271+
} else if (StartsWith(feature, "Float16Int8Features.")) {
1272+
init_feature(supports_.shader_float16_int8, features_.float16_int8,
1273+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,
1274+
VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
1275+
if (feature == kFloat16Int8_Float16) {
1276+
features_.float16_int8.shaderFloat16 = VK_TRUE;
1277+
} else if (feature == kFloat16Int8_Int8) {
1278+
features_.float16_int8.shaderInt8 = VK_TRUE;
1279+
}
1280+
} else if (StartsWith(feature, "Storage8BitFeatures.")) {
1281+
init_feature(supports_.shader_8bit_storage, features_.storage_8bit,
1282+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR,
1283+
VK_KHR_8BIT_STORAGE_EXTENSION_NAME);
1284+
if (feature == k8BitStorage_Storage) {
1285+
features_.storage_8bit.storageBuffer8BitAccess = VK_TRUE;
1286+
} else if (feature == k8BitStorage_UniformAndStorage) {
1287+
features_.storage_8bit.uniformAndStorageBuffer8BitAccess = VK_TRUE;
1288+
} else if (feature == k8BitStorage_PushConstant) {
1289+
features_.storage_8bit.storagePushConstant8 = VK_TRUE;
1290+
}
1291+
} else if (StartsWith(feature, "Storage16BitFeatures.")) {
1292+
init_feature(supports_.shader_16bit_storage, features_.storage_16bit,
1293+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,
1294+
VK_KHR_16BIT_STORAGE_EXTENSION_NAME);
1295+
if (feature == k16BitStorage_Storage) {
1296+
features_.storage_16bit.storageBuffer16BitAccess = VK_TRUE;
1297+
} else if (feature == k16BitStorage_UniformAndStorage) {
1298+
features_.storage_16bit.uniformAndStorageBuffer16BitAccess = VK_TRUE;
1299+
} else if (feature == k16BitStorage_PushConstant) {
1300+
features_.storage_16bit.storagePushConstant16 = VK_TRUE;
1301+
} else if (feature == k16BitStorage_InputOutput) {
1302+
features_.storage_16bit.storageInputOutput16 = VK_TRUE;
1303+
}
1304+
} else if (StartsWith(feature, "SubgroupSizeControl.")) {
1305+
init_feature(
1306+
supports_.subgroup_size_control, features_.subgroup_size_control,
1307+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT,
1308+
VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME);
1309+
if (feature == kSubgroupSizeControl) {
1310+
features_.subgroup_size_control.subgroupSizeControl = VK_TRUE;
1311+
} else if (feature == kComputeFullSubgroups) {
1312+
features_.subgroup_size_control.computeFullSubgroups = VK_TRUE;
1313+
}
1314+
} else if (feature == kShaderSubgroupExtendedTypes) {
1315+
init_feature(
1316+
supports_.shader_subgroup_extended_types,
1317+
features_.shader_subgroup_extended_types,
1318+
// NOLINTNEXTLINE(whitespace/line_length)
1319+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
1320+
VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME);
1321+
features_.shader_subgroup_extended_types.shaderSubgroupExtendedTypes =
1322+
VK_TRUE;
1323+
} else if (feature == kDepthClampZeroOne) {
1324+
init_feature(
1325+
supports_.depth_clamp_zero_one, features_.depth_clamp_zero_one,
1326+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT,
1327+
VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME);
1328+
features_.depth_clamp_zero_one.depthClampZeroOne = VK_TRUE;
1329+
} else if (feature == kAccelerationStructure) {
1330+
init_feature(
1331+
supports_.acceleration_structure, features_.acceleration_structure,
1332+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR,
1333+
VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME);
1334+
features_.acceleration_structure.accelerationStructure = VK_TRUE;
1335+
} else if (feature == kBufferDeviceAddress) {
1336+
init_feature(
1337+
supports_.buffer_device_address, features_.buffer_device_address,
1338+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
1339+
VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
1340+
features_.buffer_device_address.bufferDeviceAddress = VK_TRUE;
1341+
} else if (feature == kRayTracingPipeline) {
1342+
init_feature(
1343+
supports_.ray_tracing_pipeline, features_.ray_tracing_pipeline,
1344+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR,
1345+
VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME);
1346+
features_.ray_tracing_pipeline.rayTracingPipeline = VK_TRUE;
1347+
}
1348+
}
12911349
init_feature(
12921350
supports_.descriptor_indexing, features_.descriptor_indexing,
12931351
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT,
@@ -1318,54 +1376,6 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
13181376
static_cast<uint32_t>(required_extensions_in_char.size());
13191377
info->ppEnabledExtensionNames = required_extensions_in_char.data();
13201378

1321-
std::vector<std::string> feature1_names;
1322-
for (const auto& feature : required_features) {
1323-
// No dot means this is a features1 feature.
1324-
if (feature.find_first_of('.') == std::string::npos) {
1325-
feature1_names.push_back(feature);
1326-
continue;
1327-
}
1328-
1329-
if (feature == kVariablePointers) {
1330-
features_.variable_pointers.variablePointers = VK_TRUE;
1331-
} else if (feature == kVariablePointersStorageBuffer) {
1332-
features_.variable_pointers.variablePointersStorageBuffer = VK_TRUE;
1333-
} else if (feature == kFloat16Int8_Float16) {
1334-
features_.float16_int8.shaderFloat16 = VK_TRUE;
1335-
} else if (feature == kFloat16Int8_Int8) {
1336-
features_.float16_int8.shaderInt8 = VK_TRUE;
1337-
} else if (feature == k8BitStorage_Storage) {
1338-
features_.storage_8bit.storageBuffer8BitAccess = VK_TRUE;
1339-
} else if (feature == k8BitStorage_UniformAndStorage) {
1340-
features_.storage_8bit.uniformAndStorageBuffer8BitAccess = VK_TRUE;
1341-
} else if (feature == k8BitStorage_PushConstant) {
1342-
features_.storage_8bit.storagePushConstant8 = VK_TRUE;
1343-
} else if (feature == k16BitStorage_Storage) {
1344-
features_.storage_16bit.storageBuffer16BitAccess = VK_TRUE;
1345-
} else if (feature == k16BitStorage_UniformAndStorage) {
1346-
features_.storage_16bit.uniformAndStorageBuffer16BitAccess = VK_TRUE;
1347-
} else if (feature == k16BitStorage_PushConstant) {
1348-
features_.storage_16bit.storagePushConstant16 = VK_TRUE;
1349-
} else if (feature == k16BitStorage_InputOutput) {
1350-
features_.storage_16bit.storageInputOutput16 = VK_TRUE;
1351-
} else if (feature == kSubgroupSizeControl) {
1352-
features_.subgroup_size_control.subgroupSizeControl = VK_TRUE;
1353-
} else if (feature == kComputeFullSubgroups) {
1354-
features_.subgroup_size_control.computeFullSubgroups = VK_TRUE;
1355-
} else if (feature == kDepthClampZeroOne) {
1356-
features_.depth_clamp_zero_one.depthClampZeroOne = VK_TRUE;
1357-
} else if (feature == kShaderSubgroupExtendedTypes) {
1358-
features_.shader_subgroup_extended_types.shaderSubgroupExtendedTypes =
1359-
VK_TRUE;
1360-
} else if (feature == kAccelerationStructure) {
1361-
features_.acceleration_structure.accelerationStructure = VK_TRUE;
1362-
} else if (feature == kBufferDeviceAddress) {
1363-
features_.buffer_device_address.bufferDeviceAddress = VK_TRUE;
1364-
} else if (feature == kRayTracingPipeline) {
1365-
features_.ray_tracing_pipeline.rayTracingPipeline = VK_TRUE;
1366-
}
1367-
}
1368-
13691379
VkPhysicalDeviceFeatures required_vulkan_features{};
13701380
amber::Result r =
13711381
NamesToVulkanFeatures(feature1_names, &required_vulkan_features);

tools/run-lint.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
set -e # fail on error
1717

1818
FILTERS=-build/header_guard,-readability/fn_size
19-
./third_party/cpplint/cpplint.py --filter "$FILTERS" `find src samples -type f`
20-
./third_party/cpplint/cpplint.py --filter "$FILTERS" --root include `find ./include -type f`
19+
python3 ./third_party/cpplint/cpplint.py --filter "$FILTERS" `find src samples -type f`
20+
python3 ./third_party/cpplint/cpplint.py --filter "$FILTERS" --root include `find ./include -type f`

0 commit comments

Comments
 (0)