xref: /aosp_15_r20/external/vulkan-validation-layers/scripts/lvl_genvk.py (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi#!/usr/bin/python3
2*b7893ccfSSadaf Ebrahimi#
3*b7893ccfSSadaf Ebrahimi# Copyright (c) 2013-2019 The Khronos Group Inc.
4*b7893ccfSSadaf Ebrahimi#
5*b7893ccfSSadaf Ebrahimi# Licensed under the Apache License, Version 2.0 (the "License");
6*b7893ccfSSadaf Ebrahimi# you may not use this file except in compliance with the License.
7*b7893ccfSSadaf Ebrahimi# You may obtain a copy of the License at
8*b7893ccfSSadaf Ebrahimi#
9*b7893ccfSSadaf Ebrahimi#     http://www.apache.org/licenses/LICENSE-2.0
10*b7893ccfSSadaf Ebrahimi#
11*b7893ccfSSadaf Ebrahimi# Unless required by applicable law or agreed to in writing, software
12*b7893ccfSSadaf Ebrahimi# distributed under the License is distributed on an "AS IS" BASIS,
13*b7893ccfSSadaf Ebrahimi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b7893ccfSSadaf Ebrahimi# See the License for the specific language governing permissions and
15*b7893ccfSSadaf Ebrahimi# limitations under the License.
16*b7893ccfSSadaf Ebrahimi
17*b7893ccfSSadaf Ebrahimiimport argparse, cProfile, pdb, string, sys, time, os
18*b7893ccfSSadaf Ebrahimi
19*b7893ccfSSadaf Ebrahimi# Simple timer functions
20*b7893ccfSSadaf EbrahimistartTime = None
21*b7893ccfSSadaf Ebrahimi
22*b7893ccfSSadaf Ebrahimidef startTimer(timeit):
23*b7893ccfSSadaf Ebrahimi    global startTime
24*b7893ccfSSadaf Ebrahimi    if timeit:
25*b7893ccfSSadaf Ebrahimi        startTime = time.process_time()
26*b7893ccfSSadaf Ebrahimi
27*b7893ccfSSadaf Ebrahimidef endTimer(timeit, msg):
28*b7893ccfSSadaf Ebrahimi    global startTime
29*b7893ccfSSadaf Ebrahimi    if timeit:
30*b7893ccfSSadaf Ebrahimi        endTime = time.process_time()
31*b7893ccfSSadaf Ebrahimi        write(msg, endTime - startTime, file=sys.stderr)
32*b7893ccfSSadaf Ebrahimi        startTime = None
33*b7893ccfSSadaf Ebrahimi
34*b7893ccfSSadaf Ebrahimi# Turn a list of strings into a regexp string matching exactly those strings
35*b7893ccfSSadaf Ebrahimidef makeREstring(list, default = None):
36*b7893ccfSSadaf Ebrahimi    if len(list) > 0 or default is None:
37*b7893ccfSSadaf Ebrahimi        return '^(' + '|'.join(list) + ')$'
38*b7893ccfSSadaf Ebrahimi    else:
39*b7893ccfSSadaf Ebrahimi        return default
40*b7893ccfSSadaf Ebrahimi
41*b7893ccfSSadaf Ebrahimi# Returns a directory of [ generator function, generator options ] indexed
42*b7893ccfSSadaf Ebrahimi# by specified short names. The generator options incorporate the following
43*b7893ccfSSadaf Ebrahimi# parameters:
44*b7893ccfSSadaf Ebrahimi#
45*b7893ccfSSadaf Ebrahimi# args is an parsed argument object; see below for the fields that are used.
46*b7893ccfSSadaf Ebrahimidef makeGenOpts(args):
47*b7893ccfSSadaf Ebrahimi    global genOpts
48*b7893ccfSSadaf Ebrahimi    genOpts = {}
49*b7893ccfSSadaf Ebrahimi
50*b7893ccfSSadaf Ebrahimi    # Default class of extensions to include, or None
51*b7893ccfSSadaf Ebrahimi    defaultExtensions = args.defaultExtensions
52*b7893ccfSSadaf Ebrahimi
53*b7893ccfSSadaf Ebrahimi    # Additional extensions to include (list of extensions)
54*b7893ccfSSadaf Ebrahimi    extensions = args.extension
55*b7893ccfSSadaf Ebrahimi
56*b7893ccfSSadaf Ebrahimi    # Extensions to remove (list of extensions)
57*b7893ccfSSadaf Ebrahimi    removeExtensions = args.removeExtensions
58*b7893ccfSSadaf Ebrahimi
59*b7893ccfSSadaf Ebrahimi    # Extensions to emit (list of extensions)
60*b7893ccfSSadaf Ebrahimi    emitExtensions = args.emitExtensions
61*b7893ccfSSadaf Ebrahimi
62*b7893ccfSSadaf Ebrahimi    # Features to include (list of features)
63*b7893ccfSSadaf Ebrahimi    features = args.feature
64*b7893ccfSSadaf Ebrahimi
65*b7893ccfSSadaf Ebrahimi    # Whether to disable inclusion protect in headers
66*b7893ccfSSadaf Ebrahimi    protect = args.protect
67*b7893ccfSSadaf Ebrahimi
68*b7893ccfSSadaf Ebrahimi    # Output target directory
69*b7893ccfSSadaf Ebrahimi    directory = args.directory
70*b7893ccfSSadaf Ebrahimi
71*b7893ccfSSadaf Ebrahimi    # Descriptive names for various regexp patterns used to select
72*b7893ccfSSadaf Ebrahimi    # versions and extensions
73*b7893ccfSSadaf Ebrahimi    allFeatures     = allExtensions = '.*'
74*b7893ccfSSadaf Ebrahimi    noFeatures      = noExtensions = None
75*b7893ccfSSadaf Ebrahimi
76*b7893ccfSSadaf Ebrahimi    # Turn lists of names/patterns into matching regular expressions
77*b7893ccfSSadaf Ebrahimi    addExtensionsPat     = makeREstring(extensions, None)
78*b7893ccfSSadaf Ebrahimi    removeExtensionsPat  = makeREstring(removeExtensions, None)
79*b7893ccfSSadaf Ebrahimi    emitExtensionsPat    = makeREstring(emitExtensions, allExtensions)
80*b7893ccfSSadaf Ebrahimi    featuresPat          = makeREstring(features, allFeatures)
81*b7893ccfSSadaf Ebrahimi
82*b7893ccfSSadaf Ebrahimi    # Copyright text prefixing all headers (list of strings).
83*b7893ccfSSadaf Ebrahimi    prefixStrings = [
84*b7893ccfSSadaf Ebrahimi        '/*',
85*b7893ccfSSadaf Ebrahimi        '** Copyright (c) 2015-2019 The Khronos Group Inc.',
86*b7893ccfSSadaf Ebrahimi        '**',
87*b7893ccfSSadaf Ebrahimi        '** Licensed under the Apache License, Version 2.0 (the "License");',
88*b7893ccfSSadaf Ebrahimi        '** you may not use this file except in compliance with the License.',
89*b7893ccfSSadaf Ebrahimi        '** You may obtain a copy of the License at',
90*b7893ccfSSadaf Ebrahimi        '**',
91*b7893ccfSSadaf Ebrahimi        '**     http://www.apache.org/licenses/LICENSE-2.0',
92*b7893ccfSSadaf Ebrahimi        '**',
93*b7893ccfSSadaf Ebrahimi        '** Unless required by applicable law or agreed to in writing, software',
94*b7893ccfSSadaf Ebrahimi        '** distributed under the License is distributed on an "AS IS" BASIS,',
95*b7893ccfSSadaf Ebrahimi        '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
96*b7893ccfSSadaf Ebrahimi        '** See the License for the specific language governing permissions and',
97*b7893ccfSSadaf Ebrahimi        '** limitations under the License.',
98*b7893ccfSSadaf Ebrahimi        '*/',
99*b7893ccfSSadaf Ebrahimi        ''
100*b7893ccfSSadaf Ebrahimi    ]
101*b7893ccfSSadaf Ebrahimi
102*b7893ccfSSadaf Ebrahimi    # Text specific to Vulkan headers
103*b7893ccfSSadaf Ebrahimi    vkPrefixStrings = [
104*b7893ccfSSadaf Ebrahimi        '/*',
105*b7893ccfSSadaf Ebrahimi        '** This header is generated from the Khronos Vulkan XML API Registry.',
106*b7893ccfSSadaf Ebrahimi        '**',
107*b7893ccfSSadaf Ebrahimi        '*/',
108*b7893ccfSSadaf Ebrahimi        ''
109*b7893ccfSSadaf Ebrahimi    ]
110*b7893ccfSSadaf Ebrahimi
111*b7893ccfSSadaf Ebrahimi    # Defaults for generating re-inclusion protection wrappers (or not)
112*b7893ccfSSadaf Ebrahimi    protectFeature = protect
113*b7893ccfSSadaf Ebrahimi
114*b7893ccfSSadaf Ebrahimi    # An API style convention object
115*b7893ccfSSadaf Ebrahimi    conventions = VulkanConventions()
116*b7893ccfSSadaf Ebrahimi
117*b7893ccfSSadaf Ebrahimi    # ValidationLayer Generators
118*b7893ccfSSadaf Ebrahimi    # Options for thread safety header code-generation
119*b7893ccfSSadaf Ebrahimi    genOpts['thread_safety.h'] = [
120*b7893ccfSSadaf Ebrahimi          ThreadOutputGenerator,
121*b7893ccfSSadaf Ebrahimi          ThreadGeneratorOptions(
122*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
123*b7893ccfSSadaf Ebrahimi            filename          = 'thread_safety.h',
124*b7893ccfSSadaf Ebrahimi            directory         = directory,
125*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
126*b7893ccfSSadaf Ebrahimi            profile           = None,
127*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
128*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
129*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
130*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
131*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
132*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
133*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
134*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
135*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
136*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
137*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
138*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
139*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
140*b7893ccfSSadaf Ebrahimi        ]
141*b7893ccfSSadaf Ebrahimi
142*b7893ccfSSadaf Ebrahimi    # Options for thread safety source code-generation
143*b7893ccfSSadaf Ebrahimi    genOpts['thread_safety.cpp'] = [
144*b7893ccfSSadaf Ebrahimi          ThreadOutputGenerator,
145*b7893ccfSSadaf Ebrahimi          ThreadGeneratorOptions(
146*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
147*b7893ccfSSadaf Ebrahimi            filename          = 'thread_safety.cpp',
148*b7893ccfSSadaf Ebrahimi            directory         = directory,
149*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
150*b7893ccfSSadaf Ebrahimi            profile           = None,
151*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
152*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
153*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
154*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
155*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
156*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
157*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
158*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
159*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
160*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
161*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
162*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
163*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
164*b7893ccfSSadaf Ebrahimi        ]
165*b7893ccfSSadaf Ebrahimi
166*b7893ccfSSadaf Ebrahimi    # Options for stateless validation source file
167*b7893ccfSSadaf Ebrahimi    genOpts['parameter_validation.cpp'] = [
168*b7893ccfSSadaf Ebrahimi          ParameterValidationOutputGenerator,
169*b7893ccfSSadaf Ebrahimi          ParameterValidationGeneratorOptions(
170*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
171*b7893ccfSSadaf Ebrahimi            filename          = 'parameter_validation.cpp',
172*b7893ccfSSadaf Ebrahimi            directory         = directory,
173*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
174*b7893ccfSSadaf Ebrahimi            profile           = None,
175*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
176*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
177*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
178*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
179*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
180*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
181*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
182*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
183*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
184*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
185*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
186*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
187*b7893ccfSSadaf Ebrahimi            valid_usage_path  = args.scripts)
188*b7893ccfSSadaf Ebrahimi          ]
189*b7893ccfSSadaf Ebrahimi
190*b7893ccfSSadaf Ebrahimi    # Options for stateless validation source file
191*b7893ccfSSadaf Ebrahimi    genOpts['parameter_validation.h'] = [
192*b7893ccfSSadaf Ebrahimi          ParameterValidationOutputGenerator,
193*b7893ccfSSadaf Ebrahimi          ParameterValidationGeneratorOptions(
194*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
195*b7893ccfSSadaf Ebrahimi            filename          = 'parameter_validation.h',
196*b7893ccfSSadaf Ebrahimi            directory         = directory,
197*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
198*b7893ccfSSadaf Ebrahimi            profile           = None,
199*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
200*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
201*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
202*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
203*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
204*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
205*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
206*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
207*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
208*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
209*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
210*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
211*b7893ccfSSadaf Ebrahimi            valid_usage_path  = args.scripts)
212*b7893ccfSSadaf Ebrahimi          ]
213*b7893ccfSSadaf Ebrahimi
214*b7893ccfSSadaf Ebrahimi    # Options for object_tracker code-generated validation routines
215*b7893ccfSSadaf Ebrahimi    genOpts['object_tracker.cpp'] = [
216*b7893ccfSSadaf Ebrahimi          ObjectTrackerOutputGenerator,
217*b7893ccfSSadaf Ebrahimi          ObjectTrackerGeneratorOptions(
218*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
219*b7893ccfSSadaf Ebrahimi            filename          = 'object_tracker.cpp',
220*b7893ccfSSadaf Ebrahimi            directory         = directory,
221*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
222*b7893ccfSSadaf Ebrahimi            profile           = None,
223*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
224*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
225*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
226*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
227*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
228*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
229*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
230*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
231*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
232*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
233*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
234*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
235*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
236*b7893ccfSSadaf Ebrahimi            valid_usage_path  = args.scripts)
237*b7893ccfSSadaf Ebrahimi        ]
238*b7893ccfSSadaf Ebrahimi
239*b7893ccfSSadaf Ebrahimi    # Options for object_tracker code-generated prototypes
240*b7893ccfSSadaf Ebrahimi    genOpts['object_tracker.h'] = [
241*b7893ccfSSadaf Ebrahimi          ObjectTrackerOutputGenerator,
242*b7893ccfSSadaf Ebrahimi          ObjectTrackerGeneratorOptions(
243*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
244*b7893ccfSSadaf Ebrahimi            filename          = 'object_tracker.h',
245*b7893ccfSSadaf Ebrahimi            directory         = directory,
246*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
247*b7893ccfSSadaf Ebrahimi            profile           = None,
248*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
249*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
250*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
251*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
252*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
253*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
254*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
255*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
256*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
257*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
258*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
259*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
260*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
261*b7893ccfSSadaf Ebrahimi            valid_usage_path  = args.scripts)
262*b7893ccfSSadaf Ebrahimi        ]
263*b7893ccfSSadaf Ebrahimi
264*b7893ccfSSadaf Ebrahimi    # Options for dispatch table helper generator
265*b7893ccfSSadaf Ebrahimi    genOpts['vk_dispatch_table_helper.h'] = [
266*b7893ccfSSadaf Ebrahimi          DispatchTableHelperOutputGenerator,
267*b7893ccfSSadaf Ebrahimi          DispatchTableHelperOutputGeneratorOptions(
268*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
269*b7893ccfSSadaf Ebrahimi            filename          = 'vk_dispatch_table_helper.h',
270*b7893ccfSSadaf Ebrahimi            directory         = directory,
271*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
272*b7893ccfSSadaf Ebrahimi            profile           = None,
273*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
274*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
275*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
276*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
277*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
278*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
279*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
280*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
281*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
282*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
283*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
284*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
285*b7893ccfSSadaf Ebrahimi        ]
286*b7893ccfSSadaf Ebrahimi
287*b7893ccfSSadaf Ebrahimi    # Options for Layer dispatch table generator
288*b7893ccfSSadaf Ebrahimi    genOpts['vk_layer_dispatch_table.h'] = [
289*b7893ccfSSadaf Ebrahimi          LayerDispatchTableOutputGenerator,
290*b7893ccfSSadaf Ebrahimi          LayerDispatchTableGeneratorOptions(
291*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
292*b7893ccfSSadaf Ebrahimi            filename          = 'vk_layer_dispatch_table.h',
293*b7893ccfSSadaf Ebrahimi            directory         = directory,
294*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
295*b7893ccfSSadaf Ebrahimi            profile           = None,
296*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
297*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
298*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
299*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
300*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
301*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
302*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
303*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
304*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
305*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
306*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
307*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
308*b7893ccfSSadaf Ebrahimi        ]
309*b7893ccfSSadaf Ebrahimi
310*b7893ccfSSadaf Ebrahimi    # Helper file generator options for vk_enum_string_helper.h
311*b7893ccfSSadaf Ebrahimi    genOpts['vk_enum_string_helper.h'] = [
312*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
313*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
314*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
315*b7893ccfSSadaf Ebrahimi            filename          = 'vk_enum_string_helper.h',
316*b7893ccfSSadaf Ebrahimi            directory         = directory,
317*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
318*b7893ccfSSadaf Ebrahimi            profile           = None,
319*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
320*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
321*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
322*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
323*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
324*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
325*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
326*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
327*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
328*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
329*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
330*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
331*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'enum_string_header')
332*b7893ccfSSadaf Ebrahimi        ]
333*b7893ccfSSadaf Ebrahimi
334*b7893ccfSSadaf Ebrahimi    # Helper file generator options for vk_safe_struct.h
335*b7893ccfSSadaf Ebrahimi    genOpts['vk_safe_struct.h'] = [
336*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
337*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
338*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
339*b7893ccfSSadaf Ebrahimi            filename          = 'vk_safe_struct.h',
340*b7893ccfSSadaf Ebrahimi            directory         = directory,
341*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
342*b7893ccfSSadaf Ebrahimi            profile           = None,
343*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
344*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
345*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
346*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
347*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
348*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
349*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
350*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
351*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
352*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
353*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
354*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
355*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'safe_struct_header')
356*b7893ccfSSadaf Ebrahimi        ]
357*b7893ccfSSadaf Ebrahimi
358*b7893ccfSSadaf Ebrahimi    # Helper file generator options for vk_safe_struct.cpp
359*b7893ccfSSadaf Ebrahimi    genOpts['vk_safe_struct.cpp'] = [
360*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
361*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
362*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
363*b7893ccfSSadaf Ebrahimi            filename          = 'vk_safe_struct.cpp',
364*b7893ccfSSadaf Ebrahimi            directory         = directory,
365*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
366*b7893ccfSSadaf Ebrahimi            profile           = None,
367*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
368*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
369*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
370*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
371*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
372*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
373*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
374*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
375*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
376*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
377*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
378*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
379*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'safe_struct_source')
380*b7893ccfSSadaf Ebrahimi        ]
381*b7893ccfSSadaf Ebrahimi
382*b7893ccfSSadaf Ebrahimi    # Helper file generator options for vk_object_types.h
383*b7893ccfSSadaf Ebrahimi    genOpts['vk_object_types.h'] = [
384*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
385*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
386*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
387*b7893ccfSSadaf Ebrahimi            filename          = 'vk_object_types.h',
388*b7893ccfSSadaf Ebrahimi            directory         = directory,
389*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
390*b7893ccfSSadaf Ebrahimi            profile           = None,
391*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
392*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
393*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
394*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
395*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
396*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
397*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
398*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
399*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
400*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
401*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
402*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
403*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'object_types_header')
404*b7893ccfSSadaf Ebrahimi        ]
405*b7893ccfSSadaf Ebrahimi
406*b7893ccfSSadaf Ebrahimi    # Helper file generator options for extension_helper.h
407*b7893ccfSSadaf Ebrahimi    genOpts['vk_extension_helper.h'] = [
408*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
409*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
410*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
411*b7893ccfSSadaf Ebrahimi            filename          = 'vk_extension_helper.h',
412*b7893ccfSSadaf Ebrahimi            directory         = directory,
413*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
414*b7893ccfSSadaf Ebrahimi            profile           = None,
415*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
416*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
417*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
418*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
419*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
420*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
421*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
422*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
423*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
424*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
425*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
426*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
427*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'extension_helper_header')
428*b7893ccfSSadaf Ebrahimi        ]
429*b7893ccfSSadaf Ebrahimi
430*b7893ccfSSadaf Ebrahimi    # Helper file generator options for typemap_helper.h
431*b7893ccfSSadaf Ebrahimi    genOpts['vk_typemap_helper.h'] = [
432*b7893ccfSSadaf Ebrahimi          HelperFileOutputGenerator,
433*b7893ccfSSadaf Ebrahimi          HelperFileOutputGeneratorOptions(
434*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
435*b7893ccfSSadaf Ebrahimi            filename          = 'vk_typemap_helper.h',
436*b7893ccfSSadaf Ebrahimi            directory         = directory,
437*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
438*b7893ccfSSadaf Ebrahimi            profile           = None,
439*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
440*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
441*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
442*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
443*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
444*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
445*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
446*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
447*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
448*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
449*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
450*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
451*b7893ccfSSadaf Ebrahimi            expandEnumerants  = False,
452*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'typemap_helper_header')
453*b7893ccfSSadaf Ebrahimi        ]
454*b7893ccfSSadaf Ebrahimi
455*b7893ccfSSadaf Ebrahimi    # Layer chassis related generation structs
456*b7893ccfSSadaf Ebrahimi    # Options for layer chassis header
457*b7893ccfSSadaf Ebrahimi    genOpts['chassis.h'] = [
458*b7893ccfSSadaf Ebrahimi          LayerChassisOutputGenerator,
459*b7893ccfSSadaf Ebrahimi          LayerChassisGeneratorOptions(
460*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
461*b7893ccfSSadaf Ebrahimi            filename          = 'chassis.h',
462*b7893ccfSSadaf Ebrahimi            directory         = directory,
463*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
464*b7893ccfSSadaf Ebrahimi            profile           = None,
465*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
466*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
467*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
468*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
469*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
470*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
471*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
472*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
473*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
474*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
475*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
476*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'layer_chassis_header',
477*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
478*b7893ccfSSadaf Ebrahimi        ]
479*b7893ccfSSadaf Ebrahimi
480*b7893ccfSSadaf Ebrahimi    # Options for layer chassis source file
481*b7893ccfSSadaf Ebrahimi    genOpts['chassis.cpp'] = [
482*b7893ccfSSadaf Ebrahimi          LayerChassisOutputGenerator,
483*b7893ccfSSadaf Ebrahimi          LayerChassisGeneratorOptions(
484*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
485*b7893ccfSSadaf Ebrahimi            filename          = 'chassis.cpp',
486*b7893ccfSSadaf Ebrahimi            directory         = directory,
487*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
488*b7893ccfSSadaf Ebrahimi            profile           = None,
489*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
490*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
491*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
492*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
493*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
494*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
495*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
496*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
497*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
498*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
499*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
500*b7893ccfSSadaf Ebrahimi            helper_file_type  = 'layer_chassis_source',
501*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
502*b7893ccfSSadaf Ebrahimi        ]
503*b7893ccfSSadaf Ebrahimi
504*b7893ccfSSadaf Ebrahimi    # Options for layer chassis dispatch source file
505*b7893ccfSSadaf Ebrahimi    genOpts['layer_chassis_dispatch.cpp'] = [
506*b7893ccfSSadaf Ebrahimi          LayerChassisDispatchOutputGenerator,
507*b7893ccfSSadaf Ebrahimi          LayerChassisDispatchGeneratorOptions(
508*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
509*b7893ccfSSadaf Ebrahimi            filename          = 'layer_chassis_dispatch.cpp',
510*b7893ccfSSadaf Ebrahimi            directory         = directory,
511*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
512*b7893ccfSSadaf Ebrahimi            profile           = None,
513*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
514*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
515*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
516*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
517*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
518*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
519*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
520*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
521*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
522*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
523*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
524*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
525*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
526*b7893ccfSSadaf Ebrahimi        ]
527*b7893ccfSSadaf Ebrahimi
528*b7893ccfSSadaf Ebrahimi    # Options for layer chassis dispatch header file
529*b7893ccfSSadaf Ebrahimi    genOpts['layer_chassis_dispatch.h'] = [
530*b7893ccfSSadaf Ebrahimi          LayerChassisDispatchOutputGenerator,
531*b7893ccfSSadaf Ebrahimi          LayerChassisDispatchGeneratorOptions(
532*b7893ccfSSadaf Ebrahimi            conventions       = conventions,
533*b7893ccfSSadaf Ebrahimi            filename          = 'layer_chassis_dispatch.h',
534*b7893ccfSSadaf Ebrahimi            directory         = directory,
535*b7893ccfSSadaf Ebrahimi            apiname           = 'vulkan',
536*b7893ccfSSadaf Ebrahimi            profile           = None,
537*b7893ccfSSadaf Ebrahimi            versions          = featuresPat,
538*b7893ccfSSadaf Ebrahimi            emitversions      = featuresPat,
539*b7893ccfSSadaf Ebrahimi            defaultExtensions = 'vulkan',
540*b7893ccfSSadaf Ebrahimi            addExtensions     = addExtensionsPat,
541*b7893ccfSSadaf Ebrahimi            removeExtensions  = removeExtensionsPat,
542*b7893ccfSSadaf Ebrahimi            emitExtensions    = emitExtensionsPat,
543*b7893ccfSSadaf Ebrahimi            prefixText        = prefixStrings + vkPrefixStrings,
544*b7893ccfSSadaf Ebrahimi            protectFeature    = False,
545*b7893ccfSSadaf Ebrahimi            apicall           = 'VKAPI_ATTR ',
546*b7893ccfSSadaf Ebrahimi            apientry          = 'VKAPI_CALL ',
547*b7893ccfSSadaf Ebrahimi            apientryp         = 'VKAPI_PTR *',
548*b7893ccfSSadaf Ebrahimi            alignFuncParam    = 48,
549*b7893ccfSSadaf Ebrahimi            expandEnumerants = False)
550*b7893ccfSSadaf Ebrahimi        ]
551*b7893ccfSSadaf Ebrahimi
552*b7893ccfSSadaf Ebrahimi
553*b7893ccfSSadaf Ebrahimi# Generate a target based on the options in the matching genOpts{} object.
554*b7893ccfSSadaf Ebrahimi# This is encapsulated in a function so it can be profiled and/or timed.
555*b7893ccfSSadaf Ebrahimi# The args parameter is an parsed argument object containing the following
556*b7893ccfSSadaf Ebrahimi# fields that are used:
557*b7893ccfSSadaf Ebrahimi#   target - target to generate
558*b7893ccfSSadaf Ebrahimi#   directory - directory to generate it in
559*b7893ccfSSadaf Ebrahimi#   protect - True if re-inclusion wrappers should be created
560*b7893ccfSSadaf Ebrahimi#   extensions - list of additional extensions to include in generated
561*b7893ccfSSadaf Ebrahimi#   interfaces
562*b7893ccfSSadaf Ebrahimidef genTarget(args):
563*b7893ccfSSadaf Ebrahimi    global genOpts
564*b7893ccfSSadaf Ebrahimi
565*b7893ccfSSadaf Ebrahimi    # Create generator options with specified parameters
566*b7893ccfSSadaf Ebrahimi    makeGenOpts(args)
567*b7893ccfSSadaf Ebrahimi
568*b7893ccfSSadaf Ebrahimi    if (args.target in genOpts.keys()):
569*b7893ccfSSadaf Ebrahimi        createGenerator = genOpts[args.target][0]
570*b7893ccfSSadaf Ebrahimi        options = genOpts[args.target][1]
571*b7893ccfSSadaf Ebrahimi
572*b7893ccfSSadaf Ebrahimi        if not args.quiet:
573*b7893ccfSSadaf Ebrahimi            write('* Building', options.filename, file=sys.stderr)
574*b7893ccfSSadaf Ebrahimi            write('* options.versions          =', options.versions, file=sys.stderr)
575*b7893ccfSSadaf Ebrahimi            write('* options.emitversions      =', options.emitversions, file=sys.stderr)
576*b7893ccfSSadaf Ebrahimi            write('* options.defaultExtensions =', options.defaultExtensions, file=sys.stderr)
577*b7893ccfSSadaf Ebrahimi            write('* options.addExtensions     =', options.addExtensions, file=sys.stderr)
578*b7893ccfSSadaf Ebrahimi            write('* options.removeExtensions  =', options.removeExtensions, file=sys.stderr)
579*b7893ccfSSadaf Ebrahimi            write('* options.emitExtensions    =', options.emitExtensions, file=sys.stderr)
580*b7893ccfSSadaf Ebrahimi
581*b7893ccfSSadaf Ebrahimi        startTimer(args.time)
582*b7893ccfSSadaf Ebrahimi        gen = createGenerator(errFile=errWarn,
583*b7893ccfSSadaf Ebrahimi                              warnFile=errWarn,
584*b7893ccfSSadaf Ebrahimi                              diagFile=diag)
585*b7893ccfSSadaf Ebrahimi        reg.setGenerator(gen)
586*b7893ccfSSadaf Ebrahimi        reg.apiGen(options)
587*b7893ccfSSadaf Ebrahimi
588*b7893ccfSSadaf Ebrahimi        if not args.quiet:
589*b7893ccfSSadaf Ebrahimi            write('* Generated', options.filename, file=sys.stderr)
590*b7893ccfSSadaf Ebrahimi        endTimer(args.time, '* Time to generate ' + options.filename + ' =')
591*b7893ccfSSadaf Ebrahimi    else:
592*b7893ccfSSadaf Ebrahimi        write('No generator options for unknown target:',
593*b7893ccfSSadaf Ebrahimi              args.target, file=sys.stderr)
594*b7893ccfSSadaf Ebrahimi
595*b7893ccfSSadaf Ebrahimi# -feature name
596*b7893ccfSSadaf Ebrahimi# -extension name
597*b7893ccfSSadaf Ebrahimi# For both, "name" may be a single name, or a space-separated list
598*b7893ccfSSadaf Ebrahimi# of names, or a regular expression.
599*b7893ccfSSadaf Ebrahimiif __name__ == '__main__':
600*b7893ccfSSadaf Ebrahimi    parser = argparse.ArgumentParser()
601*b7893ccfSSadaf Ebrahimi
602*b7893ccfSSadaf Ebrahimi    parser.add_argument('-defaultExtensions', action='store',
603*b7893ccfSSadaf Ebrahimi                        default='vulkan',
604*b7893ccfSSadaf Ebrahimi                        help='Specify a single class of extensions to add to targets')
605*b7893ccfSSadaf Ebrahimi    parser.add_argument('-extension', action='append',
606*b7893ccfSSadaf Ebrahimi                        default=[],
607*b7893ccfSSadaf Ebrahimi                        help='Specify an extension or extensions to add to targets')
608*b7893ccfSSadaf Ebrahimi    parser.add_argument('-removeExtensions', action='append',
609*b7893ccfSSadaf Ebrahimi                        default=[],
610*b7893ccfSSadaf Ebrahimi                        help='Specify an extension or extensions to remove from targets')
611*b7893ccfSSadaf Ebrahimi    parser.add_argument('-emitExtensions', action='append',
612*b7893ccfSSadaf Ebrahimi                        default=[],
613*b7893ccfSSadaf Ebrahimi                        help='Specify an extension or extensions to emit in targets')
614*b7893ccfSSadaf Ebrahimi    parser.add_argument('-feature', action='append',
615*b7893ccfSSadaf Ebrahimi                        default=[],
616*b7893ccfSSadaf Ebrahimi                        help='Specify a core API feature name or names to add to targets')
617*b7893ccfSSadaf Ebrahimi    parser.add_argument('-debug', action='store_true',
618*b7893ccfSSadaf Ebrahimi                        help='Enable debugging')
619*b7893ccfSSadaf Ebrahimi    parser.add_argument('-dump', action='store_true',
620*b7893ccfSSadaf Ebrahimi                        help='Enable dump to stderr')
621*b7893ccfSSadaf Ebrahimi    parser.add_argument('-diagfile', action='store',
622*b7893ccfSSadaf Ebrahimi                        default=None,
623*b7893ccfSSadaf Ebrahimi                        help='Write diagnostics to specified file')
624*b7893ccfSSadaf Ebrahimi    parser.add_argument('-errfile', action='store',
625*b7893ccfSSadaf Ebrahimi                        default=None,
626*b7893ccfSSadaf Ebrahimi                        help='Write errors and warnings to specified file instead of stderr')
627*b7893ccfSSadaf Ebrahimi    parser.add_argument('-noprotect', dest='protect', action='store_false',
628*b7893ccfSSadaf Ebrahimi                        help='Disable inclusion protection in output headers')
629*b7893ccfSSadaf Ebrahimi    parser.add_argument('-profile', action='store_true',
630*b7893ccfSSadaf Ebrahimi                        help='Enable profiling')
631*b7893ccfSSadaf Ebrahimi    parser.add_argument('-registry', action='store',
632*b7893ccfSSadaf Ebrahimi                        default='vk.xml',
633*b7893ccfSSadaf Ebrahimi                        help='Use specified registry file instead of vk.xml')
634*b7893ccfSSadaf Ebrahimi    parser.add_argument('-time', action='store_true',
635*b7893ccfSSadaf Ebrahimi                        help='Enable timing')
636*b7893ccfSSadaf Ebrahimi    parser.add_argument('-validate', action='store_true',
637*b7893ccfSSadaf Ebrahimi                        help='Enable group validation')
638*b7893ccfSSadaf Ebrahimi    parser.add_argument('-o', action='store', dest='directory',
639*b7893ccfSSadaf Ebrahimi                        default='.',
640*b7893ccfSSadaf Ebrahimi                        help='Create target and related files in specified directory')
641*b7893ccfSSadaf Ebrahimi    parser.add_argument('target', metavar='target', nargs='?',
642*b7893ccfSSadaf Ebrahimi                        help='Specify target')
643*b7893ccfSSadaf Ebrahimi    parser.add_argument('-quiet', action='store_true', default=True,
644*b7893ccfSSadaf Ebrahimi                        help='Suppress script output during normal execution.')
645*b7893ccfSSadaf Ebrahimi    parser.add_argument('-verbose', action='store_false', dest='quiet', default=True,
646*b7893ccfSSadaf Ebrahimi                        help='Enable script output during normal execution.')
647*b7893ccfSSadaf Ebrahimi
648*b7893ccfSSadaf Ebrahimi    # This argument tells us where to load the script from the Vulkan-Headers registry
649*b7893ccfSSadaf Ebrahimi    parser.add_argument('-scripts', action='store',
650*b7893ccfSSadaf Ebrahimi                        help='Find additional scripts in this directory')
651*b7893ccfSSadaf Ebrahimi
652*b7893ccfSSadaf Ebrahimi    args = parser.parse_args()
653*b7893ccfSSadaf Ebrahimi
654*b7893ccfSSadaf Ebrahimi    # default scripts path to be same as registry
655*b7893ccfSSadaf Ebrahimi    if not args.scripts:
656*b7893ccfSSadaf Ebrahimi        args.scripts = os.path.dirname(args.registry)
657*b7893ccfSSadaf Ebrahimi
658*b7893ccfSSadaf Ebrahimi    scripts_directory_path = os.path.dirname(os.path.abspath(__file__))
659*b7893ccfSSadaf Ebrahimi    registry_headers_path = os.path.join(scripts_directory_path, args.scripts)
660*b7893ccfSSadaf Ebrahimi    sys.path.insert(0, registry_headers_path)
661*b7893ccfSSadaf Ebrahimi
662*b7893ccfSSadaf Ebrahimi    from reg import *
663*b7893ccfSSadaf Ebrahimi    from generator import write
664*b7893ccfSSadaf Ebrahimi    from cgenerator import CGeneratorOptions, COutputGenerator
665*b7893ccfSSadaf Ebrahimi
666*b7893ccfSSadaf Ebrahimi    # ValidationLayer Generator Modifications
667*b7893ccfSSadaf Ebrahimi    from thread_safety_generator import  ThreadGeneratorOptions, ThreadOutputGenerator
668*b7893ccfSSadaf Ebrahimi    from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
669*b7893ccfSSadaf Ebrahimi    from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
670*b7893ccfSSadaf Ebrahimi    from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
671*b7893ccfSSadaf Ebrahimi    from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
672*b7893ccfSSadaf Ebrahimi    from layer_dispatch_table_generator import LayerDispatchTableOutputGenerator, LayerDispatchTableGeneratorOptions
673*b7893ccfSSadaf Ebrahimi    from layer_chassis_generator import LayerChassisOutputGenerator, LayerChassisGeneratorOptions
674*b7893ccfSSadaf Ebrahimi    from layer_chassis_dispatch_generator import LayerChassisDispatchOutputGenerator, LayerChassisDispatchGeneratorOptions
675*b7893ccfSSadaf Ebrahimi    # Temporary workaround for vkconventions python2 compatibility
676*b7893ccfSSadaf Ebrahimi    import abc; abc.ABC = abc.ABCMeta('ABC', (object,), {})
677*b7893ccfSSadaf Ebrahimi    from vkconventions import VulkanConventions
678*b7893ccfSSadaf Ebrahimi
679*b7893ccfSSadaf Ebrahimi    # This splits arguments which are space-separated lists
680*b7893ccfSSadaf Ebrahimi    args.feature = [name for arg in args.feature for name in arg.split()]
681*b7893ccfSSadaf Ebrahimi    args.extension = [name for arg in args.extension for name in arg.split()]
682*b7893ccfSSadaf Ebrahimi
683*b7893ccfSSadaf Ebrahimi    # Load & parse registry
684*b7893ccfSSadaf Ebrahimi    reg = Registry()
685*b7893ccfSSadaf Ebrahimi
686*b7893ccfSSadaf Ebrahimi    startTimer(args.time)
687*b7893ccfSSadaf Ebrahimi    tree = etree.parse(args.registry)
688*b7893ccfSSadaf Ebrahimi    endTimer(args.time, '* Time to make ElementTree =')
689*b7893ccfSSadaf Ebrahimi
690*b7893ccfSSadaf Ebrahimi    if args.debug:
691*b7893ccfSSadaf Ebrahimi        pdb.run('reg.loadElementTree(tree)')
692*b7893ccfSSadaf Ebrahimi    else:
693*b7893ccfSSadaf Ebrahimi        startTimer(args.time)
694*b7893ccfSSadaf Ebrahimi        reg.loadElementTree(tree)
695*b7893ccfSSadaf Ebrahimi        endTimer(args.time, '* Time to parse ElementTree =')
696*b7893ccfSSadaf Ebrahimi
697*b7893ccfSSadaf Ebrahimi    if (args.validate):
698*b7893ccfSSadaf Ebrahimi        reg.validateGroups()
699*b7893ccfSSadaf Ebrahimi
700*b7893ccfSSadaf Ebrahimi    if (args.dump):
701*b7893ccfSSadaf Ebrahimi        write('* Dumping registry to regdump.txt', file=sys.stderr)
702*b7893ccfSSadaf Ebrahimi        reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
703*b7893ccfSSadaf Ebrahimi
704*b7893ccfSSadaf Ebrahimi    # create error/warning & diagnostic files
705*b7893ccfSSadaf Ebrahimi    if (args.errfile):
706*b7893ccfSSadaf Ebrahimi        errWarn = open(args.errfile, 'w', encoding='utf-8')
707*b7893ccfSSadaf Ebrahimi    else:
708*b7893ccfSSadaf Ebrahimi        errWarn = sys.stderr
709*b7893ccfSSadaf Ebrahimi
710*b7893ccfSSadaf Ebrahimi    if (args.diagfile):
711*b7893ccfSSadaf Ebrahimi        diag = open(args.diagfile, 'w', encoding='utf-8')
712*b7893ccfSSadaf Ebrahimi    else:
713*b7893ccfSSadaf Ebrahimi        diag = None
714*b7893ccfSSadaf Ebrahimi
715*b7893ccfSSadaf Ebrahimi    if (args.debug):
716*b7893ccfSSadaf Ebrahimi        pdb.run('genTarget(args)')
717*b7893ccfSSadaf Ebrahimi    elif (args.profile):
718*b7893ccfSSadaf Ebrahimi        import cProfile, pstats
719*b7893ccfSSadaf Ebrahimi        cProfile.run('genTarget(args)', 'profile.txt')
720*b7893ccfSSadaf Ebrahimi        p = pstats.Stats('profile.txt')
721*b7893ccfSSadaf Ebrahimi        p.strip_dirs().sort_stats('time').print_stats(50)
722*b7893ccfSSadaf Ebrahimi    else:
723*b7893ccfSSadaf Ebrahimi        genTarget(args)
724