Add some support of attribute "altlen" on command parameters.

This commit is contained in:
asuessenbach 2022-03-02 09:51:12 +01:00
parent 7638a1ec6c
commit ffead3984d
6 changed files with 611 additions and 587 deletions

View File

@ -79,7 +79,7 @@ std::vector<InputIt> findAll( InputIt first, InputIt last, UnaryPredicate p )
return result; return result;
} }
const std::set<std::string> altLens = { "codeSize / 4", "(rasterizationSamples + 31) / 32", "2*VK_UUID_SIZE" }; const std::set<std::string> altLens = { "2*VK_UUID_SIZE", "codeSize / 4", "(rasterizationSamples + 31) / 32", "(samples + 31) / 32" };
const std::set<std::string> specialPointerTypes = { "Display", "IDirectFB", "wl_display", "xcb_connection_t", "_screen_window" }; const std::set<std::string> specialPointerTypes = { "Display", "IDirectFB", "wl_display", "xcb_connection_t", "_screen_window" };
// //
@ -1263,9 +1263,11 @@ bool VulkanHppGenerator::allVectorSizesSupported( std::vector<ParamData> const &
{ {
return std::find_if_not( vectorParams.begin(), return std::find_if_not( vectorParams.begin(),
vectorParams.end(), vectorParams.end(),
[&params]( std::pair<size_t, size_t> const & vpi ) { [&params]( std::pair<size_t, size_t> const & vpi )
{
return params[vpi.second].type.isValue() && return params[vpi.second].type.isValue() &&
( ( params[vpi.second].type.type == "uint32_t" ) || ( params[vpi.second].type.type == "VkDeviceSize" ) ); ( ( params[vpi.second].type.type == "uint32_t" ) || ( params[vpi.second].type.type == "VkDeviceSize" ) ||
( params[vpi.second].type.type == "VkSampleCountFlagBits" ) );
} ) == vectorParams.end(); } ) == vectorParams.end();
} }
@ -2163,12 +2165,23 @@ std::map<size_t, size_t> VulkanHppGenerator::determineVectorParams( std::vector<
{ {
if ( !params[i].len.empty() ) if ( !params[i].len.empty() )
{ {
std::string len;
if ( altLens.find( params[i].len ) != altLens.end() )
{
check( params[i].len == "(samples + 31) / 32", params[i].xmlLine, "unknown command parameter len <" + params[i].len + ">" );
len = "samples";
}
else
{
len = params[i].len;
}
for ( size_t j = 0; j < i; j++ ) for ( size_t j = 0; j < i; j++ )
{ {
if ( ( params[j].name == params[i].len ) || isLenByStructMember( params[i].len, params[j] ) ) if ( ( params[j].name == len ) || isLenByStructMember( len, params[j] ) )
{ {
// add this parameter as a vector parameter, using the len-name parameter as the second value // add this parameter as a vector parameter, using the len-name parameter as the second value
vectorParams.insert( std::make_pair( i, j ) ); vectorParams.insert( std::make_pair( i, j ) );
break;
} }
} }
} }
@ -5035,7 +5048,7 @@ std::string
} }
else if ( allVectorSizesSupported( commandData.params, vectorParams ) ) else if ( allVectorSizesSupported( commandData.params, vectorParams ) )
{ {
// All the vectorParams have a counter by value, of type "uint32_t" or "VkDeviceSize" // All the vectorParams have a counter by value, of type "uint32_t", "VkDeviceSize", or "VkSampleCountFlagBits" (!)
return generateCommandSetStandardEnhanced( definition, return generateCommandSetStandardEnhanced( definition,
generateCommandStandard( name, commandData, initialSkipCount, definition ), generateCommandStandard( name, commandData, initialSkipCount, definition ),
generateCommandSingle( name, commandData, initialSkipCount, definition, vectorParams ) ); generateCommandSingle( name, commandData, initialSkipCount, definition, vectorParams ) );
@ -11567,22 +11580,35 @@ VulkanHppGenerator::ParamData VulkanHppGenerator::readCommandsCommandParam( tiny
{ {
int line = element->GetLineNum(); int line = element->GetLineNum();
std::map<std::string, std::string> attributes = getAttributes( element ); std::map<std::string, std::string> attributes = getAttributes( element );
checkAttributes( checkAttributes( line,
line,
attributes, attributes,
{}, {},
{ { "externsync", {} }, { "len", {} }, { "noautovalidity", { "true" } }, { "objecttype", { "objectType" } }, { "optional", { "false", "true" } } } ); { { "altlen", {} },
{ "externsync", {} },
{ "len", {} },
{ "noautovalidity", { "true" } },
{ "objecttype", { "objectType" } },
{ "optional", { "false", "true" } } } );
ParamData paramData( line ); ParamData paramData( line );
for ( auto attribute : attributes ) for ( auto attribute : attributes )
{ {
if ( attribute.first == "len" ) if ( attribute.first == "altlen" )
{
assert( paramData.len.empty() );
paramData.len = attribute.second;
check( altLens.find( paramData.len ) != altLens.end(), line, "member attribute <altlen> holds unknown value <" + paramData.len + ">" );
}
else if ( attribute.first == "len" )
{
if ( paramData.len.empty() )
{ {
paramData.len = attribute.second; paramData.len = attribute.second;
check( ( paramData.len == "null-terminated" ) || isParam( paramData.len, params ) || isLenByStructMember( paramData.len, params ), check( ( paramData.len == "null-terminated" ) || isParam( paramData.len, params ) || isLenByStructMember( paramData.len, params ),
line, line,
"command param len <" + paramData.len + "> is not recognized as a valid len value" ); "command param len <" + paramData.len + "> is not recognized as a valid len value" );
} }
}
else if ( attribute.first == "optional" ) else if ( attribute.first == "optional" )
{ {
paramData.optional = ( attribute.second == "true" ); paramData.optional = ( attribute.second == "true" );
@ -12822,8 +12848,7 @@ void VulkanHppGenerator::readSPIRVCapabilitiesSPIRVCapabilityEnableProperty( int
} }
if ( attribute.first == "requires" ) if ( attribute.first == "requires" )
{ {
std::vector<std::string> std::vector<std::string> requires = tokenize( attribute.second, "," );
requires = tokenize( attribute.second, "," );
for ( auto const & r : requires ) for ( auto const & r : requires )
{ {
check( ( m_features.find( r ) != m_features.end() ) || ( m_extensions.find( r ) != m_extensions.end() ), check( ( m_features.find( r ) != m_features.end() ) || ( m_extensions.find( r ) != m_extensions.end() ),
@ -12871,8 +12896,7 @@ void VulkanHppGenerator::readSPIRVCapabilitiesSPIRVCapabilityEnableStruct( int x
{ {
if ( attribute.first == "requires" ) if ( attribute.first == "requires" )
{ {
std::vector<std::string> std::vector<std::string> requires = tokenize( attribute.second, "," );
requires = tokenize( attribute.second, "," );
for ( auto const & r : requires ) for ( auto const & r : requires )
{ {
check( ( m_features.find( r ) != m_features.end() ) || ( m_extensions.find( r ) != m_extensions.end() ), check( ( m_features.find( r ) != m_features.end() ) || ( m_extensions.find( r ) != m_extensions.end() ),
@ -13618,7 +13642,7 @@ void VulkanHppGenerator::readTypesTypeStructMember( tinyxml2::XMLElement const *
check( memberData.len.size() == 1, line, "member attribute <altlen> holds unknown number of data: " + std::to_string( memberData.len.size() ) ); check( memberData.len.size() == 1, line, "member attribute <altlen> holds unknown number of data: " + std::to_string( memberData.len.size() ) );
check( altLens.find( memberData.len[0] ) != altLens.end(), line, "member attribute <altlen> holds unknown value <" + memberData.len[0] + ">" ); check( altLens.find( memberData.len[0] ) != altLens.end(), line, "member attribute <altlen> holds unknown value <" + memberData.len[0] + ">" );
} }
if ( attribute.first == "len" ) else if ( attribute.first == "len" )
{ {
if ( memberData.len.empty() ) if ( memberData.len.empty() )
{ {