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 8989301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachandef overrideSymbolName(sym, apiname): 9089301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan # The wrapper intercepts various glGet and glGetString functions and 9189301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan # (sometimes) calls the generated thunk which dispatches to the 9289301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan # driver's implementation 9389301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan wrapped_get_syms = { 9489301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'gles1' : [ 9589301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetString' 9689301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan ], 9789301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'gles2' : [ 9889301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetString', 9989301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetStringi', 10089301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetBooleanv', 10189301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetFloatv', 10289301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetIntegerv', 10389301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan 'glGetInteger64v', 10489301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan ], 10589301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan } 10689301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan if sym in wrapped_get_syms.get(apiname): 10789301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan return '__' + sym 1084a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 1094a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return sym 1104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Generate API trampoline templates: 1134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# <rtype> API_ENTRY(<name>)(<params>) { 1144a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API(<name>, <args>); 1154a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# // or 1164a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API_RETURN(<name>, <args>); 1174a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# } 1184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass TrampolineGen(reg.OutputGenerator): 1194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1224a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1234a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 1264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 1274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1284a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall call = 'CALL_GL_API' if rtype == 'void' else 'CALL_GL_API_RETURN' 1294a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('%s API_ENTRY(%s)(%s) {\n' 1304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ' %s(%s%s%s);\n' 1314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall '}' 13289301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan % (rtype, overrideSymbolName(fname, self.genOpts.apiname), 13389301eaf214f0da74c5266e7a548899d5f491b50Alistair Strachan fmtParams(params), call, fname, 1344a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ', ' if len(params) > 0 else '', 1354a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall fmtArgs(params)), 1364a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=self.outFile) 1374a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1384a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1394a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1404a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Collect all API prototypes across all families, remove duplicates, 1414a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# emit to entries.in and trace.in files. 1424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass ApiGenerator(reg.OutputGenerator): 1434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = [] 1464a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums = collections.OrderedDict() 1474a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 1514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 1524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.append({'rtype': rtype, 'name': fname, 'params': params}) 1534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genEnum(self, enuminfo, name): 1554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genEnum(self, enuminfo, name) 1564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value = enuminfo.elem.get('value') 1574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip bitmask enums. Pattern matches: 1594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BUFFER_BIT 1604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_MAP_INVALIDATE_BUFFER_BIT_EXT 1614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_COLOR_BUFFER_BIT1_QCOM 1624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # but not 1634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BITS 1644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_QUERY_COUNTER_BITS_EXT 1654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # 1664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # TODO: Assuming a naming pattern and using a regex is what the 1674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # old glenumsgen script did. But the registry XML knows which enums are 1684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # parts of bitmask groups, so we should just use that. I'm not sure how 1694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # to get the information out though, and it's not critical right now, 1704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so leaving for later. 1714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if re.search('_BIT($|\d*_)', name): 1724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip non-hex values (GL_TRUE, GL_FALSE, header guard junk) 1754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if not re.search('0x[0-9A-Fa-f]+', value): 1764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Append 'u' or 'ull' type suffix if present 1794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall type = enuminfo.elem.get('type') 1804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if type and type != 'i': 1814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value += type 1824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if value not in self.enums: 1844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums[value] = name 1854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def finish(self): 1874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # sort by function name, remove duplicates 1884a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.sort(key=itemgetter('name')) 1894a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds = [] 1904a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1914a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if len(cmds) == 0 or cmd != cmds[-1]: 1924a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds.append(cmd) 1934a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = cmds 1944a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1954a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write entries.in 1964a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEntries(self, outfile): 1974a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1984a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENTRY(%s, %s, %s)' 1994a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (cmd['rtype'], cmd['name'], fmtParams(cmd['params'])), 2004a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=outfile) 2014a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2024a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write traces.in 2034a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeTrace(self, outfile): 2044a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 2054a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if cmd['rtype'] == 'void': 2064a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ret = '_VOID(' 2074a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 2084a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ret = '(%s, ' % cmd['rtype'] 2094a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall params = cmd['params'] 2114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if len(params) > 0: 2124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall typeNameList = ', ' + fmtTypeNameList(params) 2134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 2144a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall typeNameList = '' 2154a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2164a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('TRACE_GL%s%s, (%s), (%s), %d%s)' 2174a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (ret, cmd['name'], 2184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall fmtParams(params), fmtArgs(params), 2194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall len(params), typeNameList), 2204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=outfile) 2214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2224a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write enums.in 2234a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEnums(self, outfile): 2244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for enum in self.enums.iteritems(): 2254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENUM(%s,%s)' % (enum[0], enum[1]), file=outfile) 2264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 22816f03928743b01638419874e2b6300b52da6eb4cJesse Hall# Generate .spec entries for use by legacy 'gen' script 22916f03928743b01638419874e2b6300b52da6eb4cJesse Hallclass SpecGenerator(reg.OutputGenerator): 23016f03928743b01638419874e2b6300b52da6eb4cJesse Hall def __init__(self): 23116f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 23216f03928743b01638419874e2b6300b52da6eb4cJesse Hall 23316f03928743b01638419874e2b6300b52da6eb4cJesse Hall def genCmd(self, cmd, name): 23416f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 23516f03928743b01638419874e2b6300b52da6eb4cJesse Hall rtype, fname = parseTypedName(cmd.elem.find('proto')) 23616f03928743b01638419874e2b6300b52da6eb4cJesse Hall params = [parseTypedName(p) for p in cmd.elem.findall('param')] 23716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 23816f03928743b01638419874e2b6300b52da6eb4cJesse Hall print('%s %s ( %s )' % (rtype, fname, fmtParams(params)), 23916f03928743b01638419874e2b6300b52da6eb4cJesse Hall file=self.outFile) 24016f03928743b01638419874e2b6300b52da6eb4cJesse Hall 24116f03928743b01638419874e2b6300b52da6eb4cJesse Hall 2424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallif __name__ == '__main__': 2434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry = reg.Registry() 2444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.loadFile('registry/gl.xml') 2454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2464a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(TrampolineGen()) 2474a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall TRAMPOLINE_OPTIONS = [ 2484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/gl_api.in'), 2524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1', 2574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/glext_api.in'), 2584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2_api.in'), 2624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2', 2674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2ext_api.in')] 2684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in TRAMPOLINE_OPTIONS: 2694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen = ApiGenerator() 2724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(apigen) 2734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall API_OPTIONS = [ 2744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Generate non-extension versions of each API first, then extensions, 2754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so that if an extension enum was later standardized, we see the non- 2764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # suffixed version first. 2774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1'), 2884a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2894a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2904a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2914a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2924a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2')] 2934a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in API_OPTIONS: 2944a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2954a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.finish() 2964a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/entries.in', 'w') as f: 2974a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEntries(f) 2984a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/trace.in', 'w') as f: 2994a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeTrace(f) 3004a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/enums.in', 'w') as f: 3014a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEnums(f) 30216f03928743b01638419874e2b6300b52da6eb4cJesse Hall 30316f03928743b01638419874e2b6300b52da6eb4cJesse Hall registry.setGenerator(SpecGenerator()) 30416f03928743b01638419874e2b6300b52da6eb4cJesse Hall SPEC_OPTIONS = [ 30516f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 30616f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 30716f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 30816f03928743b01638419874e2b6300b52da6eb4cJesse Hall versions = '3\.1', 30916f03928743b01638419874e2b6300b52da6eb4cJesse Hall filename = '../glgen/specs/gles11/GLES31.spec'), 31016f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 31116f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 31216f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 31316f03928743b01638419874e2b6300b52da6eb4cJesse Hall emitversions = None, 31416f03928743b01638419874e2b6300b52da6eb4cJesse Hall defaultExtensions = None, 31516f03928743b01638419874e2b6300b52da6eb4cJesse Hall addExtensions = '^({})$'.format('|'.join(AEP_EXTENSIONS)), 31616f03928743b01638419874e2b6300b52da6eb4cJesse Hall filename = '../glgen/specs/gles11/GLES31Ext.spec')] 31716f03928743b01638419874e2b6300b52da6eb4cJesse Hall # SpecGenerator creates a good starting point, but the CFunc.java parser is 31816f03928743b01638419874e2b6300b52da6eb4cJesse Hall # so terrible that the .spec file needs a lot of manual massaging before 31916f03928743b01638419874e2b6300b52da6eb4cJesse Hall # it works. Commenting this out to avoid accidentally overwriting all the 32016f03928743b01638419874e2b6300b52da6eb4cJesse Hall # manual modifications. 32116f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 32216f03928743b01638419874e2b6300b52da6eb4cJesse Hall # Eventually this script should generate the Java and JNI code directly, 32316f03928743b01638419874e2b6300b52da6eb4cJesse Hall # skipping the intermediate .spec step, and obsoleting the existing 32416f03928743b01638419874e2b6300b52da6eb4cJesse Hall # ../glgen system. 32516f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 32616f03928743b01638419874e2b6300b52da6eb4cJesse Hall # for opts in SPEC_OPTIONS: 32716f03928743b01638419874e2b6300b52da6eb4cJesse Hall # registry.apiGen(opts) 32816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 329