blob: 37f10acf8278e5f1299b6972b6b520cc05c0d8db [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
17import argparse, cProfile, pdb, string, sys, time
18from reg import *
19from generator import write
Mark Lobodzinski36c33862017-02-13 10:15:53 -070020from cgenerator import CGeneratorOptions, COutputGenerator
21# LoaderAndValidationLayer Generator Modifications
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060022from threading_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinskid4950072017-08-01 13:02:20 -060023from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060024from unique_objects_generator import UniqueObjectsGeneratorOptions, UniqueObjectsOutputGenerator
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -060025from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
Mark Young0f183a82017-02-28 09:58:04 -070026from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -070027from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Young0f183a82017-02-28 09:58:04 -070028from loader_extension_generator import LoaderExtensionOutputGenerator, LoaderExtensionGeneratorOptions
Tobin Ehlis45a0a802017-10-13 09:26:20 -060029from mock_icd_generator import MockICDGeneratorOptions, MockICDOutputGenerator
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060030
31# Simple timer functions
32startTime = None
33
34def startTimer(timeit):
35 global startTime
36 startTime = time.clock()
37
38def endTimer(timeit, msg):
39 global startTime
40 endTime = time.clock()
41 if (timeit):
42 write(msg, endTime - startTime, file=sys.stderr)
43 startTime = None
44
45# Turn a list of strings into a regexp string matching exactly those strings
Mark Lobodzinski62f71562017-10-24 13:41:18 -060046def makeREstring(list, default = None):
47 if len(list) > 0 or default == None:
48 return '^(' + '|'.join(list) + ')$'
49 else:
50 return default
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060051
52# Returns a directory of [ generator function, generator options ] indexed
53# by specified short names. The generator options incorporate the following
54# parameters:
55#
Mark Lobodzinski62f71562017-10-24 13:41:18 -060056# args is an parsed argument object; see below for the fields that are used.
57def makeGenOpts(args):
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060058 global genOpts
59 genOpts = {}
60
Mark Lobodzinski62f71562017-10-24 13:41:18 -060061 # Default class of extensions to include, or None
62 defaultExtensions = args.defaultExtensions
63
64 # Additional extensions to include (list of extensions)
65 extensions = args.extension
66
67 # Extensions to remove (list of extensions)
68 removeExtensions = args.removeExtensions
69
70 # Extensions to emit (list of extensions)
71 emitExtensions = args.emitExtensions
72
73 # Features to include (list of features)
74 features = args.feature
75
76 # Whether to disable inclusion protect in headers
77 protect = args.protect
78
79 # Output target directory
80 directory = args.directory
81
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060082 # Descriptive names for various regexp patterns used to select
83 # versions and extensions
Mark Lobodzinski16530212017-09-18 15:13:54 -060084 allFeatures = allExtensions = '.*'
Mark Lobodzinski62f71562017-10-24 13:41:18 -060085 noFeatures = noExtensions = None
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060086
Mark Lobodzinski62f71562017-10-24 13:41:18 -060087 # Turn lists of names/patterns into matching regular expressions
88 addExtensionsPat = makeREstring(extensions, None)
89 removeExtensionsPat = makeREstring(removeExtensions, None)
90 emitExtensionsPat = makeREstring(emitExtensions, allExtensions)
91 featuresPat = makeREstring(features, allFeatures)
Mark Lobodzinski16530212017-09-18 15:13:54 -060092
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060093 # Copyright text prefixing all headers (list of strings).
94 prefixStrings = [
95 '/*',
Mike Schuchardt03646252018-03-09 08:39:43 -070096 '** Copyright (c) 2015-2018 The Khronos Group Inc.',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060097 '**',
98 '** Licensed under the Apache License, Version 2.0 (the "License");',
99 '** you may not use this file except in compliance with the License.',
100 '** You may obtain a copy of the License at',
101 '**',
102 '** http://www.apache.org/licenses/LICENSE-2.0',
103 '**',
104 '** Unless required by applicable law or agreed to in writing, software',
105 '** distributed under the License is distributed on an "AS IS" BASIS,',
106 '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
107 '** See the License for the specific language governing permissions and',
108 '** limitations under the License.',
109 '*/',
110 ''
111 ]
112
113 # Text specific to Vulkan headers
114 vkPrefixStrings = [
115 '/*',
116 '** This header is generated from the Khronos Vulkan XML API Registry.',
117 '**',
118 '*/',
119 ''
120 ]
121
122 # Defaults for generating re-inclusion protection wrappers (or not)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600123 protectFeature = protect
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600124
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600125 # LoaderAndValidationLayer Generators
126 # Options for threading layer
127 genOpts['thread_check.h'] = [
128 ThreadOutputGenerator,
129 ThreadGeneratorOptions(
130 filename = 'thread_check.h',
131 directory = directory,
132 apiname = 'vulkan',
133 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600134 versions = featuresPat,
135 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600136 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600137 addExtensions = addExtensionsPat,
138 removeExtensions = removeExtensionsPat,
139 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600140 prefixText = prefixStrings + vkPrefixStrings,
141 protectFeature = False,
142 apicall = 'VKAPI_ATTR ',
143 apientry = 'VKAPI_CALL ',
144 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600145 alignFuncParam = 48,
146 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600147 ]
148
149 # Options for parameter validation layer
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600150 genOpts['parameter_validation.cpp'] = [
151 ParameterValidationOutputGenerator,
152 ParameterValidationGeneratorOptions(
153 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600154 directory = directory,
155 apiname = 'vulkan',
156 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600157 versions = featuresPat,
158 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600159 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600160 addExtensions = addExtensionsPat,
161 removeExtensions = removeExtensionsPat,
162 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600163 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600164 apicall = 'VKAPI_ATTR ',
165 apientry = 'VKAPI_CALL ',
166 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600167 alignFuncParam = 48,
168 expandEnumerants = False)
169 ]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600170
171 # Options for unique objects layer
172 genOpts['unique_objects_wrappers.h'] = [
173 UniqueObjectsOutputGenerator,
174 UniqueObjectsGeneratorOptions(
175 filename = 'unique_objects_wrappers.h',
176 directory = directory,
177 apiname = 'vulkan',
178 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600179 versions = featuresPat,
180 emitversions = featuresPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600181 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600182 addExtensions = addExtensionsPat,
183 removeExtensions = removeExtensionsPat,
184 emitExtensions = emitExtensionsPat,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600185 prefixText = prefixStrings + vkPrefixStrings,
186 protectFeature = False,
187 apicall = 'VKAPI_ATTR ',
188 apientry = 'VKAPI_CALL ',
189 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600190 alignFuncParam = 48,
191 expandEnumerants = False)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600192 ]
193
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600194 # Options for object_tracker layer
195 genOpts['object_tracker.cpp'] = [
196 ObjectTrackerOutputGenerator,
197 ObjectTrackerGeneratorOptions(
198 filename = 'object_tracker.cpp',
199 directory = directory,
200 apiname = 'vulkan',
201 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600202 versions = featuresPat,
203 emitversions = featuresPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600204 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600205 addExtensions = addExtensionsPat,
206 removeExtensions = removeExtensionsPat,
207 emitExtensions = emitExtensionsPat,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600208 prefixText = prefixStrings + vkPrefixStrings,
209 protectFeature = False,
210 apicall = 'VKAPI_ATTR ',
211 apientry = 'VKAPI_CALL ',
212 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600213 alignFuncParam = 48,
214 expandEnumerants = False)
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600215 ]
216
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700217 # Options for dispatch table helper generator
218 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700219 DispatchTableHelperOutputGenerator,
220 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700221 filename = 'vk_dispatch_table_helper.h',
222 directory = directory,
223 apiname = 'vulkan',
224 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600225 versions = featuresPat,
226 emitversions = featuresPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700227 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600228 addExtensions = addExtensionsPat,
229 removeExtensions = removeExtensionsPat,
230 emitExtensions = emitExtensionsPat,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700231 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700232 apicall = 'VKAPI_ATTR ',
233 apientry = 'VKAPI_CALL ',
234 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600235 alignFuncParam = 48,
236 expandEnumerants = False)
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700237 ]
238
Mark Young0f183a82017-02-28 09:58:04 -0700239 # Options for Layer dispatch table generator
240 genOpts['vk_layer_dispatch_table.h'] = [
241 LoaderExtensionOutputGenerator,
242 LoaderExtensionGeneratorOptions(
243 filename = 'vk_layer_dispatch_table.h',
244 directory = directory,
245 apiname = 'vulkan',
246 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600247 versions = featuresPat,
248 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700249 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600250 addExtensions = addExtensionsPat,
251 removeExtensions = removeExtensionsPat,
252 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700253 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700254 apicall = 'VKAPI_ATTR ',
255 apientry = 'VKAPI_CALL ',
256 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600257 alignFuncParam = 48,
258 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700259 ]
260
261 # Options for loader extension source generator
262 genOpts['vk_loader_extensions.h'] = [
263 LoaderExtensionOutputGenerator,
264 LoaderExtensionGeneratorOptions(
265 filename = 'vk_loader_extensions.h',
266 directory = directory,
267 apiname = 'vulkan',
268 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600269 versions = featuresPat,
270 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700271 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600272 addExtensions = addExtensionsPat,
273 removeExtensions = removeExtensionsPat,
274 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700275 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700276 apicall = 'VKAPI_ATTR ',
277 apientry = 'VKAPI_CALL ',
278 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600279 alignFuncParam = 48,
280 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700281 ]
282
283 # Options for loader extension source generator
284 genOpts['vk_loader_extensions.c'] = [
285 LoaderExtensionOutputGenerator,
286 LoaderExtensionGeneratorOptions(
287 filename = 'vk_loader_extensions.c',
288 directory = directory,
289 apiname = 'vulkan',
290 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600291 versions = featuresPat,
292 emitversions = featuresPat,
Mark Young0f183a82017-02-28 09:58:04 -0700293 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600294 addExtensions = addExtensionsPat,
295 removeExtensions = removeExtensionsPat,
296 emitExtensions = emitExtensionsPat,
Mark Young0f183a82017-02-28 09:58:04 -0700297 prefixText = prefixStrings + vkPrefixStrings,
Mark Young0f183a82017-02-28 09:58:04 -0700298 apicall = 'VKAPI_ATTR ',
299 apientry = 'VKAPI_CALL ',
300 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600301 alignFuncParam = 48,
302 expandEnumerants = False)
Mark Young0f183a82017-02-28 09:58:04 -0700303 ]
304
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700305 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700306 genOpts['vk_enum_string_helper.h'] = [
307 HelperFileOutputGenerator,
308 HelperFileOutputGeneratorOptions(
309 filename = 'vk_enum_string_helper.h',
310 directory = directory,
311 apiname = 'vulkan',
312 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600313 versions = featuresPat,
314 emitversions = featuresPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700315 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600316 addExtensions = addExtensionsPat,
317 removeExtensions = removeExtensionsPat,
318 emitExtensions = emitExtensionsPat,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700319 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700320 apicall = 'VKAPI_ATTR ',
321 apientry = 'VKAPI_CALL ',
322 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700323 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600324 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700325 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700326 ]
327
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700328 # Helper file generator options for vk_struct_size_helper.h
329 genOpts['vk_struct_size_helper.h'] = [
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700330 HelperFileOutputGenerator,
331 HelperFileOutputGeneratorOptions(
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700332 filename = 'vk_struct_size_helper.h',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700333 directory = directory,
334 apiname = 'vulkan',
335 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600336 versions = featuresPat,
337 emitversions = featuresPat,
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700338 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600339 addExtensions = addExtensionsPat,
340 removeExtensions = removeExtensionsPat,
341 emitExtensions = emitExtensionsPat,
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700342 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700343 apicall = 'VKAPI_ATTR ',
344 apientry = 'VKAPI_CALL ',
345 apientryp = 'VKAPI_PTR *',
346 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600347 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700348 helper_file_type = 'struct_size_header')
349 ]
350
351 # Helper file generator options for vk_struct_size_helper.c
352 genOpts['vk_struct_size_helper.c'] = [
353 HelperFileOutputGenerator,
354 HelperFileOutputGeneratorOptions(
355 filename = 'vk_struct_size_helper.c',
356 directory = directory,
357 apiname = 'vulkan',
358 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600359 versions = featuresPat,
360 emitversions = featuresPat,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700361 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600362 addExtensions = addExtensionsPat,
363 removeExtensions = removeExtensionsPat,
364 emitExtensions = emitExtensionsPat,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700365 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700366 apicall = 'VKAPI_ATTR ',
367 apientry = 'VKAPI_CALL ',
368 apientryp = 'VKAPI_PTR *',
369 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600370 expandEnumerants = False,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700371 helper_file_type = 'struct_size_source')
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700372 ]
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700373
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700374 # Helper file generator options for vk_safe_struct.h
375 genOpts['vk_safe_struct.h'] = [
376 HelperFileOutputGenerator,
377 HelperFileOutputGeneratorOptions(
378 filename = 'vk_safe_struct.h',
379 directory = directory,
380 apiname = 'vulkan',
381 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600382 versions = featuresPat,
383 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700384 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600385 addExtensions = addExtensionsPat,
386 removeExtensions = removeExtensionsPat,
387 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700388 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700389 apicall = 'VKAPI_ATTR ',
390 apientry = 'VKAPI_CALL ',
391 apientryp = 'VKAPI_PTR *',
392 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600393 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700394 helper_file_type = 'safe_struct_header')
395 ]
396
397 # Helper file generator options for vk_safe_struct.cpp
398 genOpts['vk_safe_struct.cpp'] = [
399 HelperFileOutputGenerator,
400 HelperFileOutputGeneratorOptions(
401 filename = 'vk_safe_struct.cpp',
402 directory = directory,
403 apiname = 'vulkan',
404 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600405 versions = featuresPat,
406 emitversions = featuresPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700407 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600408 addExtensions = addExtensionsPat,
409 removeExtensions = removeExtensionsPat,
410 emitExtensions = emitExtensionsPat,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700411 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700412 apicall = 'VKAPI_ATTR ',
413 apientry = 'VKAPI_CALL ',
414 apientryp = 'VKAPI_PTR *',
415 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600416 expandEnumerants = False,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700417 helper_file_type = 'safe_struct_source')
418 ]
419
Mark Lobodzinski70972012017-04-03 16:59:15 -0600420 # Helper file generator options for vk_object_types.h
421 genOpts['vk_object_types.h'] = [
422 HelperFileOutputGenerator,
423 HelperFileOutputGeneratorOptions(
424 filename = 'vk_object_types.h',
425 directory = directory,
426 apiname = 'vulkan',
427 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600428 versions = featuresPat,
429 emitversions = featuresPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600430 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600431 addExtensions = addExtensionsPat,
432 removeExtensions = removeExtensionsPat,
433 emitExtensions = emitExtensionsPat,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600434 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600435 apicall = 'VKAPI_ATTR ',
436 apientry = 'VKAPI_CALL ',
437 apientryp = 'VKAPI_PTR *',
438 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600439 expandEnumerants = False,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600440 helper_file_type = 'object_types_header')
441 ]
442
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600443 # Helper file generator options for extension_helper.h
444 genOpts['vk_extension_helper.h'] = [
445 HelperFileOutputGenerator,
446 HelperFileOutputGeneratorOptions(
447 filename = 'vk_extension_helper.h',
448 directory = directory,
449 apiname = 'vulkan',
450 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600451 versions = featuresPat,
452 emitversions = featuresPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600453 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600454 addExtensions = addExtensionsPat,
455 removeExtensions = removeExtensionsPat,
456 emitExtensions = emitExtensionsPat,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600457 prefixText = prefixStrings + vkPrefixStrings,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600458 apicall = 'VKAPI_ATTR ',
459 apientry = 'VKAPI_CALL ',
460 apientryp = 'VKAPI_PTR *',
461 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600462 expandEnumerants = False,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600463 helper_file_type = 'extension_helper_header')
464 ]
465
John Zulaufde972ac2017-10-26 12:07:05 -0600466 # Helper file generator options for typemap_helper.h
467 genOpts['vk_typemap_helper.h'] = [
468 HelperFileOutputGenerator,
469 HelperFileOutputGeneratorOptions(
470 filename = 'vk_typemap_helper.h',
471 directory = directory,
472 apiname = 'vulkan',
473 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600474 versions = featuresPat,
475 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600476 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600477 addExtensions = addExtensionsPat,
478 removeExtensions = removeExtensionsPat,
479 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600480 prefixText = prefixStrings + vkPrefixStrings,
481 protectFeature = False,
482 apicall = 'VKAPI_ATTR ',
483 apientry = 'VKAPI_CALL ',
484 apientryp = 'VKAPI_PTR *',
485 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600486 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600487 helper_file_type = 'typemap_helper_header')
488 ]
489
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600490 # Options for mock ICD header
491 genOpts['mock_icd.h'] = [
492 MockICDOutputGenerator,
493 MockICDGeneratorOptions(
494 filename = 'mock_icd.h',
495 directory = directory,
496 apiname = 'vulkan',
497 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600498 versions = featuresPat,
499 emitversions = featuresPat,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600500 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600501 addExtensions = addExtensionsPat,
502 removeExtensions = removeExtensionsPat,
503 emitExtensions = emitExtensionsPat,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600504 prefixText = prefixStrings + vkPrefixStrings,
505 protectFeature = False,
506 apicall = 'VKAPI_ATTR ',
507 apientry = 'VKAPI_CALL ',
508 apientryp = 'VKAPI_PTR *',
509 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600510 expandEnumerants = False,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600511 helper_file_type = 'mock_icd_header')
512 ]
513
514 # Options for mock ICD cpp
515 genOpts['mock_icd.cpp'] = [
516 MockICDOutputGenerator,
517 MockICDGeneratorOptions(
518 filename = 'mock_icd.cpp',
519 directory = directory,
520 apiname = 'vulkan',
521 profile = None,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600522 versions = featuresPat,
523 emitversions = featuresPat,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600524 defaultExtensions = 'vulkan',
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600525 addExtensions = addExtensionsPat,
526 removeExtensions = removeExtensionsPat,
527 emitExtensions = emitExtensionsPat,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600528 prefixText = prefixStrings + vkPrefixStrings,
529 protectFeature = False,
530 apicall = 'VKAPI_ATTR ',
531 apientry = 'VKAPI_CALL ',
532 apientryp = 'VKAPI_PTR *',
533 alignFuncParam = 48,
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600534 expandEnumerants = False,
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600535 helper_file_type = 'mock_icd_source')
536 ]
Mark Lobodzinski70972012017-04-03 16:59:15 -0600537
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600538# Generate a target based on the options in the matching genOpts{} object.
539# This is encapsulated in a function so it can be profiled and/or timed.
540# The args parameter is an parsed argument object containing the following
541# fields that are used:
542# target - target to generate
543# directory - directory to generate it in
544# protect - True if re-inclusion wrappers should be created
545# extensions - list of additional extensions to include in generated
546# interfaces
547def genTarget(args):
548 global genOpts
549
550 # Create generator options with specified parameters
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600551 makeGenOpts(args)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600552
553 if (args.target in genOpts.keys()):
554 createGenerator = genOpts[args.target][0]
555 options = genOpts[args.target][1]
556
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700557 if not args.quiet:
558 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600559 write('* options.versions =', options.versions, file=sys.stderr)
560 write('* options.emitversions =', options.emitversions, file=sys.stderr)
561 write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
562 write('* options.addExtensions =', options.addExtensions, file=sys.stderr)
563 write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
564 write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600565
566 startTimer(args.time)
567 gen = createGenerator(errFile=errWarn,
568 warnFile=errWarn,
569 diagFile=diag)
570 reg.setGenerator(gen)
571 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700572
573 if not args.quiet:
574 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600575 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
576 else:
577 write('No generator options for unknown target:',
578 args.target, file=sys.stderr)
579
Mark Lobodzinski16530212017-09-18 15:13:54 -0600580# -feature name
581# -extension name
582# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600583# of names, or a regular expression.
584if __name__ == '__main__':
585 parser = argparse.ArgumentParser()
586
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600587 parser.add_argument('-defaultExtensions', action='store',
588 default='vulkan',
589 help='Specify a single class of extensions to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600590 parser.add_argument('-extension', action='append',
591 default=[],
592 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski62f71562017-10-24 13:41:18 -0600593 parser.add_argument('-removeExtensions', action='append',
594 default=[],
595 help='Specify an extension or extensions to remove from targets')
596 parser.add_argument('-emitExtensions', action='append',
597 default=[],
598 help='Specify an extension or extensions to emit in targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600599 parser.add_argument('-feature', action='append',
600 default=[],
601 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600602 parser.add_argument('-debug', action='store_true',
603 help='Enable debugging')
604 parser.add_argument('-dump', action='store_true',
605 help='Enable dump to stderr')
606 parser.add_argument('-diagfile', action='store',
607 default=None,
608 help='Write diagnostics to specified file')
609 parser.add_argument('-errfile', action='store',
610 default=None,
611 help='Write errors and warnings to specified file instead of stderr')
612 parser.add_argument('-noprotect', dest='protect', action='store_false',
613 help='Disable inclusion protection in output headers')
614 parser.add_argument('-profile', action='store_true',
615 help='Enable profiling')
616 parser.add_argument('-registry', action='store',
617 default='vk.xml',
618 help='Use specified registry file instead of vk.xml')
619 parser.add_argument('-time', action='store_true',
620 help='Enable timing')
621 parser.add_argument('-validate', action='store_true',
622 help='Enable group validation')
623 parser.add_argument('-o', action='store', dest='directory',
624 default='.',
625 help='Create target and related files in specified directory')
626 parser.add_argument('target', metavar='target', nargs='?',
627 help='Specify target')
Mike Schuchardt03646252018-03-09 08:39:43 -0700628 parser.add_argument('-quiet', action='store_true', default=True,
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700629 help='Suppress script output during normal execution.')
Mike Schuchardt03646252018-03-09 08:39:43 -0700630 parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
631 help='Enable script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600632
633 args = parser.parse_args()
634
635 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600636 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600637 args.extension = [name for arg in args.extension for name in arg.split()]
638
639 # Load & parse registry
640 reg = Registry()
641
642 startTimer(args.time)
643 tree = etree.parse(args.registry)
644 endTimer(args.time, '* Time to make ElementTree =')
645
Mike Schuchardt03646252018-03-09 08:39:43 -0700646 if args.debug:
647 pdb.run('reg.loadElementTree(tree)')
648 else:
649 startTimer(args.time)
650 reg.loadElementTree(tree)
651 endTimer(args.time, '* Time to parse ElementTree =')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600652
653 if (args.validate):
654 reg.validateGroups()
655
656 if (args.dump):
657 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700658 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600659
660 # create error/warning & diagnostic files
661 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700662 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600663 else:
664 errWarn = sys.stderr
665
666 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700667 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600668 else:
669 diag = None
670
671 if (args.debug):
672 pdb.run('genTarget(args)')
673 elif (args.profile):
674 import cProfile, pstats
675 cProfile.run('genTarget(args)', 'profile.txt')
676 p = pstats.Stats('profile.txt')
677 p.strip_dirs().sort_stats('time').print_stats(50)
678 else:
679 genTarget(args)