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 594690754ec38f77431431910ce878850e1c60ab79Pablo Ceballosdef parseProto(elem): 604690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos type = nonestr(elem.text) 614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall name = None 624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for subelem in elem: 634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall text = nonestr(subelem.text) 644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if subelem.tag == 'name': 654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall name = text 664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 674690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos type += text 684690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos type += nonestr(subelem.tail) 694690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos return (type.strip(), name) 704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 714690754ec38f77431431910ce878850e1c60ab79Pablo Ceballosdef parseParam(elem): 724690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos name = elem.find('name').text 734690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos declaration = ''.join(elem.itertext()) 744690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos return (name, declaration) 754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 764690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos# Format a list of (type, declaration) tuples as a C-style parameter list 774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Halldef fmtParams(params): 784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if not params: 794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 'void' 804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return ', '.join(p[1] for p in params) 814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 824690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos# Format a list of (type, declaration) tuples as a C-style argument list 834690754ec38f77431431910ce878850e1c60ab79Pablo Ceballosdef fmtArgs(params): 844690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos return ', '.join(p[0] for p in params) 854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 86edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachandef overrideSymbolName(sym, apiname): 87edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan # The wrapper intercepts various glGet and glGetString functions and 88edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan # (sometimes) calls the generated thunk which dispatches to the 89edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan # driver's implementation 90edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan wrapped_get_syms = { 91edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'gles1' : [ 92edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetString' 93edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan ], 94edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'gles2' : [ 95edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetString', 96edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetStringi', 97edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetBooleanv', 98edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetFloatv', 99edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetIntegerv', 100edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 'glGetInteger64v', 101edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan ], 102edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 103edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if sym in wrapped_get_syms.get(apiname): 104edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return '__' + sym 1054a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall else: 1064a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return sym 1074a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1084a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1094a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Generate API trampoline templates: 1104a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# <rtype> API_ENTRY(<name>)(<params>) { 1114a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API(<name>, <args>); 1124a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# // or 1134a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# CALL_GL_API_RETURN(<name>, <args>); 1144a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# } 1154a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass TrampolineGen(reg.OutputGenerator): 1164a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1174a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1224690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos rtype, fname = parseProto(cmd.elem.find('proto')) 1234690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos params = [parseParam(p) for p in cmd.elem.findall('param')] 1244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall call = 'CALL_GL_API' if rtype == 'void' else 'CALL_GL_API_RETURN' 1254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('%s API_ENTRY(%s)(%s) {\n' 1264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ' %s(%s%s%s);\n' 1274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall '}' 128edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan % (rtype, overrideSymbolName(fname, self.genOpts.apiname), 129edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan fmtParams(params), call, fname, 1304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall ', ' if len(params) > 0 else '', 1314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall fmtArgs(params)), 1324a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=self.outFile) 1334a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1344a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1354a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1364a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall# Collect all API prototypes across all families, remove duplicates, 1374690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos# emit to entries.in and enums.in files. 1384a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallclass ApiGenerator(reg.OutputGenerator): 1394a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def __init__(self): 1404a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 1414a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = [] 1424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums = collections.OrderedDict() 1434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genCmd(self, cmd, name): 1454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 1464690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos rtype, fname = parseProto(cmd.elem.find('proto')) 1474690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos params = [parseParam(p) for p in cmd.elem.findall('param')] 1484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.append({'rtype': rtype, 'name': fname, 'params': params}) 1494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def genEnum(self, enuminfo, name): 1514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.OutputGenerator.genEnum(self, enuminfo, name) 1524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value = enuminfo.elem.get('value') 1534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip bitmask enums. Pattern matches: 1554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BUFFER_BIT 1564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_MAP_INVALIDATE_BUFFER_BIT_EXT 1574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_COLOR_BUFFER_BIT1_QCOM 1584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # but not 1594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_DEPTH_BITS 1604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # - GL_QUERY_COUNTER_BITS_EXT 1614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # 1624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # TODO: Assuming a naming pattern and using a regex is what the 1634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # old glenumsgen script did. But the registry XML knows which enums are 1644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # parts of bitmask groups, so we should just use that. I'm not sure how 1654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # to get the information out though, and it's not critical right now, 1664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so leaving for later. 1674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if re.search('_BIT($|\d*_)', name): 1684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Skip non-hex values (GL_TRUE, GL_FALSE, header guard junk) 1714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if not re.search('0x[0-9A-Fa-f]+', value): 1724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall return 1734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Append 'u' or 'ull' type suffix if present 1754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall type = enuminfo.elem.get('type') 1764a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if type and type != 'i': 1774a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall value += type 1784a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1794a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if value not in self.enums: 1804a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.enums[value] = name 1814a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1824a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def finish(self): 1834a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # sort by function name, remove duplicates 1844a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds.sort(key=itemgetter('name')) 1854a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds = [] 1864a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1874a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall if len(cmds) == 0 or cmd != cmds[-1]: 1884a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall cmds.append(cmd) 1894a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall self.cmds = cmds 1904a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1914a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write entries.in 1924a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEntries(self, outfile): 1934a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for cmd in self.cmds: 1944a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENTRY(%s, %s, %s)' 1954a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall % (cmd['rtype'], cmd['name'], fmtParams(cmd['params'])), 1964a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall file=outfile) 1974a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 1984a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Write enums.in 1994a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall def writeEnums(self, outfile): 2004a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for enum in self.enums.iteritems(): 2014a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall print('GL_ENUM(%s,%s)' % (enum[0], enum[1]), file=outfile) 2024a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2034a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 20416f03928743b01638419874e2b6300b52da6eb4cJesse Hall# Generate .spec entries for use by legacy 'gen' script 20516f03928743b01638419874e2b6300b52da6eb4cJesse Hallclass SpecGenerator(reg.OutputGenerator): 20616f03928743b01638419874e2b6300b52da6eb4cJesse Hall def __init__(self): 20716f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.__init__(self, sys.stderr, sys.stderr, None) 20816f03928743b01638419874e2b6300b52da6eb4cJesse Hall 20916f03928743b01638419874e2b6300b52da6eb4cJesse Hall def genCmd(self, cmd, name): 21016f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.OutputGenerator.genCmd(self, cmd, name) 2114690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos rtype, fname = parseProto(cmd.elem.find('proto')) 2124690754ec38f77431431910ce878850e1c60ab79Pablo Ceballos params = [parseParam(p) for p in cmd.elem.findall('param')] 21316f03928743b01638419874e2b6300b52da6eb4cJesse Hall 21416f03928743b01638419874e2b6300b52da6eb4cJesse Hall print('%s %s ( %s )' % (rtype, fname, fmtParams(params)), 21516f03928743b01638419874e2b6300b52da6eb4cJesse Hall file=self.outFile) 21616f03928743b01638419874e2b6300b52da6eb4cJesse Hall 21716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 2184a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hallif __name__ == '__main__': 2194a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry = reg.Registry() 2204a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.loadFile('registry/gl.xml') 2214a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2224a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(TrampolineGen()) 2234a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall TRAMPOLINE_OPTIONS = [ 2244a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2254a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2264a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2274a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/gl_api.in'), 2284a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2294a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2304a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2314a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2324a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1', 2334a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES_CM/glext_api.in'), 2344a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2354a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2364a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2374a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2_api.in'), 2384a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2394a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2404a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2414a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2424a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2', 2434a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall filename = '../../libs/GLES2/gl2ext_api.in')] 2444a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in TRAMPOLINE_OPTIONS: 2454a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2464a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall 2474a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen = ApiGenerator() 2484a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.setGenerator(apigen) 2494a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall API_OPTIONS = [ 2504a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # Generate non-extension versions of each API first, then extensions, 2514a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # so that if an extension enum was later standardized, we see the non- 2524a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall # suffixed version first. 2534a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2544a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2554a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2564a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2574a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2584a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common'), 2594a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2604a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles1', 2614a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2624a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2634a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles1'), 2644a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall reg.GeneratorOptions( 2654a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apiname = 'gles2', 2664a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall profile = 'common', 2674a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall emitversions = None, 2684a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall defaultExtensions = 'gles2')] 2694a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall for opts in API_OPTIONS: 2704a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall registry.apiGen(opts) 2714a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.finish() 2724a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/entries.in', 'w') as f: 2734a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEntries(f) 2744a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall with open('../../libs/enums.in', 'w') as f: 2754a73962c694bfe57eb2bea40ed6fb626be7006aaJesse Hall apigen.writeEnums(f) 27616f03928743b01638419874e2b6300b52da6eb4cJesse Hall 27716f03928743b01638419874e2b6300b52da6eb4cJesse Hall registry.setGenerator(SpecGenerator()) 27816f03928743b01638419874e2b6300b52da6eb4cJesse Hall SPEC_OPTIONS = [ 27916f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 28016f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 28116f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 28216f03928743b01638419874e2b6300b52da6eb4cJesse Hall versions = '3\.1', 28316f03928743b01638419874e2b6300b52da6eb4cJesse Hall filename = '../glgen/specs/gles11/GLES31.spec'), 28416f03928743b01638419874e2b6300b52da6eb4cJesse Hall reg.GeneratorOptions( 28516f03928743b01638419874e2b6300b52da6eb4cJesse Hall apiname = 'gles2', 28616f03928743b01638419874e2b6300b52da6eb4cJesse Hall profile = 'common', 28716f03928743b01638419874e2b6300b52da6eb4cJesse Hall emitversions = None, 28816f03928743b01638419874e2b6300b52da6eb4cJesse Hall defaultExtensions = None, 28916f03928743b01638419874e2b6300b52da6eb4cJesse Hall addExtensions = '^({})$'.format('|'.join(AEP_EXTENSIONS)), 2908a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos filename = '../glgen/specs/gles11/GLES31Ext.spec'), 2918a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos reg.GeneratorOptions( 2928a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos apiname = 'gles2', 2938a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos profile = 'common', 2948a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos versions = '3\.2', 2958a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos filename = '../glgen/specs/gles11/GLES32.spec')] 29616f03928743b01638419874e2b6300b52da6eb4cJesse Hall # SpecGenerator creates a good starting point, but the CFunc.java parser is 29716f03928743b01638419874e2b6300b52da6eb4cJesse Hall # so terrible that the .spec file needs a lot of manual massaging before 29816f03928743b01638419874e2b6300b52da6eb4cJesse Hall # it works. Commenting this out to avoid accidentally overwriting all the 29916f03928743b01638419874e2b6300b52da6eb4cJesse Hall # manual modifications. 30016f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 30116f03928743b01638419874e2b6300b52da6eb4cJesse Hall # Eventually this script should generate the Java and JNI code directly, 30216f03928743b01638419874e2b6300b52da6eb4cJesse Hall # skipping the intermediate .spec step, and obsoleting the existing 30316f03928743b01638419874e2b6300b52da6eb4cJesse Hall # ../glgen system. 30416f03928743b01638419874e2b6300b52da6eb4cJesse Hall # 30516f03928743b01638419874e2b6300b52da6eb4cJesse Hall # for opts in SPEC_OPTIONS: 30616f03928743b01638419874e2b6300b52da6eb4cJesse Hall # registry.apiGen(opts) 30716f03928743b01638419874e2b6300b52da6eb4cJesse Hall 308