blob: bd1d3cf0a6cb2ce93d08fe406ee848790c1aec0e [file] [log] [blame]
Mark Lobodzinski2d589822016-12-12 09:44:34 -07001#!/usr/bin/python3
Mark Lobodzinskif19fef92016-10-11 15:23:51 -06002#
Mike Schuchardt03646252018-03-09 08:39:43 -07003# Copyright (c) 2013-2018 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
Eric Werness30127fd2018-10-31 21:01:03 -070024 startTime = time.process_time()
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060025
26def endTimer(timeit, msg):
27 global startTime
Eric Werness30127fd2018-10-31 21:01:03 -070028 endTime = time.process_time()
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060029 if (timeit):
30 write(msg, endTime - startTime, file=sys.stderr)
31 startTime = None
32
33# Turn a list of strings into a regexp string matching exactly those strings
Mark Lobodzinski62f71562017-10-24 13:41:18 -060034def makeREstring(list, default = None):
MichaƂ Janiszewski3c3ce9e2018-10-30 23:25:21 +010035 if len(list) > 0 or default is None:
Mark Lobodzinski62f71562017-10-24 13:41:18 -060036 return '^(' + '|'.join(list) + ')$'
37 else:
38 return default
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060039
40# Returns a directory of [ generator function, generator options ] indexed
41# by specified short names. The generator options incorporate the following
42# parameters:
43#
Mark Lobodzinski62f71562017-10-24 13:41:18 -060044# args is an parsed argument object; see below for the fields that are used.
45def makeGenOpts(args):
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060046 global genOpts
47 genOpts = {}
48
Mark Lobodzinski62f71562017-10-24 13:41:18 -060049 # Default class of extensions to include, or None
50 defaultExtensions = args.defaultExtensions
51
52 # Additional extensions to include (list of extensions)
53 extensions = args.extension
54
55 # Extensions to remove (list of extensions)
56 removeExtensions = args.removeExtensions
57
58 # Extensions to emit (list of extensions)
59 emitExtensions = args.emitExtensions
60
61 # Features to include (list of features)
62 features = args.feature
63
64 # Whether to disable inclusion protect in headers
65 protect = args.protect
66
67 # Output target directory
68 directory = args.directory
69
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060070 # Descriptive names for various regexp patterns used to select
71 # versions and extensions
Mark Lobodzinski16530212017-09-18 15:13:54 -060072 allFeatures = allExtensions = '.*'
Mark Lobodzinski62f71562017-10-24 13:41:18 -060073 noFeatures = noExtensions = None
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060074
Mark Lobodzinski62f71562017-10-24 13:41:18 -060075 # Turn lists of names/patterns into matching regular expressions
76 addExtensionsPat = makeREstring(extensions, None)
77 removeExtensionsPat = makeREstring(removeExtensions, None)
78 emitExtensionsPat = makeREstring(emitExtensions, allExtensions)
79 featuresPat = makeREstring(features, allFeatures)
Mark Lobodzinski16530212017-09-18 15:13:54 -060080
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060081 # Copyright text prefixing all headers (list of strings).
82 prefixStrings = [
83 '/*',
Mike Schuchardt03646252018-03-09 08:39:43 -070084 '** Copyright (c) 2015-2018 The Khronos Group Inc.',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060085 '**',
86 '** Licensed under the Apache License, Version 2.0 (the "License");',
87 '** you may not use this file except in compliance with the License.',
88 '** You may obtain a copy of the License at',
89 '**',
90 '** http://www.apache.org/licenses/LICENSE-2.0',
91 '**',
92 '** Unless required by applicable law or agreed to in writing, software',
93 '** distributed under the License is distributed on an "AS IS" BASIS,',
94 '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
95 '** See the License for the specific language governing permissions and',
96 '** limitations under the License.',
97 '*/',
98 ''
99 ]
100
101 # Text specific to Vulkan headers
102 vkPrefixStrings = [
103 '/*',
104 '** This header is generated from the Khronos Vulkan XML API Registry.',
105 '**',
106 '*/',
107 ''
108 ]
109
110 # Defaults for generating re-inclusion protection wrappers (or not)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600111 protectFeature = protect
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600112
Mark Youngfa31cfa2018-06-04 16:41:24 -0600113 # ValidationLayer Generators
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700114 # Options for thread safety header code-generation
115 genOpts['thread_safety.h'] = [
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600116 ThreadOutputGenerator,
117 ThreadGeneratorOptions(
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700118 filename = 'thread_safety.h',
119 directory = directory,
120 apiname = 'vulkan',
121 profile = None,
122 versions = featuresPat,
123 emitversions = featuresPat,
124 defaultExtensions = 'vulkan',
125 addExtensions = addExtensionsPat,
126 removeExtensions = removeExtensionsPat,
127 emitExtensions = emitExtensionsPat,
128 prefixText = prefixStrings + vkPrefixStrings,
129 protectFeature = False,
130 apicall = 'VKAPI_ATTR ',
131 apientry = 'VKAPI_CALL ',
132 apientryp = 'VKAPI_PTR *',
133 alignFuncParam = 48,
134 expandEnumerants = False)
135 ]
136
137 # Options for thread safety source code-generation
138 genOpts['thread_safety.cpp'] = [
139 ThreadOutputGenerator,
140 ThreadGeneratorOptions(
141 filename = 'thread_safety.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600142 directory = directory,
143 apiname = 'vulkan',
144 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600145 versions = featuresPat,
146 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600147 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600148 addExtensions = addExtensionsPat,
149 removeExtensions = removeExtensionsPat,
150 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600151 prefixText = prefixStrings + vkPrefixStrings,
152 protectFeature = False,
153 apicall = 'VKAPI_ATTR ',
154 apientry = 'VKAPI_CALL ',
155 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600156 alignFuncParam = 48,
157 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600158 ]
159
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700160 # Options for stateless validation source file
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600161 genOpts['parameter_validation.cpp'] = [
162 ParameterValidationOutputGenerator,
163 ParameterValidationGeneratorOptions(
164 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600165 directory = directory,
166 apiname = 'vulkan',
167 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600168 versions = featuresPat,
169 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600170 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600171 addExtensions = addExtensionsPat,
172 removeExtensions = removeExtensionsPat,
173 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600174 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600175 apicall = 'VKAPI_ATTR ',
176 apientry = 'VKAPI_CALL ',
177 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600178 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600179 expandEnumerants = False,
180 valid_usage_path = args.scripts)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600181 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600182
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700183 # Options for stateless validation source file
184 genOpts['parameter_validation.h'] = [
185 ParameterValidationOutputGenerator,
186 ParameterValidationGeneratorOptions(
187 filename = 'parameter_validation.h',
188 directory = directory,
189 apiname = 'vulkan',
190 profile = None,
191 versions = featuresPat,
192 emitversions = featuresPat,
193 defaultExtensions = 'vulkan',
194 addExtensions = addExtensionsPat,
195 removeExtensions = removeExtensionsPat,
196 emitExtensions = emitExtensionsPat,
197 prefixText = prefixStrings + vkPrefixStrings,
198 apicall = 'VKAPI_ATTR ',
199 apientry = 'VKAPI_CALL ',
200 apientryp = 'VKAPI_PTR *',
201 alignFuncParam = 48,
202 expandEnumerants = False,
203 valid_usage_path = args.scripts)
204 ]
205
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600206 # Options for object_tracker code-generated validation routines
207 genOpts['object_tracker.cpp'] = [
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600208 ObjectTrackerOutputGenerator,
209 ObjectTrackerGeneratorOptions(
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600210 filename = 'object_tracker.cpp',
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600211 directory = directory,
212 apiname = 'vulkan',
213 profile = None,
214 versions = featuresPat,
215 emitversions = featuresPat,
216 defaultExtensions = 'vulkan',
217 addExtensions = addExtensionsPat,
218 removeExtensions = removeExtensionsPat,
219 emitExtensions = emitExtensionsPat,
220 prefixText = prefixStrings + vkPrefixStrings,
221 protectFeature = False,
222 apicall = 'VKAPI_ATTR ',
223 apientry = 'VKAPI_CALL ',
224 apientryp = 'VKAPI_PTR *',
225 alignFuncParam = 48,
226 expandEnumerants = False,
227 valid_usage_path = args.scripts)
228 ]
229
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600230 # Options for object_tracker code-generated prototypes
231 genOpts['object_tracker.h'] = [
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600232 ObjectTrackerOutputGenerator,
233 ObjectTrackerGeneratorOptions(
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600234 filename = 'object_tracker.h',
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600235 directory = directory,
236 apiname = 'vulkan',
237 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600238 versions = featuresPat,
239 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600240 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600241 addExtensions = addExtensionsPat,
242 removeExtensions = removeExtensionsPat,
243 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600244 prefixText = prefixStrings + vkPrefixStrings,
245 protectFeature = False,
246 apicall = 'VKAPI_ATTR ',
247 apientry = 'VKAPI_CALL ',
248 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600249 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600250 expandEnumerants = False,
251 valid_usage_path = args.scripts)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600252 ]
253
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700254 # Options for dispatch table helper generator
255 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700256 DispatchTableHelperOutputGenerator,
257 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700258 filename = 'vk_dispatch_table_helper.h',
259 directory = directory,
260 apiname = 'vulkan',
261 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600262 versions = featuresPat,
263 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700264 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600265 addExtensions = addExtensionsPat,
266 removeExtensions = removeExtensionsPat,
267 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700268 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700269 apicall = 'VKAPI_ATTR ',
270 apientry = 'VKAPI_CALL ',
271 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600272 alignFuncParam = 48,
273 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700274 ]
275
Mark Young0f183a82017-02-28 09:58:04 -0700276 # Options for Layer dispatch table generator
277 genOpts['vk_layer_dispatch_table.h'] = [
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700278 LayerDispatchTableOutputGenerator,
279 LayerDispatchTableGeneratorOptions(
Mark Young0f183a82017-02-28 09:58:04 -0700280 filename = 'vk_layer_dispatch_table.h',
281 directory = directory,
282 apiname = 'vulkan',
283 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600284 versions = featuresPat,
285 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700286 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600287 addExtensions = addExtensionsPat,
288 removeExtensions = removeExtensionsPat,
289 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700290 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700291 apicall = 'VKAPI_ATTR ',
292 apientry = 'VKAPI_CALL ',
293 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600294 alignFuncParam = 48,
295 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700296 ]
297
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700298 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700299 genOpts['vk_enum_string_helper.h'] = [
300 HelperFileOutputGenerator,
301 HelperFileOutputGeneratorOptions(
302 filename = 'vk_enum_string_helper.h',
303 directory = directory,
304 apiname = 'vulkan',
305 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600306 versions = featuresPat,
307 emitversions = featuresPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700308 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600309 addExtensions = addExtensionsPat,
310 removeExtensions = removeExtensionsPat,
311 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700312 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700313 apicall = 'VKAPI_ATTR ',
314 apientry = 'VKAPI_CALL ',
315 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700316 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600317 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700318 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700319 ]
320
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700321 # Helper file generator options for vk_safe_struct.h
322 genOpts['vk_safe_struct.h'] = [
323 HelperFileOutputGenerator,
324 HelperFileOutputGeneratorOptions(
325 filename = 'vk_safe_struct.h',
326 directory = directory,
327 apiname = 'vulkan',
328 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600329 versions = featuresPat,
330 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700331 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600332 addExtensions = addExtensionsPat,
333 removeExtensions = removeExtensionsPat,
334 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700335 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700336 apicall = 'VKAPI_ATTR ',
337 apientry = 'VKAPI_CALL ',
338 apientryp = 'VKAPI_PTR *',
339 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600340 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700341 helper_file_type = 'safe_struct_header')
342 ]
343
344 # Helper file generator options for vk_safe_struct.cpp
345 genOpts['vk_safe_struct.cpp'] = [
346 HelperFileOutputGenerator,
347 HelperFileOutputGeneratorOptions(
348 filename = 'vk_safe_struct.cpp',
349 directory = directory,
350 apiname = 'vulkan',
351 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600352 versions = featuresPat,
353 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700354 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600355 addExtensions = addExtensionsPat,
356 removeExtensions = removeExtensionsPat,
357 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700358 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700359 apicall = 'VKAPI_ATTR ',
360 apientry = 'VKAPI_CALL ',
361 apientryp = 'VKAPI_PTR *',
362 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600363 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700364 helper_file_type = 'safe_struct_source')
365 ]
366
Mark Lobodzinski70972012017-04-03 16:59:15 -0600367 # Helper file generator options for vk_object_types.h
368 genOpts['vk_object_types.h'] = [
369 HelperFileOutputGenerator,
370 HelperFileOutputGeneratorOptions(
371 filename = 'vk_object_types.h',
372 directory = directory,
373 apiname = 'vulkan',
374 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600375 versions = featuresPat,
376 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600377 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600378 addExtensions = addExtensionsPat,
379 removeExtensions = removeExtensionsPat,
380 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600381 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600382 apicall = 'VKAPI_ATTR ',
383 apientry = 'VKAPI_CALL ',
384 apientryp = 'VKAPI_PTR *',
385 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600386 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600387 helper_file_type = 'object_types_header')
388 ]
389
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600390 # Helper file generator options for extension_helper.h
391 genOpts['vk_extension_helper.h'] = [
392 HelperFileOutputGenerator,
393 HelperFileOutputGeneratorOptions(
394 filename = 'vk_extension_helper.h',
395 directory = directory,
396 apiname = 'vulkan',
397 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600398 versions = featuresPat,
399 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600400 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600401 addExtensions = addExtensionsPat,
402 removeExtensions = removeExtensionsPat,
403 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600404 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600405 apicall = 'VKAPI_ATTR ',
406 apientry = 'VKAPI_CALL ',
407 apientryp = 'VKAPI_PTR *',
408 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600409 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600410 helper_file_type = 'extension_helper_header')
411 ]
412
John Zulaufde972ac2017-10-26 12:07:05 -0600413 # Helper file generator options for typemap_helper.h
414 genOpts['vk_typemap_helper.h'] = [
415 HelperFileOutputGenerator,
416 HelperFileOutputGeneratorOptions(
417 filename = 'vk_typemap_helper.h',
418 directory = directory,
419 apiname = 'vulkan',
420 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600421 versions = featuresPat,
422 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600423 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600424 addExtensions = addExtensionsPat,
425 removeExtensions = removeExtensionsPat,
426 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600427 prefixText = prefixStrings + vkPrefixStrings,
428 protectFeature = False,
429 apicall = 'VKAPI_ATTR ',
430 apientry = 'VKAPI_CALL ',
431 apientryp = 'VKAPI_PTR *',
432 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600433 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600434 helper_file_type = 'typemap_helper_header')
435 ]
436
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600437 # Layer chassis related generation structs
438 # Options for layer chassis header
439 genOpts['chassis.h'] = [
440 LayerChassisOutputGenerator,
441 LayerChassisGeneratorOptions(
442 filename = 'chassis.h',
443 directory = directory,
444 apiname = 'vulkan',
445 profile = None,
446 versions = featuresPat,
447 emitversions = featuresPat,
448 defaultExtensions = 'vulkan',
449 addExtensions = addExtensionsPat,
450 removeExtensions = removeExtensionsPat,
451 emitExtensions = emitExtensionsPat,
452 prefixText = prefixStrings + vkPrefixStrings,
453 apicall = 'VKAPI_ATTR ',
454 apientry = 'VKAPI_CALL ',
455 apientryp = 'VKAPI_PTR *',
456 alignFuncParam = 48,
457 helper_file_type = 'layer_chassis_header',
458 expandEnumerants = False)
459 ]
460
461 # Options for layer chassis source file
462 genOpts['chassis.cpp'] = [
463 LayerChassisOutputGenerator,
464 LayerChassisGeneratorOptions(
465 filename = 'chassis.cpp',
466 directory = directory,
467 apiname = 'vulkan',
468 profile = None,
469 versions = featuresPat,
470 emitversions = featuresPat,
471 defaultExtensions = 'vulkan',
472 addExtensions = addExtensionsPat,
473 removeExtensions = removeExtensionsPat,
474 emitExtensions = emitExtensionsPat,
475 prefixText = prefixStrings + vkPrefixStrings,
476 apicall = 'VKAPI_ATTR ',
477 apientry = 'VKAPI_CALL ',
478 apientryp = 'VKAPI_PTR *',
479 alignFuncParam = 48,
480 helper_file_type = 'layer_chassis_source',
481 expandEnumerants = False)
482 ]
483
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700484 # Options for layer chassis dispatch source file
485 genOpts['layer_chassis_dispatch.cpp'] = [
486 LayerChassisDispatchOutputGenerator,
487 LayerChassisDispatchGeneratorOptions(
488 filename = 'layer_chassis_dispatch.cpp',
489 directory = directory,
490 apiname = 'vulkan',
491 profile = None,
492 versions = featuresPat,
493 emitversions = featuresPat,
494 defaultExtensions = 'vulkan',
495 addExtensions = addExtensionsPat,
496 removeExtensions = removeExtensionsPat,
497 emitExtensions = emitExtensionsPat,
498 prefixText = prefixStrings + vkPrefixStrings,
499 protectFeature = False,
500 apicall = 'VKAPI_ATTR ',
501 apientry = 'VKAPI_CALL ',
502 apientryp = 'VKAPI_PTR *',
503 alignFuncParam = 48,
504 expandEnumerants = False)
505 ]
506
507 # Options for layer chassis dispatch header file
508 genOpts['layer_chassis_dispatch.h'] = [
509 LayerChassisDispatchOutputGenerator,
510 LayerChassisDispatchGeneratorOptions(
511 filename = 'layer_chassis_dispatch.h',
512 directory = directory,
513 apiname = 'vulkan',
514 profile = None,
515 versions = featuresPat,
516 emitversions = featuresPat,
517 defaultExtensions = 'vulkan',
518 addExtensions = addExtensionsPat,
519 removeExtensions = removeExtensionsPat,
520 emitExtensions = emitExtensionsPat,
521 prefixText = prefixStrings + vkPrefixStrings,
522 protectFeature = False,
523 apicall = 'VKAPI_ATTR ',
524 apientry = 'VKAPI_CALL ',
525 apientryp = 'VKAPI_PTR *',
526 alignFuncParam = 48,
527 expandEnumerants = False)
528 ]
529
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600530
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600531# Generate a target based on the options in the matching genOpts{} object.
532# This is encapsulated in a function so it can be profiled and/or timed.
533# The args parameter is an parsed argument object containing the following
534# fields that are used:
535# target - target to generate
536# directory - directory to generate it in
537# protect - True if re-inclusion wrappers should be created
538# extensions - list of additional extensions to include in generated
539# interfaces
540def genTarget(args):
541 global genOpts
542
543 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600544 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600545
546 if (args.target in genOpts.keys()):
547 createGenerator = genOpts[args.target][0]
548 options = genOpts[args.target][1]
549
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700550 if not args.quiet:
551 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600552 write('* options.versions =', options.versions, file=sys.stderr)
553 write('* options.emitversions =', options.emitversions, file=sys.stderr)
554 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
555 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
556 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
557 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600558
559 startTimer(args.time)
560 gen = createGenerator(errFile=errWarn,
561 warnFile=errWarn,
562 diagFile=diag)
563 reg.setGenerator(gen)
564 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700565
566 if not args.quiet:
567 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600568 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
569 else:
570 write('No generator options for unknown target:',
571 args.target, file=sys.stderr)
572
Mark Lobodzinski16530212017-09-18 15:13:54 -0600573# -feature name
574# -extension name
575# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600576# of names, or a regular expression.
577if __name__ == '__main__':
578 parser = argparse.ArgumentParser()
579
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600580 parser.add_argument('-defaultExtensions', action='store',
581 default='vulkan',
582 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600583 parser.add_argument('-extension', action='append',
584 default=[],
585 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600586 parser.add_argument('-removeExtensions', action='append',
587 default=[],
588 help='Specify an extension or extensions to remove from targets')
589 parser.add_argument('-emitExtensions', action='append',
590 default=[],
591 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600592 parser.add_argument('-feature', action='append',
593 default=[],
594 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600595 parser.add_argument('-debug', action='store_true',
596 help='Enable debugging')
597 parser.add_argument('-dump', action='store_true',
598 help='Enable dump to stderr')
599 parser.add_argument('-diagfile', action='store',
600 default=None,
601 help='Write diagnostics to specified file')
602 parser.add_argument('-errfile', action='store',
603 default=None,
604 help='Write errors and warnings to specified file instead of stderr')
605 parser.add_argument('-noprotect', dest='protect', action='store_false',
606 help='Disable inclusion protection in output headers')
607 parser.add_argument('-profile', action='store_true',
608 help='Enable profiling')
609 parser.add_argument('-registry', action='store',
610 default='vk.xml',
611 help='Use specified registry file instead of vk.xml')
612 parser.add_argument('-time', action='store_true',
613 help='Enable timing')
614 parser.add_argument('-validate', action='store_true',
615 help='Enable group validation')
616 parser.add_argument('-o', action='store', dest='directory',
617 default='.',
618 help='Create target and related files in specified directory')
619 parser.add_argument('target', metavar='target', nargs='?',
620 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700621 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700622 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700623 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
624 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600625
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600626 # This argument tells us where to load the script from the Vulkan-Headers registry
627 parser.add_argument('-scripts', action='store',
628 help='Find additional scripts in this directory')
629
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600630 args = parser.parse_args()
631
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600632 scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
633 registry_headers_path = os.path.join(scripts_directory_path, args.scripts)
634 sys.path.insert(0, registry_headers_path)
635
636 from reg import *
637 from generator import write
638 from cgenerator import CGeneratorOptions, COutputGenerator
639
640 # ValidationLayer Generator Modifications
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700641 from thread_safety_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600642 from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600643 from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
644 from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
645 from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700646 from layer_dispatch_table_generator import LayerDispatchTableOutputGenerator, LayerDispatchTableGeneratorOptions
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600647 from layer_chassis_generator import LayerChassisOutputGenerator, LayerChassisGeneratorOptions
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700648 from layer_chassis_dispatch_generator import LayerChassisDispatchOutputGenerator, LayerChassisDispatchGeneratorOptions
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600649
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600650 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600651 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600652 args.extension = [name for arg in args.extension for name in arg.split()]
653
654 # Load & parse registry
655 reg = Registry()
656
657 startTimer(args.time)
658 tree = etree.parse(args.registry)
659 endTimer(args.time, '* Time to make ElementTree =')
660
Mike Schuchardt03646252018-03-09 08:39:43 -0700661 if args.debug:
662 pdb.run('reg.loadElementTree(tree)')
663 else:
664 startTimer(args.time)
665 reg.loadElementTree(tree)
666 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600667
668 if (args.validate):
669 reg.validateGroups()
670
671 if (args.dump):
672 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700673 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600674
675 # create error/warning & diagnostic files
676 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700677 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600678 else:
679 errWarn = sys.stderr
680
681 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700682 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600683 else:
684 diag = None
685
686 if (args.debug):
687 pdb.run('genTarget(args)')
688 elif (args.profile):
689 import cProfile, pstats
690 cProfile.run('genTarget(args)', 'profile.txt')
691 p = pstats.Stats('profile.txt')
692 p.strip_dirs().sort_stats('time').print_stats(50)
693 else:
694 genTarget(args)