@@ -278,40 +278,41 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
278
278
};
279
279
280
280
// Get physical device's limits/properties
281
- {
282
- VkPhysicalDeviceProperties2 deviceProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };
283
- setPNextChainTail (&deviceProperties2);
284
- // !! Our minimum supported Vulkan version is 1.1, no need to check anything before using `vulkan11Properties`
285
- VkPhysicalDeviceVulkan11Properties vulkan11Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES };
286
- addToPNextChain (&vulkan11Properties);
287
- // ! Declare all the property structs before so they don't go out of scope
288
- // ! Provided by Vk 1.2
289
- VkPhysicalDeviceVulkan12Properties vulkan12Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
290
- addToPNextChain (&vulkan12Properties);
291
- // ! Provided by Vk 1.3
292
- VkPhysicalDeviceVulkan13Properties vulkan13Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES };
293
- addToPNextChain (&vulkan13Properties);
294
- // ! Required by Nabla Core Profile
295
- VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalMemoryHostProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT };
296
- VkPhysicalDeviceRobustness2PropertiesEXT robustness2Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT };
297
- addToPNextChain (&robustness2Properties);
298
- // ! Extensions (ordered by spec extension number)
299
- VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservativeRasterizationProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT };
300
- VkPhysicalDeviceDiscardRectanglePropertiesEXT discardRectangleProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT };
301
- VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationsProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT };
302
- VkPhysicalDeviceAccelerationStructurePropertiesKHR accelerationStructureProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR };
303
- VkPhysicalDevicePCIBusInfoPropertiesEXT PCIBusInfoProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT };
304
- VkPhysicalDeviceFragmentDensityMapPropertiesEXT fragmentDensityMapProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT };
305
- VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT };
306
- // VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV deviceGeneratedCommandsPropertiesNV = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV };
307
- // VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT };
308
- VkPhysicalDeviceFragmentDensityMap2PropertiesEXT fragmentDensityMap2Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT };
309
- VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingPipelineProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR };
310
- VkPhysicalDeviceCooperativeMatrixPropertiesKHR cooperativeMatrixProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR };
311
- VkPhysicalDeviceShaderSMBuiltinsPropertiesNV shaderSMBuiltinsPropertiesNV = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV };
312
- VkPhysicalDeviceShaderCoreProperties2AMD shaderCoreProperties2AMD = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD };
313
- VkPhysicalDeviceMaintenance5PropertiesKHR maintenance5Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR };
314
- VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT };
281
+ VkPhysicalDeviceProperties2 deviceProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };
282
+ setPNextChainTail (&deviceProperties2);
283
+ // !! Our minimum supported Vulkan version is 1.1, no need to check anything before using `vulkan11Properties`
284
+ VkPhysicalDeviceVulkan11Properties vulkan11Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES };
285
+ addToPNextChain (&vulkan11Properties);
286
+ // ! Declare all the property structs before so they don't go out of scope
287
+ // ! Provided by Vk 1.2
288
+ VkPhysicalDeviceVulkan12Properties vulkan12Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
289
+ addToPNextChain (&vulkan12Properties);
290
+ // ! Provided by Vk 1.3
291
+ VkPhysicalDeviceVulkan13Properties vulkan13Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES };
292
+ addToPNextChain (&vulkan13Properties);
293
+ // ! Required by Nabla Core Profile
294
+ VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalMemoryHostProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT };
295
+ VkPhysicalDeviceRobustness2PropertiesEXT robustness2Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT };
296
+ addToPNextChain (&robustness2Properties);
297
+ // ! Extensions (ordered by spec extension number)
298
+ VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservativeRasterizationProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT };
299
+ VkPhysicalDeviceDiscardRectanglePropertiesEXT discardRectangleProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT };
300
+ VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationsProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT };
301
+ VkPhysicalDeviceAccelerationStructurePropertiesKHR accelerationStructureProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR };
302
+ VkPhysicalDevicePCIBusInfoPropertiesEXT PCIBusInfoProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT };
303
+ VkPhysicalDeviceFragmentDensityMapPropertiesEXT fragmentDensityMapProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT };
304
+ VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT };
305
+ // VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV deviceGeneratedCommandsPropertiesNV = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV };
306
+ // VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT };
307
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT fragmentDensityMap2Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT };
308
+ VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingPipelineProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR };
309
+ VkPhysicalDeviceCooperativeMatrixPropertiesKHR cooperativeMatrixProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR };
310
+ VkPhysicalDeviceShaderSMBuiltinsPropertiesNV shaderSMBuiltinsPropertiesNV = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV };
311
+ VkPhysicalDeviceShaderCoreProperties2AMD shaderCoreProperties2AMD = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD };
312
+ VkPhysicalDeviceMaintenance5PropertiesKHR maintenance5Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR };
313
+ VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT };
314
+
315
+ {
315
316
// ! Because Renderdoc is special and instead of ignoring extensions it whitelists them
316
317
if (isExtensionSupported (VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME))
317
318
addToPNextChain (&externalMemoryHostProperties);
@@ -411,32 +412,6 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
411
412
if (!vulkan12Properties.shaderRoundingModeRTZFloat32 )
412
413
return nullptr ;
413
414
414
- if (properties.limits .shaderFloat16 ) {
415
- if (!vulkan12Properties.shaderSignedZeroInfNanPreserveFloat16 )
416
- return nullptr ;
417
- if (!vulkan12Properties.shaderDenormPreserveFloat16 )
418
- return nullptr ;
419
- if (!vulkan12Properties.shaderDenormFlushToZeroFloat16 )
420
- return nullptr ;
421
- if (!vulkan12Properties.shaderRoundingModeRTEFloat16 )
422
- return nullptr ;
423
- if (!vulkan12Properties.shaderRoundingModeRTZFloat16 )
424
- return nullptr ;
425
- }
426
-
427
- if (properties.limits .shaderFloat64 ) {
428
- if (!vulkan12Properties.shaderSignedZeroInfNanPreserveFloat64 )
429
- return nullptr ;
430
- if (!vulkan12Properties.shaderDenormPreserveFloat64 )
431
- return nullptr ;
432
- if (!vulkan12Properties.shaderDenormFlushToZeroFloat64 )
433
- return nullptr ;
434
- if (!vulkan12Properties.shaderRoundingModeRTEFloat64 )
435
- return nullptr ;
436
- if (!vulkan12Properties.shaderRoundingModeRTZFloat64 )
437
- return nullptr ;
438
- }
439
-
440
415
// descriptor indexing
441
416
properties.limits .maxUpdateAfterBindDescriptorsInAllPools = vulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools ;
442
417
properties.limits .shaderUniformBufferArrayNonUniformIndexingNative = vulkan12Properties.shaderUniformBufferArrayNonUniformIndexingNative ;
@@ -925,6 +900,32 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
925
900
properties.limits .shaderFloat16 = vulkan12Features.shaderFloat16 ;
926
901
if (!vulkan12Features.shaderInt8 )
927
902
return nullptr ;
903
+
904
+ if (properties.limits .shaderFloat16 ) {
905
+ if (!vulkan12Properties.shaderSignedZeroInfNanPreserveFloat16 )
906
+ return nullptr ;
907
+ if (!vulkan12Properties.shaderDenormPreserveFloat16 )
908
+ return nullptr ;
909
+ if (!vulkan12Properties.shaderDenormFlushToZeroFloat16 )
910
+ return nullptr ;
911
+ if (!vulkan12Properties.shaderRoundingModeRTEFloat16 )
912
+ return nullptr ;
913
+ if (!vulkan12Properties.shaderRoundingModeRTZFloat16 )
914
+ return nullptr ;
915
+ }
916
+
917
+ if (properties.limits .shaderFloat64 ) {
918
+ if (!vulkan12Properties.shaderSignedZeroInfNanPreserveFloat64 )
919
+ return nullptr ;
920
+ if (!vulkan12Properties.shaderDenormPreserveFloat64 )
921
+ return nullptr ;
922
+ if (!vulkan12Properties.shaderDenormFlushToZeroFloat64 )
923
+ return nullptr ;
924
+ if (!vulkan12Properties.shaderRoundingModeRTEFloat64 )
925
+ return nullptr ;
926
+ if (!vulkan12Properties.shaderRoundingModeRTZFloat64 )
927
+ return nullptr ;
928
+ }
928
929
929
930
if (!vulkan12Features.descriptorIndexing )
930
931
return nullptr ;
@@ -933,9 +934,9 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
933
934
if (!vulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing || !vulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing )
934
935
return nullptr ;
935
936
// not uniform at all
936
- if (!vulkan12Features.shaderUniformBufferArrayNonUniformIndexing || !vulkan12Features. shaderSampledImageArrayNonUniformIndexing || !vulkan12Features.shaderStorageBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageImageArrayNonUniformIndexing )
937
+ if (!vulkan12Features.shaderSampledImageArrayNonUniformIndexing || !vulkan12Features.shaderStorageBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageImageArrayNonUniformIndexing )
937
938
return nullptr ;
938
- if (!vulkan12Features.shaderInputAttachmentArrayNonUniformIndexing || !vulkan12Features. shaderUniformTexelBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing )
939
+ if (!vulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing )
939
940
return nullptr ;
940
941
// update after bind
941
942
properties.limits .descriptorBindingUniformBufferUpdateAfterBind = vulkan12Features.descriptorBindingUniformBufferUpdateAfterBind ;
@@ -1609,7 +1610,7 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
1609
1610
VkPhysicalDeviceMaintenance5FeaturesKHR maintenance5Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, nullptr };
1610
1611
VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT graphicsPipelineLibraryFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, nullptr };
1611
1612
1612
- enableExtensionIfAvailable (VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, nullptr );
1613
+ const auto pipelineLibraryEnabled = enableExtensionIfAvailable (VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, nullptr );
1613
1614
1614
1615
// Enable maintenance5 and graphics pipeline libraries as backup if available
1615
1616
if (enableExtensionIfAvailable (VK_KHR_MAINTENANCE_5_EXTENSION_NAME, &maintenance5Features))
@@ -1618,8 +1619,11 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
1618
1619
}
1619
1620
else
1620
1621
{
1622
+ if (!enableExtensionIfAvailable (VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, &graphicsPipelineLibraryFeatures)) {
1623
+ return nullptr ;
1624
+ }
1625
+ assert (pipelineLibraryEnabled);
1621
1626
graphicsPipelineLibraryFeatures.graphicsPipelineLibrary = true ;
1622
- enableExtensionIfAvailable (VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, &graphicsPipelineLibraryFeatures);
1623
1627
}
1624
1628
1625
1629
#undef REQUIRE_EXTENSION_IF
0 commit comments