@@ -739,6 +739,13 @@ std::string stageFlagBitsToNames(const VkShaderStageFlags bits) {
739
739
return result.str ();
740
740
}
741
741
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
+
742
749
} // namespace
743
750
744
751
ConfigHelperVulkan::ConfigHelperVulkan () = default ;
@@ -1242,52 +1249,103 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
1242
1249
}
1243
1250
};
1244
1251
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
+ }
1290
1260
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
+ }
1291
1349
init_feature (
1292
1350
supports_.descriptor_indexing , features_.descriptor_indexing ,
1293
1351
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT,
@@ -1318,54 +1376,6 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
1318
1376
static_cast <uint32_t >(required_extensions_in_char.size ());
1319
1377
info->ppEnabledExtensionNames = required_extensions_in_char.data ();
1320
1378
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
-
1369
1379
VkPhysicalDeviceFeatures required_vulkan_features{};
1370
1380
amber::Result r =
1371
1381
NamesToVulkanFeatures (feature1_names, &required_vulkan_features);
0 commit comments