1*b7893ccfSSadaf Ebrahimi#!/usr/bin/python3 -i 2*b7893ccfSSadaf Ebrahimi# 3*b7893ccfSSadaf Ebrahimi# Copyright (c) 2015-2017, 2019 The Khronos Group Inc. 4*b7893ccfSSadaf Ebrahimi# Copyright (c) 2015-2017, 2019 Valve Corporation 5*b7893ccfSSadaf Ebrahimi# Copyright (c) 2015-2017, 2019 LunarG, Inc. 6*b7893ccfSSadaf Ebrahimi# 7*b7893ccfSSadaf Ebrahimi# Licensed under the Apache License, Version 2.0 (the "License"); 8*b7893ccfSSadaf Ebrahimi# you may not use this file except in compliance with the License. 9*b7893ccfSSadaf Ebrahimi# You may obtain a copy of the License at 10*b7893ccfSSadaf Ebrahimi# 11*b7893ccfSSadaf Ebrahimi# http://www.apache.org/licenses/LICENSE-2.0 12*b7893ccfSSadaf Ebrahimi# 13*b7893ccfSSadaf Ebrahimi# Unless required by applicable law or agreed to in writing, software 14*b7893ccfSSadaf Ebrahimi# distributed under the License is distributed on an "AS IS" BASIS, 15*b7893ccfSSadaf Ebrahimi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*b7893ccfSSadaf Ebrahimi# See the License for the specific language governing permissions and 17*b7893ccfSSadaf Ebrahimi# limitations under the License. 18*b7893ccfSSadaf Ebrahimi# 19*b7893ccfSSadaf Ebrahimi# Author: Mark Lobodzinski <[email protected]> 20*b7893ccfSSadaf Ebrahimi 21*b7893ccfSSadaf Ebrahimiimport os,re,sys,string 22*b7893ccfSSadaf Ebrahimiimport xml.etree.ElementTree as etree 23*b7893ccfSSadaf Ebrahimifrom collections import namedtuple, OrderedDict 24*b7893ccfSSadaf Ebrahimi 25*b7893ccfSSadaf Ebrahimi# Copyright text prefixing all headers (list of strings). 26*b7893ccfSSadaf EbrahimiprefixStrings = [ 27*b7893ccfSSadaf Ebrahimi '/*', 28*b7893ccfSSadaf Ebrahimi '** Copyright (c) 2015-2017, 2019 The Khronos Group Inc.', 29*b7893ccfSSadaf Ebrahimi '** Copyright (c) 2015-2017, 2019 Valve Corporation', 30*b7893ccfSSadaf Ebrahimi '** Copyright (c) 2015-2017, 2019 LunarG, Inc.', 31*b7893ccfSSadaf Ebrahimi '** Copyright (c) 2015-2017, 2019 Google Inc.', 32*b7893ccfSSadaf Ebrahimi '**', 33*b7893ccfSSadaf Ebrahimi '** Licensed under the Apache License, Version 2.0 (the "License");', 34*b7893ccfSSadaf Ebrahimi '** you may not use this file except in compliance with the License.', 35*b7893ccfSSadaf Ebrahimi '** You may obtain a copy of the License at', 36*b7893ccfSSadaf Ebrahimi '**', 37*b7893ccfSSadaf Ebrahimi '** http://www.apache.org/licenses/LICENSE-2.0', 38*b7893ccfSSadaf Ebrahimi '**', 39*b7893ccfSSadaf Ebrahimi '** Unless required by applicable law or agreed to in writing, software', 40*b7893ccfSSadaf Ebrahimi '** distributed under the License is distributed on an "AS IS" BASIS,', 41*b7893ccfSSadaf Ebrahimi '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.', 42*b7893ccfSSadaf Ebrahimi '** See the License for the specific language governing permissions and', 43*b7893ccfSSadaf Ebrahimi '** limitations under the License.', 44*b7893ccfSSadaf Ebrahimi '*/', 45*b7893ccfSSadaf Ebrahimi '' 46*b7893ccfSSadaf Ebrahimi] 47*b7893ccfSSadaf Ebrahimi 48*b7893ccfSSadaf Ebrahimi 49*b7893ccfSSadaf Ebrahimiplatform_dict = { 50*b7893ccfSSadaf Ebrahimi 'android' : 'VK_USE_PLATFORM_ANDROID_KHR', 51*b7893ccfSSadaf Ebrahimi 'fuchsia' : 'VK_USE_PLATFORM_FUCHSIA', 52*b7893ccfSSadaf Ebrahimi 'ggp': 'VK_USE_PLATFORM_GGP', 53*b7893ccfSSadaf Ebrahimi 'ios' : 'VK_USE_PLATFORM_IOS_MVK', 54*b7893ccfSSadaf Ebrahimi 'macos' : 'VK_USE_PLATFORM_MACOS_MVK', 55*b7893ccfSSadaf Ebrahimi 'metal' : 'VK_USE_PLATFORM_METAL_EXT', 56*b7893ccfSSadaf Ebrahimi 'vi' : 'VK_USE_PLATFORM_VI_NN', 57*b7893ccfSSadaf Ebrahimi 'wayland' : 'VK_USE_PLATFORM_WAYLAND_KHR', 58*b7893ccfSSadaf Ebrahimi 'win32' : 'VK_USE_PLATFORM_WIN32_KHR', 59*b7893ccfSSadaf Ebrahimi 'xcb' : 'VK_USE_PLATFORM_XCB_KHR', 60*b7893ccfSSadaf Ebrahimi 'xlib' : 'VK_USE_PLATFORM_XLIB_KHR', 61*b7893ccfSSadaf Ebrahimi 'xlib_xrandr' : 'VK_USE_PLATFORM_XLIB_XRANDR_EXT', 62*b7893ccfSSadaf Ebrahimi} 63*b7893ccfSSadaf Ebrahimi 64*b7893ccfSSadaf Ebrahimi# 65*b7893ccfSSadaf Ebrahimi# Return appropriate feature protect string from 'platform' tag on feature 66*b7893ccfSSadaf Ebrahimidef GetFeatureProtect(interface): 67*b7893ccfSSadaf Ebrahimi """Get platform protection string""" 68*b7893ccfSSadaf Ebrahimi platform = interface.get('platform') 69*b7893ccfSSadaf Ebrahimi protect = None 70*b7893ccfSSadaf Ebrahimi if platform is not None: 71*b7893ccfSSadaf Ebrahimi protect = platform_dict[platform] 72*b7893ccfSSadaf Ebrahimi return protect 73*b7893ccfSSadaf Ebrahimi 74*b7893ccfSSadaf Ebrahimi# Return a dict containing the dispatchable/non-dispatchable type of every handle 75*b7893ccfSSadaf Ebrahimidef GetHandleTypes(tree): 76*b7893ccfSSadaf Ebrahimi # Extend OrderedDict with common handle operations 77*b7893ccfSSadaf Ebrahimi class HandleDict(OrderedDict): 78*b7893ccfSSadaf Ebrahimi def IsDispatchable(self, handle_type): 79*b7893ccfSSadaf Ebrahimi return self.get(handle_type) == 'VK_DEFINE_HANDLE' 80*b7893ccfSSadaf Ebrahimi def IsNonDispatchable(self, handle_type): 81*b7893ccfSSadaf Ebrahimi return self.get(handle_type) == 'VK_DEFINE_NON_DISPATCHABLE_HANDLE' 82*b7893ccfSSadaf Ebrahimi 83*b7893ccfSSadaf Ebrahimi handles = HandleDict() 84*b7893ccfSSadaf Ebrahimi for elem in tree.findall("types/type/[@category='handle']"): 85*b7893ccfSSadaf Ebrahimi if not elem.get('alias'): 86*b7893ccfSSadaf Ebrahimi name = elem.get('name') 87*b7893ccfSSadaf Ebrahimi handles[name] = elem.find('type').text 88*b7893ccfSSadaf Ebrahimi return handles 89*b7893ccfSSadaf Ebrahimi 90*b7893ccfSSadaf Ebrahimi# Return a dict containing the category attribute of every type 91*b7893ccfSSadaf Ebrahimidef GetTypeCategories(tree): 92*b7893ccfSSadaf Ebrahimi type_categories = OrderedDict() 93*b7893ccfSSadaf Ebrahimi for elem in tree.findall("types/type"): 94*b7893ccfSSadaf Ebrahimi if not elem.get('alias'): 95*b7893ccfSSadaf Ebrahimi # name is either an attribute or the text of a child <name> tag 96*b7893ccfSSadaf Ebrahimi name = elem.get('name') or (elem.find("name") and elem.find('name').text) 97*b7893ccfSSadaf Ebrahimi type_categories[name] = elem.get('category') 98*b7893ccfSSadaf Ebrahimi return type_categories 99*b7893ccfSSadaf Ebrahimi 100*b7893ccfSSadaf Ebrahimi# Treats outdents a multiline string by the leading whitespace on the first line 101*b7893ccfSSadaf Ebrahimi# Optionally indenting by the given prefix 102*b7893ccfSSadaf Ebrahimidef Outdent(string_in, indent=''): 103*b7893ccfSSadaf Ebrahimi string_out = re.sub('^ *', '', string_in) # kill stray leading spaces 104*b7893ccfSSadaf Ebrahimi if string_out[0] != '\n': 105*b7893ccfSSadaf Ebrahimi return string_in # needs new line to find the first line's indent level 106*b7893ccfSSadaf Ebrahimi 107*b7893ccfSSadaf Ebrahimi first_indent = string_out[1:] 108*b7893ccfSSadaf Ebrahimi fake_indent = '\n' + ' ' * (len(first_indent) - len(first_indent.lstrip())) 109*b7893ccfSSadaf Ebrahimi indent = '\n' + indent 110*b7893ccfSSadaf Ebrahimi 111*b7893ccfSSadaf Ebrahimi string_out = string_out.rstrip() + '\n' # remove trailing whitespace except for a newline 112*b7893ccfSSadaf Ebrahimi outdent = re.sub(fake_indent, indent, string_out) 113*b7893ccfSSadaf Ebrahimi return outdent[1:] 114*b7893ccfSSadaf Ebrahimi 115*b7893ccfSSadaf Ebrahimi 116*b7893ccfSSadaf Ebrahimi# helper to define paths relative to the repo root 117*b7893ccfSSadaf Ebrahimidef repo_relative(path): 118*b7893ccfSSadaf Ebrahimi return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', path)) 119*b7893ccfSSadaf Ebrahimi 120