From c55cf1639702c0f2b513e7a308281d7b61a8c0ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20S=C3=BC=C3=9Fenbach?= Date: Mon, 19 Jun 2023 12:46:04 +0200 Subject: [PATCH] Fix wrong usage of 'structureChains' in generating functions returning a StructureChain and a vector of data. (#1594) --- VulkanHppGenerator.cpp | 41 +++++++++---------- VulkanHppGenerator.hpp | 2 + .../EnableBetaExtensions.cpp | 8 +++- vulkan/vulkan_funcs.hpp | 10 ----- vulkan/vulkan_raii.hpp | 5 --- 5 files changed, 29 insertions(+), 37 deletions(-) diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index 8f4e32c..2eb0eee 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -2234,22 +2234,7 @@ std::string VulkanHppGenerator::generateArgumentListEnhanced( std::vector const & singularParams, std::set const & templatedParams, + std::vector const & chainedReturnParams, CommandFlavourFlags flavourFlags, bool raii ) const { @@ -2951,7 +2937,7 @@ std::string VulkanHppGenerator::generateCallSequence( std::string const & std::string vectorName = startLowerCase( stripPrefix( commandData.params[vectorParamIt->first].name, "p" ) ); std::string vectorSize = startLowerCase( stripPrefix( commandData.params[vectorParamIt->second.lenParam].name, "p" ) ); - if ( flavourFlags & CommandFlavourFlagBits::chained ) + if ( ( flavourFlags & CommandFlavourFlagBits::chained ) && needsStructureChainResize( vectorParams, chainedReturnParams ) ) { assert( vectorParams.size() == 1 ); // chained data needs some more handling!! @@ -3282,8 +3268,8 @@ std::string VulkanHppGenerator::generateCommandEnhanced( std::string const & std::string dataPreparation = generateDataPreparation( commandData, initialSkipCount, returnParams, vectorParams, templatedParams, flavourFlags, enumerating ); std::string dataSizeChecks = generateDataSizeChecks( commandData, returnParams, dataTypes, vectorParams, templatedParams, singular ); - std::string callSequence = - generateCallSequence( name, commandData, returnParams, vectorParams, initialSkipCount, singularParams, templatedParams, flavourFlags, false ); + std::string callSequence = generateCallSequence( + name, commandData, returnParams, vectorParams, initialSkipCount, singularParams, templatedParams, chainedReturnParams, flavourFlags, false ); std::string resultCheck = generateResultCheck( commandData, className, classSeparator, commandName, enumerating ); std::string returnStatement = generateReturnStatement( name, commandData, @@ -7391,8 +7377,8 @@ ${vectorSizeCheck} } )"; - std::string callSequence = - generateCallSequence( name, commandData, returnParams, vectorParams, initialSkipCount, singularParams, templatedParams, flavourFlags, true ); + std::string callSequence = generateCallSequence( + name, commandData, returnParams, vectorParams, initialSkipCount, singularParams, templatedParams, chainedReturnParams, flavourFlags, true ); std::string className = initialSkipCount ? stripPrefix( commandData.params[initialSkipCount - 1].type.type, "Vk" ) : "Context"; std::string returnVariable = generateReturnVariable( commandData, returnParams, vectorParams, flavourFlags ); std::string dataDeclarations = @@ -11445,6 +11431,19 @@ bool VulkanHppGenerator::isTypeUsed( std::string const & type ) const return false; } +bool VulkanHppGenerator::needsStructureChainResize( std::map const & vectorParams, + std::vector const & chainedReturnParams ) const +{ + auto it = std::find_if( + chainedReturnParams.begin(), chainedReturnParams.end(), [&vectorParams]( size_t crp ) { return vectorParams.find( crp ) != vectorParams.end(); } ); + // assert that there's no other chained vector param ! + assert( + ( it == chainedReturnParams.end() ) || + ( std::find_if( std::next( it ), chainedReturnParams.end(), [&vectorParams]( size_t crp ) { return vectorParams.find( crp ) != vectorParams.end(); } ) == + chainedReturnParams.end() ) ); + return ( it != chainedReturnParams.end() ); +} + std::pair>> VulkanHppGenerator::needsVectorSizeCheck( std::vector const & params, std::map const & vectorParams, std::vector const & returnParams, diff --git a/VulkanHppGenerator.hpp b/VulkanHppGenerator.hpp index ff651a2..1bc5fdf 100644 --- a/VulkanHppGenerator.hpp +++ b/VulkanHppGenerator.hpp @@ -540,6 +540,7 @@ private: size_t initialSkipCount, std::set const & singularParams, std::set const & templatedParams, + std::vector const & chainedReturnParams, CommandFlavourFlags flavourFlags, bool raii ) const; std::string generateChainTemplates( std::vector const & returnParams, bool chained ) const; @@ -936,6 +937,7 @@ private: bool isSupportedFeature( std::string const & name ) const; bool isTypeRequired( std::string const & type ) const; bool isTypeUsed( std::string const & type ) const; + bool needsStructureChainResize( std::map const & vectorParams, std::vector const & chainedReturnParams ) const; std::pair>> needsVectorSizeCheck( std::vector const & params, std::map const & vectorParams, std::vector const & returnParams, diff --git a/tests/EnableBetaExtensions/EnableBetaExtensions.cpp b/tests/EnableBetaExtensions/EnableBetaExtensions.cpp index f3b0ef3..a041c8b 100644 --- a/tests/EnableBetaExtensions/EnableBetaExtensions.cpp +++ b/tests/EnableBetaExtensions/EnableBetaExtensions.cpp @@ -18,7 +18,13 @@ #define VK_ENABLE_BETA_EXTENSIONS #include -int main(int /*argc*/, char** /*argv*/) +int main( int /*argc*/, char ** /*argv*/ ) { + vk::Device device; + + vk::VideoEncodeSessionParametersGetInfoKHR videoSessionParametersInfo; + auto stuff = device.getEncodedVideoSessionParametersKHR( videoSessionParametersInfo ); return 0; } diff --git a/vulkan/vulkan_funcs.hpp b/vulkan/vulkan_funcs.hpp index e99c5a0..e3bdebe 100644 --- a/vulkan/vulkan_funcs.hpp +++ b/vulkan/vulkan_funcs.hpp @@ -18660,12 +18660,7 @@ namespace VULKAN_HPP_NAMESPACE nullptr ); if ( ( result == VK_SUCCESS ) && dataSize ) { - structureChains.resize( dataSize ); data.resize( dataSize ); - for ( size_t i = 0; i < dataSize; i++ ) - { - data[i].pNext = structureChains[i].template get().pNext; - } result = d.vkGetEncodedVideoSessionParametersKHR( m_device, reinterpret_cast( &videoSessionParametersInfo ), reinterpret_cast( &feedbackInfo ), @@ -18709,12 +18704,7 @@ namespace VULKAN_HPP_NAMESPACE nullptr ); if ( ( result == VK_SUCCESS ) && dataSize ) { - structureChains.resize( dataSize ); data.resize( dataSize ); - for ( size_t i = 0; i < dataSize; i++ ) - { - data[i].pNext = structureChains[i].template get().pNext; - } result = d.vkGetEncodedVideoSessionParametersKHR( m_device, reinterpret_cast( &videoSessionParametersInfo ), reinterpret_cast( &feedbackInfo ), diff --git a/vulkan/vulkan_raii.hpp b/vulkan/vulkan_raii.hpp index 9c9af3b..3ce5317 100644 --- a/vulkan/vulkan_raii.hpp +++ b/vulkan/vulkan_raii.hpp @@ -18567,12 +18567,7 @@ namespace VULKAN_HPP_NAMESPACE nullptr ); if ( ( result == VK_SUCCESS ) && dataSize ) { - structureChains.resize( dataSize ); data.resize( dataSize ); - for ( size_t i = 0; i < dataSize; i++ ) - { - data[i].pNext = structureChains[i].template get().pNext; - } result = getDispatcher()->vkGetEncodedVideoSessionParametersKHR( static_cast( m_device ), reinterpret_cast( &videoSessionParametersInfo ),