1 // Copyright(c) 2015-2019, NVIDIA CORPORATION. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #pragma once
16
17 #include <iostream>
18 #include <map>
19 #include <set>
20 #include <tinyxml2.h>
21 #include <vector>
22
23 const size_t INVALID_INDEX = (size_t)~0;
24
25 template <typename BitType>
26 class Flags
27 {
28 public:
29 using MaskType = typename std::underlying_type<BitType>::type;
30
Flags()31 constexpr Flags() noexcept : m_mask( 0 ) {}
32
Flags(BitType bit)33 constexpr Flags( BitType bit ) noexcept : m_mask( static_cast<MaskType>( bit ) ) {}
34
Flags(MaskType flags)35 constexpr explicit Flags( MaskType flags ) noexcept : m_mask( flags ) {}
36
operator !() const37 constexpr bool operator!() const noexcept
38 {
39 return !m_mask;
40 }
41
operator &(BitType const & rhs) const42 constexpr bool operator&( BitType const & rhs ) const noexcept
43 {
44 return m_mask & static_cast<MaskType>( rhs );
45 }
46
operator &(Flags<BitType> const & rhs) const47 constexpr Flags<BitType> operator&( Flags<BitType> const & rhs ) const noexcept
48 {
49 return Flags<BitType>( m_mask & rhs.m_mask );
50 }
51
operator |(Flags<BitType> const & rhs) const52 constexpr Flags<BitType> operator|( Flags<BitType> const & rhs ) const noexcept
53 {
54 return Flags<BitType>( m_mask | rhs.m_mask );
55 }
56
57 private:
58 MaskType m_mask;
59 };
60
61 enum class CommandFlavourFlagBits : uint8_t
62 {
63 chained = 1 << 0,
64 singular = 1 << 1,
65 unique = 1 << 2,
66 withAllocator = 1 << 3
67 };
68 using CommandFlavourFlags = Flags<CommandFlavourFlagBits>;
69
operator |(CommandFlavourFlagBits const & lhs,CommandFlavourFlagBits const & rhs)70 constexpr CommandFlavourFlags operator|( CommandFlavourFlagBits const & lhs, CommandFlavourFlagBits const & rhs ) noexcept
71 {
72 return CommandFlavourFlags( lhs ) | CommandFlavourFlags( rhs );
73 }
74
75 class VulkanHppGenerator
76 {
77 public:
78 VulkanHppGenerator( tinyxml2::XMLDocument const & document );
79
80 void generateVulkanEnumsHppFile() const;
81 void generateVulkanFormatTraitsHppFile() const;
82 void generateVulkanFuncsHppFile() const;
83 void generateVulkanHandlesHppFile() const;
84 void generateVulkanHashHppFile() const;
85 void generateVulkanHppFile() const;
86 void generateVulkanRAIIHppFile() const;
87 void generateVulkanStaticAssertionsHppFile() const;
88 void generateVulkanStructsHppFile() const;
89 void generateVulkanToStringHppFile() const;
90 void prepareRAIIHandles();
91 void prepareVulkanFuncs();
92
93 private:
94 struct TypeInfo
95 {
96 std::string compose( std::string const & nameSpace ) const;
97
operator ==VulkanHppGenerator::TypeInfo98 bool operator==( TypeInfo const & rhs ) const
99 {
100 return ( prefix == rhs.prefix ) && ( type == rhs.type ) && ( postfix == rhs.postfix );
101 }
102
operator !=VulkanHppGenerator::TypeInfo103 bool operator!=( TypeInfo const & rhs ) const
104 {
105 return !operator==( rhs );
106 }
107
operator <VulkanHppGenerator::TypeInfo108 bool operator<( TypeInfo const & rhs ) const
109 {
110 return ( prefix < rhs.prefix ) || ( ( prefix == rhs.prefix ) && ( ( type < rhs.type ) || ( ( type == rhs.type ) && ( postfix < rhs.postfix ) ) ) );
111 }
112
isConstPointerVulkanHppGenerator::TypeInfo113 bool isConstPointer() const
114 {
115 return ( prefix.find( "const" ) != std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
116 }
117
isNonConstPointerVulkanHppGenerator::TypeInfo118 bool isNonConstPointer() const
119 {
120 return ( prefix.find( "const" ) == std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
121 }
122
isValueVulkanHppGenerator::TypeInfo123 bool isValue() const
124 {
125 return ( ( prefix.find( '*' ) == std::string::npos ) && ( postfix.find( '*' ) == std::string::npos ) );
126 }
127
128 std::string prefix;
129 std::string type;
130 std::string postfix;
131 };
132
133 struct BaseTypeData
134 {
BaseTypeDataVulkanHppGenerator::BaseTypeData135 BaseTypeData( TypeInfo const & typeInfo_, int line ) : typeInfo( typeInfo_ ), xmlLine( line ) {}
136
137 TypeInfo typeInfo;
138 int xmlLine;
139 };
140
141 struct BitmaskData
142 {
BitmaskDataVulkanHppGenerator::BitmaskData143 BitmaskData( std::string const & r, std::string const & t, int line ) : requirements( r ), type( t ), xmlLine( line ) {}
144
145 std::string requirements;
146 std::string type;
147 std::string alias;
148 int xmlLine;
149 };
150
151 struct NameData
152 {
153 std::string name;
154 std::vector<std::string> arraySizes;
155 };
156
157 struct ParamData
158 {
ParamDataVulkanHppGenerator::ParamData159 ParamData( int line ) : optional( false ), xmlLine( line ) {}
160
161 TypeInfo type;
162 std::string name;
163 std::vector<std::string> arraySizes;
164 std::string len;
165 bool optional;
166 std::string stride;
167 int xmlLine;
168 };
169
170 struct CommandData
171 {
CommandDataVulkanHppGenerator::CommandData172 CommandData( int line ) : xmlLine( line ) {}
173
174 std::string alias;
175 std::vector<std::string> errorCodes;
176 std::string handle;
177 std::vector<ParamData> params;
178 std::string referencedIn;
179 std::string returnType;
180 std::vector<std::string> successCodes;
181 int xmlLine;
182 };
183
184 struct DefineData
185 {
DefineDataVulkanHppGenerator::DefineData186 DefineData( std::string const & require_, int line ) : require( require_ ), xmlLine( line ) {}
187
188 std::string require;
189 int xmlLine;
190 };
191
192 struct EnumAliasData
193 {
EnumAliasDataVulkanHppGenerator::EnumAliasData194 EnumAliasData( std::string const & name_, int line ) : name( name_ ), xmlLine( line ) {}
195
196 std::string name;
197 int xmlLine;
198 };
199
200 struct EnumValueData
201 {
EnumValueDataVulkanHppGenerator::EnumValueData202 EnumValueData( int line, std::string const & name_, std::string const & protect_, std::string const & extension_, bool singleBit_ )
203 : name( name_ ), extension( extension_ ), protect( protect_ ), singleBit( singleBit_ ), xmlLine( line )
204 {
205 }
206
207 std::string name;
208 std::string extension;
209 std::string protect;
210 bool singleBit;
211 int xmlLine;
212 };
213
214 struct EnumData
215 {
216 void addEnumAlias( int line, std::string const & name, std::string const & alias );
217 void addEnumValue( int line, std::string const & valueName, std::string const & protect, bool bitpos, std::string const & extension );
218
219 std::string alias = {}; // alias for this enum
220 std::map<std::string, EnumAliasData> aliases = {}; // aliases for the values
221 std::string bitwidth = {};
222 bool isBitmask = false;
223 std::vector<EnumValueData> values = {};
224 int xmlLine = 0;
225 };
226
227 struct RequireData
228 {
229 RequireData( int line, std::vector<std::string> const & depends_ );
230
231 std::vector<std::string> depends;
232 std::vector<std::string> commands;
233 std::vector<std::string> types;
234 int xmlLine;
235 };
236
237 struct FeatureData
238 {
FeatureDataVulkanHppGenerator::FeatureData239 FeatureData( std::string const & number_ ) : number( number_ ) {}
240
241 std::string number;
242 std::vector<RequireData> requireData;
243 };
244
245 struct ExtensionData
246 {
ExtensionDataVulkanHppGenerator::ExtensionData247 ExtensionData( int line,
248 std::string const & deprecatedBy_,
249 std::string const & number_,
250 std::string const & obsoletedBy_,
251 std::string const & platform_,
252 std::string const & promotedTo_ )
253 : deprecatedBy( deprecatedBy_ ), number( number_ ), obsoletedBy( obsoletedBy_ ), platform( platform_ ), promotedTo( promotedTo_ ), xmlLine( line )
254 {
255 }
256
257 std::string deprecatedBy;
258 std::string number;
259 std::string obsoletedBy;
260 std::string platform;
261 std::string promotedTo;
262 std::set<std::string> depends;
263 std::vector<RequireData> requireData;
264 int xmlLine;
265 };
266
267 struct SkippedExtensionData
268 {
SkippedExtensionDataVulkanHppGenerator::SkippedExtensionData269 SkippedExtensionData( int line, std::string const & platform_ ) : platform( platform_ ), xmlLine( line ) {}
270
271 std::string platform;
272 int xmlLine;
273 };
274
275 struct ComponentData
276 {
ComponentDataVulkanHppGenerator::ComponentData277 ComponentData( int line ) : xmlLine( line ) {}
278
279 std::string bits;
280 std::string name;
281 std::string numericFormat;
282 std::string planeIndex;
283 int xmlLine;
284 };
285
286 struct PlaneData
287 {
PlaneDataVulkanHppGenerator::PlaneData288 PlaneData( int line ) : xmlLine( line ) {}
289
290 std::string compatible;
291 std::string heightDivisor;
292 std::string widthDivisor;
293 int xmlLine;
294 };
295
296 struct FormatData
297 {
FormatDataVulkanHppGenerator::FormatData298 FormatData( int line ) : xmlLine( line ) {}
299
300 std::string blockExtent;
301 std::string blockSize;
302 std::string chroma;
303 std::string classAttribute;
304 std::vector<ComponentData> components;
305 std::string compressed;
306 std::string packed;
307 std::vector<PlaneData> planes;
308 std::string spirvImageFormat;
309 std::string texelsPerBlock;
310 int xmlLine;
311 };
312
313 struct FuncPointerArgumentData
314 {
FuncPointerArgumentDataVulkanHppGenerator::FuncPointerArgumentData315 FuncPointerArgumentData( std::string const & t, int line ) : type( t ), xmlLine( line ) {}
316
317 std::string type;
318 int xmlLine;
319 };
320
321 struct FuncPointerData
322 {
FuncPointerDataVulkanHppGenerator::FuncPointerData323 FuncPointerData( std::string const & r, int line ) : requirements( r ), xmlLine( line ) {}
324
325 std::vector<FuncPointerArgumentData> arguments;
326 std::string requirements;
327 int xmlLine;
328 };
329
330 struct HandleData
331 {
HandleDataVulkanHppGenerator::HandleData332 HandleData( std::string const & p, std::string const & objType, bool isDispatchable, int line )
333 : objTypeEnum( objType ), parent( p ), isDispatchable( isDispatchable ), xmlLine( line )
334 {
335 }
336
337 std::string alias;
338 std::set<std::string> childrenHandles;
339 std::set<std::string> commands;
340 std::string deleteCommand;
341 std::string deletePool;
342 std::string objTypeEnum;
343 std::string parent;
344 std::set<std::string> secondLevelCommands;
345 bool isDispatchable;
346 int xmlLine;
347
348 // RAII data
349 std::map<std::string, CommandData>::const_iterator destructorIt;
350 std::vector<std::map<std::string, CommandData>::const_iterator> constructorIts;
351 };
352
353 struct MemberData
354 {
MemberDataVulkanHppGenerator::MemberData355 MemberData( int line ) : xmlLine( line ) {}
356
357 TypeInfo type;
358 std::string name;
359 std::vector<std::string> arraySizes;
360 std::string bitCount;
361 std::vector<std::string> len;
362 bool noAutoValidity = false;
363 std::vector<bool> optional;
364 std::vector<std::string> selection;
365 std::string selector;
366 std::string value;
367 std::string usedConstant;
368 int xmlLine;
369 };
370
371 struct PlatformData
372 {
PlatformDataVulkanHppGenerator::PlatformData373 PlatformData( std::string const & protect_ ) : protect( protect_ ) {}
374
375 std::string protect;
376 };
377
378 struct StructureAliasData
379 {
StructureAliasDataVulkanHppGenerator::StructureAliasData380 StructureAliasData( std::string const & alias_, int line ) : alias( alias_ ), xmlLine( line ) {}
381
382 std::string alias;
383 int xmlLine;
384 };
385
386 struct StructureData
387 {
StructureDataVulkanHppGenerator::StructureData388 StructureData( std::vector<std::string> const & extends, int line ) : structExtends( extends ), xmlLine( line ) {}
389
390 bool allowDuplicate = false;
391 bool isUnion = false;
392 bool returnedOnly = false;
393 bool mutualExclusiveLens = false;
394 std::vector<MemberData> members;
395 std::vector<std::string> structExtends;
396 std::string subStruct;
397 int xmlLine;
398 };
399
400 enum class TypeCategory
401 {
402 Bitmask,
403 BaseType,
404 Define,
405 Enum,
406 FuncPointer,
407 Handle,
408 Requires,
409 Struct,
410 Union,
411 Unknown
412 };
413
414 struct TypeData
415 {
416 TypeCategory category = TypeCategory::Unknown;
417 std::string referencedIn = {};
418 };
419
420 struct VectorParamData
421 {
422 size_t lenParam = INVALID_INDEX;
423 size_t strideParam = INVALID_INDEX;
424 };
425
426 private:
427 void addCommand( std::string const & name, CommandData & commandData );
428 void addMissingFlagBits( std::vector<RequireData> & requireData, std::string const & referencedIn );
429 std::string addTitleAndProtection( std::string const & title, std::string const & strIf, std::string const & strElse = {} ) const;
430 bool allVectorSizesSupported( std::vector<ParamData> const & params, std::map<size_t, VectorParamData> const & vectorParams ) const;
431 void appendDispatchLoaderDynamicCommands( std::vector<RequireData> const & requireData,
432 std::set<std::string> & listedCommands,
433 std::string const & title,
434 std::string & commandMembers,
435 std::string & initialCommandAssignments,
436 std::string & instanceCommandAssignments,
437 std::string & deviceCommandAssignments ) const;
438 void appendRAIIDispatcherCommands( std::vector<RequireData> const & requireData,
439 std::set<std::string> & listedCommands,
440 std::string const & title,
441 std::string & contextInitializers,
442 std::string & contextMembers,
443 std::string & deviceAssignments,
444 std::string & deviceMembers,
445 std::string & instanceAssignments,
446 std::string & instanceMembers ) const;
447 void checkBitmaskCorrectness() const;
448 void checkCommandCorrectness() const;
449 void checkCorrectness() const;
450 void checkDefineCorrectness() const;
451 void checkEnumCorrectness() const;
452 void checkEnumCorrectness( std::vector<RequireData> const & requireData ) const;
453 bool checkEquivalentSingularConstructor( std::vector<std::map<std::string, CommandData>::const_iterator> const & constructorIts,
454 std::map<std::string, CommandData>::const_iterator constructorIt,
455 std::vector<ParamData>::const_iterator lenIt ) const;
456 void checkExtensionCorrectness() const;
457 void checkFuncPointerCorrectness() const;
458 void checkHandleCorrectness() const;
459 void checkStructCorrectness() const;
460 void checkStructMemberCorrectness( std::string const & structureName, std::vector<MemberData> const & members, std::set<std::string> & sTypeValues ) const;
461 std::string combineDataTypes( std::map<size_t, VectorParamData> const & vectorParams,
462 std::vector<size_t> const & returnParams,
463 bool enumerating,
464 std::vector<std::string> const & dataTypes,
465 CommandFlavourFlags flavourFlags,
466 bool raii ) const;
467 bool containsArray( std::string const & type ) const;
468 bool containsFuncPointer( std::string const & type ) const;
469 bool containsFloatingPoints( std::vector<MemberData> const & members ) const;
470 bool containsUnion( std::string const & type ) const;
471 std::vector<size_t> determineConstPointerParams( std::vector<ParamData> const & params ) const;
472 std::vector<std::string> determineDataTypes( std::vector<VulkanHppGenerator::ParamData> const & params,
473 std::map<size_t, VectorParamData> const & vectorParams,
474 std::vector<size_t> const & returnParams,
475 std::set<size_t> const & templatedParams ) const;
476 size_t determineDefaultStartIndex( std::vector<ParamData> const & params, std::set<size_t> const & skippedParams ) const;
477 bool determineEnumeration( std::map<size_t, VectorParamData> const & vectorParams, std::vector<size_t> const & returnParams ) const;
478 size_t determineInitialSkipCount( std::string const & command ) const;
479 std::vector<size_t> determineReturnParams( std::vector<ParamData> const & params ) const;
480 std::vector<std::map<std::string, CommandData>::const_iterator>
481 determineRAIIHandleConstructors( std::string const & handleType, std::map<std::string, CommandData>::const_iterator destructorIt ) const;
482 std::map<std::string, CommandData>::const_iterator determineRAIIHandleDestructor( std::string const & handleType ) const;
483 std::set<size_t> determineSingularParams( size_t returnParam, std::map<size_t, VectorParamData> const & vectorParams ) const;
484 std::set<size_t> determineSkippedParams( std::vector<ParamData> const & params,
485 size_t initialSkipCount,
486 std::map<size_t, VectorParamData> const & vectorParams,
487 std::vector<size_t> const & returnParam,
488 bool singular ) const;
489 std::string determineSubStruct( std::pair<std::string, StructureData> const & structure ) const;
490 std::map<size_t, VectorParamData> determineVectorParams( std::vector<ParamData> const & params ) const;
491 std::set<size_t> determineVoidPointerParams( std::vector<ParamData> const & params ) const;
492 void distributeSecondLevelCommands( std::set<std::string> const & specialFunctions );
493 std::string findBaseName( std::string aliasName, std::map<std::string, EnumAliasData> const & aliases ) const;
494 std::vector<MemberData>::const_iterator findStructMemberIt( std::string const & name, std::vector<MemberData> const & memberData ) const;
495 std::vector<MemberData>::const_iterator findStructMemberItByType( std::string const & type, std::vector<MemberData> const & memberData ) const;
496 std::pair<std::string, std::string> generateAllocatorTemplates( std::vector<size_t> const & returnParams,
497 std::vector<std::string> const & returnDataTypes,
498 std::map<size_t, VectorParamData> const & vectorParams,
499 CommandFlavourFlags flavourFlags,
500 bool definition ) const;
501 std::string generateArgumentListEnhanced( std::vector<ParamData> const & params,
502 std::vector<size_t> const & returnParams,
503 std::map<size_t, VectorParamData> const & vectorParams,
504 std::set<size_t> const & skippedParams,
505 std::set<size_t> const & singularParams,
506 std::set<size_t> const & templatedParams,
507 bool definition,
508 CommandFlavourFlags flavourFlags,
509 bool withDispatcher ) const;
510 std::string generateArgumentListStandard( std::vector<ParamData> const & params, std::set<size_t> const & skippedParams ) const;
511 std::string generateArgumentTemplates( std::vector<ParamData> const & params,
512 std::vector<size_t> const & returnParams,
513 std::map<size_t, VectorParamData> const & vectorParams,
514 std::set<size_t> const & templatedParams,
515 CommandFlavourFlags flavourFlags,
516 bool raii ) const;
517 std::string generateBaseTypes() const;
518 std::string generateBitmask( std::map<std::string, BitmaskData>::const_iterator bitmaskIt, std::string const & surroundingProtect ) const;
519 std::string generateBitmasksToString() const;
520 std::string generateBitmasksToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedBitmasks, std::string const & title ) const;
521 std::string generateBitmaskToString( std::map<std::string, BitmaskData>::const_iterator bitmaskIt ) const;
522 std::string generateCallArgumentsEnhanced( CommandData const & commandData,
523 size_t initialSkipCount,
524 bool nonConstPointerAsNullptr,
525 std::set<size_t> const & singularParams,
526 std::set<size_t> const & templatedParams,
527 bool raiiHandleMemberFunction ) const;
528 std::string generateCallArgumentsRAIIFactory( std::vector<ParamData> const & params,
529 size_t initialSkipCount,
530 std::set<size_t> const & skippedParams,
531 std::set<size_t> const & singularParams ) const;
532 std::string generateCallArgumentsStandard( std::string const & handle, std::vector<ParamData> const & params ) const;
533 std::string generateCallArgumentEnhanced( std::vector<ParamData> const & params,
534 size_t paramIndex,
535 bool nonConstPointerAsNullptr,
536 std::set<size_t> const & singularParams,
537 std::set<size_t> const & templatedParams ) const;
538 std::string generateCallArgumentEnhancedConstPointer( ParamData const & param,
539 size_t paramIndex,
540 std::set<size_t> const & singularParams,
541 std::set<size_t> const & templatedParams ) const;
542 std::string generateCallArgumentEnhancedNonConstPointer( ParamData const & param,
543 size_t paramIndex,
544 bool nonConstPointerAsNullptr,
545 std::set<size_t> const & singularParams ) const;
546 std::string generateCallArgumentEnhancedValue( std::vector<ParamData> const & params, size_t paramIndex, std::set<size_t> const & singularParams ) const;
547 std::string generateCallSequence( std::string const & name,
548 CommandData const & commandData,
549 std::vector<size_t> const & returnParams,
550 std::map<size_t, VectorParamData> const & vectorParams,
551 size_t initialSkipCount,
552 std::set<size_t> const & singularParams,
553 std::set<size_t> const & templatedParams,
554 CommandFlavourFlags flavourFlags,
555 bool raii ) const;
556 std::string generateChainTemplates( std::vector<size_t> const & returnParams, bool chained ) const;
557 std::string generateCommand( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
558 std::string generateCommandDefinitions() const;
559 std::string
560 generateCommandDefinitions( std::vector<RequireData> const & requireData, std::set<std::string> & listedCommands, std::string const & title ) const;
561 std::string generateCommandDefinitions( std::string const & command, std::string const & handle ) const;
562 std::string generateCommandEnhanced( std::string const & name,
563 CommandData const & commandData,
564 size_t initialSkipCount,
565 bool definition,
566 std::map<size_t, VectorParamData> const & vectorParams,
567 std::vector<size_t> const & returnParams,
568 CommandFlavourFlags flavourFlags = {} ) const;
569 std::string generateCommandName( std::string const & vulkanCommandName,
570 std::vector<ParamData> const & params,
571 size_t initialSkipCount,
572 std::set<std::string> const & tags,
573 CommandFlavourFlags flavourFlags = {} ) const;
574 std::string
575 generateCommandResultMultiSuccessNoErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
576 std::string generateCommandResultMultiSuccessNoErrors0Return( std::string const & name,
577 CommandData const & commandData,
578 size_t initialSkipCount,
579 bool definition ) const;
580 std::string generateCommandResultMultiSuccessNoErrors2Return(
581 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParams ) const;
582 std::string
583 generateCommandResultMultiSuccessWithErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
584 std::string generateCommandResultMultiSuccessWithErrors1Return(
585 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
586 std::string generateCommandResultMultiSuccessWithErrors2Return(
587 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
588 std::string generateCommandResultMultiSuccessWithErrors3Return(
589 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
590 std::string
591 generateCommandResultSingleSuccessNoErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
592 std::string
593 generateCommandResultSingleSuccessWithErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
594 std::string generateCommandResultSingleSuccessWithErrors1Return(
595 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
596 std::string generateCommandResultSingleSuccessWithErrors1ReturnChain(
597 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
598 std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle(
599 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
600 std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle1Vector( std::string const & name,
601 CommandData const & commandData,
602 size_t initialSkipCount,
603 bool definition,
604 size_t returnParam,
605 std::pair<size_t, VectorParamData> const & vectorParamIndex ) const;
606 std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle2Vector( std::string const & name,
607 CommandData const & commandData,
608 size_t initialSkipCount,
609 bool definition,
610 size_t returnParam,
611 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
612 std::string generateCommandResultSingleSuccessWithErrors1ReturnValue(
613 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
614 std::string generateCommandResultSingleSuccessWithErrors1ReturnValue2Vectors( std::string const & name,
615 CommandData const & commandData,
616 size_t initialSkipCount,
617 bool definition,
618 size_t returnParam,
619 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
620 std::string generateCommandResultSingleSuccessWithErrors1ReturnVoid(
621 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
622 std::string generateCommandResultSingleSuccessWithErrors2Return(
623 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
624 std::string
625 generateCommandResultWithErrors0Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
626 std::string generateCommandSet( bool definition,
627 std::string const & standard,
628 std::vector<std::string> const & enhanced = {},
629 std::vector<std::string> const & unique = {} ) const;
630 std::string generateCommandSet( std::string const & standard, std::string const & enhanced ) const;
631 std::string generateCommandStandard( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
632 std::string generateCommandValue( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
633 std::string generateCommandVoid0Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
634 std::string
635 generateCommandVoid1Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
636 std::string generateCommandVoid2Return(
637 std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
638 std::string generateConstexprString( std::string const & structName ) const;
639 std::string generateDataDeclarations( CommandData const & commandData,
640 std::vector<size_t> const & returnParams,
641 std::map<size_t, VectorParamData> const & vectorParams,
642 std::set<size_t> const & templatedParams,
643 CommandFlavourFlags flavourFlags,
644 bool raii,
645 std::vector<std::string> const & dataTypes,
646 std::string const & dataType,
647 std::string const & returnType,
648 std::string const & returnVariable ) const;
649 std::string generateDataDeclarations1Return( CommandData const & commandData,
650 std::vector<size_t> const & returnParams,
651 std::map<size_t, VectorParamData> const & vectorParams,
652 std::set<size_t> const & templatedParams,
653 CommandFlavourFlags flavourFlags,
654 std::vector<std::string> const & dataTypes,
655 std::string const & dataType,
656 std::string const & returnType,
657 std::string const & returnVariable ) const;
658 std::string generateDataDeclarations2Returns( CommandData const & commandData,
659 std::vector<size_t> const & returnParams,
660 std::map<size_t, VectorParamData> const & vectorParams,
661 CommandFlavourFlags flavourFlags,
662 bool raii,
663 std::vector<std::string> const & dataTypes,
664 std::string const & dataType,
665 std::string const & returnVariable ) const;
666 std::string generateDataDeclarations3Returns( CommandData const & commandData,
667 std::vector<size_t> const & returnParams,
668 CommandFlavourFlags flavourFlags,
669 bool raii,
670 std::vector<std::string> const & dataTypes ) const;
671 std::string generateDataPreparation( CommandData const & commandData,
672 size_t initialSkipCount,
673 std::vector<size_t> const & returnParams,
674 std::map<size_t, VectorParamData> const & vectorParams,
675 std::set<size_t> const & templatedParams,
676 CommandFlavourFlags flavourFlags,
677 bool enumerating ) const;
678 std::string generateDataSizeChecks( CommandData const & commandData,
679 std::vector<size_t> const & returnParams,
680 std::vector<std::string> const & returnParamTypes,
681 std::map<size_t, VectorParamData> const & vectorParams,
682 std::set<size_t> const & templatedParams,
683 bool singular ) const;
684 std::string generateDispatchLoaderDynamic() const; // uses vkGet*ProcAddress to get function pointers
685 std::string generateDispatchLoaderStatic() const; // uses exported symbols from loader
686 std::string generateDestroyCommand( std::string const & name, CommandData const & commandData ) const;
687 std::string
688 generateDispatchLoaderDynamicCommandAssignment( std::string const & commandName, CommandData const & commandData, std::string const & firstArg ) const;
689 std::string generateDispatchLoaderStaticCommands( std::vector<RequireData> const & requireData,
690 std::set<std::string> & listedCommands,
691 std::string const & title ) const;
692 std::string generateEnum( std::pair<std::string, EnumData> const & enumData, std::string const & surroundingProtect ) const;
693 std::string generateEnums() const;
694 std::string generateEnums( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
695 std::string generateEnumsToString() const;
696 std::string generateEnumsToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
697 std::string generateEnumInitializer( TypeInfo const & type,
698 std::vector<std::string> const & arraySizes,
699 std::vector<EnumValueData> const & values,
700 bool bitmask ) const;
701 std::string generateEnumToString( std::pair<std::string, EnumData> const & enumData ) const;
702 std::string generateFailureCheck( std::vector<std::string> const & successCodes ) const;
703 std::string generateFormatTraits() const;
704 std::string generateFunctionPointerCheck( std::string const & function, std::string const & referencedIn ) const;
705 std::string generateHandle( std::pair<std::string, HandleData> const & handle, std::set<std::string> & listedHandles ) const;
706 std::string generateHandleCommandDeclarations( std::set<std::string> const & commands ) const;
707 std::string generateHandleDependencies( std::pair<std::string, HandleData> const & handle, std::set<std::string> & listedHandles ) const;
708 std::string generateHandleEmpty( HandleData const & handleData ) const;
709 std::string generateHandleHashStructures( std::vector<RequireData> const & requireData, std::string const & title ) const;
710 std::string generateHandleHashStructures() const;
711 std::string generateHandles() const;
712 std::string generateIndexTypeTraits() const;
713 std::string
714 generateLenInitializer( std::vector<MemberData>::const_iterator mit,
715 std::map<std::vector<MemberData>::const_iterator, std::vector<std::vector<MemberData>::const_iterator>>::const_iterator litit,
716 bool mutualExclusiveLens ) const;
717 std::string generateName( TypeInfo const & typeInfo ) const;
718 std::string generateNoExcept( std::vector<std::string> const & errorCodes,
719 std::vector<size_t> const & returnParams,
720 std::map<size_t, VectorParamData> const & vectorParams,
721 CommandFlavourFlags flavourFlags,
722 bool vectorSizeCheck,
723 bool raii ) const;
724 std::string generateObjectDeleter( std::string const & commandName, CommandData const & commandData, size_t initialSkipCount, size_t returnParam ) const;
725 std::pair<std::string, std::string> generateProtection( std::string const & protect ) const;
726 std::string generateRAIICommandDefinitions() const;
727 std::string
728 generateRAIICommandDefinitions( std::vector<RequireData> const & requireData, std::set<std::string> & listedCommands, std::string const & title ) const;
729 std::string generateRAIIDispatchers() const;
730 std::string generateRAIIHandle( std::pair<std::string, HandleData> const & handle,
731 std::set<std::string> & listedHandles,
732 std::set<std::string> const & specialFunctions ) const;
733 std::string generateRAIIHandleCommand( std::string const & command, size_t initialSkipCount, bool definition ) const;
734 std::string generateRAIIHandleCommandDeclarations( std::pair<std::string, HandleData> const & handle, std::set<std::string> const & specialFunctions ) const;
735 std::string generateRAIIHandleCommandEnhanced( std::map<std::string, CommandData>::const_iterator commandIt,
736 size_t initialSkipCount,
737 std::vector<size_t> const & returnParams,
738 std::map<size_t, VectorParamData> const & vectorParamIndices,
739 bool definition,
740 CommandFlavourFlags flavourFlags = {} ) const;
741 std::string generateRAIIHandleCommandFactory( std::map<std::string, CommandData>::const_iterator commandIt,
742 size_t initialSkipCount,
743 std::vector<size_t> const & returnParams,
744 std::map<size_t, VectorParamData> const & vectorParams,
745 bool definition,
746 CommandFlavourFlags flavourFlags = {} ) const;
747 std::string generateRAIIHandleCommandFactoryArgumentList( std::vector<ParamData> const & params,
748 std::set<size_t> const & skippedParams,
749 bool definition,
750 bool singular ) const;
751 std::string generateRAIIHandleCommandResult( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
752 std::string generateRAIIHandleCommandResultMultiSuccessNoErrors( std::map<std::string, CommandData>::const_iterator commandIt,
753 size_t initialSkipCount,
754 bool definition ) const;
755 std::string generateRAIIHandleCommandResultMultiSuccessNoErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
756 size_t initialSkipCount,
757 bool definition,
758 std::vector<size_t> const & returnParams ) const;
759 std::string generateRAIIHandleCommandResultMultiSuccessWithErrors( std::map<std::string, CommandData>::const_iterator commandIt,
760 size_t initialSkipCount,
761 bool definition ) const;
762 std::string generateRAIIHandleCommandResultMultiSuccessWithErrors1Return( std::map<std::string, CommandData>::const_iterator commandIt,
763 size_t initialSkipCount,
764 bool definition,
765 size_t returnParam ) const;
766 std::string generateRAIIHandleCommandResultMultiSuccessWithErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
767 size_t initialSkipCount,
768 bool definition,
769 std::vector<size_t> const & returnParamIndices ) const;
770 std::string generateRAIIHandleCommandResultMultiSuccessWithErrors3Return( std::map<std::string, CommandData>::const_iterator commandIt,
771 size_t initialSkipCount,
772 bool definition,
773 std::vector<size_t> const & returnParamIndices ) const;
774 std::string generateRAIIHandleCommandResultSingleSuccessNoErrors( std::map<std::string, CommandData>::const_iterator commandIt,
775 size_t initialSkipCount,
776 bool definition ) const;
777 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors( std::map<std::string, CommandData>::const_iterator commandIt,
778 size_t initialSkipCount,
779 bool definition ) const;
780 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1Return( std::map<std::string, CommandData>::const_iterator commandIt,
781 size_t initialSkipCount,
782 bool definition,
783 size_t returnParam ) const;
784 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnChain( std::map<std::string, CommandData>::const_iterator commandIt,
785 size_t initialSkipCount,
786 bool definition,
787 size_t returnParam ) const;
788 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnHandle( std::map<std::string, CommandData>::const_iterator commandIt,
789 size_t initialSkipCount,
790 bool definition,
791 size_t returnParam ) const;
792 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnValue( std::map<std::string, CommandData>::const_iterator commandIt,
793 size_t initialSkipCount,
794 bool definition,
795 size_t returnParam ) const;
796 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnValue2Vectors( std::map<std::string, CommandData>::const_iterator commandIt,
797 size_t initialSkipCount,
798 bool definition,
799 size_t returnParam,
800 std::map<size_t, VectorParamData> const & vectorParams ) const;
801 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnVoid( std::map<std::string, CommandData>::const_iterator commandIt,
802 size_t initialSkipCount,
803 bool definition,
804 size_t returnParam ) const;
805 std::string generateRAIIHandleCommandResultSingleSuccessWithErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
806 size_t initialSkipCount,
807 bool definition,
808 std::vector<size_t> const & returnParamIndices ) const;
809 std::string generateRAIIHandleCommandValue( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
810 std::string generateRAIIHandleCommandVoid( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
811 std::pair<std::string, std::string> generateRAIIHandleStaticCreate( std::pair<std::string, HandleData> const & handle,
812 std::map<std::string, CommandData>::const_iterator constructorIt,
813 std::string const & enter,
814 std::string const & leave ) const;
815
816 std::pair<std::string, std::string> generateRAIIHandleConstructor( std::pair<std::string, HandleData> const & handle,
817 std::map<std::string, CommandData>::const_iterator constructorIt,
818 std::string const & enter,
819 std::string const & leave ) const;
820 std::pair<std::string, std::string> generateRAIIHandleStaticCreate1Return2Vector( std::pair<std::string, HandleData> const & handle,
821 std::map<std::string, CommandData>::const_iterator constructorIt,
822 std::string const & enter,
823 std::string const & leave,
824 size_t returnParam,
825 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
826 std::pair<std::string, std::string> generateRAIIHandleConstructor1Return2Vector( std::pair<std::string, HandleData> const & handle,
827 std::map<std::string, CommandData>::const_iterator constructorIt,
828 std::string const & enter,
829 std::string const & leave,
830 size_t returnParam,
831 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
832 std::pair<std::string, std::string> generateRAIIHandleStaticCreates( std::pair<std::string, HandleData> const & handle ) const;
833 std::pair<std::string, std::string> generateRAIIHandleConstructors( std::pair<std::string, HandleData> const & handle ) const;
834
835 std::string generateRAIIHandleStaticCreateToConstructorArgument( ParamData const & param,
836 bool singular ) const;
837 std::string generateRAIIHandleStaticCreateToConstructorArguments( std::pair<std::string, HandleData> const & handle,
838 std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt ) const;
839
840 std::string generateRAIIHandleConstructorArgument( ParamData const & param, bool definition, bool singular, bool takesOwnership ) const;
841 std::string generateRAIIHandleConstructorArguments( std::pair<std::string, HandleData> const & handle,
842 std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt,
843 bool singular,
844 bool takesOwnership ) const;
845 std::string generateRAIIHandleConstructorCallArguments( std::pair<std::string, HandleData> const & handle,
846 std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt,
847 bool nonConstPointerAsNullptr,
848 std::set<size_t> const & singularParams,
849 bool allocatorIsMemberVariable,
850 bool handleParamsAreMembers ) const;
851 std::string generateRAIIHandleStaticCreateEnumerate( std::pair<std::string, HandleData> const & handle,
852 std::map<std::string, CommandData>::const_iterator constructorIt,
853 std::vector<ParamData>::const_iterator handleParamIt,
854 std::vector<ParamData>::const_iterator lenParamIt,
855 std::string const & enter,
856 std::string const & leave ) const;
857 std::string generateRAIIHandleConstructorEnumerate( std::pair<std::string, HandleData> const & handle,
858 std::map<std::string, CommandData>::const_iterator constructorIt,
859 std::vector<ParamData>::const_iterator handleParamIt,
860 std::vector<ParamData>::const_iterator lenParamIt,
861 std::string const & enter,
862 std::string const & leave ) const;
863 std::string generateRAIIHandleConstructorInitializationList( std::pair<std::string, HandleData> const & handle,
864 std::map<std::string, CommandData>::const_iterator constructorIt,
865 std::map<std::string, CommandData>::const_iterator destructorIt,
866 bool takesOwnership ) const;
867 std::string generateRAIIHandleConstructorParamName( std::string const & type, std::map<std::string, CommandData>::const_iterator destructorIt ) const;
868 std::pair<std::string, std::string> generateRAIIHandleStaticCreateResult( std::pair<std::string, HandleData> const & handle,
869 std::map<std::string, CommandData>::const_iterator constructorIt,
870 std::string const & enter,
871 std::string const & leave ) const;
872 std::pair<std::string, std::string> generateRAIIHandleConstructorResult( std::pair<std::string, HandleData> const & handle,
873 std::map<std::string, CommandData>::const_iterator constructorIt,
874 std::string const & enter,
875 std::string const & leave ) const;
876 std::string generateRAIIHandleStaticCreateResultSingleSuccessWithErrors1Return0Vector( std::pair<std::string, HandleData> const & handle,
877 std::map<std::string, CommandData>::const_iterator constructorIt,
878 std::string const & enter,
879 std::string const & leave ) const;
880 std::string generateRAIIHandleConstructorResultSingleSuccessWithErrors1Return0Vector( std::pair<std::string, HandleData> const & handle,
881 std::map<std::string, CommandData>::const_iterator constructorIt,
882 std::string const & enter,
883 std::string const & leave ) const;
884 std::string generateRAIIHandleConstructorTakeOwnership( std::pair<std::string, HandleData> const & handle ) const;
885 std::string generateRAIIHandleStaticCreateVector( std::pair<std::string, HandleData> const & handle,
886 std::map<std::string, CommandData>::const_iterator constructorIt,
887 std::vector<ParamData>::const_iterator handleParamIt,
888 std::string const & enter,
889 std::string const & leave ) const;
890 std::string generateRAIIHandleConstructorVector( std::pair<std::string, HandleData> const & handle,
891 std::map<std::string, CommandData>::const_iterator constructorIt,
892 std::vector<ParamData>::const_iterator handleParamIt,
893 std::string const & enter,
894 std::string const & leave ) const;
895 std::string generateRAIIHandleStaticCreateVectorSingular( std::pair<std::string, HandleData> const & handle,
896 std::map<std::string, CommandData>::const_iterator constructorIt,
897 std::vector<ParamData>::const_iterator handleParamIt,
898 std::string const & enter,
899 std::string const & leave ) const;
900 std::string generateRAIIHandleConstructorVectorSingular( std::pair<std::string, HandleData> const & handle,
901 std::map<std::string, CommandData>::const_iterator constructorIt,
902 std::vector<ParamData>::const_iterator handleParamIt,
903 std::string const & enter,
904 std::string const & leave ) const;
905 std::pair<std::string, std::string> generateRAIIHandleConstructorVoid( std::pair<std::string, HandleData> const & handle,
906 std::map<std::string, CommandData>::const_iterator constructorIt,
907 std::string const & enter,
908 std::string const & leave ) const;
909 std::string generateRAIIHandleConstructorVoid1Return0Vector( std::pair<std::string, HandleData> const & handle,
910 std::map<std::string, CommandData>::const_iterator constructorIt,
911 std::string const & enter,
912 std::string const & leave ) const;
913 std::string generateRAIIHandleContext( std::pair<std::string, HandleData> const & handle, std::set<std::string> const & specialFunctions ) const;
914 std::string generateRAIIHandleDestructorCallArguments( std::string const & handleType,
915 std::map<std::string, CommandData>::const_iterator destructorIt ) const;
916 std::tuple<std::string, std::string, std::string, std::string, std::string, std::string, std::string>
917 generateRAIIHandleDetails( std::pair<std::string, HandleData> const & handle ) const;
918 std::string generateRAIIHandleForwardDeclarations( std::vector<RequireData> const & requireData, std::string const & title ) const;
919 std::string generateRAIIHandles() const;
920 std::string generateRAIIHandleSingularConstructorArguments( std::pair<std::string, HandleData> const & handle,
921 std::map<std::string, CommandData>::const_iterator constructorIt ) const;
922 std::string generateRAIIHandleVectorSizeCheck( std::string const & name,
923 CommandData const & commandData,
924 size_t initialSkipCount,
925 std::map<size_t, std::vector<size_t>> const & countToVectorMap,
926 std::set<size_t> const & skippedParams ) const;
927 std::string generateResultAssignment( CommandData const & commandData ) const;
928 std::string generateResultCheck(
929 CommandData const & commandData, std::string const & className, std::string const & classSeparator, std::string commandName, bool enumerating ) const;
930 std::string generateResultExceptions() const;
931 std::string generateReturnStatement( std::string const & commandName,
932 CommandData const & commandData,
933 std::string const & returnVariable,
934 std::string const & returnType,
935 std::string const & dataType,
936 size_t initialSkipCount,
937 size_t returnParam,
938 CommandFlavourFlags flavourFlags,
939 bool enumerating,
940 bool raii ) const;
941 std::string generateReturnType( CommandData const & commandData,
942 std::vector<size_t> const & returnParams,
943 std::map<size_t, VectorParamData> const & vectorParams,
944 CommandFlavourFlags flavourFlags,
945 bool raii,
946 std::string const & dataType ) const;
947 std::string generateReturnVariable( CommandData const & commandData,
948 std::vector<size_t> const & returnParams,
949 std::map<size_t, VectorParamData> const & vectorParams,
950 CommandFlavourFlags flavourFlags ) const;
951 std::string
952 generateSizeCheck( std::vector<std::vector<MemberData>::const_iterator> const & arrayIts, std::string const & structName, bool mutualExclusiveLens ) const;
953 std::string generateStaticAssertions() const;
954 std::string generateStaticAssertions( std::vector<RequireData> const & requireData, std::string const & title ) const;
955 std::string generateStruct( std::pair<std::string, StructureData> const & structure, std::set<std::string> & listedStructs ) const;
956 std::string generateStructCompareOperators( std::pair<std::string, StructureData> const & structure ) const;
957 std::string generateStructConstructors( std::pair<std::string, StructureData> const & structData ) const;
958 std::string generateStructConstructorsEnhanced( std::pair<std::string, StructureData> const & structData ) const;
959 std::string generateStructConstructorArgument( bool listedArgument, MemberData const & memberData, bool withDefault ) const;
960 std::string generateStructHashStructure( std::pair<std::string, StructureData> const & structure, std::set<std::string> & listedStructs ) const;
961 std::string generateStructHashStructures() const;
962 std::string generateStructHashSum( std::string const & structName, std::vector<MemberData> const & members ) const;
963 std::string generateStructs() const;
964 std::string generateStructure( std::pair<std::string, StructureData> const & structure ) const;
965 std::string generateStructExtendsStructs() const;
966 std::string
967 generateStructExtendsStructs( std::vector<RequireData> const & requireData, std::set<std::string> & listedStructs, std::string const & title ) const;
968 std::string generateStructForwardDeclarations() const;
969 std::string generateStructForwardDeclarations( std::vector<RequireData> const & requireData, std::string const & title ) const;
970 std::tuple<std::string, std::string, std::string, std::string> generateStructMembers( std::pair<std::string, StructureData> const & structData ) const;
971 std::string generateStructSetter( std::string const & structureName, std::vector<MemberData> const & memberData, size_t index ) const;
972 std::string generateStructSubConstructor( std::pair<std::string, StructureData> const & structData ) const;
973 std::string generateSuccessCheck( std::vector<std::string> const & successCodes ) const;
974 std::string generateSuccessCodeList( std::vector<std::string> const & successCodes, bool enumerating ) const;
975 std::string generateThrowResultException() const;
976 std::string generateTypenameCheck( std::vector<size_t> const & returnParams,
977 std::map<size_t, VectorParamData> const & vectorParams,
978 bool definition,
979 std::vector<std::string> const & dataTypes,
980 CommandFlavourFlags flavourFlags ) const;
981 std::string generateUnion( std::pair<std::string, StructureData> const & structure ) const;
982 std::string generateUniqueTypes( std::string const & parentType, std::set<std::string> const & childrenTypes ) const;
983 std::string generateVectorSizeCheck( std::string const & name,
984 CommandData const & commandData,
985 size_t initialSkipCount,
986 std::map<size_t, std::vector<size_t>> const & countToVectorMap,
987 std::set<size_t> const & skippedParams,
988 bool onlyThrows ) const;
989 std::pair<std::string, std::string> getParentTypeAndName( std::pair<std::string, HandleData> const & handle ) const;
990 std::string getPlatform( std::string const & title ) const;
991 std::pair<std::string, std::string> getPoolTypeAndName( std::string const & type ) const;
992 std::string getProtect( EnumValueData const & evd ) const;
993 std::string getProtectFromPlatform( std::string const & platform ) const;
994 std::string getProtectFromTitle( std::string const & title ) const;
995 std::string getProtectFromType( std::string const & type ) const;
996 std::string getVectorSize( std::vector<ParamData> const & params,
997 std::map<size_t, VectorParamData> const & vectorParamIndices,
998 size_t returnParam,
999 std::string const & returnParamType,
1000 std::set<size_t> const & templatedParams ) const;
1001 bool hasLen( std::vector<MemberData> const & members, MemberData const & md ) const;
1002 bool hasParentHandle( std::string const & handle, std::string const & parent ) const;
1003 bool isDeviceCommand( CommandData const & commandData ) const;
1004 bool isHandleType( std::string const & type ) const;
1005 bool isLenByStructMember( std::string const & name, std::vector<ParamData> const & params ) const;
1006 bool isLenByStructMember( std::string const & name, ParamData const & param ) const;
1007 bool isMultiSuccessCodeConstructor( std::vector<std::map<std::string, CommandData>::const_iterator> const & constructorIts ) const;
1008 bool isParam( std::string const & name, std::vector<ParamData> const & params ) const;
1009 bool isStructMember( std::string const & name, std::vector<MemberData> const & memberData ) const;
1010 bool isStructureChainAnchor( std::string const & type ) const;
1011 std::pair<bool, std::map<size_t, std::vector<size_t>>> needsVectorSizeCheck( std::vector<ParamData> const & params,
1012 std::map<size_t, VectorParamData> const & vectorParams,
1013 std::vector<size_t> const & returnParams,
1014 std::set<size_t> const & singularParams ) const;
1015 void readCommands( tinyxml2::XMLElement const * element );
1016 void readCommandsCommand( tinyxml2::XMLElement const * element );
1017 std::pair<bool, ParamData> readCommandsCommandParam( tinyxml2::XMLElement const * element, std::vector<ParamData> const & params );
1018 std::pair<std::string, std::string> readCommandsCommandProto( tinyxml2::XMLElement const * element );
1019 std::string readComment( tinyxml2::XMLElement const * element );
1020 void readEnums( tinyxml2::XMLElement const * element );
1021 void readEnumsConstant( tinyxml2::XMLElement const * element );
1022 void readEnumsEnum( tinyxml2::XMLElement const * element, std::map<std::string, EnumData>::iterator enumIt );
1023 void readExtensions( tinyxml2::XMLElement const * element );
1024 void readExtensionsExtension( tinyxml2::XMLElement const * element );
1025 void readExtensionsExtensionRequire( tinyxml2::XMLElement const * element, std::map<std::string, ExtensionData>::iterator extensionIt );
1026 void readExtensionsExtensionRequireCommand( tinyxml2::XMLElement const * element, std::string const & extensionName, RequireData & requireData );
1027 void readExtensionsExtensionRequireSkipped( tinyxml2::XMLElement const * element );
1028 void readExtensionsExtensionRequireType( tinyxml2::XMLElement const * element, std::string const & extensionName, RequireData & requireData );
1029 void readFeature( tinyxml2::XMLElement const * element );
1030 void readFeatureRequire( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt );
1031 void readFeatureRequireCommand( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt, RequireData & requireData );
1032 void readFeatureRequireCommandSkipped( tinyxml2::XMLElement const * element );
1033 void readFeatureRequireSkipped( tinyxml2::XMLElement const * element );
1034 void readFeatureRequireType( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt, RequireData & requireData );
1035 void readFormats( tinyxml2::XMLElement const * element );
1036 void readFormatsFormat( tinyxml2::XMLElement const * element );
1037 void readFormatsFormatComponent( tinyxml2::XMLElement const * element, FormatData & formatData );
1038 void readFormatsFormatPlane( tinyxml2::XMLElement const * element, FormatData & formatData );
1039 void readFormatsFormatSPIRVImageFormat( tinyxml2::XMLElement const * element, FormatData & formatData );
1040 std::pair<NameData, TypeInfo> readNameAndType( tinyxml2::XMLElement const * elements );
1041 void readPlatforms( tinyxml2::XMLElement const * element );
1042 void readPlatformsPlatform( tinyxml2::XMLElement const * element );
1043 void readRegistry( tinyxml2::XMLElement const * element );
1044 void readRequireCommandSkipped( tinyxml2::XMLElement const * element );
1045 void readRequireEnum( tinyxml2::XMLElement const * element, std::string const & extensionName );
1046 void readRequireEnumSkipped( tinyxml2::XMLElement const * element );
1047 void readRequireTypeSkipped( tinyxml2::XMLElement const * element );
1048 void readSPIRVCapabilities( tinyxml2::XMLElement const * element );
1049 void readSPIRVCapabilitiesSPIRVCapability( tinyxml2::XMLElement const * element );
1050 void readSPIRVCapabilitiesSPIRVCapabilityEnable( tinyxml2::XMLElement const * element );
1051 void readSPIRVCapabilitiesSPIRVCapabilityEnableExtension( int xmlLine, std::map<std::string, std::string> const & attributes );
1052 void readSPIRVCapabilitiesSPIRVCapabilityEnableProperty( int xmlLine, std::map<std::string, std::string> const & attributes );
1053 void readSPIRVCapabilitiesSPIRVCapabilityEnableStruct( int xmlLine, std::map<std::string, std::string> const & attributes );
1054 void readSPIRVCapabilitiesSPIRVCapabilityEnableVersion( int xmlLine, std::map<std::string, std::string> const & attributes );
1055 void readSPIRVExtensions( tinyxml2::XMLElement const * element );
1056 void readSPIRVExtensionsExtension( tinyxml2::XMLElement const * element );
1057 void readSPIRVExtensionsExtensionEnable( tinyxml2::XMLElement const * element );
1058 void readTags( tinyxml2::XMLElement const * element );
1059 void readTagsTag( tinyxml2::XMLElement const * element );
1060 void readTypes( tinyxml2::XMLElement const * element );
1061 void readTypesType( tinyxml2::XMLElement const * element );
1062 void readTypesTypeBasetype( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1063 void readTypesTypeBitmask( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1064 void readTypesTypeDefine( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1065 void readTypesTypeEnum( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1066 void readTypesTypeFuncpointer( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1067 void readTypesTypeHandle( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1068 void readTypesTypeInclude( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1069 void readTypesTypeRequires( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1070 void readTypesTypeStruct( tinyxml2::XMLElement const * element, bool isUnion, std::map<std::string, std::string> const & attributes );
1071 void readTypesTypeStructMember( tinyxml2::XMLElement const * element, std::vector<MemberData> & members, bool isUnion );
1072 void readTypesTypeStructMemberEnum( tinyxml2::XMLElement const * element, MemberData & memberData );
1073 void readTypesTypeStructMemberName( tinyxml2::XMLElement const * element, MemberData & memberData, std::vector<MemberData> const & members );
1074 void readTypesTypeStructMemberType( tinyxml2::XMLElement const * element, MemberData & memberData );
1075 TypeInfo readTypeInfo( tinyxml2::XMLElement const * element ) const;
1076 void registerDeleter( std::string const & name, std::pair<std::string, CommandData> const & commandData );
1077 void rescheduleRAIIHandle( std::string & str,
1078 std::pair<std::string, HandleData> const & handle,
1079 std::set<std::string> & listedHandles,
1080 std::set<std::string> const & specialFunctions ) const;
1081 std::vector<std::string> selectCommandsByHandle( std::vector<RequireData> const & requireData,
1082 std::set<std::string> const & handleCommands,
1083 std::set<std::string> & listedCommands ) const;
1084 void setVulkanLicenseHeader( int line, std::string const & comment );
1085 bool skipLeadingGrandParent( std::pair<std::string, HandleData> const & handle ) const;
1086 std::string toString( TypeCategory category );
1087
1088 private:
1089 std::map<std::string, BaseTypeData> m_baseTypes;
1090 std::map<std::string, BitmaskData> m_bitmasks;
1091 std::map<std::string, CommandData> m_commands;
1092 std::map<std::string, std::string> m_constants;
1093 std::map<std::string, DefineData> m_defines;
1094 std::map<std::string, EnumData> m_enums;
1095 std::set<std::string> m_extendedStructs; // structs which are referenced by the structextends tag
1096 std::map<std::string, ExtensionData> m_extensions;
1097 std::map<int, std::map<std::string, ExtensionData>::const_iterator> m_extensionsByNumber;
1098 std::map<std::string, FeatureData> m_features;
1099 std::map<std::string, FormatData> m_formats;
1100 std::map<std::string, FuncPointerData> m_funcPointers;
1101 std::map<std::string, HandleData> m_handles;
1102 std::set<std::string> m_includes;
1103 std::map<std::string, PlatformData> m_platforms;
1104 std::set<std::string> m_RAIISpecialFunctions;
1105 std::map<std::string, EnumData> m_skippedEnums;
1106 std::set<std::string> m_skippedCommands;
1107 std::set<std::string> m_skippedFeatures;
1108 std::map<std::string, TypeData> m_skippedTypes;
1109 std::map<std::string, StructureData> m_structures;
1110 std::map<std::string, StructureAliasData> m_structureAliases;
1111 std::map<std::string, std::set<std::string>> m_structureAliasesInverse;
1112 std::set<std::string> m_tags;
1113 std::map<std::string, TypeData> m_types;
1114 std::string m_typesafeCheck;
1115 std::string m_version;
1116 std::string m_vulkanLicenseHeader;
1117 };
1118