Introduce vk::PFN_VoidFunction as a replacement of PFN_vkVoidFunction (#2033)

This commit is contained in:
Andreas Süßenbach 2025-01-06 18:04:33 +01:00 committed by GitHub
parent d5f49e5a7b
commit 264d35b58c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 52 additions and 20 deletions

View File

@ -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<RequireData> const & requireData, std::string const & title )
auto const generateUsingsAndProtection = [this]( std::vector<RequireData> 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<std::string, Func
const auto [enter, leave] = generateProtection( getProtectFromType( funcPointer.first ) );
std::string funcPointerArguments;
for ( auto const & argument : funcPointer.second.arguments )
if ( !funcPointer.second.arguments.empty() )
{
funcPointerArguments += argument.type.compose( "VULKAN_HPP_NAMESPACE" ) + " " + argument.name + ", ";
for ( auto const & argument : funcPointer.second.arguments )
{
funcPointerArguments += argument.type.compose( "VULKAN_HPP_NAMESPACE" ) + " " + argument.name + ", ";
}
assert( !funcPointerArguments.empty() );
funcPointerArguments.pop_back();
funcPointerArguments.pop_back();
}
assert( !funcPointerArguments.empty() );
funcPointerArguments.pop_back();
funcPointerArguments.pop_back();
static const std::string funcPointerTemplate = R"(
typedef ${returnType} (VKAPI_PTR *PFN_${funcPointerName})
(
${funcPointerArguments}
);
typedef ${returnType} (VKAPI_PTR *PFN_${funcPointerName})( ${funcPointerArguments} );
)";
str += "\n" + enter +
@ -8312,6 +8318,27 @@ std::string VulkanHppGenerator::generateFuncPointer( std::pair<std::string, Func
return str;
}
std::string VulkanHppGenerator::generateFuncPointerReturns() const
{
std::string str;
std::set<std::string> 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<std::string> const & requiredBy, bool raii ) const
{
std::string functionPointerCheck;

View File

@ -845,6 +845,7 @@ private:
std::string generateExtensionTypeTest( std::string const & type ) const;
std::string generateFormatTraits() const;
std::string generateFuncPointer( std::pair<std::string, FuncPointerData> const & funcPointer, std::set<std::string> & listedStructs ) const;
std::string generateFuncPointerReturns() const;
std::string generateFunctionPointerCheck( std::string const & function, std::set<std::string> const & requiredBy, bool raii ) const;
std::string generateHandle( std::pair<std::string, HandleData> const & handle, std::set<std::string> & listedHandles ) const;
std::string generateHandleCommandDeclarations( std::set<std::string> const & commands ) const;

View File

@ -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;

View File

@ -400,7 +400,7 @@ namespace VULKAN_HPP_NAMESPACE
#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
template <typename Dispatch>
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 <typename Dispatch>
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 )

View File

@ -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 <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
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 <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
@ -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 <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
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 ===

View File

@ -3044,7 +3044,7 @@ namespace VULKAN_HPP_NAMESPACE
std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>>::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<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>::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 <vkGetInstanceProcAddr> requires <VK_VERSION_1_0>" );
@ -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 <vkGetDeviceProcAddr> requires <VK_VERSION_1_0>" );