blob: 3ed5c0dfdc912789837736433f4629add937f5a7 [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
24 startTime = time.clock()
25
26def endTimer(timeit, msg):
27 global startTime
28 endTime = time.clock()
29 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):
35 if len(list) > 0 or default == None:
36 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 Lobodzinskif19fef92016-10-11 15:23:51 -0600114 # Options for threading layer
115 genOpts['thread_check.h'] = [
116 ThreadOutputGenerator,
117 ThreadGeneratorOptions(
118 filename = 'thread_check.h',
119 directory = directory,
120 apiname = 'vulkan',
121 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600122 versions = featuresPat,
123 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600124 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600125 addExtensions = addExtensionsPat,
126 removeExtensions = removeExtensionsPat,
127 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600128 prefixText = prefixStrings + vkPrefixStrings,
129 protectFeature = False,
130 apicall = 'VKAPI_ATTR ',
131 apientry = 'VKAPI_CALL ',
132 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600133 alignFuncParam = 48,
134 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600135 ]
136
137 # Options for parameter validation layer
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600138 genOpts['parameter_validation.cpp'] = [
139 ParameterValidationOutputGenerator,
140 ParameterValidationGeneratorOptions(
141 filename = 'parameter_validation.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,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600152 apicall = 'VKAPI_ATTR ',
153 apientry = 'VKAPI_CALL ',
154 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600155 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600156 expandEnumerants = False,
157 valid_usage_path = args.scripts)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600158 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600159
160 # Options for unique objects layer
161 genOpts['unique_objects_wrappers.h'] = [
162 UniqueObjectsOutputGenerator,
163 UniqueObjectsGeneratorOptions(
164 filename = 'unique_objects_wrappers.h',
165 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,
175 protectFeature = False,
176 apicall = 'VKAPI_ATTR ',
177 apientry = 'VKAPI_CALL ',
178 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600179 alignFuncParam = 48,
180 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600181 ]
182
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600183 # Options for object_tracker layer
184 genOpts['object_tracker.cpp'] = [
185 ObjectTrackerOutputGenerator,
186 ObjectTrackerGeneratorOptions(
187 filename = 'object_tracker.cpp',
188 directory = directory,
189 apiname = 'vulkan',
190 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600191 versions = featuresPat,
192 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600193 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600194 addExtensions = addExtensionsPat,
195 removeExtensions = removeExtensionsPat,
196 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600197 prefixText = prefixStrings + vkPrefixStrings,
198 protectFeature = False,
199 apicall = 'VKAPI_ATTR ',
200 apientry = 'VKAPI_CALL ',
201 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600202 alignFuncParam = 48,
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600203 expandEnumerants = False,
204 valid_usage_path = args.scripts)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600205 ]
206
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700207 # Options for dispatch table helper generator
208 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700209 DispatchTableHelperOutputGenerator,
210 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700211 filename = 'vk_dispatch_table_helper.h',
212 directory = directory,
213 apiname = 'vulkan',
214 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600215 versions = featuresPat,
216 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700217 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600218 addExtensions = addExtensionsPat,
219 removeExtensions = removeExtensionsPat,
220 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700221 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700222 apicall = 'VKAPI_ATTR ',
223 apientry = 'VKAPI_CALL ',
224 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600225 alignFuncParam = 48,
226 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700227 ]
228
Mark Young0f183a82017-02-28 09:58:04 -0700229 # Options for Layer dispatch table generator
230 genOpts['vk_layer_dispatch_table.h'] = [
231 LoaderExtensionOutputGenerator,
232 LoaderExtensionGeneratorOptions(
233 filename = 'vk_layer_dispatch_table.h',
234 directory = directory,
235 apiname = 'vulkan',
236 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600237 versions = featuresPat,
238 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700239 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600240 addExtensions = addExtensionsPat,
241 removeExtensions = removeExtensionsPat,
242 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700243 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700244 apicall = 'VKAPI_ATTR ',
245 apientry = 'VKAPI_CALL ',
246 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600247 alignFuncParam = 48,
248 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700249 ]
250
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700251 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700252 genOpts['vk_enum_string_helper.h'] = [
253 HelperFileOutputGenerator,
254 HelperFileOutputGeneratorOptions(
255 filename = 'vk_enum_string_helper.h',
256 directory = directory,
257 apiname = 'vulkan',
258 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600259 versions = featuresPat,
260 emitversions = featuresPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700261 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600262 addExtensions = addExtensionsPat,
263 removeExtensions = removeExtensionsPat,
264 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700265 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700266 apicall = 'VKAPI_ATTR ',
267 apientry = 'VKAPI_CALL ',
268 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700269 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600270 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700271 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700272 ]
273
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700274 # Helper file generator options for vk_safe_struct.h
275 genOpts['vk_safe_struct.h'] = [
276 HelperFileOutputGenerator,
277 HelperFileOutputGeneratorOptions(
278 filename = 'vk_safe_struct.h',
279 directory = directory,
280 apiname = 'vulkan',
281 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600282 versions = featuresPat,
283 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700284 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600285 addExtensions = addExtensionsPat,
286 removeExtensions = removeExtensionsPat,
287 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700288 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700289 apicall = 'VKAPI_ATTR ',
290 apientry = 'VKAPI_CALL ',
291 apientryp = 'VKAPI_PTR *',
292 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600293 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700294 helper_file_type = 'safe_struct_header')
295 ]
296
297 # Helper file generator options for vk_safe_struct.cpp
298 genOpts['vk_safe_struct.cpp'] = [
299 HelperFileOutputGenerator,
300 HelperFileOutputGeneratorOptions(
301 filename = 'vk_safe_struct.cpp',
302 directory = directory,
303 apiname = 'vulkan',
304 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600305 versions = featuresPat,
306 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700307 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600308 addExtensions = addExtensionsPat,
309 removeExtensions = removeExtensionsPat,
310 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700311 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700312 apicall = 'VKAPI_ATTR ',
313 apientry = 'VKAPI_CALL ',
314 apientryp = 'VKAPI_PTR *',
315 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600316 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700317 helper_file_type = 'safe_struct_source')
318 ]
319
Mark Lobodzinski70972012017-04-03 16:59:15 -0600320 # Helper file generator options for vk_object_types.h
321 genOpts['vk_object_types.h'] = [
322 HelperFileOutputGenerator,
323 HelperFileOutputGeneratorOptions(
324 filename = 'vk_object_types.h',
325 directory = directory,
326 apiname = 'vulkan',
327 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600328 versions = featuresPat,
329 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600330 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600331 addExtensions = addExtensionsPat,
332 removeExtensions = removeExtensionsPat,
333 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600334 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600335 apicall = 'VKAPI_ATTR ',
336 apientry = 'VKAPI_CALL ',
337 apientryp = 'VKAPI_PTR *',
338 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600339 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600340 helper_file_type = 'object_types_header')
341 ]
342
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600343 # Helper file generator options for extension_helper.h
344 genOpts['vk_extension_helper.h'] = [
345 HelperFileOutputGenerator,
346 HelperFileOutputGeneratorOptions(
347 filename = 'vk_extension_helper.h',
348 directory = directory,
349 apiname = 'vulkan',
350 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600351 versions = featuresPat,
352 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600353 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600354 addExtensions = addExtensionsPat,
355 removeExtensions = removeExtensionsPat,
356 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600357 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600358 apicall = 'VKAPI_ATTR ',
359 apientry = 'VKAPI_CALL ',
360 apientryp = 'VKAPI_PTR *',
361 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600362 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600363 helper_file_type = 'extension_helper_header')
364 ]
365
John Zulaufde972ac2017-10-26 12:07:05 -0600366 # Helper file generator options for typemap_helper.h
367 genOpts['vk_typemap_helper.h'] = [
368 HelperFileOutputGenerator,
369 HelperFileOutputGeneratorOptions(
370 filename = 'vk_typemap_helper.h',
371 directory = directory,
372 apiname = 'vulkan',
373 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600374 versions = featuresPat,
375 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600376 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600377 addExtensions = addExtensionsPat,
378 removeExtensions = removeExtensionsPat,
379 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600380 prefixText = prefixStrings + vkPrefixStrings,
381 protectFeature = False,
382 apicall = 'VKAPI_ATTR ',
383 apientry = 'VKAPI_CALL ',
384 apientryp = 'VKAPI_PTR *',
385 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600386 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600387 helper_file_type = 'typemap_helper_header')
388 ]
389
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600390# Generate a target based on the options in the matching genOpts{} object.
391# This is encapsulated in a function so it can be profiled and/or timed.
392# The args parameter is an parsed argument object containing the following
393# fields that are used:
394# target - target to generate
395# directory - directory to generate it in
396# protect - True if re-inclusion wrappers should be created
397# extensions - list of additional extensions to include in generated
398# interfaces
399def genTarget(args):
400 global genOpts
401
402 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600403 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600404
405 if (args.target in genOpts.keys()):
406 createGenerator = genOpts[args.target][0]
407 options = genOpts[args.target][1]
408
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700409 if not args.quiet:
410 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600411 write('* options.versions =', options.versions, file=sys.stderr)
412 write('* options.emitversions =', options.emitversions, file=sys.stderr)
413 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
414 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
415 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
416 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600417
418 startTimer(args.time)
419 gen = createGenerator(errFile=errWarn,
420 warnFile=errWarn,
421 diagFile=diag)
422 reg.setGenerator(gen)
423 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700424
425 if not args.quiet:
426 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600427 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
428 else:
429 write('No generator options for unknown target:',
430 args.target, file=sys.stderr)
431
Mark Lobodzinski16530212017-09-18 15:13:54 -0600432# -feature name
433# -extension name
434# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600435# of names, or a regular expression.
436if __name__ == '__main__':
437 parser = argparse.ArgumentParser()
438
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600439 parser.add_argument('-defaultExtensions', action='store',
440 default='vulkan',
441 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600442 parser.add_argument('-extension', action='append',
443 default=[],
444 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600445 parser.add_argument('-removeExtensions', action='append',
446 default=[],
447 help='Specify an extension or extensions to remove from targets')
448 parser.add_argument('-emitExtensions', action='append',
449 default=[],
450 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600451 parser.add_argument('-feature', action='append',
452 default=[],
453 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600454 parser.add_argument('-debug', action='store_true',
455 help='Enable debugging')
456 parser.add_argument('-dump', action='store_true',
457 help='Enable dump to stderr')
458 parser.add_argument('-diagfile', action='store',
459 default=None,
460 help='Write diagnostics to specified file')
461 parser.add_argument('-errfile', action='store',
462 default=None,
463 help='Write errors and warnings to specified file instead of stderr')
464 parser.add_argument('-noprotect', dest='protect', action='store_false',
465 help='Disable inclusion protection in output headers')
466 parser.add_argument('-profile', action='store_true',
467 help='Enable profiling')
468 parser.add_argument('-registry', action='store',
469 default='vk.xml',
470 help='Use specified registry file instead of vk.xml')
471 parser.add_argument('-time', action='store_true',
472 help='Enable timing')
473 parser.add_argument('-validate', action='store_true',
474 help='Enable group validation')
475 parser.add_argument('-o', action='store', dest='directory',
476 default='.',
477 help='Create target and related files in specified directory')
478 parser.add_argument('target', metavar='target', nargs='?',
479 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700480 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700481 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700482 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
483 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600484
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600485 # This argument tells us where to load the script from the Vulkan-Headers registry
486 parser.add_argument('-scripts', action='store',
487 help='Find additional scripts in this directory')
488
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600489 args = parser.parse_args()
490
Mark Lobodzinski27a9e7c2018-05-31 16:01:57 -0600491 scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
492 registry_headers_path = os.path.join(scripts_directory_path, args.scripts)
493 sys.path.insert(0, registry_headers_path)
494
495 from reg import *
496 from generator import write
497 from cgenerator import CGeneratorOptions, COutputGenerator
498
499 # ValidationLayer Generator Modifications
500 from threading_generator import ThreadGeneratorOptions, ThreadOutputGenerator
501 from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
502 from unique_objects_generator import UniqueObjectsGeneratorOptions, UniqueObjectsOutputGenerator
503 from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
504 from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
505 from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
506 from loader_extension_generator import LoaderExtensionOutputGenerator, LoaderExtensionGeneratorOptions
507
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600508 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600509 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600510 args.extension = [name for arg in args.extension for name in arg.split()]
511
512 # Load & parse registry
513 reg = Registry()
514
515 startTimer(args.time)
516 tree = etree.parse(args.registry)
517 endTimer(args.time, '* Time to make ElementTree =')
518
Mike Schuchardt03646252018-03-09 08:39:43 -0700519 if args.debug:
520 pdb.run('reg.loadElementTree(tree)')
521 else:
522 startTimer(args.time)
523 reg.loadElementTree(tree)
524 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600525
526 if (args.validate):
527 reg.validateGroups()
528
529 if (args.dump):
530 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700531 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600532
533 # create error/warning & diagnostic files
534 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700535 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600536 else:
537 errWarn = sys.stderr
538
539 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700540 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600541 else:
542 diag = None
543
544 if (args.debug):
545 pdb.run('genTarget(args)')
546 elif (args.profile):
547 import cProfile, pstats
548 cProfile.run('genTarget(args)', 'profile.txt')
549 p = pstats.Stats('profile.txt')
550 p.strip_dirs().sort_stats('time').print_stats(50)
551 else:
552 genTarget(args)