blob: b35b3a9625de2e18634e701d1d31eaec0e91fc54 [file] [log] [blame]
Mark Lobodzinski2d589822016-12-12 09:44:34 -07001#!/usr/bin/python3
Mark Lobodzinskif19fef92016-10-11 15:23:51 -06002#
Shannon McPherson9a4ae982019-01-07 16:05:25 -07003# Copyright (c) 2013-2019 The Khronos Group Inc.
Mark Lobodzinskif19fef92016-10-11 15:23:51 -06004#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Mark Lobodzinskif094c932018-05-22 13:48:48 -060017import argparse, cProfile, pdb, string, sys, time, os
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060018
19# Simple timer functions
20startTime = None
21
22def startTimer(timeit):
23 global startTime
Mike Schuchardta58389c2019-01-17 17:04:39 -080024 if timeit:
25 startTime = time.process_time()
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060026
27def endTimer(timeit, msg):
28 global startTime
Mike Schuchardta58389c2019-01-17 17:04:39 -080029 if timeit:
30 endTime = time.process_time()
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060031 write(msg, endTime - startTime, file=sys.stderr)
32 startTime = None
33
34# Turn a list of strings into a regexp string matching exactly those strings
Mark Lobodzinski62f71562017-10-24 13:41:18 -060035def makeREstring(list, default = None):
MichaƂ Janiszewski3c3ce9e2018-10-30 23:25:21 +010036 if len(list) > 0 or default is None:
Mark Lobodzinski62f71562017-10-24 13:41:18 -060037 return '^(' + '|'.join(list) + ')$'
38 else:
39 return default
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060040
41# Returns a directory of [ generator function, generator options ] indexed
42# by specified short names. The generator options incorporate the following
43# parameters:
44#
Mark Lobodzinski62f71562017-10-24 13:41:18 -060045# args is an parsed argument object; see below for the fields that are used.
46def makeGenOpts(args):
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060047 global genOpts
48 genOpts = {}
49
Mark Lobodzinski62f71562017-10-24 13:41:18 -060050 # Default class of extensions to include, or None
51 defaultExtensions = args.defaultExtensions
52
53 # Additional extensions to include (list of extensions)
54 extensions = args.extension
55
56 # Extensions to remove (list of extensions)
57 removeExtensions = args.removeExtensions
58
59 # Extensions to emit (list of extensions)
60 emitExtensions = args.emitExtensions
61
62 # Features to include (list of features)
63 features = args.feature
64
65 # Whether to disable inclusion protect in headers
66 protect = args.protect
67
68 # Output target directory
69 directory = args.directory
70
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060071 # Descriptive names for various regexp patterns used to select
72 # versions and extensions
Mark Lobodzinski16530212017-09-18 15:13:54 -060073 allFeatures = allExtensions = '.*'
Mark Lobodzinski62f71562017-10-24 13:41:18 -060074 noFeatures = noExtensions = None
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060075
Mark Lobodzinski62f71562017-10-24 13:41:18 -060076 # Turn lists of names/patterns into matching regular expressions
77 addExtensionsPat = makeREstring(extensions, None)
78 removeExtensionsPat = makeREstring(removeExtensions, None)
79 emitExtensionsPat = makeREstring(emitExtensions, allExtensions)
80 featuresPat = makeREstring(features, allFeatures)
Mark Lobodzinski16530212017-09-18 15:13:54 -060081
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060082 # Copyright text prefixing all headers (list of strings).
83 prefixStrings = [
84 '/*',
Shannon McPherson9a4ae982019-01-07 16:05:25 -070085 '** Copyright (c) 2015-2019 The Khronos Group Inc.',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060086 '**',
87 '** Licensed under the Apache License, Version 2.0 (the "License");',
88 '** you may not use this file except in compliance with the License.',
89 '** You may obtain a copy of the License at',
90 '**',
91 '** http://www.apache.org/licenses/LICENSE-2.0',
92 '**',
93 '** Unless required by applicable law or agreed to in writing, software',
94 '** distributed under the License is distributed on an "AS IS" BASIS,',
95 '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
96 '** See the License for the specific language governing permissions and',
97 '** limitations under the License.',
98 '*/',
99 ''
100 ]
101
102 # Text specific to Vulkan headers
103 vkPrefixStrings = [
104 '/*',
105 '** This header is generated from the Khronos Vulkan XML API Registry.',
106 '**',
107 '*/',
108 ''
109 ]
110
111 # Defaults for generating re-inclusion protection wrappers (or not)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600112 protectFeature = protect
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600113
Mike Schuchardt21638df2019-03-16 10:52:02 -0700114 # An API style convention object
115 conventions = VulkanConventions()
116
Mark Youngfa31cfa2018-06-04 16:41:24 -0600117 # ValidationLayer Generators
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700118 # Options for thread safety header code-generation
119 genOpts['thread_safety.h'] = [
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600120 ThreadOutputGenerator,
121 ThreadGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700122 conventions = conventions,
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700123 filename = 'thread_safety.h',
124 directory = directory,
125 apiname = 'vulkan',
126 profile = None,
127 versions = featuresPat,
128 emitversions = featuresPat,
129 defaultExtensions = 'vulkan',
130 addExtensions = addExtensionsPat,
131 removeExtensions = removeExtensionsPat,
132 emitExtensions = emitExtensionsPat,
133 prefixText = prefixStrings + vkPrefixStrings,
134 protectFeature = False,
135 apicall = 'VKAPI_ATTR ',
136 apientry = 'VKAPI_CALL ',
137 apientryp = 'VKAPI_PTR *',
138 alignFuncParam = 48,
139 expandEnumerants = False)
140 ]
141
142 # Options for thread safety source code-generation
143 genOpts['thread_safety.cpp'] = [
144 ThreadOutputGenerator,
145 ThreadGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700146 conventions = conventions,
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700147 filename = 'thread_safety.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600148 directory = directory,
149 apiname = 'vulkan',
150 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600151 versions = featuresPat,
152 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600153 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600154 addExtensions = addExtensionsPat,
155 removeExtensions = removeExtensionsPat,
156 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600157 prefixText = prefixStrings + vkPrefixStrings,
158 protectFeature = False,
159 apicall = 'VKAPI_ATTR ',
160 apientry = 'VKAPI_CALL ',
161 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600162 alignFuncParam = 48,
163 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600164 ]
165
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700166 # Options for stateless validation source file
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600167 genOpts['parameter_validation.cpp'] = [
168 ParameterValidationOutputGenerator,
169 ParameterValidationGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700170 conventions = conventions,
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600171 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600172 directory = directory,
173 apiname = 'vulkan',
174 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600175 versions = featuresPat,
176 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600177 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600178 addExtensions = addExtensionsPat,
179 removeExtensions = removeExtensionsPat,
180 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600181 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600182 apicall = 'VKAPI_ATTR ',
183 apientry = 'VKAPI_CALL ',
184 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600185 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600186 expandEnumerants = False,
187 valid_usage_path = args.scripts)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600188 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600189
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700190 # Options for stateless validation source file
191 genOpts['parameter_validation.h'] = [
192 ParameterValidationOutputGenerator,
193 ParameterValidationGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700194 conventions = conventions,
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700195 filename = 'parameter_validation.h',
196 directory = directory,
197 apiname = 'vulkan',
198 profile = None,
199 versions = featuresPat,
200 emitversions = featuresPat,
201 defaultExtensions = 'vulkan',
202 addExtensions = addExtensionsPat,
203 removeExtensions = removeExtensionsPat,
204 emitExtensions = emitExtensionsPat,
205 prefixText = prefixStrings + vkPrefixStrings,
206 apicall = 'VKAPI_ATTR ',
207 apientry = 'VKAPI_CALL ',
208 apientryp = 'VKAPI_PTR *',
209 alignFuncParam = 48,
210 expandEnumerants = False,
211 valid_usage_path = args.scripts)
212 ]
213
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600214 # Options for object_tracker code-generated validation routines
215 genOpts['object_tracker.cpp'] = [
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600216 ObjectTrackerOutputGenerator,
217 ObjectTrackerGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700218 conventions = conventions,
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600219 filename = 'object_tracker.cpp',
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600220 directory = directory,
221 apiname = 'vulkan',
222 profile = None,
223 versions = featuresPat,
224 emitversions = featuresPat,
225 defaultExtensions = 'vulkan',
226 addExtensions = addExtensionsPat,
227 removeExtensions = removeExtensionsPat,
228 emitExtensions = emitExtensionsPat,
229 prefixText = prefixStrings + vkPrefixStrings,
230 protectFeature = False,
231 apicall = 'VKAPI_ATTR ',
232 apientry = 'VKAPI_CALL ',
233 apientryp = 'VKAPI_PTR *',
234 alignFuncParam = 48,
235 expandEnumerants = False,
236 valid_usage_path = args.scripts)
237 ]
238
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600239 # Options for object_tracker code-generated prototypes
240 genOpts['object_tracker.h'] = [
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600241 ObjectTrackerOutputGenerator,
242 ObjectTrackerGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700243 conventions = conventions,
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600244 filename = 'object_tracker.h',
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600245 directory = directory,
246 apiname = 'vulkan',
247 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600248 versions = featuresPat,
249 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600250 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600251 addExtensions = addExtensionsPat,
252 removeExtensions = removeExtensionsPat,
253 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600254 prefixText = prefixStrings + vkPrefixStrings,
255 protectFeature = False,
256 apicall = 'VKAPI_ATTR ',
257 apientry = 'VKAPI_CALL ',
258 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600259 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600260 expandEnumerants = False,
261 valid_usage_path = args.scripts)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600262 ]
263
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700264 # Options for dispatch table helper generator
265 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700266 DispatchTableHelperOutputGenerator,
267 DispatchTableHelperOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700268 conventions = conventions,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700269 filename = 'vk_dispatch_table_helper.h',
270 directory = directory,
271 apiname = 'vulkan',
272 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600273 versions = featuresPat,
274 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700275 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600276 addExtensions = addExtensionsPat,
277 removeExtensions = removeExtensionsPat,
278 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700279 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700280 apicall = 'VKAPI_ATTR ',
281 apientry = 'VKAPI_CALL ',
282 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600283 alignFuncParam = 48,
284 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700285 ]
286
Mark Young0f183a82017-02-28 09:58:04 -0700287 # Options for Layer dispatch table generator
288 genOpts['vk_layer_dispatch_table.h'] = [
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700289 LayerDispatchTableOutputGenerator,
290 LayerDispatchTableGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700291 conventions = conventions,
Mark Young0f183a82017-02-28 09:58:04 -0700292 filename = 'vk_layer_dispatch_table.h',
293 directory = directory,
294 apiname = 'vulkan',
295 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600296 versions = featuresPat,
297 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700298 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600299 addExtensions = addExtensionsPat,
300 removeExtensions = removeExtensionsPat,
301 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700302 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700303 apicall = 'VKAPI_ATTR ',
304 apientry = 'VKAPI_CALL ',
305 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600306 alignFuncParam = 48,
307 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700308 ]
309
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700310 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700311 genOpts['vk_enum_string_helper.h'] = [
312 HelperFileOutputGenerator,
313 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700314 conventions = conventions,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700315 filename = 'vk_enum_string_helper.h',
316 directory = directory,
317 apiname = 'vulkan',
318 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600319 versions = featuresPat,
320 emitversions = featuresPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700321 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600322 addExtensions = addExtensionsPat,
323 removeExtensions = removeExtensionsPat,
324 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700325 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700326 apicall = 'VKAPI_ATTR ',
327 apientry = 'VKAPI_CALL ',
328 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700329 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600330 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700331 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700332 ]
333
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700334 # Helper file generator options for vk_safe_struct.h
335 genOpts['vk_safe_struct.h'] = [
336 HelperFileOutputGenerator,
337 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700338 conventions = conventions,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700339 filename = 'vk_safe_struct.h',
340 directory = directory,
341 apiname = 'vulkan',
342 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600343 versions = featuresPat,
344 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700345 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600346 addExtensions = addExtensionsPat,
347 removeExtensions = removeExtensionsPat,
348 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700349 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700350 apicall = 'VKAPI_ATTR ',
351 apientry = 'VKAPI_CALL ',
352 apientryp = 'VKAPI_PTR *',
353 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600354 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700355 helper_file_type = 'safe_struct_header')
356 ]
357
358 # Helper file generator options for vk_safe_struct.cpp
359 genOpts['vk_safe_struct.cpp'] = [
360 HelperFileOutputGenerator,
361 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700362 conventions = conventions,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700363 filename = 'vk_safe_struct.cpp',
364 directory = directory,
365 apiname = 'vulkan',
366 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600367 versions = featuresPat,
368 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700369 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600370 addExtensions = addExtensionsPat,
371 removeExtensions = removeExtensionsPat,
372 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700373 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700374 apicall = 'VKAPI_ATTR ',
375 apientry = 'VKAPI_CALL ',
376 apientryp = 'VKAPI_PTR *',
377 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600378 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700379 helper_file_type = 'safe_struct_source')
380 ]
381
Mark Lobodzinski70972012017-04-03 16:59:15 -0600382 # Helper file generator options for vk_object_types.h
383 genOpts['vk_object_types.h'] = [
384 HelperFileOutputGenerator,
385 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700386 conventions = conventions,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600387 filename = 'vk_object_types.h',
388 directory = directory,
389 apiname = 'vulkan',
390 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600391 versions = featuresPat,
392 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600393 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600394 addExtensions = addExtensionsPat,
395 removeExtensions = removeExtensionsPat,
396 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600397 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600398 apicall = 'VKAPI_ATTR ',
399 apientry = 'VKAPI_CALL ',
400 apientryp = 'VKAPI_PTR *',
401 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600402 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600403 helper_file_type = 'object_types_header')
404 ]
405
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600406 # Helper file generator options for extension_helper.h
407 genOpts['vk_extension_helper.h'] = [
408 HelperFileOutputGenerator,
409 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700410 conventions = conventions,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600411 filename = 'vk_extension_helper.h',
412 directory = directory,
413 apiname = 'vulkan',
414 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600415 versions = featuresPat,
416 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600417 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600418 addExtensions = addExtensionsPat,
419 removeExtensions = removeExtensionsPat,
420 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600421 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600422 apicall = 'VKAPI_ATTR ',
423 apientry = 'VKAPI_CALL ',
424 apientryp = 'VKAPI_PTR *',
425 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600426 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600427 helper_file_type = 'extension_helper_header')
428 ]
429
John Zulaufde972ac2017-10-26 12:07:05 -0600430 # Helper file generator options for typemap_helper.h
431 genOpts['vk_typemap_helper.h'] = [
432 HelperFileOutputGenerator,
433 HelperFileOutputGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700434 conventions = conventions,
John Zulaufde972ac2017-10-26 12:07:05 -0600435 filename = 'vk_typemap_helper.h',
436 directory = directory,
437 apiname = 'vulkan',
438 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600439 versions = featuresPat,
440 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600441 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600442 addExtensions = addExtensionsPat,
443 removeExtensions = removeExtensionsPat,
444 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600445 prefixText = prefixStrings + vkPrefixStrings,
446 protectFeature = False,
447 apicall = 'VKAPI_ATTR ',
448 apientry = 'VKAPI_CALL ',
449 apientryp = 'VKAPI_PTR *',
450 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600451 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600452 helper_file_type = 'typemap_helper_header')
453 ]
454
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600455 # Layer chassis related generation structs
456 # Options for layer chassis header
457 genOpts['chassis.h'] = [
458 LayerChassisOutputGenerator,
459 LayerChassisGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700460 conventions = conventions,
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600461 filename = 'chassis.h',
462 directory = directory,
463 apiname = 'vulkan',
464 profile = None,
465 versions = featuresPat,
466 emitversions = featuresPat,
467 defaultExtensions = 'vulkan',
468 addExtensions = addExtensionsPat,
469 removeExtensions = removeExtensionsPat,
470 emitExtensions = emitExtensionsPat,
471 prefixText = prefixStrings + vkPrefixStrings,
472 apicall = 'VKAPI_ATTR ',
473 apientry = 'VKAPI_CALL ',
474 apientryp = 'VKAPI_PTR *',
475 alignFuncParam = 48,
476 helper_file_type = 'layer_chassis_header',
477 expandEnumerants = False)
478 ]
479
480 # Options for layer chassis source file
481 genOpts['chassis.cpp'] = [
482 LayerChassisOutputGenerator,
483 LayerChassisGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700484 conventions = conventions,
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600485 filename = 'chassis.cpp',
486 directory = directory,
487 apiname = 'vulkan',
488 profile = None,
489 versions = featuresPat,
490 emitversions = featuresPat,
491 defaultExtensions = 'vulkan',
492 addExtensions = addExtensionsPat,
493 removeExtensions = removeExtensionsPat,
494 emitExtensions = emitExtensionsPat,
495 prefixText = prefixStrings + vkPrefixStrings,
496 apicall = 'VKAPI_ATTR ',
497 apientry = 'VKAPI_CALL ',
498 apientryp = 'VKAPI_PTR *',
499 alignFuncParam = 48,
500 helper_file_type = 'layer_chassis_source',
501 expandEnumerants = False)
502 ]
503
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700504 # Options for layer chassis dispatch source file
505 genOpts['layer_chassis_dispatch.cpp'] = [
506 LayerChassisDispatchOutputGenerator,
507 LayerChassisDispatchGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700508 conventions = conventions,
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700509 filename = 'layer_chassis_dispatch.cpp',
510 directory = directory,
511 apiname = 'vulkan',
512 profile = None,
513 versions = featuresPat,
514 emitversions = featuresPat,
515 defaultExtensions = 'vulkan',
516 addExtensions = addExtensionsPat,
517 removeExtensions = removeExtensionsPat,
518 emitExtensions = emitExtensionsPat,
519 prefixText = prefixStrings + vkPrefixStrings,
520 protectFeature = False,
521 apicall = 'VKAPI_ATTR ',
522 apientry = 'VKAPI_CALL ',
523 apientryp = 'VKAPI_PTR *',
524 alignFuncParam = 48,
525 expandEnumerants = False)
526 ]
527
528 # Options for layer chassis dispatch header file
529 genOpts['layer_chassis_dispatch.h'] = [
530 LayerChassisDispatchOutputGenerator,
531 LayerChassisDispatchGeneratorOptions(
Mike Schuchardt21638df2019-03-16 10:52:02 -0700532 conventions = conventions,
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700533 filename = 'layer_chassis_dispatch.h',
534 directory = directory,
535 apiname = 'vulkan',
536 profile = None,
537 versions = featuresPat,
538 emitversions = featuresPat,
539 defaultExtensions = 'vulkan',
540 addExtensions = addExtensionsPat,
541 removeExtensions = removeExtensionsPat,
542 emitExtensions = emitExtensionsPat,
543 prefixText = prefixStrings + vkPrefixStrings,
544 protectFeature = False,
545 apicall = 'VKAPI_ATTR ',
546 apientry = 'VKAPI_CALL ',
547 apientryp = 'VKAPI_PTR *',
548 alignFuncParam = 48,
549 expandEnumerants = False)
550 ]
551
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600552
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600553# Generate a target based on the options in the matching genOpts{} object.
554# This is encapsulated in a function so it can be profiled and/or timed.
555# The args parameter is an parsed argument object containing the following
556# fields that are used:
557# target - target to generate
558# directory - directory to generate it in
559# protect - True if re-inclusion wrappers should be created
560# extensions - list of additional extensions to include in generated
561# interfaces
562def genTarget(args):
563 global genOpts
564
565 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600566 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600567
568 if (args.target in genOpts.keys()):
569 createGenerator = genOpts[args.target][0]
570 options = genOpts[args.target][1]
571
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700572 if not args.quiet:
573 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600574 write('* options.versions =', options.versions, file=sys.stderr)
575 write('* options.emitversions =', options.emitversions, file=sys.stderr)
576 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
577 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
578 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
579 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600580
581 startTimer(args.time)
582 gen = createGenerator(errFile=errWarn,
583 warnFile=errWarn,
584 diagFile=diag)
585 reg.setGenerator(gen)
586 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700587
588 if not args.quiet:
589 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600590 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
591 else:
592 write('No generator options for unknown target:',
593 args.target, file=sys.stderr)
594
Mark Lobodzinski16530212017-09-18 15:13:54 -0600595# -feature name
596# -extension name
597# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600598# of names, or a regular expression.
599if __name__ == '__main__':
600 parser = argparse.ArgumentParser()
601
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600602 parser.add_argument('-defaultExtensions', action='store',
603 default='vulkan',
604 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600605 parser.add_argument('-extension', action='append',
606 default=[],
607 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600608 parser.add_argument('-removeExtensions', action='append',
609 default=[],
610 help='Specify an extension or extensions to remove from targets')
611 parser.add_argument('-emitExtensions', action='append',
612 default=[],
613 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600614 parser.add_argument('-feature', action='append',
615 default=[],
616 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600617 parser.add_argument('-debug', action='store_true',
618 help='Enable debugging')
619 parser.add_argument('-dump', action='store_true',
620 help='Enable dump to stderr')
621 parser.add_argument('-diagfile', action='store',
622 default=None,
623 help='Write diagnostics to specified file')
624 parser.add_argument('-errfile', action='store',
625 default=None,
626 help='Write errors and warnings to specified file instead of stderr')
627 parser.add_argument('-noprotect', dest='protect', action='store_false',
628 help='Disable inclusion protection in output headers')
629 parser.add_argument('-profile', action='store_true',
630 help='Enable profiling')
631 parser.add_argument('-registry', action='store',
632 default='vk.xml',
633 help='Use specified registry file instead of vk.xml')
634 parser.add_argument('-time', action='store_true',
635 help='Enable timing')
636 parser.add_argument('-validate', action='store_true',
637 help='Enable group validation')
638 parser.add_argument('-o', action='store', dest='directory',
639 default='.',
640 help='Create target and related files in specified directory')
641 parser.add_argument('target', metavar='target', nargs='?',
642 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700643 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700644 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700645 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
646 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600647
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600648 # This argument tells us where to load the script from the Vulkan-Headers registry
649 parser.add_argument('-scripts', action='store',
650 help='Find additional scripts in this directory')
651
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600652 args = parser.parse_args()
653
Mike Schuchardtc64a5412019-07-02 00:27:05 -0700654 # default scripts path to be same as registry
655 if not args.scripts:
656 args.scripts = os.path.dirname(args.registry)
657
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600658 scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
659 registry_headers_path = os.path.join(scripts_directory_path, args.scripts)
660 sys.path.insert(0, registry_headers_path)
661
662 from reg import *
663 from generator import write
664 from cgenerator import CGeneratorOptions, COutputGenerator
665
666 # ValidationLayer Generator Modifications
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700667 from thread_safety_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600668 from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600669 from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
670 from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
671 from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700672 from layer_dispatch_table_generator import LayerDispatchTableOutputGenerator, LayerDispatchTableGeneratorOptions
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600673 from layer_chassis_generator import LayerChassisOutputGenerator, LayerChassisGeneratorOptions
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700674 from layer_chassis_dispatch_generator import LayerChassisDispatchOutputGenerator, LayerChassisDispatchGeneratorOptions
Mike Schuchardt4fd8cbc2019-04-22 10:52:29 -0700675 # Temporary workaround for vkconventions python2 compatibility
676 import abc; abc.ABC = abc.ABCMeta('ABC', (object,), {})
Mike Schuchardt21638df2019-03-16 10:52:02 -0700677 from vkconventions import VulkanConventions
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600678
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600679 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600680 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600681 args.extension = [name for arg in args.extension for name in arg.split()]
682
683 # Load & parse registry
684 reg = Registry()
685
686 startTimer(args.time)
687 tree = etree.parse(args.registry)
688 endTimer(args.time, '* Time to make ElementTree =')
689
Mike Schuchardt03646252018-03-09 08:39:43 -0700690 if args.debug:
691 pdb.run('reg.loadElementTree(tree)')
692 else:
693 startTimer(args.time)
694 reg.loadElementTree(tree)
695 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600696
697 if (args.validate):
698 reg.validateGroups()
699
700 if (args.dump):
701 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700702 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600703
704 # create error/warning & diagnostic files
705 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700706 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600707 else:
708 errWarn = sys.stderr
709
710 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700711 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600712 else:
713 diag = None
714
715 if (args.debug):
716 pdb.run('genTarget(args)')
717 elif (args.profile):
718 import cProfile, pstats
719 cProfile.run('genTarget(args)', 'profile.txt')
720 p = pstats.Stats('profile.txt')
721 p.strip_dirs().sort_stats('time').print_stats(50)
722 else:
723 genTarget(args)