Skip to content

Commit a699edc

Browse files
authored
Change C-arrays as command arguments to std::arrays (#2561)
1 parent 412ef7d commit a699edc

5 files changed

Lines changed: 124 additions & 61 deletions

File tree

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ Requests for updates and issues with these packages should be directed to their
7777

7878
We try to keep the API for all flavours of Vulkan-Hpp constant or backwards compatible. However, we may introduce unavoidable breaking changes, usually to fix bugs. Following is a list of those changes, arranged by version.
7979

80+
### v1.4.351
81+
82+
In order to improve argument safety, the interface of functions taking a C-array of values has changed to take a `std::array`, instead.
83+
The affected functions are:
84+
- `vk::CommandBuffer::setFragmentShadingRateKHR`
85+
- `vk::raii::CommandBuffer::setBlendConstants`
86+
- `vk::raii::CommandBuffer::setFragmentShadingRateKHR`
87+
- `vk::raii::CommandBuffer::setFragmentShadingRateEnumNV`
88+
8089
### v1.4.334
8190

8291
The `vulkan_hpp` C++ named module has been renamed to `vulkan`.

generator/VulkanHppGenerator.cpp

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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, [&param]( 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, [&param]( 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, [&param]( 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

1285012852
bool 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

1285512857
bool VulkanHppGenerator::isDeviceCommand( CommandData const & commandData ) const

vulkan/vulkan_funcs.hpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5336,6 +5336,20 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
53365336
d.vkCmdSetBlendConstants( static_cast<VkCommandBuffer>( m_commandBuffer ), blendConstants );
53375337
}
53385338

5339+
#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
5340+
// wrapper function for command vkCmdSetBlendConstants, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetBlendConstants.html
5341+
template <typename Dispatch, typename std::enable_if<IS_DISPATCHED( vkCmdSetBlendConstants ), bool>::type>
5342+
VULKAN_HPP_INLINE void CommandBuffer::setBlendConstants( std::array<float, 4> const & blendConstants, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
5343+
{
5344+
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
5345+
# if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )
5346+
VULKAN_HPP_ASSERT( d.vkCmdSetBlendConstants && "Function <vkCmdSetBlendConstants> requires <VK_VERSION_1_0>" );
5347+
# endif
5348+
5349+
d.vkCmdSetBlendConstants( m_commandBuffer, blendConstants.data() );
5350+
}
5351+
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
5352+
53395353
// wrapper function for command vkCmdSetDepthBounds, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetDepthBounds.html
53405354
template <typename Dispatch, typename std::enable_if<IS_DISPATCHED( vkCmdSetDepthBounds ), bool>::type>
53415355
VULKAN_HPP_INLINE void CommandBuffer::setDepthBounds( float minDepthBounds, float maxDepthBounds, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
@@ -20943,15 +20957,16 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
2094320957
// https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetFragmentShadingRateKHR.html
2094420958
template <typename Dispatch, typename std::enable_if<IS_DISPATCHED( vkCmdSetFragmentShadingRateKHR ), bool>::type>
2094520959
VULKAN_HPP_INLINE void CommandBuffer::setFragmentShadingRateKHR(
20946-
Extent2D const & fragmentSize, FragmentShadingRateCombinerOpKHR const combinerOps[2], Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
20960+
Extent2D const & fragmentSize, std::array<FragmentShadingRateCombinerOpKHR, 2> const & combinerOps, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
2094720961
{
2094820962
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
2094920963
# if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )
2095020964
VULKAN_HPP_ASSERT( d.vkCmdSetFragmentShadingRateKHR && "Function <vkCmdSetFragmentShadingRateKHR> requires <VK_KHR_fragment_shading_rate>" );
2095120965
# endif
2095220966

20953-
d.vkCmdSetFragmentShadingRateKHR(
20954-
m_commandBuffer, reinterpret_cast<VkExtent2D const *>( &fragmentSize ), reinterpret_cast<VkFragmentShadingRateCombinerOpKHR const *>( combinerOps ) );
20967+
d.vkCmdSetFragmentShadingRateKHR( m_commandBuffer,
20968+
reinterpret_cast<VkExtent2D const *>( &fragmentSize ),
20969+
reinterpret_cast<VkFragmentShadingRateCombinerOpKHR const *>( combinerOps.data() ) );
2095520970
}
2095620971
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
2095720972

@@ -24939,6 +24954,24 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
2493924954
reinterpret_cast<VkFragmentShadingRateCombinerOpKHR const *>( combinerOps ) );
2494024955
}
2494124956

24957+
#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
24958+
// wrapper function for command vkCmdSetFragmentShadingRateEnumNV, see
24959+
// https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetFragmentShadingRateEnumNV.html
24960+
template <typename Dispatch, typename std::enable_if<IS_DISPATCHED( vkCmdSetFragmentShadingRateEnumNV ), bool>::type>
24961+
VULKAN_HPP_INLINE void CommandBuffer::setFragmentShadingRateEnumNV(
24962+
FragmentShadingRateNV shadingRate, std::array<FragmentShadingRateCombinerOpKHR, 2> const & combinerOps, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
24963+
{
24964+
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
24965+
# if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )
24966+
VULKAN_HPP_ASSERT( d.vkCmdSetFragmentShadingRateEnumNV && "Function <vkCmdSetFragmentShadingRateEnumNV> requires <VK_NV_fragment_shading_rate_enums>" );
24967+
# endif
24968+
24969+
d.vkCmdSetFragmentShadingRateEnumNV( m_commandBuffer,
24970+
static_cast<VkFragmentShadingRateNV>( shadingRate ),
24971+
reinterpret_cast<VkFragmentShadingRateCombinerOpKHR const *>( combinerOps.data() ) );
24972+
}
24973+
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
24974+
2494224975
//=== VK_EXT_mesh_shader ===
2494324976

2494424977
// wrapper function for command vkCmdDrawMeshTasksEXT, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdDrawMeshTasksEXT.html

vulkan/vulkan_handles.hpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5729,6 +5729,12 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
57295729
// wrapper function for command vkCmdSetBlendConstants, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetBlendConstants.html
57305730
template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE, typename std::enable_if<IS_DISPATCHED( vkCmdSetBlendConstants ), bool>::type = true>
57315731
void setBlendConstants( float const blendConstants[4], Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
5732+
#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
5733+
// wrapper function for command vkCmdSetBlendConstants, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetBlendConstants.html
5734+
template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE, typename std::enable_if<IS_DISPATCHED( vkCmdSetBlendConstants ), bool>::type = true>
5735+
void setBlendConstants( std::array<float, 4> const & blendConstants,
5736+
Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
5737+
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
57325738

57335739
// wrapper function for command vkCmdSetDepthBounds, see https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetDepthBounds.html
57345740
template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE, typename std::enable_if<IS_DISPATCHED( vkCmdSetDepthBounds ), bool>::type = true>
@@ -7289,9 +7295,9 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
72897295
// https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetFragmentShadingRateKHR.html
72907296
template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,
72917297
typename std::enable_if<IS_DISPATCHED( vkCmdSetFragmentShadingRateKHR ), bool>::type = true>
7292-
void setFragmentShadingRateKHR( Extent2D const & fragmentSize,
7293-
FragmentShadingRateCombinerOpKHR const combinerOps[2],
7294-
Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
7298+
void setFragmentShadingRateKHR( Extent2D const & fragmentSize,
7299+
std::array<FragmentShadingRateCombinerOpKHR, 2> const & combinerOps,
7300+
Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
72957301
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
72967302

72977303
//=== VK_KHR_dynamic_rendering_local_read ===
@@ -7953,6 +7959,15 @@ VULKAN_HPP_EXPORT namespace VULKAN_HPP_NAMESPACE
79537959
void setFragmentShadingRateEnumNV( FragmentShadingRateNV shadingRate,
79547960
FragmentShadingRateCombinerOpKHR const combinerOps[2],
79557961
Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
7962+
#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
7963+
// wrapper function for command vkCmdSetFragmentShadingRateEnumNV, see
7964+
// https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetFragmentShadingRateEnumNV.html
7965+
template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,
7966+
typename std::enable_if<IS_DISPATCHED( vkCmdSetFragmentShadingRateEnumNV ), bool>::type = true>
7967+
void setFragmentShadingRateEnumNV( FragmentShadingRateNV shadingRate,
7968+
std::array<FragmentShadingRateCombinerOpKHR, 2> const & combinerOps,
7969+
Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
7970+
#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */
79567971

79577972
//=== VK_EXT_mesh_shader ===
79587973

0 commit comments

Comments
 (0)