blob: 50d0294b09ca696911373a8b9e9351848d6d758d [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
Mark Youngfa31cfa2018-06-04 16:41:24 -0600114 # ValidationLayer Generators
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700115 # Options for thread safety header code-generation
116 genOpts['thread_safety.h'] = [
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600117 ThreadOutputGenerator,
118 ThreadGeneratorOptions(
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700119 filename = 'thread_safety.h',
120 directory = directory,
121 apiname = 'vulkan',
122 profile = None,
123 versions = featuresPat,
124 emitversions = featuresPat,
125 defaultExtensions = 'vulkan',
126 addExtensions = addExtensionsPat,
127 removeExtensions = removeExtensionsPat,
128 emitExtensions = emitExtensionsPat,
129 prefixText = prefixStrings + vkPrefixStrings,
130 protectFeature = False,
131 apicall = 'VKAPI_ATTR ',
132 apientry = 'VKAPI_CALL ',
133 apientryp = 'VKAPI_PTR *',
134 alignFuncParam = 48,
135 expandEnumerants = False)
136 ]
137
138 # Options for thread safety source code-generation
139 genOpts['thread_safety.cpp'] = [
140 ThreadOutputGenerator,
141 ThreadGeneratorOptions(
142 filename = 'thread_safety.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600143 directory = directory,
144 apiname = 'vulkan',
145 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600146 versions = featuresPat,
147 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600148 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600149 addExtensions = addExtensionsPat,
150 removeExtensions = removeExtensionsPat,
151 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600152 prefixText = prefixStrings + vkPrefixStrings,
153 protectFeature = False,
154 apicall = 'VKAPI_ATTR ',
155 apientry = 'VKAPI_CALL ',
156 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600157 alignFuncParam = 48,
158 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600159 ]
160
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700161 # Options for stateless validation source file
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600162 genOpts['parameter_validation.cpp'] = [
163 ParameterValidationOutputGenerator,
164 ParameterValidationGeneratorOptions(
165 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600166 directory = directory,
167 apiname = 'vulkan',
168 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600169 versions = featuresPat,
170 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600171 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600172 addExtensions = addExtensionsPat,
173 removeExtensions = removeExtensionsPat,
174 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600175 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600176 apicall = 'VKAPI_ATTR ',
177 apientry = 'VKAPI_CALL ',
178 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600179 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600180 expandEnumerants = False,
181 valid_usage_path = args.scripts)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600182 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600183
Mark Lobodzinskiaf7c0382018-12-18 11:55:55 -0700184 # Options for stateless validation source file
185 genOpts['parameter_validation.h'] = [
186 ParameterValidationOutputGenerator,
187 ParameterValidationGeneratorOptions(
188 filename = 'parameter_validation.h',
189 directory = directory,
190 apiname = 'vulkan',
191 profile = None,
192 versions = featuresPat,
193 emitversions = featuresPat,
194 defaultExtensions = 'vulkan',
195 addExtensions = addExtensionsPat,
196 removeExtensions = removeExtensionsPat,
197 emitExtensions = emitExtensionsPat,
198 prefixText = prefixStrings + vkPrefixStrings,
199 apicall = 'VKAPI_ATTR ',
200 apientry = 'VKAPI_CALL ',
201 apientryp = 'VKAPI_PTR *',
202 alignFuncParam = 48,
203 expandEnumerants = False,
204 valid_usage_path = args.scripts)
205 ]
206
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600207 # Options for object_tracker code-generated validation routines
208 genOpts['object_tracker.cpp'] = [
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600209 ObjectTrackerOutputGenerator,
210 ObjectTrackerGeneratorOptions(
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600211 filename = 'object_tracker.cpp',
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600212 directory = directory,
213 apiname = 'vulkan',
214 profile = None,
215 versions = featuresPat,
216 emitversions = featuresPat,
217 defaultExtensions = 'vulkan',
218 addExtensions = addExtensionsPat,
219 removeExtensions = removeExtensionsPat,
220 emitExtensions = emitExtensionsPat,
221 prefixText = prefixStrings + vkPrefixStrings,
222 protectFeature = False,
223 apicall = 'VKAPI_ATTR ',
224 apientry = 'VKAPI_CALL ',
225 apientryp = 'VKAPI_PTR *',
226 alignFuncParam = 48,
227 expandEnumerants = False,
228 valid_usage_path = args.scripts)
229 ]
230
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600231 # Options for object_tracker code-generated prototypes
232 genOpts['object_tracker.h'] = [
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600233 ObjectTrackerOutputGenerator,
234 ObjectTrackerGeneratorOptions(
Mark Lobodzinski0c668462018-09-27 10:13:19 -0600235 filename = 'object_tracker.h',
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600236 directory = directory,
237 apiname = 'vulkan',
238 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600239 versions = featuresPat,
240 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600241 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600242 addExtensions = addExtensionsPat,
243 removeExtensions = removeExtensionsPat,
244 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600245 prefixText = prefixStrings + vkPrefixStrings,
246 protectFeature = False,
247 apicall = 'VKAPI_ATTR ',
248 apientry = 'VKAPI_CALL ',
249 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600250 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600251 expandEnumerants = False,
252 valid_usage_path = args.scripts)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600253 ]
254
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700255 # Options for dispatch table helper generator
256 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700257 DispatchTableHelperOutputGenerator,
258 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700259 filename = 'vk_dispatch_table_helper.h',
260 directory = directory,
261 apiname = 'vulkan',
262 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600263 versions = featuresPat,
264 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700265 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600266 addExtensions = addExtensionsPat,
267 removeExtensions = removeExtensionsPat,
268 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700269 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700270 apicall = 'VKAPI_ATTR ',
271 apientry = 'VKAPI_CALL ',
272 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600273 alignFuncParam = 48,
274 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700275 ]
276
Mark Young0f183a82017-02-28 09:58:04 -0700277 # Options for Layer dispatch table generator
278 genOpts['vk_layer_dispatch_table.h'] = [
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700279 LayerDispatchTableOutputGenerator,
280 LayerDispatchTableGeneratorOptions(
Mark Young0f183a82017-02-28 09:58:04 -0700281 filename = 'vk_layer_dispatch_table.h',
282 directory = directory,
283 apiname = 'vulkan',
284 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600285 versions = featuresPat,
286 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700287 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600288 addExtensions = addExtensionsPat,
289 removeExtensions = removeExtensionsPat,
290 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700291 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700292 apicall = 'VKAPI_ATTR ',
293 apientry = 'VKAPI_CALL ',
294 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600295 alignFuncParam = 48,
296 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700297 ]
298
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700299 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700300 genOpts['vk_enum_string_helper.h'] = [
301 HelperFileOutputGenerator,
302 HelperFileOutputGeneratorOptions(
303 filename = 'vk_enum_string_helper.h',
304 directory = directory,
305 apiname = 'vulkan',
306 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600307 versions = featuresPat,
308 emitversions = featuresPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700309 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600310 addExtensions = addExtensionsPat,
311 removeExtensions = removeExtensionsPat,
312 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700313 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700314 apicall = 'VKAPI_ATTR ',
315 apientry = 'VKAPI_CALL ',
316 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700317 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600318 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700319 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700320 ]
321
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700322 # Helper file generator options for vk_safe_struct.h
323 genOpts['vk_safe_struct.h'] = [
324 HelperFileOutputGenerator,
325 HelperFileOutputGeneratorOptions(
326 filename = 'vk_safe_struct.h',
327 directory = directory,
328 apiname = 'vulkan',
329 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600330 versions = featuresPat,
331 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700332 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600333 addExtensions = addExtensionsPat,
334 removeExtensions = removeExtensionsPat,
335 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700336 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700337 apicall = 'VKAPI_ATTR ',
338 apientry = 'VKAPI_CALL ',
339 apientryp = 'VKAPI_PTR *',
340 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600341 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700342 helper_file_type = 'safe_struct_header')
343 ]
344
345 # Helper file generator options for vk_safe_struct.cpp
346 genOpts['vk_safe_struct.cpp'] = [
347 HelperFileOutputGenerator,
348 HelperFileOutputGeneratorOptions(
349 filename = 'vk_safe_struct.cpp',
350 directory = directory,
351 apiname = 'vulkan',
352 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600353 versions = featuresPat,
354 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700355 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600356 addExtensions = addExtensionsPat,
357 removeExtensions = removeExtensionsPat,
358 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700359 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700360 apicall = 'VKAPI_ATTR ',
361 apientry = 'VKAPI_CALL ',
362 apientryp = 'VKAPI_PTR *',
363 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600364 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700365 helper_file_type = 'safe_struct_source')
366 ]
367
Mark Lobodzinski70972012017-04-03 16:59:15 -0600368 # Helper file generator options for vk_object_types.h
369 genOpts['vk_object_types.h'] = [
370 HelperFileOutputGenerator,
371 HelperFileOutputGeneratorOptions(
372 filename = 'vk_object_types.h',
373 directory = directory,
374 apiname = 'vulkan',
375 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600376 versions = featuresPat,
377 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600378 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600379 addExtensions = addExtensionsPat,
380 removeExtensions = removeExtensionsPat,
381 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600382 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600383 apicall = 'VKAPI_ATTR ',
384 apientry = 'VKAPI_CALL ',
385 apientryp = 'VKAPI_PTR *',
386 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600387 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600388 helper_file_type = 'object_types_header')
389 ]
390
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600391 # Helper file generator options for extension_helper.h
392 genOpts['vk_extension_helper.h'] = [
393 HelperFileOutputGenerator,
394 HelperFileOutputGeneratorOptions(
395 filename = 'vk_extension_helper.h',
396 directory = directory,
397 apiname = 'vulkan',
398 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600399 versions = featuresPat,
400 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600401 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600402 addExtensions = addExtensionsPat,
403 removeExtensions = removeExtensionsPat,
404 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600405 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600406 apicall = 'VKAPI_ATTR ',
407 apientry = 'VKAPI_CALL ',
408 apientryp = 'VKAPI_PTR *',
409 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600410 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600411 helper_file_type = 'extension_helper_header')
412 ]
413
John Zulaufde972ac2017-10-26 12:07:05 -0600414 # Helper file generator options for typemap_helper.h
415 genOpts['vk_typemap_helper.h'] = [
416 HelperFileOutputGenerator,
417 HelperFileOutputGeneratorOptions(
418 filename = 'vk_typemap_helper.h',
419 directory = directory,
420 apiname = 'vulkan',
421 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600422 versions = featuresPat,
423 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600424 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600425 addExtensions = addExtensionsPat,
426 removeExtensions = removeExtensionsPat,
427 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600428 prefixText = prefixStrings + vkPrefixStrings,
429 protectFeature = False,
430 apicall = 'VKAPI_ATTR ',
431 apientry = 'VKAPI_CALL ',
432 apientryp = 'VKAPI_PTR *',
433 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600434 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600435 helper_file_type = 'typemap_helper_header')
436 ]
437
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600438 # Layer chassis related generation structs
439 # Options for layer chassis header
440 genOpts['chassis.h'] = [
441 LayerChassisOutputGenerator,
442 LayerChassisGeneratorOptions(
443 filename = 'chassis.h',
444 directory = directory,
445 apiname = 'vulkan',
446 profile = None,
447 versions = featuresPat,
448 emitversions = featuresPat,
449 defaultExtensions = 'vulkan',
450 addExtensions = addExtensionsPat,
451 removeExtensions = removeExtensionsPat,
452 emitExtensions = emitExtensionsPat,
453 prefixText = prefixStrings + vkPrefixStrings,
454 apicall = 'VKAPI_ATTR ',
455 apientry = 'VKAPI_CALL ',
456 apientryp = 'VKAPI_PTR *',
457 alignFuncParam = 48,
458 helper_file_type = 'layer_chassis_header',
459 expandEnumerants = False)
460 ]
461
462 # Options for layer chassis source file
463 genOpts['chassis.cpp'] = [
464 LayerChassisOutputGenerator,
465 LayerChassisGeneratorOptions(
466 filename = 'chassis.cpp',
467 directory = directory,
468 apiname = 'vulkan',
469 profile = None,
470 versions = featuresPat,
471 emitversions = featuresPat,
472 defaultExtensions = 'vulkan',
473 addExtensions = addExtensionsPat,
474 removeExtensions = removeExtensionsPat,
475 emitExtensions = emitExtensionsPat,
476 prefixText = prefixStrings + vkPrefixStrings,
477 apicall = 'VKAPI_ATTR ',
478 apientry = 'VKAPI_CALL ',
479 apientryp = 'VKAPI_PTR *',
480 alignFuncParam = 48,
481 helper_file_type = 'layer_chassis_source',
482 expandEnumerants = False)
483 ]
484
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700485 # Options for layer chassis dispatch source file
486 genOpts['layer_chassis_dispatch.cpp'] = [
487 LayerChassisDispatchOutputGenerator,
488 LayerChassisDispatchGeneratorOptions(
489 filename = 'layer_chassis_dispatch.cpp',
490 directory = directory,
491 apiname = 'vulkan',
492 profile = None,
493 versions = featuresPat,
494 emitversions = featuresPat,
495 defaultExtensions = 'vulkan',
496 addExtensions = addExtensionsPat,
497 removeExtensions = removeExtensionsPat,
498 emitExtensions = emitExtensionsPat,
499 prefixText = prefixStrings + vkPrefixStrings,
500 protectFeature = False,
501 apicall = 'VKAPI_ATTR ',
502 apientry = 'VKAPI_CALL ',
503 apientryp = 'VKAPI_PTR *',
504 alignFuncParam = 48,
505 expandEnumerants = False)
506 ]
507
508 # Options for layer chassis dispatch header file
509 genOpts['layer_chassis_dispatch.h'] = [
510 LayerChassisDispatchOutputGenerator,
511 LayerChassisDispatchGeneratorOptions(
512 filename = 'layer_chassis_dispatch.h',
513 directory = directory,
514 apiname = 'vulkan',
515 profile = None,
516 versions = featuresPat,
517 emitversions = featuresPat,
518 defaultExtensions = 'vulkan',
519 addExtensions = addExtensionsPat,
520 removeExtensions = removeExtensionsPat,
521 emitExtensions = emitExtensionsPat,
522 prefixText = prefixStrings + vkPrefixStrings,
523 protectFeature = False,
524 apicall = 'VKAPI_ATTR ',
525 apientry = 'VKAPI_CALL ',
526 apientryp = 'VKAPI_PTR *',
527 alignFuncParam = 48,
528 expandEnumerants = False)
529 ]
530
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600531
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600532# Generate a target based on the options in the matching genOpts{} object.
533# This is encapsulated in a function so it can be profiled and/or timed.
534# The args parameter is an parsed argument object containing the following
535# fields that are used:
536# target - target to generate
537# directory - directory to generate it in
538# protect - True if re-inclusion wrappers should be created
539# extensions - list of additional extensions to include in generated
540# interfaces
541def genTarget(args):
542 global genOpts
543
544 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600545 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600546
547 if (args.target in genOpts.keys()):
548 createGenerator = genOpts[args.target][0]
549 options = genOpts[args.target][1]
550
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700551 if not args.quiet:
552 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600553 write('* options.versions =', options.versions, file=sys.stderr)
554 write('* options.emitversions =', options.emitversions, file=sys.stderr)
555 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
556 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
557 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
558 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600559
560 startTimer(args.time)
561 gen = createGenerator(errFile=errWarn,
562 warnFile=errWarn,
563 diagFile=diag)
564 reg.setGenerator(gen)
565 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700566
567 if not args.quiet:
568 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600569 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
570 else:
571 write('No generator options for unknown target:',
572 args.target, file=sys.stderr)
573
Mark Lobodzinski16530212017-09-18 15:13:54 -0600574# -feature name
575# -extension name
576# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600577# of names, or a regular expression.
578if __name__ == '__main__':
579 parser = argparse.ArgumentParser()
580
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600581 parser.add_argument('-defaultExtensions', action='store',
582 default='vulkan',
583 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600584 parser.add_argument('-extension', action='append',
585 default=[],
586 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600587 parser.add_argument('-removeExtensions', action='append',
588 default=[],
589 help='Specify an extension or extensions to remove from targets')
590 parser.add_argument('-emitExtensions', action='append',
591 default=[],
592 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600593 parser.add_argument('-feature', action='append',
594 default=[],
595 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600596 parser.add_argument('-debug', action='store_true',
597 help='Enable debugging')
598 parser.add_argument('-dump', action='store_true',
599 help='Enable dump to stderr')
600 parser.add_argument('-diagfile', action='store',
601 default=None,
602 help='Write diagnostics to specified file')
603 parser.add_argument('-errfile', action='store',
604 default=None,
605 help='Write errors and warnings to specified file instead of stderr')
606 parser.add_argument('-noprotect', dest='protect', action='store_false',
607 help='Disable inclusion protection in output headers')
608 parser.add_argument('-profile', action='store_true',
609 help='Enable profiling')
610 parser.add_argument('-registry', action='store',
611 default='vk.xml',
612 help='Use specified registry file instead of vk.xml')
613 parser.add_argument('-time', action='store_true',
614 help='Enable timing')
615 parser.add_argument('-validate', action='store_true',
616 help='Enable group validation')
617 parser.add_argument('-o', action='store', dest='directory',
618 default='.',
619 help='Create target and related files in specified directory')
620 parser.add_argument('target', metavar='target', nargs='?',
621 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700622 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700623 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700624 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
625 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600626
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600627 # This argument tells us where to load the script from the Vulkan-Headers registry
628 parser.add_argument('-scripts', action='store',
629 help='Find additional scripts in this directory')
630
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600631 args = parser.parse_args()
632
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600633 scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
634 registry_headers_path = os.path.join(scripts_directory_path, args.scripts)
635 sys.path.insert(0, registry_headers_path)
636
637 from reg import *
638 from generator import write
639 from cgenerator import CGeneratorOptions, COutputGenerator
640
641 # ValidationLayer Generator Modifications
Mark Lobodzinski1f2ba262018-12-04 14:15:47 -0700642 from thread_safety_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600643 from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600644 from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
645 from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
646 from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Lobodzinskiacf4a202018-11-13 15:06:46 -0700647 from layer_dispatch_table_generator import LayerDispatchTableOutputGenerator, LayerDispatchTableGeneratorOptions
Mark Lobodzinski9b6522d2018-09-26 11:07:45 -0600648 from layer_chassis_generator import LayerChassisOutputGenerator, LayerChassisGeneratorOptions
Mark Lobodzinski0b1f1c92018-11-06 15:39:06 -0700649 from layer_chassis_dispatch_generator import LayerChassisDispatchOutputGenerator, LayerChassisDispatchGeneratorOptions
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600650
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600651 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600652 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600653 args.extension = [name for arg in args.extension for name in arg.split()]
654
655 # Load & parse registry
656 reg = Registry()
657
658 startTimer(args.time)
659 tree = etree.parse(args.registry)
660 endTimer(args.time, '* Time to make ElementTree =')
661
Mike Schuchardt03646252018-03-09 08:39:43 -0700662 if args.debug:
663 pdb.run('reg.loadElementTree(tree)')
664 else:
665 startTimer(args.time)
666 reg.loadElementTree(tree)
667 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600668
669 if (args.validate):
670 reg.validateGroups()
671
672 if (args.dump):
673 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700674 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600675
676 # create error/warning & diagnostic files
677 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700678 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600679 else:
680 errWarn = sys.stderr
681
682 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700683 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600684 else:
685 diag = None
686
687 if (args.debug):
688 pdb.run('genTarget(args)')
689 elif (args.profile):
690 import cProfile, pstats
691 cProfile.run('genTarget(args)', 'profile.txt')
692 p = pstats.Stats('profile.txt')
693 p.strip_dirs().sort_stats('time').print_stats(50)
694 else:
695 genTarget(args)