From 264d35b58c3ed5f729c373a17a9c0470c2766d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20S=C3=BC=C3=9Fenbach?= Date: Mon, 6 Jan 2025 18:04:33 +0100 Subject: [PATCH] Introduce vk::PFN_VoidFunction as a replacement of PFN_vkVoidFunction (#2033) --- VulkanHppGenerator.cpp | 49 ++++++++++++++++++++++++++++++--------- VulkanHppGenerator.hpp | 1 + vulkan/vulkan.cppm | 2 +- vulkan/vulkan_funcs.hpp | 4 ++-- vulkan/vulkan_handles.hpp | 8 +++++-- vulkan/vulkan_raii.hpp | 8 +++---- 6 files changed, 52 insertions(+), 20 deletions(-) diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index 2ed9dc3..d85987e 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -230,6 +230,7 @@ namespace VULKAN_HPP_NAMESPACE { ${structForwardDeclarations} ${handleForwardDeclarations} + ${funcPointerReturns} ${uniqueHandles} ${handles} @@ -289,6 +290,7 @@ namespace VULKAN_HPP_NAMESPACE std::string str = replaceWithMap( vulkanHandlesHppTemplate, { + { "funcPointerReturns", generateFuncPointerReturns() }, { "handles", generateHandles() }, { "handleForwardDeclarations", generateHandleForwardDeclarations() }, { "licenseHeader", m_vulkanLicenseHeader }, @@ -784,7 +786,7 @@ export namespace std // This VkFlags type is used as part of a bitfield in some structure. // As it that can't be mimiced by vk-data types, we need to export just that!! -using VkGeometryInstanceFlagsKHR; +export VkGeometryInstanceFlagsKHR; )"; auto const str = replaceWithMap( vulkanCppmTemplate, @@ -5505,7 +5507,7 @@ std::string VulkanHppGenerator::generateCppModuleFuncpointerUsings() const //==================== )"; - auto const generateUsingsAndProtection = [this]( std::vector const & requireData, std::string const & title ) + auto const generateUsingsAndProtection = [this]( std::vector const & requireData, std::string const & title ) { auto usings = std::string{}; for ( auto const & require : requireData ) @@ -6736,6 +6738,10 @@ std::string VulkanHppGenerator::generateDecoratedReturnType( CommandData const & { decoratedReturnType = generateNamespacedType( commandData.returnType ); } + else if ( commandData.returnType.starts_with( "PFN_vk" ) ) + { + decoratedReturnType = "VULKAN_HPP_NAMESPACE::PFN_" + stripPrefix( commandData.returnType, "PFN_vk" ); + } else { decoratedReturnType = commandData.returnType; @@ -8286,19 +8292,19 @@ std::string VulkanHppGenerator::generateFuncPointer( std::pair listedFuncPointers; + for ( auto const & handle : m_handles ) + { + for ( auto const & command : handle.second.commands ) + { + auto commandIt = findByNameOrAlias( m_commands, command ); + assert( commandIt != m_commands.end() ); + auto funcPointerIt = m_funcPointers.find( commandIt->second.returnType ); + if ( ( funcPointerIt != m_funcPointers.end() ) && !listedFuncPointers.contains( commandIt->second.returnType ) ) + { + assert( funcPointerIt->second.arguments.empty() ); + str += generateFuncPointer( *funcPointerIt, listedFuncPointers ); + } + } + } + return str; +} + std::string VulkanHppGenerator::generateFunctionPointerCheck( std::string const & function, std::set const & requiredBy, bool raii ) const { std::string functionPointerCheck; diff --git a/VulkanHppGenerator.hpp b/VulkanHppGenerator.hpp index 4cc2d62..9367241 100644 --- a/VulkanHppGenerator.hpp +++ b/VulkanHppGenerator.hpp @@ -845,6 +845,7 @@ private: std::string generateExtensionTypeTest( std::string const & type ) const; std::string generateFormatTraits() const; std::string generateFuncPointer( std::pair const & funcPointer, std::set & listedStructs ) const; + std::string generateFuncPointerReturns() const; std::string generateFunctionPointerCheck( std::string const & function, std::set const & requiredBy, bool raii ) const; std::string generateHandle( std::pair const & handle, std::set & listedHandles ) const; std::string generateHandleCommandDeclarations( std::set const & commands ) const; diff --git a/vulkan/vulkan.cppm b/vulkan/vulkan.cppm index 941467d..ec2c670 100644 --- a/vulkan/vulkan.cppm +++ b/vulkan/vulkan.cppm @@ -8249,4 +8249,4 @@ export namespace std // This VkFlags type is used as part of a bitfield in some structure. // As it that can't be mimiced by vk-data types, we need to export just that!! -using VkGeometryInstanceFlagsKHR; +export VkGeometryInstanceFlagsKHR; diff --git a/vulkan/vulkan_funcs.hpp b/vulkan/vulkan_funcs.hpp index f7ecce5..753b165 100644 --- a/vulkan/vulkan_funcs.hpp +++ b/vulkan/vulkan_funcs.hpp @@ -400,7 +400,7 @@ namespace VULKAN_HPP_NAMESPACE #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT + VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Instance::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT { VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION ); # if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 ) @@ -422,7 +422,7 @@ namespace VULKAN_HPP_NAMESPACE #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT + VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Device::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT { VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION ); # if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 ) diff --git a/vulkan/vulkan_handles.hpp b/vulkan/vulkan_handles.hpp index 304e9ed..cd8599b 100644 --- a/vulkan/vulkan_handles.hpp +++ b/vulkan/vulkan_handles.hpp @@ -2085,6 +2085,8 @@ namespace VULKAN_HPP_NAMESPACE class IndirectCommandsLayoutEXT; class IndirectExecutionSetEXT; + typedef void( VKAPI_PTR * PFN_VoidFunction )(); + #ifndef VULKAN_HPP_NO_SMART_HANDLE //====================== //=== UNIQUE HANDLEs === @@ -9722,7 +9724,8 @@ namespace VULKAN_HPP_NAMESPACE PFN_vkVoidFunction getProcAddr( const char * pName, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - PFN_vkVoidFunction getProcAddr( const std::string & name, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; + VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name, + Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; #endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */ template @@ -17032,7 +17035,8 @@ namespace VULKAN_HPP_NAMESPACE PFN_vkVoidFunction getProcAddr( const char * pName, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - PFN_vkVoidFunction getProcAddr( const std::string & name, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; + VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name, + Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT; #endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */ //=== VK_VERSION_1_1 === diff --git a/vulkan/vulkan_raii.hpp b/vulkan/vulkan_raii.hpp index 3cf1e0e..3fe9430 100644 --- a/vulkan/vulkan_raii.hpp +++ b/vulkan/vulkan_raii.hpp @@ -3044,7 +3044,7 @@ namespace VULKAN_HPP_NAMESPACE std::vector>::Type enumeratePhysicalDevices() const; - VULKAN_HPP_NODISCARD PFN_vkVoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT; + VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT; //=== VK_VERSION_1_1 === @@ -3818,7 +3818,7 @@ namespace VULKAN_HPP_NAMESPACE //=== VK_VERSION_1_0 === - VULKAN_HPP_NODISCARD PFN_vkVoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT; + VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT; VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType::Type @@ -13176,7 +13176,7 @@ namespace VULKAN_HPP_NAMESPACE return memoryProperties; } - VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT + VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Instance::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT { VULKAN_HPP_ASSERT( getDispatcher()->vkGetInstanceProcAddr && "Function requires " ); @@ -13185,7 +13185,7 @@ namespace VULKAN_HPP_NAMESPACE return result; } - VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT + VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Device::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT { VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceProcAddr && "Function requires " );