1*61046927SAndroid Build Coastguard Worker# Copyright 2020 Intel Corporation 2*61046927SAndroid Build Coastguard Worker# 3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a 4*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the 5*61046927SAndroid Build Coastguard Worker# "Software"), to deal in the Software without restriction, including 6*61046927SAndroid Build Coastguard Worker# without limitation the rights to use, copy, modify, merge, publish, 7*61046927SAndroid Build Coastguard Worker# distribute, sub license, and/or sell copies of the Software, and to 8*61046927SAndroid Build Coastguard Worker# permit persons to whom the Software is furnished to do so, subject to 9*61046927SAndroid Build Coastguard Worker# the following conditions: 10*61046927SAndroid Build Coastguard Worker# 11*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the 12*61046927SAndroid Build Coastguard Worker# next paragraph) shall be included in all copies or substantial portions 13*61046927SAndroid Build Coastguard Worker# of the Software. 14*61046927SAndroid Build Coastguard Worker# 15*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16*61046927SAndroid Build Coastguard Worker# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*61046927SAndroid Build Coastguard Worker# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 18*61046927SAndroid Build Coastguard Worker# IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 19*61046927SAndroid Build Coastguard Worker# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20*61046927SAndroid Build Coastguard Worker# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21*61046927SAndroid Build Coastguard Worker# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Workerimport xml.etree.ElementTree as et 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Workerfrom collections import OrderedDict, namedtuple 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker# Mesa-local imports must be declared in meson variable 28*61046927SAndroid Build Coastguard Worker# '{file_without_suffix}_depend_files'. 29*61046927SAndroid Build Coastguard Workerfrom vk_extensions import get_all_required, filter_api 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard WorkerEntrypointParam = namedtuple('EntrypointParam', 'type name decl len') 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Workerclass EntrypointBase: 34*61046927SAndroid Build Coastguard Worker def __init__(self, name): 35*61046927SAndroid Build Coastguard Worker assert name.startswith('vk') 36*61046927SAndroid Build Coastguard Worker self.name = name[2:] 37*61046927SAndroid Build Coastguard Worker self.alias = None 38*61046927SAndroid Build Coastguard Worker self.guard = None 39*61046927SAndroid Build Coastguard Worker self.entry_table_index = None 40*61046927SAndroid Build Coastguard Worker # Extensions which require this entrypoint 41*61046927SAndroid Build Coastguard Worker self.core_version = None 42*61046927SAndroid Build Coastguard Worker self.extensions = [] 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker def prefixed_name(self, prefix): 45*61046927SAndroid Build Coastguard Worker return prefix + '_' + self.name 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Workerclass Entrypoint(EntrypointBase): 48*61046927SAndroid Build Coastguard Worker def __init__(self, name, return_type, params): 49*61046927SAndroid Build Coastguard Worker super(Entrypoint, self).__init__(name) 50*61046927SAndroid Build Coastguard Worker self.return_type = return_type 51*61046927SAndroid Build Coastguard Worker self.params = params 52*61046927SAndroid Build Coastguard Worker self.guard = None 53*61046927SAndroid Build Coastguard Worker self.aliases = [] 54*61046927SAndroid Build Coastguard Worker self.disp_table_index = None 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker def is_physical_device_entrypoint(self): 57*61046927SAndroid Build Coastguard Worker return self.params[0].type in ('VkPhysicalDevice', ) 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker def is_device_entrypoint(self): 60*61046927SAndroid Build Coastguard Worker return self.params[0].type in ('VkDevice', 'VkCommandBuffer', 'VkQueue') 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Worker def decl_params(self, start=0): 63*61046927SAndroid Build Coastguard Worker return ', '.join(p.decl for p in self.params[start:]) 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker def call_params(self, start=0): 66*61046927SAndroid Build Coastguard Worker return ', '.join(p.name for p in self.params[start:]) 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Workerclass EntrypointAlias(EntrypointBase): 69*61046927SAndroid Build Coastguard Worker def __init__(self, name, entrypoint): 70*61046927SAndroid Build Coastguard Worker super(EntrypointAlias, self).__init__(name) 71*61046927SAndroid Build Coastguard Worker self.alias = entrypoint 72*61046927SAndroid Build Coastguard Worker entrypoint.aliases.append(self) 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker def is_physical_device_entrypoint(self): 75*61046927SAndroid Build Coastguard Worker return self.alias.is_physical_device_entrypoint() 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker def is_device_entrypoint(self): 78*61046927SAndroid Build Coastguard Worker return self.alias.is_device_entrypoint() 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker def prefixed_name(self, prefix): 81*61046927SAndroid Build Coastguard Worker return self.alias.prefixed_name(prefix) 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker @property 84*61046927SAndroid Build Coastguard Worker def params(self): 85*61046927SAndroid Build Coastguard Worker return self.alias.params 86*61046927SAndroid Build Coastguard Worker 87*61046927SAndroid Build Coastguard Worker @property 88*61046927SAndroid Build Coastguard Worker def return_type(self): 89*61046927SAndroid Build Coastguard Worker return self.alias.return_type 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker @property 92*61046927SAndroid Build Coastguard Worker def disp_table_index(self): 93*61046927SAndroid Build Coastguard Worker return self.alias.disp_table_index 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker def decl_params(self): 96*61046927SAndroid Build Coastguard Worker return self.alias.decl_params() 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker def call_params(self): 99*61046927SAndroid Build Coastguard Worker return self.alias.call_params() 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Workerdef get_entrypoints(doc, api, beta): 102*61046927SAndroid Build Coastguard Worker """Extract the entry points from the registry.""" 103*61046927SAndroid Build Coastguard Worker entrypoints = OrderedDict() 104*61046927SAndroid Build Coastguard Worker 105*61046927SAndroid Build Coastguard Worker required = get_all_required(doc, 'command', api, beta) 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker for command in doc.findall('./commands/command'): 108*61046927SAndroid Build Coastguard Worker if not filter_api(command, api): 109*61046927SAndroid Build Coastguard Worker continue 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker if 'alias' in command.attrib: 112*61046927SAndroid Build Coastguard Worker name = command.attrib['name'] 113*61046927SAndroid Build Coastguard Worker target = command.attrib['alias'] 114*61046927SAndroid Build Coastguard Worker e = EntrypointAlias(name, entrypoints[target]) 115*61046927SAndroid Build Coastguard Worker else: 116*61046927SAndroid Build Coastguard Worker name = command.find('./proto/name').text 117*61046927SAndroid Build Coastguard Worker ret_type = command.find('./proto/type').text 118*61046927SAndroid Build Coastguard Worker params = [EntrypointParam( 119*61046927SAndroid Build Coastguard Worker type=p.find('./type').text, 120*61046927SAndroid Build Coastguard Worker name=p.find('./name').text, 121*61046927SAndroid Build Coastguard Worker decl=''.join(p.itertext()), 122*61046927SAndroid Build Coastguard Worker len=p.attrib.get('altlen', p.attrib.get('len', None)) 123*61046927SAndroid Build Coastguard Worker ) for p in command.findall('./param') if filter_api(p, api)] 124*61046927SAndroid Build Coastguard Worker # They really need to be unique 125*61046927SAndroid Build Coastguard Worker e = Entrypoint(name, ret_type, params) 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker if name not in required: 128*61046927SAndroid Build Coastguard Worker continue 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker r = required[name] 131*61046927SAndroid Build Coastguard Worker e.core_version = r.core_version 132*61046927SAndroid Build Coastguard Worker e.extensions = r.extensions 133*61046927SAndroid Build Coastguard Worker e.guard = r.guard 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker assert name not in entrypoints, name 136*61046927SAndroid Build Coastguard Worker entrypoints[name] = e 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker return entrypoints.values() 139*61046927SAndroid Build Coastguard Worker 140*61046927SAndroid Build Coastguard Workerdef get_entrypoints_from_xml(xml_files, beta, api='vulkan'): 141*61046927SAndroid Build Coastguard Worker entrypoints = [] 142*61046927SAndroid Build Coastguard Worker 143*61046927SAndroid Build Coastguard Worker for filename in xml_files: 144*61046927SAndroid Build Coastguard Worker doc = et.parse(filename) 145*61046927SAndroid Build Coastguard Worker entrypoints += get_entrypoints(doc, api, beta) 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker return entrypoints 148