14a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall#!/usr/bin/env python 24a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# 34a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Copyright 2014 The Android Open Source Project 44a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# 54a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Licensed under the Apache License, Version 2.0 (the "License"); 64a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# you may not use this file except in compliance with the License. 74a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# You may obtain a copy of the License at 84a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# 94a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# http://www.apache.org/licenses/LICENSE-2.0 104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# 114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Unless required by applicable law or agreed to in writing, software 124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# distributed under the License is distributed on an "AS IS" BASIS, 134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# See the License for the specific language governing permissions and 154a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# limitations under the License. 164a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 174a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallfrom __future__ import print_function 184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallfrom operator import itemgetter 194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallimport collections 204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallimport os.path 214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallimport re 224a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallimport sys 234a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Avoid endlessly adding to the path if this module is imported multiple 264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# times, e.g. in an interactive session 274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallregpath = os.path.join(sys.path[0], "registry") 284a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallif sys.path[1] != regpath: 294a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall sys.path.insert(1, regpath) 304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallimport reg 314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 324a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 3316f03928743b01638419874e2b6300b52da6eb4cJesse HallAEP_EXTENSIONS = [ 3416f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_KHR_blend_equation_advanced', 3516f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_KHR_debug', 3616f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_KHR_texture_compression_astc_ldr', 3716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_sample_shading', 3816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_sample_variables', 3916f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_shader_image_atomic', 4016f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_shader_multisample_interpolation', 4116f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_texture_stencil8', 4216f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_OES_texture_storage_multisample_2d_array', 4316f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_copy_image', 4416f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_draw_buffers_indexed', 4516f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_geometry_shader', 4616f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_gpu_shader5', 4716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_primitive_bounding_box', 4816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_shader_io_blocks', 4916f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_tessellation_shader', 5016f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_texture_border_clamp', 5116f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_texture_buffer', 5216f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_texture_cube_map_array', 5316f03928743b01638419874e2b6300b52da6eb4cJesse Hall 'GL_EXT_texture_sRGB_decode'] 5416f03928743b01638419874e2b6300b52da6eb4cJesse Hall 5516f03928743b01638419874e2b6300b52da6eb4cJesse Hall 564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef nonestr(s): 574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return s if s else "" 584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef parseTypedName(elem): 614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall type = [nonestr(elem.text)] 624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall name = None 634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for subelem in elem: 644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall text = nonestr(subelem.text) 654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall tail = nonestr(subelem.tail) 664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if subelem.tag == 'name': 674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall name = text 684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall break 694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall type.extend([text, tail]) 714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return (''.join(type).strip(), name) 724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Format a list of (type, name) tuples as a C-style parameter list 754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef fmtParams(params): 764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if not params: 774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 'void' 784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return ', '.join(['%s %s' % (p[0], p[1]) for p in params]) 794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Format a list of (type, name) tuples as a C-style argument list 814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef fmtArgs(params): 824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return ', '.join(p[1] for p in params) 834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Format a list of (type, name) tuples as comma-separated '"type", name' 854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef fmtTypeNameList(params): 864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return ', '.join(['"%s", %s' % (p[0], p[1]) for p in params]) 874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 884a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 894a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef overrideSymbolName(sym): 904a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # The wrapper intercepts glGetString and (sometimes) calls the generated 914a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # __glGetString thunk which dispatches to the driver's glGetString 924a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if sym == 'glGetString': 934a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return '__glGetString' 944a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 954a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return sym 964a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 974a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 984a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Generate API trampoline templates: 994a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# <rtype> API_ENTRY(<name>)(<params>) { 1004a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API(<name>, <args>); 1014a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# // or 1024a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API_RETURN(<name>, <args>); 1034a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# } 1044a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass TrampolineGen(reg.OutputGenerator): 1054a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1064a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1074a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1084a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1094a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 1124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 1134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1144a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall call = 'CALL_GL_API' if rtype == 'void' else 'CALL_GL_API_RETURN' 1154a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('%s API_ENTRY(%s)(%s) {\n' 1164a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ' %s(%s%s%s);\n' 1174a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall '}' 1184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (rtype, overrideSymbolName(fname), fmtParams(params), 1194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall call, fname, 1204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ', ' if len(params) > 0 else '', 1214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall fmtArgs(params)), 1224a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=self.outFile) 1234a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Collect all API prototypes across all families, remove duplicates, 1274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# emit to entries.in and trace.in files. 1284a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass ApiGenerator(reg.OutputGenerator): 1294a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = [] 1324a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums = collections.OrderedDict() 1334a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1344a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1354a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1364a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 1374a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 1384a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.append({'rtype': rtype, 'name': fname, 'params': params}) 1394a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1404a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genEnum(self, enuminfo, name): 1414a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genEnum(self, enuminfo, name) 1424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value = enuminfo.elem.get('value') 1434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip bitmask enums. Pattern matches: 1454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BUFFER_BIT 1464a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_MAP_INVALIDATE_BUFFER_BIT_EXT 1474a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_COLOR_BUFFER_BIT1_QCOM 1484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # but not 1494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BITS 1504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_QUERY_COUNTER_BITS_EXT 1514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # 1524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # TODO: Assuming a naming pattern and using a regex is what the 1534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # old glenumsgen script did. But the registry XML knows which enums are 1544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # parts of bitmask groups, so we should just use that. I'm not sure how 1554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # to get the information out though, and it's not critical right now, 1564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so leaving for later. 1574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if re.search('_BIT($|\d*_)', name): 1584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip non-hex values (GL_TRUE, GL_FALSE, header guard junk) 1614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if not re.search('0x[0-9A-Fa-f]+', value): 1624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Append 'u' or 'ull' type suffix if present 1654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall type = enuminfo.elem.get('type') 1664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if type and type != 'i': 1674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value += type 1684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if value not in self.enums: 1704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums[value] = name 1714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def finish(self): 1734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # sort by function name, remove duplicates 1744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.sort(key=itemgetter('name')) 1754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds = [] 1764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if len(cmds) == 0 or cmd != cmds[-1]: 1784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds.append(cmd) 1794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = cmds 1804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write entries.in 1824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEntries(self, outfile): 1834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENTRY(%s, %s, %s)' 1854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (cmd['rtype'], cmd['name'], fmtParams(cmd['params'])), 1864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=outfile) 1874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1884a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write traces.in 1894a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeTrace(self, outfile): 1904a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1914a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if cmd['rtype'] == 'void': 1924a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ret = '_VOID(' 1934a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 1944a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ret = '(%s, ' % cmd['rtype'] 1954a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1964a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = cmd['params'] 1974a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if len(params) > 0: 1984a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall typeNameList = ', ' + fmtTypeNameList(params) 1994a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 2004a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall typeNameList = '' 2014a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2024a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('TRACE_GL%s%s, (%s), (%s), %d%s)' 2034a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (ret, cmd['name'], 2044a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall fmtParams(params), fmtArgs(params), 2054a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall len(params), typeNameList), 2064a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=outfile) 2074a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2084a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write enums.in 2094a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEnums(self, outfile): 2104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for enum in self.enums.iteritems(): 2114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENUM(%s,%s)' % (enum[0], enum[1]), file=outfile) 2124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 21416f03928743b01638419874e2b6300b52da6eb4cJesse Hall# Generate .spec entries for use by legacy 'gen' script 21516f03928743b01638419874e2b6300b52da6eb4cJesse Hallclass SpecGenerator(reg.OutputGenerator): 21616f03928743b01638419874e2b6300b52da6eb4cJesse Hall def __init__(self): 21716f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 21816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 21916f03928743b01638419874e2b6300b52da6eb4cJesse Hall def genCmd(self, cmd, name): 22016f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 22116f03928743b01638419874e2b6300b52da6eb4cJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 22216f03928743b01638419874e2b6300b52da6eb4cJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 22316f03928743b01638419874e2b6300b52da6eb4cJesse Hall 22416f03928743b01638419874e2b6300b52da6eb4cJesse Hall print('%s %s ( %s )' % (rtype, fname, fmtParams(params)), 22516f03928743b01638419874e2b6300b52da6eb4cJesse Hall file=self.outFile) 22616f03928743b01638419874e2b6300b52da6eb4cJesse Hall 22716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 2284a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallif __name__ == '__main__': 2294a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry = reg.Registry() 2304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.loadFile('registry/gl.xml') 2314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2324a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(TrampolineGen()) 2334a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall TRAMPOLINE_OPTIONS = [ 2344a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2354a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2364a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2374a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/gl_api.in'), 2384a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2394a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2404a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2414a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1', 2434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/glext_api.in'), 2444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2464a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2474a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2_api.in'), 2484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2', 2534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2ext_api.in')] 2544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in TRAMPOLINE_OPTIONS: 2554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen = ApiGenerator() 2584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(apigen) 2594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall API_OPTIONS = [ 2604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Generate non-extension versions of each API first, then extensions, 2614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so that if an extension enum was later standardized, we see the non- 2624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # suffixed version first. 2634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1'), 2744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2')] 2794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in API_OPTIONS: 2804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.finish() 2824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/entries.in', 'w') as f: 2834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEntries(f) 2844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/trace.in', 'w') as f: 2854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeTrace(f) 2864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/enums.in', 'w') as f: 2874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEnums(f) 28816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 28916f03928743b01638419874e2b6300b52da6eb4cJesse Hall registry.setGenerator(SpecGenerator()) 29016f03928743b01638419874e2b6300b52da6eb4cJesse Hall SPEC_OPTIONS = [ 29116f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 29216f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 29316f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 29416f03928743b01638419874e2b6300b52da6eb4cJesse Hall versions = '3\.1', 29516f03928743b01638419874e2b6300b52da6eb4cJesse Hall filename = '../glgen/specs/gles11/GLES31.spec'), 29616f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 29716f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 29816f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 29916f03928743b01638419874e2b6300b52da6eb4cJesse Hall emitversions = None, 30016f03928743b01638419874e2b6300b52da6eb4cJesse Hall defaultExtensions = None, 30116f03928743b01638419874e2b6300b52da6eb4cJesse Hall addExtensions = '^({})$'.format('|'.join(AEP_EXTENSIONS)), 30216f03928743b01638419874e2b6300b52da6eb4cJesse Hall filename = '../glgen/specs/gles11/GLES31Ext.spec')] 30316f03928743b01638419874e2b6300b52da6eb4cJesse Hall # SpecGenerator creates a good starting point, but the CFunc.java parser is 30416f03928743b01638419874e2b6300b52da6eb4cJesse Hall # so terrible that the .spec file needs a lot of manual massaging before 30516f03928743b01638419874e2b6300b52da6eb4cJesse Hall # it works. Commenting this out to avoid accidentally overwriting all the 30616f03928743b01638419874e2b6300b52da6eb4cJesse Hall # manual modifications. 30716f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 30816f03928743b01638419874e2b6300b52da6eb4cJesse Hall # Eventually this script should generate the Java and JNI code directly, 30916f03928743b01638419874e2b6300b52da6eb4cJesse Hall # skipping the intermediate .spec step, and obsoleting the existing 31016f03928743b01638419874e2b6300b52da6eb4cJesse Hall # ../glgen system. 31116f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 31216f03928743b01638419874e2b6300b52da6eb4cJesse Hall # for opts in SPEC_OPTIONS: 31316f03928743b01638419874e2b6300b52da6eb4cJesse Hall # registry.apiGen(opts) 31416f03928743b01638419874e2b6300b52da6eb4cJesse Hall 315