diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-10-06 00:49:19 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-05 09:49:19 -0700 |
| commit | 65751ce222adb302e62b5b7b6312de65638abed5 (patch) | |
| tree | 3096bf602ec1cc6f3aef7b8648a0a6fc9478903d /tools | |
| parent | 8eb504f6df544014bbcc8972cb6922e9c0f26b2e (diff) | |
Check for extension support before enabling a feature (#3262)
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/gfx/vulkan/vk-device.cpp | 246 |
1 files changed, 123 insertions, 123 deletions
diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp index bed9c038a..f8bc9c3aa 100644 --- a/tools/gfx/vulkan/vk-device.cpp +++ b/tools/gfx/vulkan/vk-device.cpp @@ -323,6 +323,18 @@ Result DeviceImpl::initVulkanInstanceAndDevice( m_info.adapterName = m_adapterName.begin(); } + // Query the available extensions + uint32_t extensionCount = 0; + m_api.vkEnumerateDeviceExtensionProperties( + m_api.m_physicalDevice, NULL, &extensionCount, NULL); + Slang::List<VkExtensionProperties> extensions; + extensions.setCount(extensionCount); + m_api.vkEnumerateDeviceExtensionProperties( + m_api.m_physicalDevice, NULL, &extensionCount, extensions.getBuffer()); + HashSet<String> extensionNames; + for (const auto& e : extensions) + extensionNames.add(e.extensionName); + List<const char*> deviceExtensions; deviceExtensions.add(VK_KHR_SWAPCHAIN_EXTENSION_NAME); @@ -471,130 +483,132 @@ Result DeviceImpl::initVulkanInstanceAndDevice( m_features.add("half"); } - if (extendedFeatures.storage16BitFeatures.storageBuffer16BitAccess) + const auto addFeatureExtension = [&](const bool feature, auto& featureStruct, const char* extension = nullptr){ + if(!feature) + return false; + if(extension) + { + if(!extensionNames.contains(extension)) + return false; + deviceExtensions.add(extension); + } + featureStruct.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &featureStruct; + return true; + }; + + // SIMPLE_EXTENSION_FEATURE(struct, feature member name, extension + // name, features...) will check for the presence of the boolean + // feature member in struct and the availability of the extensions. If + // they are both present then the extensions are addded, the struct + // linked into the deviceCreateInfo chain and the features added to the + // supported features list. +#define SIMPLE_EXTENSION_FEATURE(s, m, e, ...) \ + do{ \ + const static auto fs = {__VA_ARGS__}; \ + if(addFeatureExtension(s.m, s, e)) \ + for(const auto& p : fs) \ + m_features.add(p); \ + } while(0) + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.storage16BitFeatures, + storageBuffer16BitAccess, + VK_KHR_16BIT_STORAGE_EXTENSION_NAME, + "16-bit-storage" + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.atomicFloatFeatures, + shaderBufferFloat32AtomicAdd, + VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, + "atomic-float" + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.extendedDynamicStateFeatures, + extendedDynamicState, + VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, + "extended-dynamic-states" + ); + + if (extendedFeatures.accelerationStructureFeatures.accelerationStructure + && extensionNames.contains(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) + && extensionNames.contains(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME)) { - // Link into the creation features - extendedFeatures.storage16BitFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.storage16BitFeatures; - - // Add the 16-bit storage extension - deviceExtensions.add(VK_KHR_16BIT_STORAGE_EXTENSION_NAME); + extendedFeatures.accelerationStructureFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.accelerationStructureFeatures; + deviceExtensions.add(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME); + deviceExtensions.add(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); + m_features.add("acceleration-structure"); - // We have half support - m_features.add("16-bit-storage"); + // These both depend on VK_KHR_acceleration_structure + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.rayQueryFeatures, + rayQuery, + VK_KHR_RAY_QUERY_EXTENSION_NAME, + "ray-query", + "ray-tracing", + "sm_6_6" + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.rayTracingPipelineFeatures, + rayTracingPipeline, + VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, + "ray-tracing-pipeline" + ); } + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.inlineUniformBlockFeatures, + inlineUniformBlock, + VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, + "inline-uniform-block", + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.robustness2Features, + nullDescriptor, + VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, + "robustness2", + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.clockFeatures, + shaderDeviceClock, + VK_KHR_SHADER_CLOCK_EXTENSION_NAME, + "realtime-clock" + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.meshShaderFeatures, + meshShader, + VK_EXT_MESH_SHADER_EXTENSION_NAME, + "mesh-shader" + ); + + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.rayTracingInvocationReorderFeatures, + rayTracingInvocationReorder, + VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, + "shader-execution-reorder" + ); + +#undef SIMPLE_EXTENSION_FEATURE + if (extendedFeatures.vulkan12Features.shaderBufferInt64Atomics) - { m_features.add("atomic-int64"); - } - - if (extendedFeatures.atomicFloatFeatures.shaderBufferFloat32AtomicAdd) - { - // Link into the creation features - extendedFeatures.atomicFloatFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.atomicFloatFeatures; - - deviceExtensions.add(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME); - m_features.add("atomic-float"); - } if (extendedFeatures.vulkan12Features.timelineSemaphore) - { m_features.add("timeline-semaphore"); - } - - if (extendedFeatures.extendedDynamicStateFeatures.extendedDynamicState) - { - // Link into the creation features - extendedFeatures.extendedDynamicStateFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.extendedDynamicStateFeatures; - deviceExtensions.add(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); - m_features.add("extended-dynamic-states"); - } if (extendedFeatures.vulkan12Features.shaderSubgroupExtendedTypes) - { m_features.add("shader-subgroup-extended-types"); - } - - if (extendedFeatures.accelerationStructureFeatures.accelerationStructure) - { - extendedFeatures.accelerationStructureFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.accelerationStructureFeatures; - deviceExtensions.add(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME); - deviceExtensions.add(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); - m_features.add("acceleration-structure"); - } - - if (extendedFeatures.rayTracingPipelineFeatures.rayTracingPipeline) - { - extendedFeatures.rayTracingPipelineFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.rayTracingPipelineFeatures; - deviceExtensions.add(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME); - m_features.add("ray-tracing-pipeline"); - } - - if (extendedFeatures.rayQueryFeatures.rayQuery) - { - extendedFeatures.rayQueryFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.rayQueryFeatures; - deviceExtensions.add(VK_KHR_RAY_QUERY_EXTENSION_NAME); - m_features.add("ray-query"); - m_features.add("ray-tracing"); - m_features.add("sm_6_6"); - } if (extendedFeatures.vulkan12Features.bufferDeviceAddress) - { m_features.add("buffer-device-address"); - } - - if (extendedFeatures.inlineUniformBlockFeatures.inlineUniformBlock) - { - extendedFeatures.inlineUniformBlockFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.inlineUniformBlockFeatures; - deviceExtensions.add(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME); - m_features.add("inline-uniform-block"); - } - - if (extendedFeatures.robustness2Features.nullDescriptor) - { - extendedFeatures.robustness2Features.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.robustness2Features; - deviceExtensions.add(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); - m_features.add("robustness2"); - } - - if (extendedFeatures.clockFeatures.shaderDeviceClock) - { - deviceExtensions.add(VK_KHR_SHADER_CLOCK_EXTENSION_NAME); - - extendedFeatures.clockFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.clockFeatures; - - m_features.add("realtime-clock"); - } - - if (extendedFeatures.meshShaderFeatures.meshShader) - { - deviceExtensions.add(VK_EXT_MESH_SHADER_EXTENSION_NAME); - - extendedFeatures.meshShaderFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.meshShaderFeatures; - - m_features.add("mesh-shader"); - } - - if (extendedFeatures.rayTracingInvocationReorderFeatures.rayTracingInvocationReorder) - { - deviceExtensions.add(VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME); - - extendedFeatures.rayTracingInvocationReorderFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedFeatures.rayTracingInvocationReorderFeatures; - - m_features.add("shader-execution-reorder"); - } if (_hasAnySetBits( extendedFeatures.vulkan12Features, @@ -632,20 +646,6 @@ Result DeviceImpl::initVulkanInstanceAndDevice( m_features.add("wave-ops"); } - uint32_t extensionCount = 0; - m_api.vkEnumerateDeviceExtensionProperties( - m_api.m_physicalDevice, NULL, &extensionCount, NULL); - Slang::List<VkExtensionProperties> extensions; - extensions.setCount(extensionCount); - m_api.vkEnumerateDeviceExtensionProperties( - m_api.m_physicalDevice, NULL, &extensionCount, extensions.getBuffer()); - - HashSet<String> extensionNames; - for (const auto& e : extensions) - { - extensionNames.add(e.extensionName); - } - if (extensionNames.contains("VK_KHR_external_memory")) { deviceExtensions.add(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME); |
