From 6bd3b4652c121562c63a78665c651b3cdccb8dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20S=C3=BC=C3=9Fenbach?= Date: Mon, 11 Aug 2025 13:36:46 +0200 Subject: [PATCH] Introduce defines VULKAN_HPP_DISPATCH_LOADER_[DYNAMIC|STATIC]_TYPE (#2244) --- README.md | 12 +++++++++++- snippets/macros.hpp | 23 +++++++++++++++-------- tests/DeviceFunctions/DeviceFunctions.cpp | 11 ++++++----- tests/UniqueHandle/UniqueHandle.cpp | 11 ++++++----- vulkan/vulkan_hpp_macros.hpp | 23 +++++++++++++++-------- 5 files changed, 53 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 08a9102..6b4581d 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ The goal of the Vulkan-Hpp is to provide header only C++ bindings for the Vulkan - [VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE](#default_dispatch_loader_dynamic_storage) - [VULKAN_HPP_DISABLE_ENHANCED_MODE](#disable_enhanced_mode) - [VULKAN_HPP_DISPATCH_LOADER_DYNAMIC](#dispatch_loader_dynamic) + - [VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE](#dispatch_loader_dynamic_type) + - [VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE](#dispatch_loader_static_type) - [VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL](#enable_dynamic_loader_tool) - [VULKAN_HPP_EXPECTED](#expected) - [VULKAN_HPP_FLAGS_MASK_TYPE_AS_PUBLIC](#flags_mask_type_as_public) @@ -956,7 +958,7 @@ You can use your own default dispatcher by setting `VULKAN_HPP_DEFAULT_DISPATCHE #### VULKAN_HPP_DEFAULT_DISPATCHER_TYPE -This names the default dispatcher type, as specified by `VULKAN_HPP_DEFAULT_DISPATCHER`. Per default, it is `vk::detail::DispatchLoaderDynamic` or `vk::detail::DispatchLoaderStatic`, depending on `VULKAN_HPP_DISPATCH_LOADER_DYNAMIC` being `1` or not `1`, respectively. If you explicitly set `VULKAN_HPP_DEFAULT_DISPATCHER`, you need to set `VULKAN_HPP_DEFAULT_DISPATCHER_TYPE` accordingly as well. +This names the default dispatcher type, as specified by `VULKAN_HPP_DEFAULT_DISPATCHER`. Per default, it is `VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE` or `VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE`, depending on `VULKAN_HPP_DISPATCH_LOADER_DYNAMIC` being `1` or not `1`, respectively. If you explicitly set `VULKAN_HPP_DEFAULT_DISPATCHER`, you need to set `VULKAN_HPP_DEFAULT_DISPATCHER_TYPE` accordingly as well. #### VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE @@ -981,6 +983,14 @@ If this is not defined, you additionally get: This either selects the dynamic (when it's `1`) or the static (when it's not `1`) DispatchLoader as the default one, as long as it's not explicitly specified by `VULKAN_HPP_DEFAULT_DISPATCHER`. By default, this is defined to be `1` if `VK_NO_PROTOTYPES` is defined, otherwise `0`. +#### VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE + +The type of the dynamic dispatch loader. By default, it's vk::detail::DispatchLoaderDynamic. You can define this before including vulkan.hpp to use your own dynamic dispatcher. + +#### VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE + +The type of the static dispatch loader. By default, it's vk::detail::DispatchLoaderStatic. You can define this before including vulkan.hpp to use your own static dispatcher. + #### VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL By default, a little helper class `vk::detail::DynamicLoader` is used to dynamically load the vulkan library. If you set it to something different than `1` before including `vulkan.hpp`, this helper is not available, and you need to explicitly provide your own loader type for the function `vk::detail::DispatchLoaderDynamic::init()`. diff --git a/snippets/macros.hpp b/snippets/macros.hpp index 5f11ae1..764d052 100644 --- a/snippets/macros.hpp +++ b/snippets/macros.hpp @@ -257,6 +257,21 @@ namespace VULKAN_HPP_NAMESPACE } // namespace detail } // namespace VULKAN_HPP_NAMESPACE +#if !defined(VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE) +# define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic +#endif +#if !defined(VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE) +# define VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic +#endif + +#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ) +# if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 +# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE +# else +# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE +# endif +#endif + #if !defined( VULKAN_HPP_DEFAULT_DISPATCHER ) # if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 # define VULKAN_HPP_DEFAULT_DISPATCHER ::VULKAN_HPP_NAMESPACE::detail::defaultDispatchLoaderDynamic @@ -274,14 +289,6 @@ namespace VULKAN_HPP_NAMESPACE # endif #endif -#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ) -# if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 -# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic -# else -# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic -# endif -#endif - #if defined( VULKAN_HPP_NO_DEFAULT_DISPATCHER ) # define VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT # define VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT diff --git a/tests/DeviceFunctions/DeviceFunctions.cpp b/tests/DeviceFunctions/DeviceFunctions.cpp index 10087fd..fff5e9a 100644 --- a/tests/DeviceFunctions/DeviceFunctions.cpp +++ b/tests/DeviceFunctions/DeviceFunctions.cpp @@ -60,16 +60,17 @@ int main( int /*argc*/, char ** /*argv*/ ) vk::DeviceQueueCreateInfo deviceQueueCreateInfo( vk::DeviceQueueCreateFlags(), static_cast( graphicsQueueFamilyIndex ), 1, &queuePriority ); vk::UniqueDevice device = physicalDevice.createDeviceUnique( vk::DeviceCreateInfo( vk::DeviceCreateFlags(), deviceQueueCreateInfo ) ); - uint64_t handle = device->getAccelerationStructureHandleNV( {}, vk::detail::DispatchLoaderDynamic() ); + uint64_t handle = device->getAccelerationStructureHandleNV( {}, VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE() ); std::vector::allocator_type vectorAllocator; - vk::UniqueCommandBuffer commandBuffer = std::move( device->allocateCommandBuffersUnique( {}, vectorAllocator, vk::detail::DispatchLoaderStatic() ).front() ); + vk::UniqueCommandBuffer commandBuffer = + std::move( device->allocateCommandBuffersUnique( {}, vectorAllocator, VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE() ).front() ); commandBuffer->begin( vk::CommandBufferBeginInfo() ); - std::vector>::allocator_type dynamicVectorAllocator; - vk::UniqueHandle dynamicCommandBuffer = - std::move( device->allocateCommandBuffersUnique( {}, dynamicVectorAllocator, vk::detail::DispatchLoaderDynamic() ).front() ); + std::vector>::allocator_type dynamicVectorAllocator; + vk::UniqueHandle dynamicCommandBuffer = + std::move( device->allocateCommandBuffersUnique( {}, dynamicVectorAllocator, VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE() ).front() ); vk::Buffer buffer = device->createBuffer( {} ); vk::UniqueBuffer uniqueBuffer = vk::UniqueBuffer( buffer, *device ); diff --git a/tests/UniqueHandle/UniqueHandle.cpp b/tests/UniqueHandle/UniqueHandle.cpp index bed3796..7159fb6 100644 --- a/tests/UniqueHandle/UniqueHandle.cpp +++ b/tests/UniqueHandle/UniqueHandle.cpp @@ -174,7 +174,7 @@ vk::UniqueSwapchainKHR createSwapchainKHRUnique( vk::PhysicalDevice physicalDevi vk::SurfaceCapabilitiesKHR surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR( surface ); vk::SurfaceFormatKHR surfaceFormat = vk::su::pickSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( surface ) ); vk::Extent2D swapchainExtent; - if ( surfaceCapabilities.currentExtent.width == (std::numeric_limits::max)() ) + if ( surfaceCapabilities.currentExtent.width == ( std::numeric_limits::max )() ) { // If the surface size is undefined, the size is set to the size of the images requested. swapchainExtent.width = vk::su::clamp( 64, surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width ); @@ -357,12 +357,13 @@ int main( int /*argc*/, char ** /*argv*/ ) vk::UniquePipeline graphicsPipeline = device->createGraphicsPipelineUnique( *pipelineCache, graphicsPipelineCreateInfo ).value; - vk::UniquePipeline graphicsPipeline2 = - std::move( device->createGraphicsPipelinesUnique>( *pipelineCache, graphicsPipelineCreateInfo ) - .value[0] ); + vk::UniquePipeline graphicsPipeline2 = std::move( + device + ->createGraphicsPipelinesUnique>( *pipelineCache, graphicsPipelineCreateInfo ) + .value[0] ); vk::UniquePipeline graphicsPipeline3 = - std::move( device->createGraphicsPipelinesUnique( *pipelineCache, graphicsPipelineCreateInfo ).value[0] ); + std::move( device->createGraphicsPipelinesUnique( *pipelineCache, graphicsPipelineCreateInfo ).value[0] ); vk::DescriptorPoolSize poolSize( vk::DescriptorType::eUniformBuffer, 1 ); vk::UniqueDescriptorPool descriptorPool = device->createDescriptorPoolUnique( { vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet, 1, poolSize } ); diff --git a/vulkan/vulkan_hpp_macros.hpp b/vulkan/vulkan_hpp_macros.hpp index 5bf0fa7..2dbdede 100644 --- a/vulkan/vulkan_hpp_macros.hpp +++ b/vulkan/vulkan_hpp_macros.hpp @@ -274,6 +274,21 @@ namespace VULKAN_HPP_NAMESPACE } // namespace detail } // namespace VULKAN_HPP_NAMESPACE +#if !defined( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE ) +# define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic +#endif +#if !defined( VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE ) +# define VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic +#endif + +#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ) +# if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 +# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE VULKAN_HPP_DISPATCH_LOADER_DYNAMIC_TYPE +# else +# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE VULKAN_HPP_DISPATCH_LOADER_STATIC_TYPE +# endif +#endif + #if !defined( VULKAN_HPP_DEFAULT_DISPATCHER ) # if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 # define VULKAN_HPP_DEFAULT_DISPATCHER ::VULKAN_HPP_NAMESPACE::detail::defaultDispatchLoaderDynamic @@ -291,14 +306,6 @@ namespace VULKAN_HPP_NAMESPACE # endif #endif -#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ) -# if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 -# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic -# else -# define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic -# endif -#endif - #if defined( VULKAN_HPP_NO_DEFAULT_DISPATCHER ) # define VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT # define VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT