blob: 4dac9ca259e3f0aa4d240e32460aa83be15a79b3 [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
18scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
19registry_headers_path = os.path.join(scripts_directory_path, '../Vulkan-Headers/registry')
20sys.path.insert(0, registry_headers_path)
21
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060022from reg import *
23from generator import write
Mark Lobodzinski36c33862017-02-13 10:15:53 -070024from cgenerator import CGeneratorOptions, COutputGenerator
Mark Lobodzinskif094c932018-05-22 13:48:48 -060025
26# ValidationLayer Generator Modifications
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060027from threading_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinskid4950072017-08-01 13:02:20 -060028from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060029from unique_objects_generator import UniqueObjectsGeneratorOptions, UniqueObjectsOutputGenerator
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -060030from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
Mark Young0f183a82017-02-28 09:58:04 -070031from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -070032from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Young0f183a82017-02-28 09:58:04 -070033from loader_extension_generator import LoaderExtensionOutputGenerator, LoaderExtensionGeneratorOptions
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060034
35# Simple timer functions
36startTime = None
37
38def startTimer(timeit):
39 global startTime
40 startTime = time.clock()
41
42def endTimer(timeit, msg):
43 global startTime
44 endTime = time.clock()
45 if (timeit):
46 write(msg, endTime - startTime, file=sys.stderr)
47 startTime = None
48
49# Turn a list of strings into a regexp string matching exactly those strings
Mark Lobodzinski62f71562017-10-24 13:41:18 -060050def makeREstring(list, default = None):
51 if len(list) > 0 or default == None:
52 return '^(' + '|'.join(list) + ')$'
53 else:
54 return default
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060055
56# Returns a directory of [ generator function, generator options ] indexed
57# by specified short names. The generator options incorporate the following
58# parameters:
59#
Mark Lobodzinski62f71562017-10-24 13:41:18 -060060# args is an parsed argument object; see below for the fields that are used.
61def makeGenOpts(args):
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060062 global genOpts
63 genOpts = {}
64
Mark Lobodzinski62f71562017-10-24 13:41:18 -060065 # Default class of extensions to include, or None
66 defaultExtensions = args.defaultExtensions
67
68 # Additional extensions to include (list of extensions)
69 extensions = args.extension
70
71 # Extensions to remove (list of extensions)
72 removeExtensions = args.removeExtensions
73
74 # Extensions to emit (list of extensions)
75 emitExtensions = args.emitExtensions
76
77 # Features to include (list of features)
78 features = args.feature
79
80 # Whether to disable inclusion protect in headers
81 protect = args.protect
82
83 # Output target directory
84 directory = args.directory
85
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060086 # Descriptive names for various regexp patterns used to select
87 # versions and extensions
Mark Lobodzinski16530212017-09-18 15:13:54 -060088 allFeatures = allExtensions = '.*'
Mark Lobodzinski62f71562017-10-24 13:41:18 -060089 noFeatures = noExtensions = None
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060090
Mark Lobodzinski62f71562017-10-24 13:41:18 -060091 # Turn lists of names/patterns into matching regular expressions
92 addExtensionsPat = makeREstring(extensions, None)
93 removeExtensionsPat = makeREstring(removeExtensions, None)
94 emitExtensionsPat = makeREstring(emitExtensions, allExtensions)
95 featuresPat = makeREstring(features, allFeatures)
Mark Lobodzinski16530212017-09-18 15:13:54 -060096
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060097 # Copyright text prefixing all headers (list of strings).
98 prefixStrings = [
99 '/*',
Mike Schuchardt03646252018-03-09 08:39:43 -0700100 '** Copyright (c) 2015-2018 The Khronos Group Inc.',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600101 '**',
102 '** Licensed under the Apache License, Version 2.0 (the "License");',
103 '** you may not use this file except in compliance with the License.',
104 '** You may obtain a copy of the License at',
105 '**',
106 '** http://www.apache.org/licenses/LICENSE-2.0',
107 '**',
108 '** Unless required by applicable law or agreed to in writing, software',
109 '** distributed under the License is distributed on an "AS IS" BASIS,',
110 '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
111 '** See the License for the specific language governing permissions and',
112 '** limitations under the License.',
113 '*/',
114 ''
115 ]
116
117 # Text specific to Vulkan headers
118 vkPrefixStrings = [
119 '/*',
120 '** This header is generated from the Khronos Vulkan XML API Registry.',
121 '**',
122 '*/',
123 ''
124 ]
125
126 # Defaults for generating re-inclusion protection wrappers (or not)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600127 protectFeature = protect
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600128
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600129 # LoaderAndValidationLayer Generators
130 # Options for threading layer
131 genOpts['thread_check.h'] = [
132 ThreadOutputGenerator,
133 ThreadGeneratorOptions(
134 filename = 'thread_check.h',
135 directory = directory,
136 apiname = 'vulkan',
137 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600138 versions = featuresPat,
139 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600140 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600141 addExtensions = addExtensionsPat,
142 removeExtensions = removeExtensionsPat,
143 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600144 prefixText = prefixStrings + vkPrefixStrings,
145 protectFeature = False,
146 apicall = 'VKAPI_ATTR ',
147 apientry = 'VKAPI_CALL ',
148 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600149 alignFuncParam = 48,
150 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600151 ]
152
153 # Options for parameter validation layer
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600154 genOpts['parameter_validation.cpp'] = [
155 ParameterValidationOutputGenerator,
156 ParameterValidationGeneratorOptions(
157 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600158 directory = directory,
159 apiname = 'vulkan',
160 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600161 versions = featuresPat,
162 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600163 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600164 addExtensions = addExtensionsPat,
165 removeExtensions = removeExtensionsPat,
166 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600167 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600168 apicall = 'VKAPI_ATTR ',
169 apientry = 'VKAPI_CALL ',
170 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600171 alignFuncParam = 48,
172 expandEnumerants = False)
173 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600174
175 # Options for unique objects layer
176 genOpts['unique_objects_wrappers.h'] = [
177 UniqueObjectsOutputGenerator,
178 UniqueObjectsGeneratorOptions(
179 filename = 'unique_objects_wrappers.h',
180 directory = directory,
181 apiname = 'vulkan',
182 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600183 versions = featuresPat,
184 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600185 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600186 addExtensions = addExtensionsPat,
187 removeExtensions = removeExtensionsPat,
188 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600189 prefixText = prefixStrings + vkPrefixStrings,
190 protectFeature = False,
191 apicall = 'VKAPI_ATTR ',
192 apientry = 'VKAPI_CALL ',
193 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600194 alignFuncParam = 48,
195 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600196 ]
197
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600198 # Options for object_tracker layer
199 genOpts['object_tracker.cpp'] = [
200 ObjectTrackerOutputGenerator,
201 ObjectTrackerGeneratorOptions(
202 filename = 'object_tracker.cpp',
203 directory = directory,
204 apiname = 'vulkan',
205 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600206 versions = featuresPat,
207 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600208 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600209 addExtensions = addExtensionsPat,
210 removeExtensions = removeExtensionsPat,
211 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600212 prefixText = prefixStrings + vkPrefixStrings,
213 protectFeature = False,
214 apicall = 'VKAPI_ATTR ',
215 apientry = 'VKAPI_CALL ',
216 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600217 alignFuncParam = 48,
218 expandEnumerants = False)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600219 ]
220
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700221 # Options for dispatch table helper generator
222 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700223 DispatchTableHelperOutputGenerator,
224 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700225 filename = 'vk_dispatch_table_helper.h',
226 directory = directory,
227 apiname = 'vulkan',
228 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600229 versions = featuresPat,
230 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700231 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600232 addExtensions = addExtensionsPat,
233 removeExtensions = removeExtensionsPat,
234 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700235 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700236 apicall = 'VKAPI_ATTR ',
237 apientry = 'VKAPI_CALL ',
238 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600239 alignFuncParam = 48,
240 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700241 ]
242
Mark Young0f183a82017-02-28 09:58:04 -0700243 # Options for Layer dispatch table generator
244 genOpts['vk_layer_dispatch_table.h'] = [
245 LoaderExtensionOutputGenerator,
246 LoaderExtensionGeneratorOptions(
247 filename = 'vk_layer_dispatch_table.h',
248 directory = directory,
249 apiname = 'vulkan',
250 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600251 versions = featuresPat,
252 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700253 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600254 addExtensions = addExtensionsPat,
255 removeExtensions = removeExtensionsPat,
256 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700257 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700258 apicall = 'VKAPI_ATTR ',
259 apientry = 'VKAPI_CALL ',
260 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600261 alignFuncParam = 48,
262 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700263 ]
264
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700265 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700266 genOpts['vk_enum_string_helper.h'] = [
267 HelperFileOutputGenerator,
268 HelperFileOutputGeneratorOptions(
269 filename = 'vk_enum_string_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 Lobodzinski41d9bb32016-12-27 13:50:05 -0700275 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600276 addExtensions = addExtensionsPat,
277 removeExtensions = removeExtensionsPat,
278 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700279 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700280 apicall = 'VKAPI_ATTR ',
281 apientry = 'VKAPI_CALL ',
282 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700283 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600284 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700285 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700286 ]
287
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700288 # Helper file generator options for vk_safe_struct.h
289 genOpts['vk_safe_struct.h'] = [
290 HelperFileOutputGenerator,
291 HelperFileOutputGeneratorOptions(
292 filename = 'vk_safe_struct.h',
293 directory = directory,
294 apiname = 'vulkan',
295 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600296 versions = featuresPat,
297 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700298 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600299 addExtensions = addExtensionsPat,
300 removeExtensions = removeExtensionsPat,
301 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700302 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700303 apicall = 'VKAPI_ATTR ',
304 apientry = 'VKAPI_CALL ',
305 apientryp = 'VKAPI_PTR *',
306 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600307 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700308 helper_file_type = 'safe_struct_header')
309 ]
310
311 # Helper file generator options for vk_safe_struct.cpp
312 genOpts['vk_safe_struct.cpp'] = [
313 HelperFileOutputGenerator,
314 HelperFileOutputGeneratorOptions(
315 filename = 'vk_safe_struct.cpp',
316 directory = directory,
317 apiname = 'vulkan',
318 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600319 versions = featuresPat,
320 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700321 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600322 addExtensions = addExtensionsPat,
323 removeExtensions = removeExtensionsPat,
324 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700325 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700326 apicall = 'VKAPI_ATTR ',
327 apientry = 'VKAPI_CALL ',
328 apientryp = 'VKAPI_PTR *',
329 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600330 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700331 helper_file_type = 'safe_struct_source')
332 ]
333
Mark Lobodzinski70972012017-04-03 16:59:15 -0600334 # Helper file generator options for vk_object_types.h
335 genOpts['vk_object_types.h'] = [
336 HelperFileOutputGenerator,
337 HelperFileOutputGeneratorOptions(
338 filename = 'vk_object_types.h',
339 directory = directory,
340 apiname = 'vulkan',
341 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600342 versions = featuresPat,
343 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600344 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600345 addExtensions = addExtensionsPat,
346 removeExtensions = removeExtensionsPat,
347 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600348 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600349 apicall = 'VKAPI_ATTR ',
350 apientry = 'VKAPI_CALL ',
351 apientryp = 'VKAPI_PTR *',
352 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600353 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600354 helper_file_type = 'object_types_header')
355 ]
356
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600357 # Helper file generator options for extension_helper.h
358 genOpts['vk_extension_helper.h'] = [
359 HelperFileOutputGenerator,
360 HelperFileOutputGeneratorOptions(
361 filename = 'vk_extension_helper.h',
362 directory = directory,
363 apiname = 'vulkan',
364 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600365 versions = featuresPat,
366 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600367 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600368 addExtensions = addExtensionsPat,
369 removeExtensions = removeExtensionsPat,
370 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600371 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600372 apicall = 'VKAPI_ATTR ',
373 apientry = 'VKAPI_CALL ',
374 apientryp = 'VKAPI_PTR *',
375 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600376 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600377 helper_file_type = 'extension_helper_header')
378 ]
379
John Zulaufde972ac2017-10-26 12:07:05 -0600380 # Helper file generator options for typemap_helper.h
381 genOpts['vk_typemap_helper.h'] = [
382 HelperFileOutputGenerator,
383 HelperFileOutputGeneratorOptions(
384 filename = 'vk_typemap_helper.h',
385 directory = directory,
386 apiname = 'vulkan',
387 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600388 versions = featuresPat,
389 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600390 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600391 addExtensions = addExtensionsPat,
392 removeExtensions = removeExtensionsPat,
393 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600394 prefixText = prefixStrings + vkPrefixStrings,
395 protectFeature = False,
396 apicall = 'VKAPI_ATTR ',
397 apientry = 'VKAPI_CALL ',
398 apientryp = 'VKAPI_PTR *',
399 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600400 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600401 helper_file_type = 'typemap_helper_header')
402 ]
403
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600404# Generate a target based on the options in the matching genOpts{} object.
405# This is encapsulated in a function so it can be profiled and/or timed.
406# The args parameter is an parsed argument object containing the following
407# fields that are used:
408# target - target to generate
409# directory - directory to generate it in
410# protect - True if re-inclusion wrappers should be created
411# extensions - list of additional extensions to include in generated
412# interfaces
413def genTarget(args):
414 global genOpts
415
416 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600417 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600418
419 if (args.target in genOpts.keys()):
420 createGenerator = genOpts[args.target][0]
421 options = genOpts[args.target][1]
422
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700423 if not args.quiet:
424 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600425 write('* options.versions =', options.versions, file=sys.stderr)
426 write('* options.emitversions =', options.emitversions, file=sys.stderr)
427 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
428 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
429 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
430 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600431
432 startTimer(args.time)
433 gen = createGenerator(errFile=errWarn,
434 warnFile=errWarn,
435 diagFile=diag)
436 reg.setGenerator(gen)
437 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700438
439 if not args.quiet:
440 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600441 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
442 else:
443 write('No generator options for unknown target:',
444 args.target, file=sys.stderr)
445
Mark Lobodzinski16530212017-09-18 15:13:54 -0600446# -feature name
447# -extension name
448# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600449# of names, or a regular expression.
450if __name__ == '__main__':
451 parser = argparse.ArgumentParser()
452
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600453 parser.add_argument('-defaultExtensions', action='store',
454 default='vulkan',
455 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600456 parser.add_argument('-extension', action='append',
457 default=[],
458 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600459 parser.add_argument('-removeExtensions', action='append',
460 default=[],
461 help='Specify an extension or extensions to remove from targets')
462 parser.add_argument('-emitExtensions', action='append',
463 default=[],
464 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600465 parser.add_argument('-feature', action='append',
466 default=[],
467 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600468 parser.add_argument('-debug', action='store_true',
469 help='Enable debugging')
470 parser.add_argument('-dump', action='store_true',
471 help='Enable dump to stderr')
472 parser.add_argument('-diagfile', action='store',
473 default=None,
474 help='Write diagnostics to specified file')
475 parser.add_argument('-errfile', action='store',
476 default=None,
477 help='Write errors and warnings to specified file instead of stderr')
478 parser.add_argument('-noprotect', dest='protect', action='store_false',
479 help='Disable inclusion protection in output headers')
480 parser.add_argument('-profile', action='store_true',
481 help='Enable profiling')
482 parser.add_argument('-registry', action='store',
483 default='vk.xml',
484 help='Use specified registry file instead of vk.xml')
485 parser.add_argument('-time', action='store_true',
486 help='Enable timing')
487 parser.add_argument('-validate', action='store_true',
488 help='Enable group validation')
489 parser.add_argument('-o', action='store', dest='directory',
490 default='.',
491 help='Create target and related files in specified directory')
492 parser.add_argument('target', metavar='target', nargs='?',
493 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700494 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700495 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700496 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
497 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600498
499 args = parser.parse_args()
500
501 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600502 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600503 args.extension = [name for arg in args.extension for name in arg.split()]
504
505 # Load & parse registry
506 reg = Registry()
507
508 startTimer(args.time)
509 tree = etree.parse(args.registry)
510 endTimer(args.time, '* Time to make ElementTree =')
511
Mike Schuchardt03646252018-03-09 08:39:43 -0700512 if args.debug:
513 pdb.run('reg.loadElementTree(tree)')
514 else:
515 startTimer(args.time)
516 reg.loadElementTree(tree)
517 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600518
519 if (args.validate):
520 reg.validateGroups()
521
522 if (args.dump):
523 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700524 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600525
526 # create error/warning & diagnostic files
527 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700528 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600529 else:
530 errWarn = sys.stderr
531
532 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700533 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600534 else:
535 diag = None
536
537 if (args.debug):
538 pdb.run('genTarget(args)')
539 elif (args.profile):
540 import cProfile, pstats
541 cProfile.run('genTarget(args)', 'profile.txt')
542 p = pstats.Stats('profile.txt')
543 p.strip_dirs().sort_stats('time').print_stats(50)
544 else:
545 genTarget(args)