@@ -2350,14 +2350,19 @@ std::string VulkanHppGenerator::generateArgumentListEnhanced( std::vector<ParamD
23502350 assert( composedType.ends_with( " *" ) );
23512351 arguments.push_back( stripPostfix( composedType, " *" ) + " & " + stripPluralS( startLowerCase( stripPrefix( params[i].name, "p" ) ) ) );
23522352 }
2353+ else if ( !params[i].arraySizes.empty() )
2354+ {
2355+ assert( params[i].arraySizes.size() == 1 );
2356+ assert( params[i].type.postfix == "const" );
2357+ arguments.push_back( "std::array<" + stripPrefix( params[i].type.name, "Vk" ) + ", " + params[i].arraySizes[0] + "> const & " + params[i].name );
2358+ }
23532359 else if ( params[i].type.isConstPointer() )
23542360 {
23552361 assert( composedType.ends_with( " *" ) );
23562362 std::string name = startLowerCase( stripPrefix( params[i].name, "p" ) );
23572363 if ( params[i].lenExpression.empty() )
23582364 {
23592365 assert( withDispatcher || !isHandleType( params[i].type.name ) );
2360- assert( params[i].arraySizes.empty() );
23612366 if ( params[i].type.name == "void" )
23622367 {
23632368 arguments.push_back( templatedParams.contains( i ) ? ( stripPrefix( params[i].name, "p" ) + "Type const & " + name )
@@ -2378,7 +2383,6 @@ std::string VulkanHppGenerator::generateArgumentListEnhanced( std::vector<ParamD
23782383 {
23792384 // a const-pointer with a non-empty len is either null-terminated (aka a string) or represented by an
23802385 // ArrayProxy
2381- assert( params[i].arraySizes.empty() );
23822386 if ( params[i].lenExpression == "null-terminated" )
23832387 {
23842388 assert( params[i].type.name == "char" );
@@ -2431,7 +2435,7 @@ std::string VulkanHppGenerator::generateArgumentListEnhanced( std::vector<ParamD
24312435 assert( params[i].type.isValue() );
24322436 // parameters named "objectType" collide with the member variable -> append an _ to here
24332437 std::string paramName = ( definition && ( params[i].name == "objectType" ) ) ? "objectType_" : params[i].name;
2434- arguments.push_back( composedType + " " + paramName + generateCArraySizes( params[i].arraySizes ) );
2438+ arguments.push_back( composedType + " " + paramName );
24352439 }
24362440 arguments.back() += std::string( !definition && ( defaultStartIndex <= i ) && !hasDefaultAssignment ? " VULKAN_HPP_DEFAULT_ASSIGNMENT( {} )" : "" );
24372441 }
@@ -2999,9 +3003,9 @@ std::string VulkanHppGenerator::generateCallArgumentEnhancedValue(
29993003 std::string argument;
30003004 ParamData const & param = params[paramIndex];
30013005 assert( ( flavourFlags & CommandFlavourFlagBits::keepVoidPtr ) || param.lenExpression.empty() ); // !keepVoidPtr -> no lenExpression
3002- if ( param.type.name.starts_with( "Vk" ) )
3006+ if ( param.arraySizes.empty( ) )
30033007 {
3004- if ( param.arraySizes.empty( ) )
3008+ if ( param.type.name.starts_with( "Vk" ) )
30053009 {
30063010 // check if this param is used as the len of an other param
30073011 auto pointerIt = std::ranges::find_if( params, [¶m]( ParamData const & pd ) { return pd.lenExpression == param.name; } );
@@ -3038,57 +3042,55 @@ std::string VulkanHppGenerator::generateCallArgumentEnhancedValue(
30383042 }
30393043 else
30403044 {
3041- assert( !param.optional );
3042- assert( param.arraySizes.size() == 1 );
3043- assert( param.type.postfix == "const" );
3044- argument = "reinterpret_cast<" + param.type.compose( "" ) + " *>( " + param.name + " )";
3045- }
3046- }
3047- else
3048- {
3049- auto pointerIt = std::ranges::find_if( params, [¶m]( ParamData const & pd ) { return pd.lenExpression == param.name; } );
3050- if ( ( pointerIt != params.end() ) && !( ( pointerIt->type.name == "void" ) && ( flavourFlags & CommandFlavourFlagBits::keepVoidPtr ) ) )
3051- {
3052- // this parameter is the len of some other -> replace it with that parameter's size
3053- assert( param.arraySizes.empty() );
3054- assert( ( param.type.name == "size_t" ) || ( param.type.name == "uint32_t" ) );
3055- if ( singularParams.contains( paramIndex ) )
3045+ auto pointerIt = std::ranges::find_if( params, [¶m]( ParamData const & pd ) { return pd.lenExpression == param.name; } );
3046+ if ( ( pointerIt != params.end() ) && !( ( pointerIt->type.name == "void" ) && ( flavourFlags & CommandFlavourFlagBits::keepVoidPtr ) ) )
30563047 {
3057- if ( pointerIt->type.name == "void" )
3048+ // this parameter is the len of some other -> replace it with that parameter's size
3049+ assert( ( param.type.name == "size_t" ) || ( param.type.name == "uint32_t" ) );
3050+ if ( singularParams.contains( paramIndex ) )
30583051 {
3059- argument = "sizeof( " + stripPrefix( pointerIt->name, "p" ) + "Type )";
3052+ if ( pointerIt->type.name == "void" )
3053+ {
3054+ argument = "sizeof( " + stripPrefix( pointerIt->name, "p" ) + "Type )";
3055+ }
3056+ else
3057+ {
3058+ argument = "1";
3059+ }
30603060 }
30613061 else
30623062 {
3063- argument = "1";
3063+ argument = startLowerCase( stripPrefix( pointerIt->name, "p" ) ) + ".size()";
3064+ if ( pointerIt->type.name == "void" )
3065+ {
3066+ argument += " * sizeof( " + stripPrefix( pointerIt->name, "p" ) + "Type )";
3067+ }
30643068 }
30653069 }
30663070 else
30673071 {
3068- argument = startLowerCase( stripPrefix( pointerIt->name, "p" ) ) + ".size()" ;
3069- if ( pointerIt->type.name == "void" )
3072+ pointerIt = std::ranges::find_if( params, [paramIndex]( ParamData const & pd ) { return pd.strideParam.second == paramIndex; } ) ;
3073+ if ( pointerIt != params.end() )
30703074 {
3071- argument += " * sizeof( " + stripPrefix( pointerIt->name, "p" ) + "Type )";
3075+ // this parameter is the stride of some other -> replace it with that parameter's stride
3076+ assert( param.type.name == "uint32_t" );
3077+ assert( pointerIt->strideParam.first == param.name );
3078+ argument = startLowerCase( stripPrefix( pointerIt->name, "p" ) ) + ".stride()";
3079+ }
3080+ else
3081+ {
3082+ argument = param.name;
30723083 }
30733084 }
30743085 }
3075- else
3076- {
3077- assert( param.arraySizes.size() <= 1 );
3078- pointerIt = std::ranges::find_if( params, [paramIndex]( ParamData const & pd ) { return pd.strideParam.second == paramIndex; } );
3079- if ( pointerIt != params.end() )
3080- {
3081- // this parameter is the stride of some other -> replace it with that parameter's stride
3082- assert( param.arraySizes.empty() );
3083- assert( param.type.name == "uint32_t" );
3084- assert( pointerIt->strideParam.first == param.name );
3085- argument = startLowerCase( stripPrefix( pointerIt->name, "p" ) ) + ".stride()";
3086- }
3087- else
3088- {
3089- argument = param.name;
3090- }
3091- }
3086+ }
3087+ else
3088+ {
3089+ assert( !param.optional );
3090+ assert( param.arraySizes.size() == 1 );
3091+ assert( param.type.postfix == "const" );
3092+ argument = param.type.name.starts_with( "Vk" ) ? ( "reinterpret_cast<" + param.type.compose( "" ) + " *>( " + param.name + ".data() )" )
3093+ : ( param.name + ".data()" );
30923094 }
30933095 return argument;
30943096}
@@ -12849,7 +12851,7 @@ bool VulkanHppGenerator::hasParentHandle( std::string const & handle, std::strin
1284912851
1285012852bool VulkanHppGenerator::hasPointerParams( std::vector<ParamData> const & params ) const
1285112853{
12852- return std::ranges::any_of( params, []( auto const & pd ) { return pd.type.isPointer(); } );
12854+ return std::ranges::any_of( params, []( auto const & pd ) { return pd.type.isPointer() || !pd.arraySizes.empty() ; } );
1285312855}
1285412856
1285512857bool VulkanHppGenerator::isDeviceCommand( CommandData const & commandData ) const
0 commit comments