annotate fuhtark_test/Vulkan-Headers-1.4.334/registry/reg.py @ 1501:f40d9d814c08 default tip

did: correct vulkan-api generator
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 23:34:29 +0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1501
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1 #!/usr/bin/env python3 -i
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
2 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
3 # Copyright 2013-2025 The Khronos Group Inc.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
4 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
5 # SPDX-License-Identifier: Apache-2.0
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
6
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
7 """Types and classes for manipulating an API registry."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
8
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
9 import copy
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
10 import re
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
11 import sys
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
12 import xml.etree.ElementTree as etree
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
13 from collections import defaultdict, deque, namedtuple
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
14
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
15 from generator import GeneratorOptions, OutputGenerator, noneStr, write
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
16 from apiconventions import APIConventions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
17
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
18 def apiNameMatch(str, supported):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
19 """Return whether a required api name matches a pattern specified for an
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
20 XML <feature> 'api' attribute or <extension> 'supported' attribute.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
21
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
22 - str - API name such as 'vulkan' or 'openxr'. May be None, in which
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
23 case it never matches (this should not happen).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
24 - supported - comma-separated list of XML API names. May be None, in
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
25 which case str always matches (this is the usual case)."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
26
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
27 if str is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
28 return supported is None or str in supported.split(',')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
29
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
30 # Fallthrough case - either str is None or the test failed
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
31 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
32
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
33 def matchAPIProfile(api, profile, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
34 """Return whether an API and profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
35 being generated matches an element's profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
36
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
37 - api - string naming the API to match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
38 - profile - string naming the profile to match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
39 - elem - Element which (may) have 'api' and 'profile'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
40 attributes to match to.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
41
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
42 If a tag is not present in the Element, the corresponding API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
43 or profile always matches.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
44
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
45 Otherwise, the tag must exactly match the API or profile.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
46
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
47 Thus, if 'profile' = core:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
48
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
49 - `<remove>` with no attribute will match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
50 - `<remove profile="core">` will match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
51 - `<remove profile="compatibility">` will not match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
52
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
53 Possible match conditions:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
54
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
55 ```
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
56 Requested Element
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
57 Profile Profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
58 --------- --------
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
59 None None Always matches
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
60 'string' None Always matches
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
61 None 'string' Does not match. Cannot generate multiple APIs
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
62 or profiles, so if an API/profile constraint
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
63 is present, it must be asked for explicitly.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
64 'string' 'string' Strings must match
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
65 ```
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
66
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
67 ** In the future, we will allow regexes for the attributes,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
68 not just strings, so that `api="^(gl|gles2)"` will match. Even
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
69 this is not really quite enough, we might prefer something
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
70 like `"gl(core)|gles1(common-lite)"`."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
71 # Match 'api', if present
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
72 elem_api = elem.get('api')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
73 if elem_api:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
74 if api is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
75 raise UserWarning("No API requested, but 'api' attribute is present with value '"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
76 + elem_api + "'")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
77 elif api != elem_api:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
78 # Requested API does not match attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
79 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
80 elem_profile = elem.get('profile')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
81 if elem_profile:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
82 if profile is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
83 raise UserWarning("No profile requested, but 'profile' attribute is present with value '"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
84 + elem_profile + "'")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
85 elif profile != elem_profile:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
86 # Requested profile does not match attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
87 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
88 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
89
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
90
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
91 def mergeAPIs(tree, fromApiNames, toApiName):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
92 """Merge multiple APIs using the precedence order specified in apiNames.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
93 Also deletes <remove> elements.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
94
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
95 tree - Element at the root of the hierarchy to merge.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
96 apiNames - list of strings of API names."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
97
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
98 stack = deque()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
99 stack.append(tree)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
100
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
101 while len(stack) > 0:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
102 parent = stack.pop()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
103
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
104 for child in parent.findall('*'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
105 if child.tag == 'remove':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
106 # Remove <remove> elements
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
107 parent.remove(child)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
108 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
109 stack.append(child)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
110
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
111 supportedList = child.get('supported')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
112 if supportedList:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
113 supportedList = supportedList.split(',')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
114 for apiName in [toApiName] + fromApiNames:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
115 if apiName in supportedList:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
116 child.set('supported', toApiName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
117
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
118 if child.get('api'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
119 definitionName = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
120 definitionVariants = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
121
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
122 # Keep only one definition with the same name if there are multiple definitions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
123 if child.tag in ['type']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
124 if child.get('name') is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
125 definitionName = child.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
126 definitionVariants = parent.findall(f"{child.tag}[@name='{definitionName}']")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
127 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
128 definitionName = child.find('name').text
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
129 definitionVariants = parent.findall(f"{child.tag}/name[.='{definitionName}']/..")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
130 elif child.tag in ['member', 'param']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
131 definitionName = child.find('name').text
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
132 definitionVariants = parent.findall(f"{child.tag}/name[.='{definitionName}']/..")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
133 elif child.tag in ['enum', 'feature']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
134 definitionName = child.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
135 definitionVariants = parent.findall(f"{child.tag}[@name='{definitionName}']")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
136 elif child.tag in ['require']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
137 # No way to correlate require tags because they do not have a definite identifier in the way they
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
138 # are used in the latest forms of the XML so the best we can do is simply enable all of them
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
139 if child.get('api') in fromApiNames:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
140 child.set('api', toApiName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
141 elif child.tag in ['command']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
142 definitionName = child.find('proto/name').text
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
143 definitionVariants = parent.findall(f"{child.tag}/proto/name[.='{definitionName}']/../..")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
144
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
145 if definitionName:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
146 bestMatchApi = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
147 requires = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
148 for apiName in [toApiName] + fromApiNames:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
149 for variant in definitionVariants:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
150 # Keep any requires attributes from the target API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
151 if variant.get('requires') and variant.get('api') == apiName:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
152 requires = variant.get('requires')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
153 # Find the best matching definition
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
154 if apiName in variant.get('api').split(',') and bestMatchApi is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
155 bestMatchApi = variant.get('api')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
156
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
157 if bestMatchApi:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
158 for variant in definitionVariants:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
159 if variant.get('api') != bestMatchApi:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
160 # Only keep best matching definition
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
161 parent.remove(variant)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
162 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
163 # Add requires attribute from the target API if it is not overridden
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
164 if requires is not None and variant.get('requires') is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
165 variant.set('requires', requires)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
166 variant.set('api', toApiName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
167
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
168
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
169 def mergeInternalFeatures(tree, apiName):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
170 """Merge internal API features (apitype='internal') into their public dependents.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
171
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
172 This processes the tree to find features marked with apitype='internal' and merges
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
173 their <require>, <deprecate>, and <remove> blocks into the first public feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
174 that depends on them. After merging, the internal features are removed from the tree.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
175
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
176 tree - Element at the root of the hierarchy (typically <registry>)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
177 apiName - the API name to process (e.g., 'vulkan', 'vulkansc')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
178 """
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
179 import copy
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
180
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
181 # Find all features in the tree
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
182 features = tree.findall('feature')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
183
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
184 # Separate internal and public features
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
185 internal_features = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
186 public_features = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
187
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
188 for feature in features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
189 api = feature.get('api', '')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
190 apitype = feature.get('apitype', '')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
191
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
192 # Only process features matching the target API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
193 if apiName not in api.split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
194 continue
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
195
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
196 if apitype == 'internal':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
197 internal_features.append(feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
198 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
199 public_features.append(feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
200
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
201 # Build a simple dependency map from the 'depends' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
202 def get_dependencies(feature):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
203 """Extract all dependencies from a feature's depends attribute."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
204 depends = feature.get('depends', '')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
205 if not depends:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
206 return set()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
207 # Parse the depends expression - for simplicity, extract feature names
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
208 # Dependencies can be like "VK_VERSION_1_0" or "VK_VERSION_1_0+VK_KHR_feature"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
209 deps = set()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
210 # Split on + and , to get individual dependencies
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
211 for dep in depends.replace('+', ',').split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
212 dep = dep.strip()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
213 if dep:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
214 deps.add(dep)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
215 return deps
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
216
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
217 def has_dependency(feature, target_name, all_features_map, visited=None):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
218 """Check if feature depends on target_name (directly or transitively)."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
219 if visited is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
220 visited = set()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
221
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
222 feature_name = feature.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
223 if feature_name in visited:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
224 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
225 visited.add(feature_name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
226
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
227 deps = get_dependencies(feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
228 if target_name in deps:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
229 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
230
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
231 # Check transitive dependencies
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
232 for dep_name in deps:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
233 if dep_name in all_features_map:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
234 if has_dependency(all_features_map[dep_name], target_name, all_features_map, visited):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
235 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
236 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
237
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
238 # Create a map of all features for dependency lookups
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
239 all_features_map = {f.get('name'): f for f in public_features + internal_features}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
240
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
241 # For each internal feature, find its first public dependent and merge
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
242 for internal_feature in internal_features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
243 internal_name = internal_feature.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
244 target_feature = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
245
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
246 # Find the first public feature that depends on this internal feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
247 for public_feature in public_features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
248 if has_dependency(public_feature, internal_name, all_features_map):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
249 target_feature = public_feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
250 break
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
251
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
252 if target_feature is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
253 # Merge require blocks
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
254 for require in internal_feature.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
255 require_copy = copy.deepcopy(require)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
256 target_feature.append(require_copy)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
257
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
258 # Merge deprecate blocks
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
259 for deprecate in internal_feature.findall('deprecate'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
260 deprecate_copy = copy.deepcopy(deprecate)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
261 target_feature.append(deprecate_copy)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
262
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
263 # Merge remove blocks
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
264 for remove in internal_feature.findall('remove'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
265 remove_copy = copy.deepcopy(remove)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
266 target_feature.append(remove_copy)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
267
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
268 # Remove the internal feature from the tree
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
269 tree.remove(internal_feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
270
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
271
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
272 def stripNonmatchingAPIs(tree, apiName, actuallyDelete = True):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
273 """Remove tree Elements with 'api' attributes matching apiName.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
274
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
275 tree - Element at the root of the hierarchy to strip. Only its
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
276 children can actually be removed, not the tree itself.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
277 apiName - string which much match a command-separated component of
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
278 the 'api' attribute.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
279 actuallyDelete - only delete matching elements if True."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
280
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
281 stack = deque()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
282 stack.append(tree)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
283
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
284 while len(stack) > 0:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
285 parent = stack.pop()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
286
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
287 for child in parent.findall('*'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
288 api = child.get('api')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
289
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
290 if apiNameMatch(apiName, api):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
291 # Add child to the queue
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
292 stack.append(child)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
293 elif not apiNameMatch(apiName, api):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
294 # Child does not match requested api. Remove it.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
295 if actuallyDelete:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
296 parent.remove(child)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
297
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
298
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
299 class BaseInfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
300 """Base class for information about a registry feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
301 (type/group/enum/command/API/extension).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
302
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
303 Represents the state of a registry feature, used during API generation.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
304 """
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
305
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
306 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
307 self.required = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
308 """should this feature be defined during header generation
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
309 (has it been removed by a profile or version)?"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
310
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
311 self.declared = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
312 "has this feature been defined already?"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
313
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
314 self.elem = elem
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
315 "etree Element for this feature"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
316
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
317 self.deprecatedbyversion = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
318 self.deprecatedbyextensions = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
319 self.deprecatedlink = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
320
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
321 def resetState(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
322 """Reset required/declared to initial values. Used
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
323 prior to generating a new API interface."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
324 self.required = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
325 self.declared = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
326
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
327 def compareKeys(self, info, key, required = False):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
328 """Return True if self.elem and info.elem have the same attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
329 value for key.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
330 If 'required' is not True, also returns True if neither element
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
331 has an attribute value for key."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
332
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
333 if required and key not in self.elem.keys():
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
334 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
335 return self.elem.get(key) == info.elem.get(key)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
336
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
337 def compareElem(self, info, infoName):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
338 """Return True if self.elem and info.elem have the same definition.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
339 info - the other object
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
340 infoName - 'type' / 'group' / 'enum' / 'command' / 'feature' /
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
341 'extension'"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
342
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
343 if infoName == 'enum':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
344 if self.compareKeys(info, 'extends'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
345 # Either both extend the same type, or no type
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
346 if (self.compareKeys(info, 'value', required = True) or
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
347 self.compareKeys(info, 'bitpos', required = True)):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
348 # If both specify the same value or bit position,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
349 # they are equal
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
350 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
351 elif (self.compareKeys(info, 'extnumber') and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
352 self.compareKeys(info, 'offset') and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
353 self.compareKeys(info, 'dir')):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
354 # If both specify the same relative offset, they are equal
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
355 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
356 elif (self.compareKeys(info, 'alias')):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
357 # If both are aliases of the same value
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
358 return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
359 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
360 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
361 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
362 # The same enum cannot extend two different types
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
363 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
364 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
365 # Non-<enum>s should never be redefined
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
366 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
367
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
368
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
369 class TypeInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
370 """Registry information about a type. No additional state
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
371 beyond BaseInfo is required."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
372
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
373 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
374 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
375 self.additionalValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
376 self.removedValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
377
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
378 def getMembers(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
379 """Get a collection of all member elements for this type, if any."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
380 return self.elem.findall('member')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
381
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
382 def resetState(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
383 BaseInfo.resetState(self)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
384 self.additionalValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
385 self.removedValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
386
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
387
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
388 class GroupInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
389 """Registry information about a group of related enums
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
390 in an <enums> block, generally corresponding to a C "enum" type."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
391
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
392 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
393 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
394
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
395
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
396 class EnumInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
397 """Registry information about an enum"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
398
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
399 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
400 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
401 self.type = elem.get('type')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
402 """numeric type of the value of the <enum> tag
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
403 ( '' for GLint, 'u' for GLuint, 'ull' for GLuint64 )"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
404 if self.type is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
405 self.type = ''
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
406
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
407
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
408 class CmdInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
409 """Registry information about a command"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
410
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
411 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
412 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
413 self.additionalValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
414 self.removedValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
415
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
416 def getParams(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
417 """Get a collection of all param elements for this command, if any."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
418 return self.elem.findall('param')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
419
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
420 def resetState(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
421 BaseInfo.resetState(self)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
422 self.additionalValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
423 self.removedValidity = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
424
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
425
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
426 class FeatureInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
427 """Registry information about an API <feature>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
428 or <extension>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
429
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
430 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
431 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
432 self.name = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
433 "feature name string (e.g. 'VK_KHR_surface')"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
434
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
435 self.emit = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
436 "has this feature been defined already?"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
437
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
438 self.sortorder = int(elem.get('sortorder', 0))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
439 """explicit numeric sort key within feature and extension groups.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
440 Defaults to 0."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
441
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
442 # Determine element category (vendor). Only works
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
443 # for <extension> elements.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
444 if elem.tag == 'feature':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
445 # Element category (vendor) is meaningless for <feature>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
446 self.category = 'VERSION'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
447 """category, e.g. VERSION or khr/vendor tag"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
448
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
449 self.version = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
450 """feature name string"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
451
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
452 self.versionNumber = elem.get('number')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
453 """versionNumber - API version number, taken from the 'number'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
454 attribute of <feature>. Extensions do not have API version
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
455 numbers and are assigned number 0."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
456
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
457 self.number = 0
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
458 self.supported = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
459
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
460 self.deprecates = elem.findall('deprecate')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
461 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
462 # Extract vendor portion of <APIprefix>_<vendor>_<name>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
463 self.category = self.name.split('_', 2)[1]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
464 self.version = "0"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
465 self.versionNumber = "0"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
466
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
467 self.number = int(elem.get('number','0'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
468 """extension number, used for ordering and for assigning
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
469 enumerant offsets. <feature> features do not have extension
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
470 numbers and are assigned number 0, as are extensions without
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
471 numbers, so sorting works."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
472
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
473 self.supported = elem.get('supported', 'disabled')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
474
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
475 class SpirvInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
476 """Registry information about an API <spirvextensions>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
477 or <spirvcapability>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
478
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
479 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
480 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
481
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
482 class FormatInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
483 """Registry information about an API <format>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
484
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
485 def __init__(self, elem, condition):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
486 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
487 # Need to save the condition here when it is known
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
488 self.condition = condition
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
489
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
490 class SyncStageInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
491 """Registry information about <syncstage>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
492
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
493 def __init__(self, elem, condition):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
494 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
495 # Need to save the condition here when it is known
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
496 self.condition = condition
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
497
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
498 class SyncAccessInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
499 """Registry information about <syncaccess>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
500
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
501 def __init__(self, elem, condition):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
502 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
503 # Need to save the condition here when it is known
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
504 self.condition = condition
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
505
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
506 class SyncPipelineInfo(BaseInfo):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
507 """Registry information about <syncpipeline>."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
508
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
509 def __init__(self, elem):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
510 BaseInfo.__init__(self, elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
511
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
512 class Registry:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
513 """Object representing an API registry, loaded from an XML file."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
514
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
515 def __init__(self, gen=None, genOpts=None):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
516 if gen is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
517 # If not specified, give a default object so messaging will work
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
518 self.gen = OutputGenerator()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
519 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
520 self.gen = gen
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
521 "Output generator used to write headers / messages"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
522
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
523 if genOpts is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
524 # If no generator is provided, we may still need the XML API name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
525 # (for example, in genRef.py).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
526 self.genOpts = GeneratorOptions(apiname = APIConventions().xml_api_name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
527 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
528 self.genOpts = genOpts
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
529 "Options controlling features to write and how to format them"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
530
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
531 self.gen.registry = self
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
532 self.gen.genOpts = self.genOpts
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
533 self.gen.genOpts.registry = self
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
534
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
535 # Store mergeInternalApis in self to avoid repeated lookups
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
536 self.mergeInternalApis = getattr(self.genOpts, 'mergeInternalApis', True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
537
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
538 self.tree = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
539 "ElementTree containing the root `<registry>`"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
540
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
541 self.typedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
542 "dictionary of TypeInfo objects keyed by type name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
543
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
544 self.groupdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
545 "dictionary of GroupInfo objects keyed by group name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
546
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
547 self.enumdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
548 "dictionary of EnumInfo objects keyed by enum name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
549
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
550 self.cmddict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
551 "dictionary of CmdInfo objects keyed by command name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
552
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
553 self.aliasdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
554 "dictionary of type and command names mapped to their alias, such as VkFooKHR -> VkFoo"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
555
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
556 self.enumvaluedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
557 "dictionary of enum values mapped to their type, such as VK_FOO_VALUE -> VkFoo"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
558
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
559 self.apidict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
560 "dictionary of FeatureInfo objects for `<feature>` elements keyed by API name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
561
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
562 self.extensions = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
563 "list of `<extension>` Elements"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
564
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
565 self.extdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
566 "dictionary of FeatureInfo objects for `<extension>` elements keyed by extension name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
567
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
568 self.spirvextdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
569 "dictionary of FeatureInfo objects for `<spirvextension>` elements keyed by spirv extension name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
570
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
571 self.spirvcapdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
572 "dictionary of FeatureInfo objects for `<spirvcapability>` elements keyed by spirv capability name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
573
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
574 self.formatsdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
575 "dictionary of FeatureInfo objects for `<format>` elements keyed by VkFormat name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
576
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
577 self.syncstagedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
578 "dictionary of Sync*Info objects for `<syncstage>` elements keyed by VkPipelineStageFlagBits2 name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
579
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
580 self.syncaccessdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
581 "dictionary of Sync*Info objects for `<syncaccess>` elements keyed by VkAccessFlagBits2 name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
582
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
583 self.syncpipelinedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
584 "dictionary of Sync*Info objects for `<syncpipeline>` elements keyed by pipeline type name"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
585
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
586 self.emitFeatures = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
587 """True to actually emit features for a version / extension,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
588 or False to just treat them as emitted"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
589
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
590 self.breakPat = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
591 "regexp pattern to break on when generating names"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
592 # self.breakPat = re.compile('VkFenceImportFlagBits.*')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
593
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
594 self.requiredextensions = [] # Hack - can remove it after validity generator goes away
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
595
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
596 # ** Global types for automatic source generation **
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
597 # Length Member data
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
598 self.commandextensiontuple = namedtuple('commandextensiontuple',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
599 ['command', # The name of the command being modified
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
600 'value', # The value to append to the command
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
601 'extension']) # The name of the extension that added it
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
602 self.validextensionstructs = defaultdict(list)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
603 self.commandextensionsuccesses = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
604 self.commandextensionerrors = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
605
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
606 self.filename = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
607
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
608 def loadElementTree(self, tree):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
609 """Load ElementTree into a Registry object and parse it."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
610 self.tree = tree
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
611 self.parseTree()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
612
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
613 def loadFile(self, file):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
614 """Load an API registry XML file into a Registry object and parse it"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
615 self.filename = file
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
616 self.tree = etree.parse(file)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
617 self.parseTree()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
618
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
619 def setGenerator(self, gen):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
620 """Specify output generator object.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
621
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
622 `None` restores the default generator."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
623 self.gen = gen
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
624 self.gen.setRegistry(self)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
625
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
626 def addElementInfo(self, elem, info, infoName, dictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
627 """Add information about an element to the corresponding dictionary.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
628
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
629 Intended for internal use only.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
630
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
631 - elem - `<type>`/`<enums>`/`<enum>`/`<command>`/`<feature>`/`<extension>`/`<spirvextension>`/`<spirvcapability>`/`<format>`/`<syncstage>`/`<syncaccess>`/`<syncpipeline>` Element
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
632 - info - corresponding {Type|Group|Enum|Cmd|Feature|Spirv|Format|SyncStage|SyncAccess|SyncPipeline}Info object
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
633 - infoName - 'type' / 'group' / 'enum' / 'command' / 'feature' / 'extension' / 'spirvextension' / 'spirvcapability' / 'format' / 'syncstage' / 'syncaccess' / 'syncpipeline'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
634 - dictionary - self.{type|group|enum|cmd|api|ext|format|spirvext|spirvcap|sync}dict
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
635
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
636 The dictionary key is the element 'name' attribute."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
637
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
638 # self.gen.logMsg('diag', 'Adding ElementInfo.required =',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
639 # info.required, 'name =', elem.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
640 key = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
641 if key in dictionary:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
642 if not dictionary[key].compareElem(info, infoName):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
643 self.gen.logMsg('warn', 'Attempt to redefine', key,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
644 '(this should not happen)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
645 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
646 dictionary[key] = info
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
647
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
648 def lookupElementInfo(self, fname, dictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
649 """Find a {Type|Enum|Cmd}Info object by name.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
650
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
651 Intended for internal use only.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
652
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
653 If an object qualified by API name exists, use that.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
654
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
655 - fname - name of type / enum / command
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
656 - dictionary - self.{type|enum|cmd}dict"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
657 key = (fname, self.genOpts.apiname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
658 if key in dictionary:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
659 # self.gen.logMsg('diag', 'Found API-specific element for feature', fname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
660 return dictionary[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
661 if fname in dictionary:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
662 # self.gen.logMsg('diag', 'Found generic element for feature', fname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
663 return dictionary[fname]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
664
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
665 return None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
666
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
667 def breakOnName(self, regexp):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
668 """Specify a feature name regexp to break on when generating features."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
669 self.breakPat = re.compile(regexp)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
670
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
671 def addEnumValue(self, enum, type_name):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
672 """Track aliasing and map back from enum values to their type"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
673 # Record alias, if any
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
674 value = enum.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
675 alias = enum.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
676 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
677 self.aliasdict[value] = alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
678 # Map the value back to the type
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
679 if type_name in self.aliasdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
680 type_name = self.aliasdict[type_name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
681 if value in self.enumvaluedict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
682 # Some times the same enum is defined by multiple extensions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
683 assert(type_name == self.enumvaluedict[value])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
684 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
685 self.enumvaluedict[value] = type_name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
686
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
687 def parseTree(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
688 """Parse the registry Element, once created"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
689 # This must be the Element for the root <registry>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
690 if self.tree is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
691 raise RuntimeError("Tree not initialized!")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
692 self.reg = self.tree.getroot()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
693
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
694 # Preprocess the tree in one of the following ways:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
695 # - either merge a set of APIs to another API based on their 'api' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
696 # - or remove all elements with non-matching 'api' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
697 # The preprocessing happens through a breath-first tree traversal.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
698 # This is a blunt hammer, but eliminates the need to track and test
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
699 # the apis deeper in processing to select the correct elements and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
700 # avoid duplicates.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
701 # Schema validation should prevent duplicate elements with
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
702 # overlapping api attributes, or where one element has an api
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
703 # attribute and the other does not.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
704
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
705 if self.genOpts.mergeApiNames:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
706 mergeAPIs(self.reg, self.genOpts.mergeApiNames.split(','), self.genOpts.apiname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
707 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
708 stripNonmatchingAPIs(self.reg, self.genOpts.apiname, actuallyDelete = True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
709
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
710 # Merge internal features (apitype="internal") into their public dependents
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
711 # This happens after API merging/stripping so we work with the correct API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
712 if self.mergeInternalApis:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
713 mergeInternalFeatures(self.reg, self.genOpts.apiname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
714
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
715 self.aliasdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
716 self.enumvaluedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
717
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
718 # Create dictionary of registry types from toplevel <types> tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
719 # and add 'name' attribute to each <type> tag (where missing)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
720 # based on its <name> element.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
721 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
722 # There is usually one <types> block; more are OK
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
723 # Required <type> attributes: 'name' or nested <name> tag contents
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
724 self.typedict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
725 for type_elem in self.reg.findall('types/type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
726 # If the <type> does not already have a 'name' attribute, set
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
727 # it from contents of its <name> tag.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
728 name = type_elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
729 if name is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
730 name_elem = type_elem.find('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
731 if name_elem is None or not name_elem.text:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
732 raise RuntimeError("Type without a name!")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
733 name = name_elem.text
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
734 type_elem.set('name', name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
735 self.addElementInfo(type_elem, TypeInfo(type_elem), 'type', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
736
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
737 # Record alias, if any
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
738 alias = type_elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
739 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
740 self.aliasdict[name] = alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
741
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
742 # Create dictionary of registry enum groups from <enums> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
743 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
744 # Required <enums> attributes: 'name'. If no name is given, one is
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
745 # generated, but that group cannot be identified and turned into an
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
746 # enum type definition - it is just a container for <enum> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
747 self.groupdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
748 for group in self.reg.findall('enums'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
749 self.addElementInfo(group, GroupInfo(group), 'group', self.groupdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
750
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
751 # Create dictionary of registry enums from <enum> tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
752 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
753 # <enums> tags usually define different namespaces for the values
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
754 # defined in those tags, but the actual names all share the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
755 # same dictionary.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
756 # Required <enum> attributes: 'name', 'value'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
757 # For containing <enums> which have type="enum" or type="bitmask",
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
758 # tag all contained <enum>s are required. This is a stopgap until
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
759 # a better scheme for tagging core and extension enums is created.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
760 self.enumdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
761 for enums in self.reg.findall('enums'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
762 required = (enums.get('type') is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
763 type_name = enums.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
764 # Enum values are defined only for the type that is not aliased to something else.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
765 assert(type_name not in self.aliasdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
766 for enum in enums.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
767 enumInfo = EnumInfo(enum)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
768 enumInfo.required = required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
769 self.addElementInfo(enum, enumInfo, 'enum', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
770 self.addEnumValue(enum, type_name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
771
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
772 # Create dictionary of registry commands from <command> tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
773 # and add 'name' attribute to each <command> tag (where missing)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
774 # based on its <proto><name> element.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
775 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
776 # There is usually only one <commands> block; more are OK.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
777 # Required <command> attributes: 'name' or <proto><name> tag contents
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
778 self.cmddict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
779 # List of commands which alias others. Contains
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
780 # [ name, aliasName, element ]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
781 # for each alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
782 cmdAlias = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
783 for cmd in self.reg.findall('commands/command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
784 # If the <command> does not already have a 'name' attribute, set
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
785 # it from contents of its <proto><name> tag.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
786 name = cmd.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
787 if name is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
788 name_elem = cmd.find('proto/name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
789 if name_elem is None or not name_elem.text:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
790 raise RuntimeError("Command without a name!")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
791 name = cmd.set('name', name_elem.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
792 ci = CmdInfo(cmd)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
793 self.addElementInfo(cmd, ci, 'command', self.cmddict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
794 alias = cmd.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
795 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
796 cmdAlias.append([name, alias, cmd])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
797 self.aliasdict[name] = alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
798
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
799 # Now loop over aliases, injecting a copy of the aliased command's
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
800 # Element with the aliased prototype name replaced with the command
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
801 # name - if it exists.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
802 # Copy the 'export' sttribute (whether it exists or not) from the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
803 # original, aliased command, since that can be different for a
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
804 # command and its alias.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
805 for (name, alias, cmd) in cmdAlias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
806 if alias in self.cmddict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
807 aliasInfo = self.cmddict[alias]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
808 cmdElem = copy.deepcopy(aliasInfo.elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
809 cmdElem.find('proto/name').text = name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
810 cmdElem.set('name', name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
811 cmdElem.set('alias', alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
812 export = cmd.get('export')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
813 if export is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
814 # Replicate the command's 'export' attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
815 cmdElem.set('export', export)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
816 elif cmdElem.get('export') is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
817 # Remove the 'export' attribute, if the alias has one but
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
818 # the command does not.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
819 del cmdElem.attrib['export']
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
820 ci = CmdInfo(cmdElem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
821 # Replace the dictionary entry for the CmdInfo element
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
822 self.cmddict[name] = ci
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
823
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
824 # @ newString = etree.tostring(base, encoding="unicode").replace(aliasValue, aliasName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
825 # @elem.append(etree.fromstring(replacement))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
826 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
827 self.gen.logMsg('warn', 'No matching <command> found for command',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
828 cmd.get('name'), 'alias', alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
829
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
830 # Create dictionaries of API and extension interfaces
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
831 # from toplevel <api> and <extension> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
832 self.apidict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
833 format_condition = dict()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
834 for feature in self.reg.findall('feature'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
835 featureInfo = FeatureInfo(feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
836 self.addElementInfo(feature, featureInfo, 'feature', self.apidict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
837
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
838 # Add additional enums defined only in <feature> tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
839 # to the corresponding enumerated type.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
840 # When seen here, the <enum> element, processed to contain the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
841 # numeric enum value, is added to the corresponding <enums>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
842 # element, as well as adding to the enum dictionary. It is no
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
843 # longer removed from the <require> element it is introduced in.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
844 # Instead, generateRequiredInterface ignores <enum> elements
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
845 # that extend enumerated types.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
846 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
847 # For <enum> tags which are actually just constants, if there is
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
848 # no 'extends' tag but there is a 'value' or 'bitpos' tag, just
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
849 # add an EnumInfo record to the dictionary. That works because
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
850 # output generation of constants is purely dependency-based, and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
851 # does not need to iterate through the XML tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
852 for elem in feature.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
853 for enum in elem.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
854 addEnumInfo = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
855 groupName = enum.get('extends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
856 if groupName is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
857 # self.gen.logMsg('diag', 'Found extension enum',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
858 # enum.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
859 # Add version number attribute to the <enum> element
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
860 enum.set('version', featureInfo.version)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
861 # Look up the GroupInfo with matching groupName
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
862 if groupName in self.groupdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
863 # self.gen.logMsg('diag', 'Matching group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
864 # groupName, 'found, adding element...')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
865 gi = self.groupdict[groupName]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
866 gi.elem.append(copy.deepcopy(enum))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
867 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
868 self.gen.logMsg('warn', 'NO matching group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
869 groupName, 'for enum', enum.get('name'), 'found.')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
870 if groupName == "VkFormat":
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
871 format_name = enum.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
872 if enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
873 format_name = enum.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
874 format_condition[format_name] = featureInfo.name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
875 addEnumInfo = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
876 elif enum.get('value') or enum.get('bitpos') or enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
877 # self.gen.logMsg('diag', 'Adding extension constant "enum"',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
878 # enum.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
879 addEnumInfo = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
880 if addEnumInfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
881 enumInfo = EnumInfo(enum)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
882 self.addElementInfo(enum, enumInfo, 'enum', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
883 self.addEnumValue(enum, groupName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
884
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
885 sync_pipeline_stage_condition = dict()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
886 sync_access_condition = dict()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
887
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
888 self.extensions = self.reg.findall('extensions/extension')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
889 self.extdict = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
890 for feature in self.extensions:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
891 featureInfo = FeatureInfo(feature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
892 self.addElementInfo(feature, featureInfo, 'extension', self.extdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
893
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
894 # Add additional enums defined only in <extension> tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
895 # to the corresponding core type.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
896 # Algorithm matches that of enums in a "feature" tag as above.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
897 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
898 # This code also adds a 'extnumber' attribute containing the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
899 # extension number, used for enumerant value calculation.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
900 for elem in feature.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
901 for enum in elem.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
902 addEnumInfo = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
903 groupName = enum.get('extends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
904 if groupName is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
905 # self.gen.logMsg('diag', 'Found extension enum',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
906 # enum.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
907
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
908 # Add <extension> block's extension number attribute to
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
909 # the <enum> element unless specified explicitly, such
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
910 # as when redefining an enum in another extension.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
911 extnumber = enum.get('extnumber')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
912 if not extnumber:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
913 enum.set('extnumber', str(featureInfo.number))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
914
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
915 enum.set('extname', featureInfo.name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
916 enum.set('supported', noneStr(featureInfo.supported))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
917 # Look up the GroupInfo with matching groupName
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
918 if groupName in self.groupdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
919 # self.gen.logMsg('diag', 'Matching group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
920 # groupName, 'found, adding element...')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
921 gi = self.groupdict[groupName]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
922 gi.elem.append(copy.deepcopy(enum))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
923 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
924 self.gen.logMsg('warn', 'NO matching group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
925 groupName, 'for enum', enum.get('name'), 'found.')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
926 # This is Vulkan-specific
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
927 if groupName == "VkFormat":
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
928 format_name = enum.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
929 if enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
930 format_name = enum.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
931 if format_name in format_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
932 format_condition[format_name] += f",{featureInfo.name}"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
933 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
934 format_condition[format_name] = featureInfo.name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
935 elif groupName == "VkPipelineStageFlagBits2":
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
936 stage_flag = enum.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
937 if enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
938 stage_flag = enum.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
939 featureName = elem.get('depends') if elem.get('depends') is not None else featureInfo.name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
940 if stage_flag in sync_pipeline_stage_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
941 sync_pipeline_stage_condition[stage_flag] += f",{featureName}"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
942 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
943 sync_pipeline_stage_condition[stage_flag] = featureName
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
944 elif groupName == "VkAccessFlagBits2":
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
945 access_flag = enum.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
946 if enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
947 access_flag = enum.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
948 featureName = elem.get('depends') if elem.get('depends') is not None else featureInfo.name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
949 if access_flag in sync_access_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
950 sync_access_condition[access_flag] += f",{featureName}"
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
951 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
952 sync_access_condition[access_flag] = featureName
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
953
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
954 addEnumInfo = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
955 elif enum.get('value') or enum.get('bitpos') or enum.get('alias'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
956 # self.gen.logMsg('diag', 'Adding extension constant "enum"',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
957 # enum.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
958 addEnumInfo = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
959 if addEnumInfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
960 enumInfo = EnumInfo(enum)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
961 self.addElementInfo(enum, enumInfo, 'enum', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
962 self.addEnumValue(enum, groupName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
963
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
964 # Parse out all spirv tags in dictionaries
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
965 # Use addElementInfo to catch duplicates
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
966 for spirv in self.reg.findall('spirvextensions/spirvextension'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
967 spirvInfo = SpirvInfo(spirv)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
968 self.addElementInfo(spirv, spirvInfo, 'spirvextension', self.spirvextdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
969 for spirv in self.reg.findall('spirvcapabilities/spirvcapability'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
970 spirvInfo = SpirvInfo(spirv)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
971 self.addElementInfo(spirv, spirvInfo, 'spirvcapability', self.spirvcapdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
972
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
973 for format in self.reg.findall('formats/format'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
974 condition = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
975 format_name = format.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
976 if format_name in format_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
977 condition = format_condition[format_name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
978 formatInfo = FormatInfo(format, condition)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
979 self.addElementInfo(format, formatInfo, 'format', self.formatsdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
980
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
981 for stage in self.reg.findall('sync/syncstage'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
982 condition = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
983 stage_flag = stage.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
984 if stage_flag in sync_pipeline_stage_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
985 condition = sync_pipeline_stage_condition[stage_flag]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
986 syncInfo = SyncStageInfo(stage, condition)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
987 self.addElementInfo(stage, syncInfo, 'syncstage', self.syncstagedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
988
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
989 for access in self.reg.findall('sync/syncaccess'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
990 condition = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
991 access_flag = access.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
992 if access_flag in sync_access_condition:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
993 condition = sync_access_condition[access_flag]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
994 syncInfo = SyncAccessInfo(access, condition)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
995 self.addElementInfo(access, syncInfo, 'syncaccess', self.syncaccessdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
996
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
997 for pipeline in self.reg.findall('sync/syncpipeline'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
998 syncInfo = SyncPipelineInfo(pipeline)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
999 self.addElementInfo(pipeline, syncInfo, 'syncpipeline', self.syncpipelinedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1000
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1001 def dumpReg(self, maxlen=120, filehandle=sys.stdout):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1002 """Dump all the dictionaries constructed from the Registry object.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1003
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1004 Diagnostic to dump the dictionaries to specified file handle (default stdout).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1005 Truncates type / enum / command elements to maxlen characters (default 120)"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1006 write('***************************************', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1007 write(' ** Dumping Registry contents **', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1008 write('***************************************', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1009 write('// Types', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1010 for name in self.typedict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1011 tobj = self.typedict[name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1012 write(' Type', name, '->', etree.tostring(tobj.elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1013 write('// Groups', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1014 for name in self.groupdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1015 gobj = self.groupdict[name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1016 write(' Group', name, '->', etree.tostring(gobj.elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1017 write('// Enums', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1018 for name in self.enumdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1019 eobj = self.enumdict[name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1020 write(' Enum', name, '->', etree.tostring(eobj.elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1021 write('// Commands', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1022 for name in self.cmddict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1023 cobj = self.cmddict[name]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1024 write(' Command', name, '->', etree.tostring(cobj.elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1025 write('// APIs', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1026 for key in self.apidict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1027 write(' API Version ', key, '->',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1028 etree.tostring(self.apidict[key].elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1029 write('// Extensions', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1030 for key in self.extdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1031 write(' Extension', key, '->',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1032 etree.tostring(self.extdict[key].elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1033 write('// SPIR-V', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1034 for key in self.spirvextdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1035 write(' SPIR-V Extension', key, '->',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1036 etree.tostring(self.spirvextdict[key].elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1037 for key in self.spirvcapdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1038 write(' SPIR-V Capability', key, '->',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1039 etree.tostring(self.spirvcapdict[key].elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1040 write('// VkFormat', file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1041 for key in self.formatsdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1042 write(' VkFormat', key, '->',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1043 etree.tostring(self.formatsdict[key].elem)[0:maxlen], file=filehandle)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1044
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1045 def markTypeRequired(self, typename, required):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1046 """Require (along with its dependencies) or remove (but not its dependencies) a type.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1047
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1048 - typename - name of type
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1049 - required - boolean (to tag features as required or not)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1050 """
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1051 self.gen.logMsg('diag', 'tagging type:', typename, '-> required =', required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1052
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1053 # Get TypeInfo object for <type> tag corresponding to typename
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1054 typeinfo = self.lookupElementInfo(typename, self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1055 if typeinfo is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1056 if required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1057 # Tag type dependencies in 'alias' and 'required' attributes as
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1058 # required. This does not un-tag dependencies in a <remove>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1059 # tag. See comments in markRequired() below for the reason.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1060 for attrib_name in ['requires', 'alias']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1061 depname = typeinfo.elem.get(attrib_name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1062 if depname:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1063 self.gen.logMsg('diag', 'Generating dependent type',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1064 depname, 'for', attrib_name, 'type', typename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1065 # Do not recurse on self-referential structures.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1066 if typename != depname:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1067 self.markTypeRequired(depname, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1068 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1069 self.gen.logMsg('diag', 'type', typename, 'is self-referential')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1070 # Tag types used in defining this type (e.g. in nested
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1071 # <type> tags)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1072 # Look for <type> in entire <command> tree,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1073 # not just immediate children
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1074 for subtype in typeinfo.elem.findall('.//type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1075 self.gen.logMsg('diag', 'markRequired: type requires dependent <type>', subtype.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1076 if typename != subtype.text:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1077 self.markTypeRequired(subtype.text, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1078 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1079 self.gen.logMsg('diag', 'type', typename, 'is self-referential')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1080 # Tag enums used in defining this type, for example in
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1081 # <member><name>member</name>[<enum>MEMBER_SIZE</enum>]</member>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1082 for subenum in typeinfo.elem.findall('.//enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1083 self.gen.logMsg('diag', 'markRequired: type requires dependent <enum>', subenum.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1084 self.markEnumRequired(subenum.text, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1085 # Tag type dependency in 'bitvalues' attributes as
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1086 # required. This ensures that the bit values for a flag
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1087 # are emitted
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1088 depType = typeinfo.elem.get('bitvalues')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1089 if depType:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1090 self.gen.logMsg('diag', 'Generating bitflag type',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1091 depType, 'for type', typename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1092 self.markTypeRequired(depType, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1093 group = self.lookupElementInfo(depType, self.groupdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1094 if group is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1095 group.flagType = typeinfo
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1096
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1097 typeinfo.required = required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1098 elif '.h' not in typename:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1099 self.gen.logMsg('warn', 'type:', typename, 'IS NOT DEFINED')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1100
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1101 def markEnumRequired(self, enumname, required):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1102 """Mark an enum as required or not.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1103
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1104 - enumname - name of enum
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1105 - required - boolean (to tag features as required or not)"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1106
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1107 self.gen.logMsg('diag', 'markEnumRequired: tagging enum:', enumname, '-> required =', required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1108 enum = self.lookupElementInfo(enumname, self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1109 if enum is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1110 # If the enum is part of a group, and is being removed, then
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1111 # look it up in that <enums> tag and remove the Element there,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1112 # so that it is not visible to generators (which traverse the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1113 # <enums> tag elements rather than using the dictionaries).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1114 if not required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1115 groupName = enum.elem.get('extends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1116 if groupName is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1117 self.gen.logMsg('diag', f'markEnumRequired: Removing extending enum {enum.elem.get("name")}')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1118
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1119 # Look up the Info with matching groupName
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1120 if groupName in self.groupdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1121 gi = self.groupdict[groupName]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1122 gienum = gi.elem.find(f"enum[@name='{enumname}']")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1123 if gienum is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1124 # Remove copy of this enum from the group
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1125 gi.elem.remove(gienum)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1126 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1127 self.gen.logMsg('warn', 'markEnumRequired: Cannot remove enum',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1128 enumname, 'not found in group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1129 groupName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1130 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1131 self.gen.logMsg('warn', 'markEnumRequired: Cannot remove enum',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1132 enumname, 'from nonexistent group',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1133 groupName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1134 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1135 # This enum is not an extending enum.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1136 # The XML tree must be searched for all <enums> that
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1137 # might have it, so we know the parent to delete from.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1138
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1139 enumName = enum.elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1140
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1141 self.gen.logMsg('diag', f'markEnumRequired: Removing non-extending enum {enumName}')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1142
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1143 count = 0
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1144 for enums in self.reg.findall('enums'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1145 for thisEnum in enums.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1146 if thisEnum.get('name') == enumName:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1147 # Actually remove it
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1148 count = count + 1
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1149 enums.remove(thisEnum)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1150
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1151 if count == 0:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1152 self.gen.logMsg('warn', f'markEnumRequired: {enumName}) not found in any <enums> tag')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1153
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1154 enum.required = required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1155 # Tag enum dependencies in 'alias' attribute as required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1156 depname = enum.elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1157 if depname:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1158 self.gen.logMsg('diag', 'markEnumRequired: Generating dependent enum',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1159 depname, 'for alias', enumname, 'required =', enum.required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1160 self.markEnumRequired(depname, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1161 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1162 self.gen.logMsg('warn', f'markEnumRequired: {enumname} IS NOT DEFINED')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1163
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1164 def markCmdRequired(self, cmdname, required):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1165 """Mark a command as required or not.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1166
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1167 - cmdname - name of command
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1168 - required - boolean (to tag features as required or not)"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1169 self.gen.logMsg('diag', 'tagging command:', cmdname, '-> required =', required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1170 cmd = self.lookupElementInfo(cmdname, self.cmddict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1171 if cmd is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1172 cmd.required = required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1173
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1174 # Tag command dependencies in 'alias' attribute as required
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1175 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1176 # This is usually not done, because command 'aliases' are not
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1177 # actual C language aliases like type and enum aliases. Instead
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1178 # they are just duplicates of the function signature of the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1179 # alias. This means that there is no dependency of a command
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1180 # alias on what it aliases. One exception is validity includes,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1181 # where the spec markup needs the promoted-to validity include
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1182 # even if only the promoted-from command is being built.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1183 if self.genOpts.requireCommandAliases:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1184 depname = cmd.elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1185 if depname:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1186 self.gen.logMsg('diag', 'Generating dependent command',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1187 depname, 'for alias', cmdname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1188 self.markCmdRequired(depname, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1189
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1190 # Tag all parameter types of this command as required.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1191 # This does not remove types of commands in a <remove>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1192 # tag, because many other commands may use the same type.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1193 # We could be more clever and reference count types,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1194 # instead of using a boolean.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1195 if required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1196 # Look for <type> in entire <command> tree,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1197 # not just immediate children
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1198 for type_elem in cmd.elem.findall('.//type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1199 self.gen.logMsg('diag', 'markRequired: command implicitly requires dependent type', type_elem.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1200 self.markTypeRequired(type_elem.text, required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1201 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1202 self.gen.logMsg('warn', 'command:', cmdname, 'IS NOT DEFINED')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1203
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1204 def markRequired(self, featurename, feature, required):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1205 """Require or remove features specified in the Element.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1206
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1207 - featurename - name of the feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1208 - feature - Element for `<require>` or `<remove>` tag
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1209 - required - boolean (to tag features as required or not)"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1210 self.gen.logMsg('diag', 'markRequired (feature = <too long to print>, required =', required, ')')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1211
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1212 # Loop over types, enums, and commands in the tag
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1213 # @@ It would be possible to respect 'api' and 'profile' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1214 # in individual features, but that is not done yet.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1215 for typeElem in feature.findall('type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1216 self.markTypeRequired(typeElem.get('name'), required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1217 for enumElem in feature.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1218 self.markEnumRequired(enumElem.get('name'), required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1219
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1220 for cmdElem in feature.findall('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1221 self.markCmdRequired(cmdElem.get('name'), required)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1222
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1223 # Extensions may need to extend existing commands or other items in the future.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1224 # So, look for extend tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1225 for extendElem in feature.findall('extend'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1226 extendType = extendElem.get('type')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1227 if extendType == 'command':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1228 commandName = extendElem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1229 successExtends = extendElem.get('successcodes')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1230 if successExtends is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1231 for success in successExtends.split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1232 self.commandextensionsuccesses.append(self.commandextensiontuple(command=commandName,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1233 value=success,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1234 extension=featurename))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1235 errorExtends = extendElem.get('errorcodes')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1236 if errorExtends is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1237 for error in errorExtends.split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1238 self.commandextensionerrors.append(self.commandextensiontuple(command=commandName,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1239 value=error,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1240 extension=featurename))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1241 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1242 self.gen.logMsg('warn', 'extend type:', extendType, 'IS NOT SUPPORTED')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1243
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1244 def getAlias(self, elem, dict):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1245 """Check for an alias in the same require block.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1246
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1247 - elem - Element to check for an alias"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1248
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1249 # Try to find an alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1250 alias = elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1251 if alias is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1252 name = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1253 typeinfo = self.lookupElementInfo(name, dict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1254 if not typeinfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1255 self.gen.logMsg('error', name, 'is not a known name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1256 alias = typeinfo.elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1257
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1258 return alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1259
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1260 def checkForCorrectionAliases(self, alias, require, tag):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1261 """Check for an alias in the same require block.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1262
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1263 - alias - String name of the alias
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1264 - require - `<require>` block from the registry
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1265 - tag - tag to look for in the require block"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1266
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1267 # For the time being, the code below is bypassed. It has the effect
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1268 # of excluding "spelling aliases" created to comply with the style
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1269 # guide, but this leaves references out of the specification and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1270 # causes broken internal links.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1271 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1272 # if alias and require.findall(tag + "[@name='" + alias + "']"):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1273 # return True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1274
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1275 return False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1276
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1277 def fillFeatureDictionary(self, interface, featurename, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1278 """Capture added interfaces for a `<version>` or `<extension>`.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1279
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1280 - interface - Element for `<version>` or `<extension>`, containing
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1281 `<require>` and `<remove>` tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1282 - featurename - name of the feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1283 - api - string specifying API name being generated
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1284 - profile - string specifying API profile being generated"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1285
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1286 # Explicitly initialize known types - errors for unhandled categories
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1287 self.gen.featureDictionary[featurename] = {
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1288 "enumconstant": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1289 "command": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1290 "enum": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1291 "struct": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1292 "handle": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1293 "basetype": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1294 "include": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1295 "define": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1296 "bitmask": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1297 "union": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1298 "funcpointer": {},
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1299 }
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1300
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1301 # <require> marks things that are required by this version/profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1302 for require in interface.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1303 if matchAPIProfile(api, profile, require):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1304
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1305 # Determine the required extension or version needed for a require block
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1306 # Assumes that only one of these is specified
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1307 # 'extension', and therefore 'required_key', may be a boolean
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1308 # expression of extension names.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1309 # 'required_key' is used only as a dictionary key at
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1310 # present, and passed through to the script generators, so
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1311 # they must be prepared to parse that boolean expression.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1312 required_key = require.get('depends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1313
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1314 # Loop over types, enums, and commands in the tag
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1315 for typeElem in require.findall('type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1316 typename = typeElem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1317 typeinfo = self.lookupElementInfo(typename, self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1318
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1319 if typeinfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1320 # Remove aliases in the same extension/feature; these are always added as a correction. Do not need the original to be visible.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1321 alias = self.getAlias(typeElem, self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1322 if not self.checkForCorrectionAliases(alias, require, 'type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1323 # Resolve the type info to the actual type, so we get an accurate read for 'structextends'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1324 while alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1325 typeinfo = self.lookupElementInfo(alias, self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1326 if not typeinfo:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1327 raise RuntimeError(f"Missing alias {alias}")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1328 alias = typeinfo.elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1329
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1330 typecat = typeinfo.elem.get('category')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1331 typeextends = typeinfo.elem.get('structextends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1332 if not required_key in self.gen.featureDictionary[featurename][typecat]:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1333 self.gen.featureDictionary[featurename][typecat][required_key] = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1334 if not typeextends in self.gen.featureDictionary[featurename][typecat][required_key]:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1335 self.gen.featureDictionary[featurename][typecat][required_key][typeextends] = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1336 self.gen.featureDictionary[featurename][typecat][required_key][typeextends].append(typename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1337 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1338 self.gen.logMsg('warn', f'fillFeatureDictionary: NOT filling for {typename}')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1339
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1340
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1341 for enumElem in require.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1342 enumname = enumElem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1343 typeinfo = self.lookupElementInfo(enumname, self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1344
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1345 # Remove aliases in the same extension/feature; these are always added as a correction. Do not need the original to be visible.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1346 alias = self.getAlias(enumElem, self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1347 if not self.checkForCorrectionAliases(alias, require, 'enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1348 enumextends = enumElem.get('extends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1349 if not required_key in self.gen.featureDictionary[featurename]['enumconstant']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1350 self.gen.featureDictionary[featurename]['enumconstant'][required_key] = {}
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1351 if not enumextends in self.gen.featureDictionary[featurename]['enumconstant'][required_key]:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1352 self.gen.featureDictionary[featurename]['enumconstant'][required_key][enumextends] = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1353 self.gen.featureDictionary[featurename]['enumconstant'][required_key][enumextends].append(enumname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1354 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1355 self.gen.logMsg('warn', f'fillFeatureDictionary: NOT filling for {typename}')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1356
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1357 for cmdElem in require.findall('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1358 # Remove aliases in the same extension/feature; these are always added as a correction. Do not need the original to be visible.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1359 alias = self.getAlias(cmdElem, self.cmddict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1360 if not self.checkForCorrectionAliases(alias, require, 'command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1361 if not required_key in self.gen.featureDictionary[featurename]['command']:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1362 self.gen.featureDictionary[featurename]['command'][required_key] = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1363 self.gen.featureDictionary[featurename]['command'][required_key].append(cmdElem.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1364 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1365 self.gen.logMsg('warn', f'fillFeatureDictionary: NOT filling for {typename}')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1366
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1367 def requireFeatures(self, interface, featurename, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1368 """Process `<require>` tags for a `<version>` or `<extension>`.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1369
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1370 - interface - Element for `<version>` or `<extension>`, containing
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1371 `<require>` tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1372 - featurename - name of the feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1373 - api - string specifying API name being generated
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1374 - profile - string specifying API profile being generated"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1375
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1376 # <require> marks things that are required by this version/profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1377 for feature in interface.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1378 if matchAPIProfile(api, profile, feature):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1379 self.markRequired(featurename, feature, True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1380
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1381 def deprecateFeatures(self, interface, featurename, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1382 """Process `<require>` tags for a `<version>` or `<extension>`.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1383
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1384 - interface - Element for `<version>` or `<extension>`, containing
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1385 `<require>` tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1386 - featurename - name of the feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1387 - api - string specifying API name being generated
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1388 - profile - string specifying API profile being generated"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1389
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1390 versionmatch = APIConventions().is_api_version_name(featurename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1391
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1392 # <deprecate> marks things that are deprecated by this version/profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1393 for deprecation in interface.findall('deprecate'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1394 if matchAPIProfile(api, profile, deprecation):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1395 for typeElem in deprecation.findall('type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1396 type = self.lookupElementInfo(typeElem.get('name'), self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1397 if type:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1398 if versionmatch is not False:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1399 type.deprecatedbyversion = featurename
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1400 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1401 type.deprecatedbyextensions.append(featurename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1402 type.deprecatedlink = deprecation.get('explanationlink')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1403 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1404 self.gen.logMsg('error', typeElem.get('name'), ' is tagged for deprecation but not present in registry')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1405 for enumElem in deprecation.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1406 enum = self.lookupElementInfo(enumElem.get('name'), self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1407 if enum:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1408 if versionmatch is not False:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1409 enum.deprecatedbyversion = featurename
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1410 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1411 enum.deprecatedbyextensions.append(featurename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1412 enum.deprecatedlink = deprecation.get('explanationlink')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1413 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1414 self.gen.logMsg('error', enumElem.get('name'), ' is tagged for deprecation but not present in registry')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1415 for cmdElem in deprecation.findall('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1416 cmd = self.lookupElementInfo(cmdElem.get('name'), self.cmddict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1417 if cmd:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1418 if versionmatch is not False:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1419 cmd.deprecatedbyversion = featurename
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1420 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1421 cmd.deprecatedbyextensions.append(featurename)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1422 cmd.deprecatedlink = deprecation.get('explanationlink')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1423 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1424 self.gen.logMsg('error', cmdElem.get('name'), ' is tagged for deprecation but not present in registry')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1425
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1426 def removeFeatures(self, interface, featurename, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1427 """Process `<remove>` tags for a `<version>` or `<extension>`.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1428
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1429 - interface - Element for `<version>` or `<extension>`, containing
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1430 `<remove>` tags
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1431 - featurename - name of the feature
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1432 - api - string specifying API name being generated
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1433 - profile - string specifying API profile being generated"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1434
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1435 # <remove> marks things that are removed by this version/profile
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1436 for feature in interface.findall('remove'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1437 if matchAPIProfile(api, profile, feature):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1438 self.markRequired(featurename, feature, False)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1439
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1440 def assignAdditionalValidity(self, interface, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1441 # Loop over all usage inside all <require> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1442 for feature in interface.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1443 if matchAPIProfile(api, profile, feature):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1444 for v in feature.findall('usage'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1445 if v.get('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1446 self.cmddict[v.get('command')].additionalValidity.append(copy.deepcopy(v))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1447 if v.get('struct'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1448 self.typedict[v.get('struct')].additionalValidity.append(copy.deepcopy(v))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1449
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1450 def removeAdditionalValidity(self, interface, api, profile):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1451 # Loop over all usage inside all <remove> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1452 for feature in interface.findall('remove'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1453 if matchAPIProfile(api, profile, feature):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1454 for v in feature.findall('usage'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1455 if v.get('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1456 self.cmddict[v.get('command')].removedValidity.append(copy.deepcopy(v))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1457 if v.get('struct'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1458 self.typedict[v.get('struct')].removedValidity.append(copy.deepcopy(v))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1459
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1460 def generateFeature(self, fname, ftype, dictionary, explicit=False):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1461 """Generate a single type / enum group / enum / command,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1462 and all its dependencies as needed.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1463
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1464 - fname - name of feature (`<type>`/`<enum>`/`<command>`)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1465 - ftype - type of feature, 'type' | 'enum' | 'command'
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1466 - dictionary - of *Info objects - self.{type|enum|cmd}dict
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1467 - explicit - True if this is explicitly required by the top-level
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1468 XML <require> tag, False if it is a dependency of an explicit
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1469 requirement."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1470
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1471 self.gen.logMsg('diag', 'generateFeature: generating', ftype, fname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1472
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1473 if not (explicit or self.genOpts.requireDepends):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1474 self.gen.logMsg('diag', 'generateFeature: NOT generating', ftype, fname, 'because generator does not require dependencies')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1475 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1476
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1477 f = self.lookupElementInfo(fname, dictionary)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1478 if f is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1479 # No such feature. This is an error, but reported earlier
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1480 self.gen.logMsg('diag', 'No entry found for feature', fname,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1481 'returning!')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1482 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1483
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1484 # If feature is not required, or has already been declared, return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1485 if not f.required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1486 self.gen.logMsg('diag', 'Skipping', ftype, fname, '(not required)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1487 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1488 if f.declared:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1489 self.gen.logMsg('diag', 'Skipping', ftype, fname, '(already declared)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1490 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1491 # Always mark feature declared, as though actually emitted
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1492 f.declared = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1493
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1494 # Determine if this is an alias, and of what, if so
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1495 alias = f.elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1496 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1497 self.gen.logMsg('diag', fname, 'is an alias of', alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1498
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1499 # Pull in dependent declaration(s) of the feature.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1500 # For types, there may be one type in the 'requires' attribute of
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1501 # the element, one in the 'alias' attribute, and many in
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1502 # embedded <type> and <enum> tags within the element.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1503 # For commands, there may be many in <type> tags within the element.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1504 # For enums, no dependencies are allowed (though perhaps if you
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1505 # have a uint64 enum, it should require that type).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1506 genProc = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1507 followupFeature = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1508 if ftype == 'type':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1509 genProc = self.gen.genType
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1510
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1511 # Generate type dependencies in 'alias' and 'requires' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1512 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1513 self.generateFeature(alias, 'type', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1514 requires = f.elem.get('requires')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1515 if requires:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1516 self.gen.logMsg('diag', 'Generating required dependent type',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1517 requires)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1518 self.generateFeature(requires, 'type', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1519
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1520 # Generate types used in defining this type (e.g. in nested
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1521 # <type> tags)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1522 # Look for <type> in entire <command> tree,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1523 # not just immediate children
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1524 for subtype in f.elem.findall('.//type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1525 self.gen.logMsg('diag', 'Generating required dependent <type>',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1526 subtype.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1527 self.generateFeature(subtype.text, 'type', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1528
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1529 # Generate enums used in defining this type, for example in
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1530 # <member><name>member</name>[<enum>MEMBER_SIZE</enum>]</member>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1531 for subtype in f.elem.findall('.//enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1532 self.gen.logMsg('diag', 'Generating required dependent <enum>',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1533 subtype.text)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1534 self.generateFeature(subtype.text, 'enum', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1535
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1536 # If the type is an enum group, look up the corresponding
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1537 # group in the group dictionary and generate that instead.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1538 if f.elem.get('category') == 'enum':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1539 self.gen.logMsg('diag', 'Type', fname, 'is an enum group, so generate that instead')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1540 group = self.lookupElementInfo(fname, self.groupdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1541 if alias is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1542 # An alias of another group name.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1543 # Pass to genGroup with 'alias' parameter = aliased name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1544 self.gen.logMsg('diag', 'Generating alias', fname,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1545 'for enumerated type', alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1546 # Now, pass the *aliased* GroupInfo to the genGroup, but
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1547 # with an additional parameter which is the alias name.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1548 genProc = self.gen.genGroup
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1549 f = self.lookupElementInfo(alias, self.groupdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1550 elif group is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1551 self.gen.logMsg('warn', 'Skipping enum type', fname,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1552 ': No matching enumerant group')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1553 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1554 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1555 genProc = self.gen.genGroup
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1556 f = group
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1557
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1558 # @ The enum group is not ready for generation. At this
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1559 # @ point, it contains all <enum> tags injected by
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1560 # @ <extension> tags without any verification of whether
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1561 # @ they are required or not. It may also contain
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1562 # @ duplicates injected by multiple consistent
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1563 # @ definitions of an <enum>.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1564
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1565 # @ Pass over each enum, marking its enumdict[] entry as
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1566 # @ required or not. Mark aliases of enums as required,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1567 # @ too.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1568
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1569 enums = group.elem.findall('enum')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1570
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1571 self.gen.logMsg('diag', 'generateFeature: checking enums for group', fname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1572
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1573 # Check for required enums, including aliases
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1574 # LATER - Check for, report, and remove duplicates?
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1575 enumAliases = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1576 for elem in enums:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1577 name = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1578
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1579 required = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1580
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1581 extname = elem.get('extname')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1582 version = elem.get('version')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1583 if extname is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1584 # 'supported' attribute was injected when the <enum> element was
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1585 # moved into the <enums> group in Registry.parseTree()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1586 supported_list = elem.get('supported').split(",")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1587 if self.genOpts.defaultExtensions in supported_list:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1588 required = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1589 elif re.match(self.genOpts.addExtensions, extname) is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1590 required = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1591 elif version is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1592 required = re.match(self.genOpts.emitversions, version) is not None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1593 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1594 required = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1595
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1596 self.gen.logMsg('diag', '* required =', required, 'for', name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1597 if required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1598 # Mark this element as required (in the element, not the EnumInfo)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1599 elem.set('required', 'true')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1600 # If it is an alias, track that for later use
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1601 enumAlias = elem.get('alias')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1602 if enumAlias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1603 enumAliases.append(enumAlias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1604 for elem in enums:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1605 name = elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1606 if name in enumAliases:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1607 elem.set('required', 'true')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1608 self.gen.logMsg('diag', '* also need to require alias', name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1609 if f is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1610 raise RuntimeError("Should not get here")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1611 if f.elem.get('category') == 'bitmask':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1612 followupFeature = f.elem.get('bitvalues')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1613 elif ftype == 'command':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1614 # Generate command dependencies in 'alias' attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1615 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1616 self.generateFeature(alias, 'command', self.cmddict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1617
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1618 genProc = self.gen.genCmd
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1619 for type_elem in f.elem.findall('.//type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1620 depname = type_elem.text
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1621 self.gen.logMsg('diag', 'Generating required parameter type',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1622 depname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1623 self.generateFeature(depname, 'type', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1624 elif ftype == 'enum':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1625 # Generate enum dependencies in 'alias' attribute
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1626 if alias:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1627 self.generateFeature(alias, 'enum', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1628 genProc = self.gen.genEnum
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1629
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1630 # Actually generate the type only if emitting declarations
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1631 if self.emitFeatures:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1632 self.gen.logMsg('diag', 'Emitting', ftype, 'decl for', fname)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1633 if genProc is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1634 raise RuntimeError("genProc is None when we should be emitting")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1635 genProc(f, fname, alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1636 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1637 self.gen.logMsg('diag', 'Skipping', ftype, fname,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1638 '(should not be emitted)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1639
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1640 if followupFeature:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1641 self.gen.logMsg('diag', 'Generating required bitvalues <enum>',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1642 followupFeature)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1643 self.generateFeature(followupFeature, "type", self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1644
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1645 def generateRequiredInterface(self, interface):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1646 """Generate all interfaces required by an API version or extension.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1647
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1648 - interface - Element for `<version>` or `<extension>`"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1649
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1650 # Loop over all features inside all <require> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1651 for features in interface.findall('require'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1652 for t in features.findall('type'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1653 self.generateFeature(t.get('name'), 'type', self.typedict, explicit=True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1654 for e in features.findall('enum'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1655 # If this is an enum extending an enumerated type, do not
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1656 # generate it - this has already been done in reg.parseTree,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1657 # by copying this element into the enumerated type.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1658 enumextends = e.get('extends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1659 if not enumextends:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1660 self.generateFeature(e.get('name'), 'enum', self.enumdict, explicit=True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1661 for c in features.findall('command'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1662 self.generateFeature(c.get('name'), 'command', self.cmddict, explicit=True)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1663
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1664 def generateSpirv(self, spirv, dictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1665 if spirv is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1666 self.gen.logMsg('diag', 'No entry found for element', name,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1667 'returning!')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1668 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1669
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1670 name = spirv.elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1671 # No known alias for spirv elements
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1672 alias = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1673 if spirv.emit:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1674 genProc = self.gen.genSpirv
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1675 genProc(spirv, name, alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1676
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1677 def stripUnsupportedAPIs(self, dictionary, attribute, supportedDictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1678 """Strip unsupported APIs from attributes of APIs.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1679 dictionary - *Info dictionary of APIs to be updated
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1680 attribute - attribute name to look for in each API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1681 supportedDictionary - dictionary in which to look for supported
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1682 API elements in the attribute"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1683
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1684 for key in dictionary:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1685 eleminfo = dictionary[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1686 attribstring = eleminfo.elem.get(attribute)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1687 if attribstring is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1688 apis = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1689 stripped = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1690 for api in attribstring.split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1691 ##print('Checking API {} referenced by {}'.format(api, key))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1692 if api in supportedDictionary and supportedDictionary[api].required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1693 apis.append(api)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1694 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1695 stripped = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1696 ##print('\t**STRIPPING API {} from {}'.format(api, key))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1697
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1698 # Update the attribute after stripping stuff.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1699 # Could sort apis before joining, but it is not a clear win
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1700 if stripped:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1701 eleminfo.elem.set(attribute, ','.join(apis))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1702
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1703 def stripUnsupportedAPIsFromList(self, dictionary, supportedDictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1704 """Strip unsupported APIs from attributes of APIs.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1705 dictionary - dictionary of list of structure name strings
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1706 supportedDictionary - dictionary in which to look for supported
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1707 API elements in the attribute"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1708
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1709 for key in dictionary:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1710 attribstring = dictionary[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1711 if attribstring is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1712 apis = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1713 stripped = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1714 for api in attribstring:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1715 ##print('Checking API {} referenced by {}'.format(api, key))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1716 if supportedDictionary[api].required:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1717 apis.append(api)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1718 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1719 stripped = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1720 ##print('\t**STRIPPING API {} from {}'.format(api, key))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1721
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1722 # Update the attribute after stripping stuff.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1723 # Could sort apis before joining, but it is not a clear win
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1724 if stripped:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1725 dictionary[key] = apis
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1726
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1727 def generateFormat(self, format, dictionary):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1728 if format is None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1729 self.gen.logMsg('diag', 'No entry found for format element',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1730 'returning!')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1731 return
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1732
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1733 name = format.elem.get('name')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1734 # No known alias for VkFormat elements
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1735 alias = None
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1736 if format.emit:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1737 genProc = self.gen.genFormat
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1738 genProc(format, name, alias)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1739
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1740 def generateSyncStage(self, sync):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1741 genProc = self.gen.genSyncStage
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1742 genProc(sync)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1743
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1744 def generateSyncAccess(self, sync):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1745 genProc = self.gen.genSyncAccess
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1746 genProc(sync)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1747
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1748 def generateSyncPipeline(self, sync):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1749 genProc = self.gen.genSyncPipeline
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1750 genProc(sync)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1751
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1752 def tagValidExtensionStructs(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1753 """Construct a "validextensionstructs" list for parent structures
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1754 based on "structextends" tags in child structures.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1755 Only do this for structures tagged as required."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1756
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1757 for typeinfo in self.typedict.values():
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1758 type_elem = typeinfo.elem
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1759 if typeinfo.required and type_elem.get('category') == 'struct':
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1760 struct_extends = type_elem.get('structextends')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1761 if struct_extends is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1762 for parent in struct_extends.split(','):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1763 # self.gen.logMsg('diag', type_elem.get('name'), 'extends', parent)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1764 self.validextensionstructs[parent].append(type_elem.get('name'))
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1765
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1766 # Sort the lists so they do not depend on the XML order
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1767 for parent in self.validextensionstructs:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1768 self.validextensionstructs[parent].sort()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1769
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1770 def apiGen(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1771 """Generate interface for specified versions using the current
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1772 generator and generator options"""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1773
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1774 self.gen.logMsg('diag', '*******************************************')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1775 self.gen.logMsg('diag', ' Registry.apiGen file:', self.genOpts.filename,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1776 'api:', self.genOpts.apiname,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1777 'profile:', self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1778 self.gen.logMsg('diag', '*******************************************')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1779
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1780 # Could reset required/declared flags for all features here.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1781 # This has been removed as never used. The initial motivation was
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1782 # the idea of calling apiGen() repeatedly for different targets, but
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1783 # this has never been done. The 20% or so build-time speedup that
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1784 # might result is not worth the effort to make it actually work.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1785 #
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1786 # self.apiReset()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1787
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1788 # Compile regexps used to select versions & extensions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1789 regVersions = re.compile(self.genOpts.versions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1790 regEmitVersions = re.compile(self.genOpts.emitversions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1791 regAddExtensions = re.compile(self.genOpts.addExtensions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1792 regRemoveExtensions = re.compile(self.genOpts.removeExtensions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1793 regEmitExtensions = re.compile(self.genOpts.emitExtensions)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1794 regEmitSpirv = re.compile(self.genOpts.emitSpirv)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1795 regEmitFormats = re.compile(self.genOpts.emitFormats)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1796
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1797 # Get all matching API feature names & add to list of FeatureInfo
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1798 # Note we used to select on feature version attributes, not names.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1799 features = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1800 apiMatch = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1801 for key in self.apidict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1802 fi = self.apidict[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1803 api = fi.elem.get('api')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1804 if apiNameMatch(self.genOpts.apiname, api):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1805 apiMatch = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1806 if regVersions.match(fi.name):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1807 # Matches API & version #s being generated. Mark for
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1808 # emission and add to the features[] list .
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1809 # @@ Could use 'declared' instead of 'emit'?
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1810 fi.emit = (regEmitVersions.match(fi.name) is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1811 features.append(fi)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1812 if not fi.emit:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1813 self.gen.logMsg('diag', 'NOT tagging feature api =', api,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1814 'name =', fi.name, 'version =', fi.version,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1815 'for emission (does not match emitversions pattern)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1816 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1817 self.gen.logMsg('diag', 'Including feature api =', api,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1818 'name =', fi.name, 'version =', fi.version,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1819 'for emission (matches emitversions pattern)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1820 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1821 self.gen.logMsg('diag', 'NOT including feature api =', api,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1822 'name =', fi.name, 'version =', fi.version,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1823 '(does not match requested versions)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1824 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1825 self.gen.logMsg('diag', 'NOT including feature api =', api,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1826 'name =', fi.name,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1827 '(does not match requested API)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1828 if not apiMatch:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1829 self.gen.logMsg('warn', 'No matching API versions found!')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1830
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1831 # Get all matching extensions, in order by their extension number,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1832 # and add to the list of features.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1833 # Start with extensions whose 'supported' attributes match the API
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1834 # being generated. Add extensions matching the pattern specified in
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1835 # regExtensions, then remove extensions matching the pattern
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1836 # specified in regRemoveExtensions
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1837 for (extName, ei) in sorted(self.extdict.items(), key=lambda x: x[1].number if x[1].number is not None else '0'):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1838 extName = ei.name
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1839 include = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1840
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1841 # Include extension if defaultExtensions is not None and is
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1842 # exactly matched by the 'supported' attribute.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1843 if apiNameMatch(self.genOpts.defaultExtensions,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1844 ei.elem.get('supported')):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1845 self.gen.logMsg('diag', 'Including extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1846 extName, "(defaultExtensions matches the 'supported' attribute)")
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1847 include = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1848
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1849 # Include additional extensions if the extension name matches
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1850 # the regexp specified in the generator options. This allows
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1851 # forcing extensions into an interface even if they are not
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1852 # tagged appropriately in the registry.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1853 # However, we still respect the 'supported' attribute.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1854 if regAddExtensions.match(extName) is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1855 if not apiNameMatch(self.genOpts.apiname, ei.elem.get('supported')):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1856 self.gen.logMsg('diag', 'NOT including extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1857 extName, '(matches explicitly requested, but does not match the \'supported\' attribute)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1858 include = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1859 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1860 self.gen.logMsg('diag', 'Including extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1861 extName, '(matches explicitly requested extensions to add)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1862 include = True
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1863 # Remove extensions if the name matches the regexp specified
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1864 # in generator options. This allows forcing removal of
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1865 # extensions from an interface even if they are tagged that
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1866 # way in the registry.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1867 if regRemoveExtensions.match(extName) is not None:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1868 self.gen.logMsg('diag', 'Removing extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1869 extName, '(matches explicitly requested extensions to remove)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1870 include = False
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1871
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1872 # If the extension is to be included, add it to the
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1873 # extension features list.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1874 if include:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1875 ei.emit = (regEmitExtensions.match(extName) is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1876 features.append(ei)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1877 if not ei.emit:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1878 self.gen.logMsg('diag', 'NOT tagging extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1879 extName,
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1880 'for emission (does not match emitextensions pattern)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1881
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1882 # Hack - can be removed when validity generator goes away
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1883 # (Jon) I am not sure what this does, or if it should
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1884 # respect the ei.emit flag above.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1885 self.requiredextensions.append(extName)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1886 else:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1887 self.gen.logMsg('diag', 'NOT including extension',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1888 extName, '(does not match api attribute or explicitly requested extensions)')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1889
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1890 # Add all spirv elements to list
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1891 # generators decide to emit them all or not
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1892 # Currently no filtering as no client of these elements needs filtering
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1893 spirvexts = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1894 for key in self.spirvextdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1895 si = self.spirvextdict[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1896 si.emit = (regEmitSpirv.match(key) is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1897 spirvexts.append(si)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1898 spirvcaps = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1899 for key in self.spirvcapdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1900 si = self.spirvcapdict[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1901 si.emit = (regEmitSpirv.match(key) is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1902 spirvcaps.append(si)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1903
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1904 formats = []
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1905 for key in self.formatsdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1906 si = self.formatsdict[key]
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1907 si.emit = (regEmitFormats.match(key) is not None)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1908 formats.append(si)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1909
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1910 # Sort the features list, if a sort procedure is defined
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1911 if self.genOpts.sortProcedure:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1912 self.genOpts.sortProcedure(features)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1913
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1914 # Passes 1+2: loop over requested API versions and extensions tagging
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1915 # types/commands/features as required (in an <require> block) or no
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1916 # longer required (in an <remove> block). <remove>s are processed
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1917 # after all <require>s, so removals win.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1918 # If a profile other than 'None' is being generated, it must
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1919 # match the profile attribute (if any) of the <require> and
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1920 # <remove> tags.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1921 self.gen.logMsg('diag', 'PASS 1: TAG FEATURES')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1922 for f in features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1923 self.gen.logMsg('diag', 'PASS 1: Tagging required and features for', f.name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1924 self.fillFeatureDictionary(f.elem, f.name, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1925 self.requireFeatures(f.elem, f.name, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1926 self.deprecateFeatures(f.elem, f.name, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1927 self.assignAdditionalValidity(f.elem, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1928
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1929 for f in features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1930 self.gen.logMsg('diag', 'PASS 2: Tagging removed features for', f.name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1931 self.removeFeatures(f.elem, f.name, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1932 self.removeAdditionalValidity(f.elem, self.genOpts.apiname, self.genOpts.profile)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1933
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1934 # Now, strip references to APIs that are not required.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1935 # At present such references may occur in:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1936 # Structs in <type category="struct"> 'structextends' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1937 # Enums in <command> 'successcodes' and 'errorcodes' attributes
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1938 self.stripUnsupportedAPIs(self.typedict, 'structextends', self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1939 self.stripUnsupportedAPIs(self.cmddict, 'successcodes', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1940 self.stripUnsupportedAPIs(self.cmddict, 'errorcodes', self.enumdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1941 self.stripUnsupportedAPIsFromList(self.validextensionstructs, self.typedict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1942
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1943 # Construct lists of valid extension structures
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1944 self.tagValidExtensionStructs()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1945
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1946 # @@May need to strip <spirvcapability> / <spirvextension> <enable>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1947 # tags of these forms:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1948 # <enable version="VK_API_VERSION_1_0"/>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1949 # <enable struct="VkPhysicalDeviceFeatures" feature="geometryShader" requires="VK_VERSION_1_0"/>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1950 # <enable extension="VK_KHR_shader_draw_parameters"/>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1951 # <enable property="VkPhysicalDeviceVulkan12Properties" member="shaderDenormPreserveFloat16" value="VK_TRUE" requires="VK_VERSION_1_2,VK_KHR_shader_float_controls"/>
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1952
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1953 # Pass 3: loop over specified API versions and extensions printing
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1954 # declarations for required things which have not already been
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1955 # generated.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1956 self.gen.logMsg('diag', 'PASS 3: GENERATE INTERFACES FOR FEATURES')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1957 self.gen.beginFile(self.genOpts)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1958 for f in features:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1959 self.gen.logMsg('diag', 'PASS 3: Generating interface for',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1960 f.name)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1961 emit = self.emitFeatures = f.emit
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1962 if not emit:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1963 self.gen.logMsg('diag', 'PASS 3: NOT declaring feature',
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1964 f.elem.get('name'), 'because it is not tagged for emission')
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1965 # Generate the interface (or just tag its elements as having been
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1966 # emitted, if they have not been).
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1967 self.gen.beginFeature(f.elem, emit)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1968 self.generateRequiredInterface(f.elem)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1969 self.gen.endFeature()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1970 # Generate spirv elements
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1971 for s in spirvexts:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1972 self.generateSpirv(s, self.spirvextdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1973 for s in spirvcaps:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1974 self.generateSpirv(s, self.spirvcapdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1975 for s in formats:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1976 self.generateFormat(s, self.formatsdict)
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1977 for s in self.syncstagedict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1978 self.generateSyncStage(self.syncstagedict[s])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1979 for s in self.syncaccessdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1980 self.generateSyncAccess(self.syncaccessdict[s])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1981 for s in self.syncpipelinedict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1982 self.generateSyncPipeline(self.syncpipelinedict[s])
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1983 self.gen.endFile()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1984
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1985 def apiReset(self):
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1986 """Reset type/enum/command dictionaries before generating another API.
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1987
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1988 Use between apiGen() calls to reset internal state."""
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1989 for datatype in self.typedict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1990 self.typedict[datatype].resetState()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1991 for enum in self.enumdict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1992 self.enumdict[enum].resetState()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1993 for cmd in self.cmddict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1994 self.cmddict[cmd].resetState()
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1995 for cmd in self.apidict:
f40d9d814c08 did: correct vulkan-api generator
sam <sam@basx.dev>
parents:
diff changeset
1996 self.apidict[cmd].resetState()