1d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu#!/usr/bin/env python 2d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 3d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# Copyright (C) 2009 Chia-I Wu <olv@0xlab.org> 4d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# All Rights Reserved. 5d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# 6d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# This is based on extension_helper.py by Ian Romanick. 7d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# 8d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# Permission is hereby granted, free of charge, to any person obtaining a 9d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# copy of this software and associated documentation files (the "Software"), 10d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# to deal in the Software without restriction, including without limitation 11d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# on the rights to use, copy, modify, merge, publish, distribute, sub 12d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# license, and/or sell copies of the Software, and to permit persons to whom 13d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# the Software is furnished to do so, subject to the following conditions: 14d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# 15d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# The above copyright notice and this permission notice (including the next 16d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# paragraph) shall be included in all copies or substantial portions of the 17d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# Software. 18d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# 19d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 22d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 25d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu# IN THE SOFTWARE. 26d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 27d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wuimport gl_XML 28d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wuimport license 29d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wuimport sys, getopt, string 30d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 31d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wudef get_function_spec(func): 32d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sig = "" 33d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # derive parameter signature 34d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for p in func.parameterIterator(): 35d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if p.is_padding: 36d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu continue 37d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # FIXME: This is a *really* ugly hack. :( 38d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu tn = p.type_expr.get_base_type_node() 39d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if p.is_pointer(): 40d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sig += 'p' 41d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu elif tn.integer: 42d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sig += 'i' 43d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu elif tn.size == 4: 44d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sig += 'f' 45d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu else: 46d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sig += 'd' 47d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 48d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu spec = [sig] 49d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for ent in func.entry_points: 50d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu spec.append("gl" + ent) 51d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 52d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # spec is terminated by an empty string 53d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu spec.append('') 54d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 55d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu return spec 56d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 57d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wuclass PrintGlRemap(gl_XML.gl_print_base): 58d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu def __init__(self): 59d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu gl_XML.gl_print_base.__init__(self) 60d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 61d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu self.name = "remap_helper.py (from Mesa)" 62d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu self.license = license.bsd_license_template % ("Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>", "Chia-I Wu") 63d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu return 64d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 65d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 66d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu def printRealHeader(self): 672cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu print '#include "main/dispatch.h"' 681741ddb747ca0be284315adb4b6fe67ddf292d03Kristian Høgsberg print '#include "main/remap.h"' 69d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '' 70d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu return 71d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 72d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 73d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu def printBody(self, api): 74d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu pool_indices = {} 75d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 76d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '/* this is internal to remap.c */' 77c78baae79696b38622fa18fe9a0f2ad0ab361c1cIan Romanick print '#ifndef need_MESA_remap_table' 78c78baae79696b38622fa18fe9a0f2ad0ab361c1cIan Romanick print '#error Only remap.c should include this file!' 79c78baae79696b38622fa18fe9a0f2ad0ab361c1cIan Romanick print '#endif /* need_MESA_remap_table */' 80c78baae79696b38622fa18fe9a0f2ad0ab361c1cIan Romanick print '' 81c78baae79696b38622fa18fe9a0f2ad0ab361c1cIan Romanick 82d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '' 83d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print 'static const char _mesa_function_pool[] =' 84d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 85d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # output string pool 86d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu index = 0; 87d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for f in api.functionIterateAll(): 88d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu pool_indices[f] = index 89d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 90d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu spec = get_function_spec(f) 91d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 92d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # a function has either assigned offset, fixed offset, 93d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # or no offset 94d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if f.assign_offset: 95d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu comments = "will be remapped" 96d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu elif f.offset > 0: 97d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu comments = "offset %d" % f.offset 98d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu else: 99d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu comments = "dynamic" 100d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 101d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' /* _mesa_function_pool[%d]: %s (%s) */' \ 102d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu % (index, f.name, comments) 103d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for line in spec: 104d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' "%s\\0"' % line 105d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu index += len(line) + 1 106d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' ;' 107d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '' 108d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 109d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '/* these functions need to be remapped */' 1101741ddb747ca0be284315adb4b6fe67ddf292d03Kristian Høgsberg print 'static const struct gl_function_pool_remap MESA_remap_table_functions[] = {' 111d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # output all functions that need to be remapped 112d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # iterate by offsets so that they are sorted by remap indices 113d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for f in api.functionIterateByOffset(): 114d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if not f.assign_offset: 115d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu continue 116d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' { %5d, %s_remap_index },' \ 117d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu % (pool_indices[f], f.name) 118d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' { -1, -1 }' 119d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '};' 120d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '' 121d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 1227df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu # collect functions by versions/extensions 123d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu extension_functions = {} 1247df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu abi_extensions = [] 125d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for f in api.functionIterateAll(): 126d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for n in f.entry_points: 127d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu category, num = api.get_category_for_name(n) 1287df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu # consider only GL_VERSION_X_Y or extensions 1297df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu c = gl_XML.real_category_name(category) 1307df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu if c.startswith("GL_"): 131d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if not extension_functions.has_key(c): 132d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu extension_functions[c] = [] 133d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu extension_functions[c].append(f) 1347df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu # remember the ext names of the ABI 1357df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu if (f.is_abi() and n == f.name and 1367df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu c not in abi_extensions): 1377df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu abi_extensions.append(c) 1387df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu # ignore the ABI itself 1397df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu for ext in abi_extensions: 1407df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu extension_functions.pop(ext) 1417df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu 142d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu extensions = extension_functions.keys() 143d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu extensions.sort() 144d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 145d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu # output ABI functions that have alternative names (with ext suffix) 146d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '/* these functions are in the ABI, but have alternative names */' 147d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print 'static const struct gl_function_remap MESA_alt_functions[] = {' 148d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for ext in extensions: 149d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu funcs = [] 150d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for f in extension_functions[ext]: 1517df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu # test if the function is in the ABI and has alt names 1527df4c7e1b8faf0c0339ca7287e3560fafab02b6aChia-I Wu if f.is_abi() and len(f.entry_points) > 1: 153d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu funcs.append(f) 154d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if not funcs: 155d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu continue 156d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' /* from %s */' % ext 157d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for f in funcs: 158d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' { %5d, _gloffset_%s },' \ 159d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu % (pool_indices[f], f.name) 160d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print ' { -1, -1 }' 161d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '};' 162d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu print '' 163d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu return 164d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 165d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 166d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wudef show_usage(): 1675076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu print "Usage: %s [-f input_file_name] [-c ver]" % sys.argv[0] 1685076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu print " -c ver Version can be 'es1' or 'es2'." 169d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu sys.exit(1) 170d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 171d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wuif __name__ == '__main__': 172d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu file_name = "gl_API.xml" 173d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 174d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu try: 1755076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu (args, trail) = getopt.getopt(sys.argv[1:], "f:c:") 176d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu except Exception,e: 177d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu show_usage() 178d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 1795076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu es = None 180d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu for (arg,val) in args: 181d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu if arg == "-f": 182d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu file_name = val 1835076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu elif arg == "-c": 1845076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu es = val 185d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 186d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu api = gl_XML.parse_GL_API( file_name ) 187d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu 1885076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu if es is not None: 1895076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu import gles_api 1905076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu 1915076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu api_map = { 1925076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu 'es1': gles_api.es1_api, 1935076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu 'es2': gles_api.es2_api, 1945076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu } 1955076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu 1965076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu api.filter_functions(api_map[es]) 1975076561b35b9c2c78f277ab03bf1e642094ee20eChia-I Wu 198d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu printer = PrintGlRemap() 199d7d3fb925b6993740d0126d0d7e678c27f5f1850Chia-I Wu printer.Print( api ) 200