mirror of
https://github.com/KhronosGroup/Vulkan-Hpp.git
synced 2024-10-14 16:32:17 +00:00
Replace dispatcher in vk::rai::Context by helper class vk::raii::ContextDispatcher
This commit is contained in:
parent
dab8ba586f
commit
7f01d662de
@ -3321,6 +3321,59 @@ void VulkanHppGenerator::appendHashStructures( std::string & str ) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VulkanHppGenerator::appendRAIIDispatchers( std::string & str ) const
|
||||||
|
{
|
||||||
|
std::string contextInitializerList, deviceInitializerList, instanceInitializerList;
|
||||||
|
std::string contextMembers, deviceMembers, instanceMembers;
|
||||||
|
std::string contextMoveAssignments, deviceMoveAssignments, instanceMoveAssignments;
|
||||||
|
std::string contextMoveConstruction, deviceMoveConstruction, instanceMoveConstruction;
|
||||||
|
for ( auto const & command : m_commands )
|
||||||
|
{
|
||||||
|
if ( command.second.handle.empty() )
|
||||||
|
{
|
||||||
|
contextInitializerList +=
|
||||||
|
", " + command.first + "( PFN_" + command.first + "( getProcAddr( NULL, \"" + command.first + "\" ) ) )";
|
||||||
|
contextMembers += " PFN_" + command.first + " " + command.first + " = 0;\n";
|
||||||
|
contextMoveAssignments += " " + command.first + " = rhs." + command.first + ";\n";
|
||||||
|
contextMoveConstruction += " , " + command.first + "( rhs." + command.first + " )\n";
|
||||||
|
}
|
||||||
|
else if ( ( command.second.handle == "VkDevice" ) || hasParentHandle( command.second.handle, "VkDevice" ) )
|
||||||
|
{
|
||||||
|
deviceInitializerList += " " + command.first + " = PFN_" + command.first + "( getProcAddr( device, \"" +
|
||||||
|
command.first + "\" ) );\n";
|
||||||
|
deviceMembers += " PFN_" + command.first + " " + command.first + " = 0;\n";
|
||||||
|
deviceMoveAssignments += " " + command.first + " = rhs." + command.first + ";\n";
|
||||||
|
deviceMoveConstruction += " , " + command.first + "( rhs." + command.first + " )\n";
|
||||||
|
}
|
||||||
|
else if ( command.first != "vkGetInstanceProcAddr" )
|
||||||
|
{
|
||||||
|
assert( ( command.second.handle == "VkInstance" ) || hasParentHandle( command.second.handle, "VkInstance" ) );
|
||||||
|
instanceInitializerList += " " + command.first + " = PFN_" + command.first +
|
||||||
|
"( getProcAddr( instance, \"" + command.first + "\" ) );\n";
|
||||||
|
instanceMembers += " PFN_" + command.first + " " + command.first + " = 0;\n";
|
||||||
|
instanceMoveAssignments += " " + command.first + " = rhs." + command.first + ";\n";
|
||||||
|
instanceMoveConstruction += " , " + command.first + "( rhs." + command.first + " )\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string contextDispatcherTemplate = R"(
|
||||||
|
class ContextDispatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ContextDispatcher( PFN_vkGetInstanceProcAddr getProcAddr )
|
||||||
|
: vkGetInstanceProcAddr( getProcAddr )${initializerList}
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;
|
||||||
|
${members}
|
||||||
|
};
|
||||||
|
)";
|
||||||
|
|
||||||
|
str += replaceWithMap( contextDispatcherTemplate,
|
||||||
|
{ { "initializerList", contextInitializerList }, { "members", contextMembers } } );
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanHppGenerator::appendRAIIHandles( std::string & str, std::string & commandDefinitions )
|
void VulkanHppGenerator::appendRAIIHandles( std::string & str, std::string & commandDefinitions )
|
||||||
{
|
{
|
||||||
// Enum -> Type translations are always able to occur.
|
// Enum -> Type translations are always able to occur.
|
||||||
@ -3546,10 +3599,8 @@ void VulkanHppGenerator::appendRAIIHandleContext( std::string &
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Context()
|
Context()
|
||||||
{
|
: m_dispatcher( m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>( "vkGetInstanceProcAddr" ) )
|
||||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>( "vkGetInstanceProcAddr" );
|
{}
|
||||||
m_dispatcher.init( vkGetInstanceProcAddr );
|
|
||||||
}
|
|
||||||
|
|
||||||
~Context() = default;
|
~Context() = default;
|
||||||
|
|
||||||
@ -3571,14 +3622,14 @@ void VulkanHppGenerator::appendRAIIHandleContext( std::string &
|
|||||||
|
|
||||||
${memberFunctionDeclarations}
|
${memberFunctionDeclarations}
|
||||||
|
|
||||||
VULKAN_HPP_RAII_DISPATCHER_TYPE const * getDispatcher() const
|
VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher const * getDispatcher() const
|
||||||
{
|
{
|
||||||
return &m_dispatcher;
|
return &m_dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vk::DynamicLoader m_dynamicLoader;
|
VULKAN_HPP_NAMESPACE::DynamicLoader m_dynamicLoader;
|
||||||
VULKAN_HPP_RAII_DISPATCHER_TYPE m_dispatcher;
|
VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher m_dispatcher;
|
||||||
};
|
};
|
||||||
|
|
||||||
)";
|
)";
|
||||||
@ -6922,20 +6973,25 @@ std::string VulkanHppGenerator::constructRAIIHandleConstructorResult(
|
|||||||
{
|
{
|
||||||
std::string callArguments = constructRAIIHandleConstructorCallArguments(
|
std::string callArguments = constructRAIIHandleConstructorCallArguments(
|
||||||
handle.first, constructorIt->second.params, false, {}, {}, handle.second.destructorIt != m_commands.end() );
|
handle.first, constructorIt->second.params, false, {}, {}, handle.second.destructorIt != m_commands.end() );
|
||||||
std::string constructorArguments;
|
std::string constructorArguments, dispatcherArgument, dispatcherInit;
|
||||||
if ( handle.first == "VkInstance" )
|
if ( handle.first == "VkInstance" )
|
||||||
{
|
{
|
||||||
constructorArguments = "VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const & context";
|
constructorArguments = "VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const & context";
|
||||||
|
dispatcherArgument = "context.getDispatcher()->vkGetInstanceProcAddr";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dispatcherArgument = constructorIt->second.params[0].name + ".getDispatcher()";
|
||||||
|
if ( handle.first == "VkDevice" )
|
||||||
|
{
|
||||||
|
dispatcherArgument = "*" + dispatcherArgument;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
constructorArguments += constructRAIIHandleConstructorArguments(
|
constructorArguments += constructRAIIHandleConstructorArguments(
|
||||||
handle.first, constructorIt->second.params, false, handle.first == "VkInstance" );
|
handle.first, constructorIt->second.params, false, handle.first == "VkInstance" );
|
||||||
std::string dispatcherArgument =
|
|
||||||
( ( handle.first == "VkInstance" ) ? "context" : constructorIt->second.params[0].name ) + ".getDispatcher()";
|
|
||||||
std::string dispatcherInit;
|
|
||||||
if ( ( handle.first == "VkDevice" ) || ( handle.first == "VkInstance" ) )
|
if ( ( handle.first == "VkDevice" ) || ( handle.first == "VkInstance" ) )
|
||||||
{
|
{
|
||||||
dispatcherArgument = "*" + dispatcherArgument;
|
dispatcherInit = "\n m_dispatcher.init( m_" + startLowerCase( stripPrefix( handle.first, "Vk" ) ) + " );";
|
||||||
dispatcherInit = "\n m_dispatcher.init( m_" + startLowerCase( stripPrefix( handle.first, "Vk" ) ) + " );";
|
|
||||||
}
|
}
|
||||||
std::string initializationList = constructRAIIHandleConstructorInitializationList(
|
std::string initializationList = constructRAIIHandleConstructorInitializationList(
|
||||||
handle.first, constructorIt, handle.second.destructorIt, !handle.second.secondLevelCommands.empty() );
|
handle.first, constructorIt, handle.second.destructorIt, !handle.second.secondLevelCommands.empty() );
|
||||||
@ -6975,7 +7031,7 @@ std::string VulkanHppGenerator::constructRAIIHandleConstructorTakeOwnership(
|
|||||||
if ( handle.first == "VkInstance" )
|
if ( handle.first == "VkInstance" )
|
||||||
{
|
{
|
||||||
constructorArguments = "VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const & context";
|
constructorArguments = "VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const & context";
|
||||||
dispatcherArgument = "context.getDispatcher()";
|
dispatcherArgument = "context.getDispatcher()->vkGetInstanceProcAddr";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -6987,7 +7043,7 @@ std::string VulkanHppGenerator::constructRAIIHandleConstructorTakeOwnership(
|
|||||||
"VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::" + paramType + " const & " + startLowerCase( paramType );
|
"VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::" + paramType + " const & " + startLowerCase( paramType );
|
||||||
dispatcherArgument = startLowerCase( paramType ) + ".getDispatcher()";
|
dispatcherArgument = startLowerCase( paramType ) + ".getDispatcher()";
|
||||||
}
|
}
|
||||||
if ( ( handle.first == "VkDevice" ) || ( handle.first == "VkInstance" ) )
|
if ( handle.first == "VkDevice" )
|
||||||
{
|
{
|
||||||
dispatcherArgument = "*" + dispatcherArgument;
|
dispatcherArgument = "*" + dispatcherArgument;
|
||||||
}
|
}
|
||||||
@ -11644,6 +11700,25 @@ std::string VulkanHppGenerator::getVectorSize( std::vector<ParamData> const &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VulkanHppGenerator::hasParentHandle( std::string const & handle, std::string const & parent ) const
|
||||||
|
{
|
||||||
|
std::string candidate = handle;
|
||||||
|
while ( !candidate.empty() )
|
||||||
|
{
|
||||||
|
auto const & handleIt = m_handles.find( candidate );
|
||||||
|
assert( handleIt != m_handles.end() );
|
||||||
|
if ( handleIt->second.parent == parent )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
candidate = handleIt->second.parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool VulkanHppGenerator::isHandleType( std::string const & type ) const
|
bool VulkanHppGenerator::isHandleType( std::string const & type ) const
|
||||||
{
|
{
|
||||||
if ( beginsWith( type, "Vk" ) )
|
if ( beginsWith( type, "Vk" ) )
|
||||||
@ -16074,9 +16149,9 @@ namespace std
|
|||||||
ofs.close();
|
ofs.close();
|
||||||
|
|
||||||
#if defined( CLANG_FORMAT_EXECUTABLE )
|
#if defined( CLANG_FORMAT_EXECUTABLE )
|
||||||
std::cout << "VulkanHppGenerator: Formatting " << VULKAN_HPP_FILE << " using clang-format..." << std::endl;
|
|
||||||
int ret = std::system( "\"" CLANG_FORMAT_EXECUTABLE "\" --version" );
|
int ret = std::system( "\"" CLANG_FORMAT_EXECUTABLE "\" --version" );
|
||||||
assert( ret == 0 );
|
assert( ret == 0 );
|
||||||
|
std::cout << "VulkanHppGenerator: Formatting " << VULKAN_HPP_FILE << " using clang-format..." << std::endl;
|
||||||
ret = std::system( "\"" CLANG_FORMAT_EXECUTABLE "\" -i --style=file " VULKAN_HPP_FILE );
|
ret = std::system( "\"" CLANG_FORMAT_EXECUTABLE "\" -i --style=file " VULKAN_HPP_FILE );
|
||||||
if ( ret != 0 )
|
if ( ret != 0 )
|
||||||
{
|
{
|
||||||
@ -16120,6 +16195,9 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
}
|
}
|
||||||
|
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
generator.appendRAIIDispatchers( str );
|
||||||
|
|
||||||
std::string raiiHandlesCommandDefinitions;
|
std::string raiiHandlesCommandDefinitions;
|
||||||
generator.appendRAIIHandles( str, raiiHandlesCommandDefinitions );
|
generator.appendRAIIHandles( str, raiiHandlesCommandDefinitions );
|
||||||
str += raiiHandlesCommandDefinitions;
|
str += raiiHandlesCommandDefinitions;
|
||||||
|
@ -35,6 +35,7 @@ public:
|
|||||||
void appendHandles( std::string & str );
|
void appendHandles( std::string & str );
|
||||||
void appendHandlesCommandDefinitions( std::string & str ) const;
|
void appendHandlesCommandDefinitions( std::string & str ) const;
|
||||||
void appendHashStructures( std::string & str ) const;
|
void appendHashStructures( std::string & str ) const;
|
||||||
|
void appendRAIIDispatchers( std::string & str ) const;
|
||||||
void appendRAIIHandles( std::string & str, std::string & commandDefinitions );
|
void appendRAIIHandles( std::string & str, std::string & commandDefinitions );
|
||||||
void appendResultExceptions( std::string & str ) const;
|
void appendResultExceptions( std::string & str ) const;
|
||||||
void appendStructs( std::string & str );
|
void appendStructs( std::string & str );
|
||||||
@ -975,6 +976,7 @@ private:
|
|||||||
std::string getVectorSize( std::vector<ParamData> const & params,
|
std::string getVectorSize( std::vector<ParamData> const & params,
|
||||||
std::map<size_t, size_t> const & vectorParamIndices,
|
std::map<size_t, size_t> const & vectorParamIndices,
|
||||||
size_t returnParamIndex ) const;
|
size_t returnParamIndex ) const;
|
||||||
|
bool hasParentHandle( std::string const & handle, std::string const & parent ) const;
|
||||||
bool isHandleType( std::string const & type ) const;
|
bool isHandleType( std::string const & type ) const;
|
||||||
bool isLenByStructMember( std::string const & name, std::vector<ParamData> const & params ) const;
|
bool isLenByStructMember( std::string const & name, std::vector<ParamData> const & params ) const;
|
||||||
bool isLenByStructMember( std::string const & name, ParamData const & param ) const;
|
bool isLenByStructMember( std::string const & name, ParamData const & param ) const;
|
||||||
|
@ -36,15 +36,33 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ContextDispatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ContextDispatcher( PFN_vkGetInstanceProcAddr getProcAddr )
|
||||||
|
: vkGetInstanceProcAddr( getProcAddr )
|
||||||
|
, vkCreateInstance( PFN_vkCreateInstance( getProcAddr( NULL, "vkCreateInstance" ) ) )
|
||||||
|
, vkEnumerateInstanceExtensionProperties( PFN_vkEnumerateInstanceExtensionProperties(
|
||||||
|
getProcAddr( NULL, "vkEnumerateInstanceExtensionProperties" ) ) )
|
||||||
|
, vkEnumerateInstanceLayerProperties(
|
||||||
|
PFN_vkEnumerateInstanceLayerProperties( getProcAddr( NULL, "vkEnumerateInstanceLayerProperties" ) ) )
|
||||||
|
, vkEnumerateInstanceVersion(
|
||||||
|
PFN_vkEnumerateInstanceVersion( getProcAddr( NULL, "vkEnumerateInstanceVersion" ) ) )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;
|
||||||
|
PFN_vkCreateInstance vkCreateInstance = 0;
|
||||||
|
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = 0;
|
||||||
|
PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties = 0;
|
||||||
|
PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class Context
|
class Context
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Context()
|
Context() : m_dispatcher( m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>( "vkGetInstanceProcAddr" ) )
|
||||||
{
|
{}
|
||||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr =
|
|
||||||
m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>( "vkGetInstanceProcAddr" );
|
|
||||||
m_dispatcher.init( vkGetInstanceProcAddr );
|
|
||||||
}
|
|
||||||
|
|
||||||
~Context() = default;
|
~Context() = default;
|
||||||
|
|
||||||
@ -70,14 +88,14 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
|
|
||||||
VULKAN_HPP_NODISCARD uint32_t enumerateInstanceVersion() const;
|
VULKAN_HPP_NODISCARD uint32_t enumerateInstanceVersion() const;
|
||||||
|
|
||||||
VULKAN_HPP_RAII_DISPATCHER_TYPE const * getDispatcher() const
|
VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher const * getDispatcher() const
|
||||||
{
|
{
|
||||||
return &m_dispatcher;
|
return &m_dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vk::DynamicLoader m_dynamicLoader;
|
VULKAN_HPP_NAMESPACE::DynamicLoader m_dynamicLoader;
|
||||||
VULKAN_HPP_RAII_DISPATCHER_TYPE m_dispatcher;
|
VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher m_dispatcher;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Instance
|
class Instance
|
||||||
@ -96,7 +114,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )
|
VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )
|
||||||
: m_allocator( reinterpret_cast<const VkAllocationCallbacks *>(
|
: m_allocator( reinterpret_cast<const VkAllocationCallbacks *>(
|
||||||
static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) )
|
static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) )
|
||||||
, m_dispatcher( *context.getDispatcher() )
|
, m_dispatcher( context.getDispatcher()->vkGetInstanceProcAddr )
|
||||||
{
|
{
|
||||||
VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
|
VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
|
||||||
getDispatcher()->vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),
|
getDispatcher()->vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),
|
||||||
@ -115,7 +133,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
: m_instance( instance )
|
: m_instance( instance )
|
||||||
, m_allocator( reinterpret_cast<const VkAllocationCallbacks *>(
|
, m_allocator( reinterpret_cast<const VkAllocationCallbacks *>(
|
||||||
static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) )
|
static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) )
|
||||||
, m_dispatcher( *context.getDispatcher() )
|
, m_dispatcher( context.getDispatcher()->vkGetInstanceProcAddr )
|
||||||
{
|
{
|
||||||
m_dispatcher.init( m_instance );
|
m_dispatcher.init( m_instance );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user