@@ -278,40 +278,41 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
278278 };
279279
280280 // 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+ {
315316 // ! Because Renderdoc is special and instead of ignoring extensions it whitelists them
316317 if (isExtensionSupported (VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME))
317318 addToPNextChain (&externalMemoryHostProperties);
@@ -411,32 +412,6 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
411412 if (!vulkan12Properties.shaderRoundingModeRTZFloat32 )
412413 return nullptr ;
413414
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-
440415 // descriptor indexing
441416 properties.limits .maxUpdateAfterBindDescriptorsInAllPools = vulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools ;
442417 properties.limits .shaderUniformBufferArrayNonUniformIndexingNative = vulkan12Properties.shaderUniformBufferArrayNonUniformIndexingNative ;
@@ -925,6 +900,32 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
925900 properties.limits .shaderFloat16 = vulkan12Features.shaderFloat16 ;
926901 if (!vulkan12Features.shaderInt8 )
927902 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+ }
928929
929930 if (!vulkan12Features.descriptorIndexing )
930931 return nullptr ;
@@ -933,9 +934,9 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
933934 if (!vulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing || !vulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing )
934935 return nullptr ;
935936 // not uniform at all
936- if (!vulkan12Features.shaderUniformBufferArrayNonUniformIndexing || !vulkan12Features. shaderSampledImageArrayNonUniformIndexing || !vulkan12Features.shaderStorageBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageImageArrayNonUniformIndexing )
937+ if (!vulkan12Features.shaderSampledImageArrayNonUniformIndexing || !vulkan12Features.shaderStorageBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageImageArrayNonUniformIndexing )
937938 return nullptr ;
938- if (!vulkan12Features.shaderInputAttachmentArrayNonUniformIndexing || !vulkan12Features. shaderUniformTexelBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing )
939+ if (!vulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing || !vulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing )
939940 return nullptr ;
940941 // update after bind
941942 properties.limits .descriptorBindingUniformBufferUpdateAfterBind = vulkan12Features.descriptorBindingUniformBufferUpdateAfterBind ;
@@ -1609,7 +1610,7 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
16091610 VkPhysicalDeviceMaintenance5FeaturesKHR maintenance5Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, nullptr };
16101611 VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT graphicsPipelineLibraryFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, nullptr };
16111612
1612- enableExtensionIfAvailable (VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, nullptr );
1613+ const auto pipelineLibraryEnabled = enableExtensionIfAvailable (VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, nullptr );
16131614
16141615 // Enable maintenance5 and graphics pipeline libraries as backup if available
16151616 if (enableExtensionIfAvailable (VK_KHR_MAINTENANCE_5_EXTENSION_NAME, &maintenance5Features))
@@ -1618,8 +1619,11 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
16181619 }
16191620 else
16201621 {
1622+ if (!enableExtensionIfAvailable (VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, &graphicsPipelineLibraryFeatures)) {
1623+ return nullptr ;
1624+ }
1625+ assert (pipelineLibraryEnabled);
16211626 graphicsPipelineLibraryFeatures.graphicsPipelineLibrary = true ;
1622- enableExtensionIfAvailable (VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, &graphicsPipelineLibraryFeatures);
16231627 }
16241628
16251629 #undef REQUIRE_EXTENSION_IF
0 commit comments