glX_proto_send.py revision 47719fda0c2fba13c81e84e33523d5489263182e
1e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#!/usr/bin/python2 2e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# (C) Copyright IBM Corporation 2004 4e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# All Rights Reserved. 5e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 6e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Permission is hereby granted, free of charge, to any person obtaining a 7e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# copy of this software and associated documentation files (the "Software"), 8e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# to deal in the Software without restriction, including without limitation 9e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub 10e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# license, and/or sell copies of the Software, and to permit persons to whom 11e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# the Software is furnished to do so, subject to the following conditions: 12e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 13e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# The above copyright notice and this permission notice (including the next 14e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# paragraph) shall be included in all copies or substantial portions of the 15e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Software. 16e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 17e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IN THE SOFTWARE. 24e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 25e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Authors: 26e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Ian Romanick <idr@us.ibm.com> 27e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 28e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import saxutils 29e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import make_parser 30e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax.handler import feature_namespaces 31e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 32e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport gl_XML 33e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport license 34e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport sys, getopt 35e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 36e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 37e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef printPure(): 38e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) 39e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define PURE __attribute__((pure)) 40e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# else 41e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define PURE 42e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# endif""" 43e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 44e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef printFastcall(): 45e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """# if defined(__i386__) && defined(__GNUC__) 46e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define FASTCALL __attribute__((fastcall)) 47e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# else 48e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define FASTCALL 49e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# endif""" 50e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 51e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef printVisibility(S, s): 52e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) 53e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define %s __attribute__((visibility("%s"))) 54e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# else 55e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define %s 56e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# endif""" % (S, s, S) 57e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 58e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef printNoinline(): 59e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """# if defined(__GNUC__) 60e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define NOINLINE __attribute__((noinline)) 61e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# else 62e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define NOINLINE 63e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# endif""" 64e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 65e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 66e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass glXItemFactory(gl_XML.glItemFactory): 67e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick """Factory to create GLX protocol oriented objects derived from glItem.""" 68e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 69e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def create(self, context, name, attrs): 70e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if name == "function": 71e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glXFunction(context, name, attrs) 72e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif name == "enum": 73e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glXEnum(context, name, attrs) 74e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif name == "param": 75e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glXParameter(context, name, attrs) 76e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 77e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return gl_XML.glItemFactory.create(self, context, name, attrs) 78e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 79e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass glXEnumFunction: 80e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self, name): 81e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.name = name 82e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 83e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # "enums" is a set of lists. The element in the set is the 84e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # value of the enum. The list is the list of names for that 85e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # value. For example, [0x8126] = {"POINT_SIZE_MIN", 86e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # "POINT_SIZE_MIN_ARB", "POINT_SIZE_MIN_EXT", 87e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # "POINT_SIZE_MIN_SGIS"}. 88e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 89e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.enums = {} 90e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 91e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # "count" is indexed by count values. Each element of count 92e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # is a list of index to "enums" that have that number of 93e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # associated data elements. For example, [4] = 94e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # {GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, 95e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # GL_AMBIENT_AND_DIFFUSE} (the enum names are used here, 96e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # but the actual hexadecimal values would be in the array). 97e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 98e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.count = {} 99e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 100e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 101e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def append(self, count, value, name): 102e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.enums.has_key( value ): 103e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.enums[value].append(name) 104e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 105e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if not self.count.has_key(count): 106e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.count[count] = [] 107e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.enums[value] = [] 109e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.enums[value].append(name) 110e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.count[count].append(value) 111e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 112e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 113e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def signature( self ): 114e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sig = "" 115e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for i in self.count: 116e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for e in self.count[i]: 117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sig += "%04x,%u," % (e, i) 118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return sig; 120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def PrintUsingTable(self): 123e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick """Emit the body of the __gl*_size function using a pair 124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick of look-up tables and a mask. The mask is calculated such 125e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick that (e & mask) is unique for all the valid values of e for 126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick this function. The result of (e & mask) is used as an index 127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick into the first look-up table. If it matches e, then the 128e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick same entry of the second table is returned. Otherwise zero 129e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick is returned. 130e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 131e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick It seems like this should cause better code to be generated. 132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick However, on x86 at least, the resulting .o file is about 20% 133e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick larger then the switch-statment version. I am leaving this 134e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick code in because the results may be different on other 135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick platforms (e.g., PowerPC or x86-64).""" 136e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0 138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick count = 0 139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for a in self.enums: 140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick count += 1 141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # Determine if there is some mask M, such that M = (2^N) - 1, 143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # that will generate unique values for all of the enums. 144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mask = 0 146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for i in [1, 2, 3, 4, 5, 6, 7, 8]: 147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mask = (1 << i) - 1 148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick fail = 0; 150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for a in self.enums: 151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for b in self.enums: 152e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if a != b: 153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (a & mask) == (b & mask): 154e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick fail = 1; 155e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 156e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if not fail: 157e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick break; 158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 159e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mask = 0 160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (mask != 0) and (mask < (2 * count)): 162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_enums = {} 163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_count = {} 164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 16547719fda0c2fba13c81e84e33523d5489263182eIan Romanick for i in range(0, mask + 1): 166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_enums[i] = "0"; 167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_count[i] = 0; 168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for c in self.count: 170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for e in self.count[c]: 171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick i = e & mask 172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_enums[i] = '0x%04x /* %s */' % (e, self.enums[e][0]) 173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick masked_count[i] = c 174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' static const GLushort a[%u] = {' % (mask + 1) 177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for e in masked_enums: 178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s, ' % (masked_enums[e]) 179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' };' 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' static const GLubyte b[%u] = {' % (mask + 1) 182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for c in masked_count: 183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %u, ' % (masked_count[c]) 184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' };' 185e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const unsigned idx = (e & 0x%02xU);' % (mask) 187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' return (e == a[idx]) ? (GLint) b[idx] : 0;' 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 1; 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def PrintUsingSwitch(self): 194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick """Emit the body of the __gl*_size function using a 195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick switch-statement.""" 196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' switch( e ) {' 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for c in self.count: 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for e in self.count[c]: 201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick first = 1 202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 203e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # There may be multiple enums with the same 204e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # value. This happens has extensions are 205e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # promoted from vendor-specific or EXT to 206e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # ARB and to the core. Emit the first one as 207e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # a case label, and emit the others as 208e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # commented-out case labels. 209e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 210e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for j in self.enums[e]: 211e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if first: 212e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' case %s:' % (j) 213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick first = 0 214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* case %s:*/' % (j) 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' return %u;' % (c) 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' default: return 0;' 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def Print(self, name): 224e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print 'INTERNAL PURE FASTCALL GLint' 225e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '__gl%s_size( GLenum e )' % (name) 226e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '{' 227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if not self.PrintUsingTable(): 229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.PrintUsingSwitch() 230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass glXEnum(gl_XML.glEnum): 237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self, context, name, attrs): 238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glEnum.__init__(self, context, name, attrs) 239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_functions = [] 240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def startElement(self, name, attrs): 242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if name == "size": 243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick n = attrs.get('name', None) 244e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if not self.context.glx_enum_functions.has_key( n ): 245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f = glXEnumFunction( n ) 246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.context.glx_enum_functions[ f.name ] = f 247e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 248e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick temp = attrs.get('count', None) 249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick c = int(temp) 251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick raise RuntimeError('Invalid count value "%s" for enum "%s" in function "%s" when an integer was expected.' % (temp, self.name, n)) 253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.context.glx_enum_functions[ n ].append( c, self.value, self.name ) 255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glEnum.startElement(self, context, name, attrs) 257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass glXParameter(gl_XML.glParameter): 261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self, context, name, attrs): 262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.order = 1; 263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glParameter.__init__(self, context, name, attrs); 264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass glXFunction(gl_XML.glFunction): 267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glx_rop = 0 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glx_sop = 0 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glx_vendorpriv = 0 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # If this is set to true, it means that GLdouble parameters should be 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # written to the GLX protocol packet in the order they appear in the 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # prototype. This is different from the "classic" ordering. In the 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # classic ordering GLdoubles are written to the protocol packet first, 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # followed by non-doubles. NV_vertex_program was the first extension 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # to break with this tradition. 277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glx_doubles_in_order = 0 279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick vectorequiv = None 281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick handcode = 0 282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ignore = 0 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick can_be_large = 0 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self, context, name, attrs): 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.vectorequiv = attrs.get('vectorequiv', None) 287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.count_parameters = None 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.counter = None 289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.output = None 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.can_be_large = 0 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.reply_always_array = 0 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glFunction.__init__(self, context, name, attrs) 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def startElement(self, name, attrs): 297e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick """Process elements within a function that are specific to GLX.""" 298e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 299e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if name == "glx": 300e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_rop = int(attrs.get('rop', "0")) 301e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_sop = int(attrs.get('sop', "0")) 302e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_vendorpriv = int(attrs.get('vendorpriv', "0")) 303e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 304e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if attrs.get('handcode', "false") == "true": 305e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.handcode = 1 306e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.handcode = 0 308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if attrs.get('ignore', "false") == "true": 310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.ignore = 1 311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.ignore = 0 313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if attrs.get('large', "false") == "true": 315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.can_be_large = 1 316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.can_be_large = 0 318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if attrs.get('doubles_in_order', "false") == "true": 320e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_doubles_in_order = 1 321e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 322e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_doubles_in_order = 0 323e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 324e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if attrs.get('always_array', "false") == "true": 325e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.reply_always_array = 1 326e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 327e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.reply_always_array = 0 328e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 329e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 330e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glFunction.startElement(self, name, attrs) 331e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 332e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 333e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def append(self, tag_name, p): 334e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.glFunction.append(self, tag_name, p) 335e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 336e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_variable_length_array(): 337e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p.order = 2; 338e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif not self.glx_doubles_in_order and p.p_type.size == 8: 339e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p.order = 0; 340e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 341e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.p_count_parameters != None: 342e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.count_parameters = p.p_count_parameters 343e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 344e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_counter: 345e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.counter = p.name 346e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 347e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_output: 348e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.output = p 349e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 350e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 351e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 352e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def variable_length_parameter(self): 353e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for param in self.fn_parameters: 354e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if param.is_variable_length_array(): 355e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return param 356e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 357e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return None 358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 359e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def command_payload_length(self): 361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size = 0 362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size_string = "" 363e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for p in self: 364e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_output: continue 365e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick temp = p.size_string() 366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick s = int(temp) 368e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size += s 369e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 370e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size_string = size_string + " + __GLX_PAD(%s)" % (temp) 371e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 372e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return [size, size_string] 373e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def command_length(self): 375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick [size, size_string] = self.command_payload_length() 376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_rop != 0: 378e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size += 4 379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 380e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick size = ((size + 3) & ~3) 381e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "%u%s" % (size, size_string) 382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 38447719fda0c2fba13c81e84e33523d5489263182eIan Romanick def opcode_real_value(self): 38547719fda0c2fba13c81e84e33523d5489263182eIan Romanick if self.glx_vendorpriv != 0: 38647719fda0c2fba13c81e84e33523d5489263182eIan Romanick if self.needs_reply(): 38747719fda0c2fba13c81e84e33523d5489263182eIan Romanick return 17 38847719fda0c2fba13c81e84e33523d5489263182eIan Romanick else: 38947719fda0c2fba13c81e84e33523d5489263182eIan Romanick return 16 39047719fda0c2fba13c81e84e33523d5489263182eIan Romanick else: 39147719fda0c2fba13c81e84e33523d5489263182eIan Romanick return self.opcode_value() 39247719fda0c2fba13c81e84e33523d5489263182eIan Romanick 393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def opcode_value(self): 394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_rop != 0: 395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.glx_rop 396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif self.glx_sop != 0: 397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.glx_sop 398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif self.glx_vendorpriv != 0: 399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.glx_vendorpriv 400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return -1 402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def opcode_rop_basename(self): 404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.vectorequiv == None: 405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.name 406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.vectorequiv 408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def opcode_name(self): 410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_rop != 0: 411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "X_GLrop_%s" % (self.opcode_rop_basename()) 412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif self.glx_sop != 0: 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "X_GLsop_%s" % (self.name) 414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif self.glx_vendorpriv != 0: 415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "X_GLvop_%s" % (self.name) 416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "ERROR" 418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def opcode_real_name(self): 420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_vendorpriv != 0: 421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.needs_reply(): 422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "X_GLXVendorPrivateWithReply" 423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "X_GLXVendorPrivate" 425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.opcode_name() 427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 428e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def return_string(self): 430e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.fn_return_type != 'void': 431e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "return retval;" 432e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 433e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return "return;" 434e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 435e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 436e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def needs_reply(self): 437e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return self.fn_return_type != 'void' or self.output != None 438e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 439e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 440e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass GlxProto(gl_XML.FilterGLAPISpecBase): 441e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick name = "glX_proto_send.py (from Mesa)" 442e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 443e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 444e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.FilterGLAPISpecBase.__init__(self) 445e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.factory = glXItemFactory() 446e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_functions = {} 447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 448e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 449e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def endElement(self, name): 450e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if name == 'OpenGLAPI': 451e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # Once all the parsing is done, we have to go back and 452e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # fix-up some cross references between different 453e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # functions. 454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 455e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for k in self.functions: 456e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f = self.functions[k] 457e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.vectorequiv != None: 458e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick equiv = self.find_function(f.vectorequiv) 459e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if equiv != None: 460e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f.glx_doubles_in_order = equiv.glx_doubles_in_order 461e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f.glx_rop = equiv.glx_rop 462e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 463e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick raise RuntimeError("Could not find the vector equiv. function %s for %s!" % (f.name, f.vectorequiv)) 464e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 465e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gl_XML.FilterGLAPISpecBase.endElement(self, name) 466e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 467e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 468e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 469e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass PrintGlxProtoStubs(GlxProto): 470e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 471e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GlxProto.__init__(self) 472e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 474e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 475e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 476e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 477e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 478e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 479e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 480e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect.h"' 481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "glxclient.h"' 482e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "size.h"' 483e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 484e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 485e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 487e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printFastcall() 488e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printNoinline() 489e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 490e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 491e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 492e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 493e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 494e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 495e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 496e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 497e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 498e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static NOINLINE CARD32 499e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickread_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 500e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 501e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 502e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 503e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 504e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 505e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if ((reply.size >= 1) || reply_is_always_array) { 506e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLint bytes = (reply_is_always_array) 507e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ? (4 * reply.length) : (reply.size * size); 508e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLint extra = 4 - (bytes & 3); 509e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 510e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick _XRead(dpy, dest, bytes); 511e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if ( extra != 0 ) { 512e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick _XEatData(dpy, extra); 513e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 514e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 515e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else { 516e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 517e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 518e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 519e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 520e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 521e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 522e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 523e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 524e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 525e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic NOINLINE GLubyte * 526e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen ) 527e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 528e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 529e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 530e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 531e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 532e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 533e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 534e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 536e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 537e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 538e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 539e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 540e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic NOINLINE GLubyte * 541e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 542e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 543e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 544e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 545e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 546e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 547e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 548e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 549e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 550e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 551e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 552e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 553e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 554e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 555e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 556e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 557e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 558e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 559e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 560e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 561e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 562e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.handcode or f.ignore: return 563e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 564e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_rop != 0 or f.vectorequiv != None: 565e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.printRenderFunction(f) 566e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif f.glx_sop != 0 or f.glx_vendorpriv != 0: 567e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.printSingleFunction(f) 568e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 569e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "/* Missing GLX protocol for %s. */" % (f.name) 570e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 571e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 572e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 573e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 574e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 575e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 576e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 577e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 578e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 579e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 580e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 581e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 582e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 583e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" % (n, n + 4, n) 584e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 585e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 586e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_one_arg(self, p, offset, pc, indent, adjust): 587e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_output: return 588e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 589e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick t = p.p_type 590e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 591e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 592e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 593e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 594e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 595e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 596e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick % (indent, pc, offset + adjust, src_ptr, p.size_string() ) 597e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 598e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_args(self, f, pc, indent, adjust, skip_vla): 599e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # First emit all of the fixed-length 8-byte (i.e., GLdouble) 600e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick # parameters. 601e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 602e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick offset = 0 603e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 604e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if skip_vla: 605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick r = [0, 1] 606e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 607e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick r = [0, 1, 2] 608e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 609e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for order in r: 610e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for p in f: 611e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_output or p.order != order: continue 612e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 613e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_one_arg(p, offset, pc, indent, adjust) 614e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick offset += p.size() 615e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 616e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 617e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return offset 618e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 620e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_func_print_just_header(self, f): 621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define %s %d' % (f.opcode_name(), f.opcode_value()) 622e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 623e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s' % (f.fn_return_type) 624e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string()) 625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '{' 626e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 627e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 628e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_func_print_header(self, f): 629e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_just_header(f) 630e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 631e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 632e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' Display * const dpy = gc->currentDpy;' 633e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 634e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_return_type != 'void': 635e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type) 636e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 637e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.count_parameters != None: 638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint compsize = __gl%s_size(%s);' % (f.name, f.count_parameters) 639e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 640e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint cmdlen = %s;' % (f.command_length()) 641e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 642e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.counter != None: 643e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' if (%s < 0) %s' % (f.counter, f.return_string()) 644e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 645e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 646e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' if (dpy == NULL) return;' 647e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' if ( ((gc->pc + cmdlen) > gc->bufEnd)' 648e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' || (cmdlen > gc->maxSmallRenderCommandSize)) {' 649e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 650e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 651e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 652e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' (void) dpy;' 653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 655e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 656e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 657e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printSingleFunction(self, f): 658e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_header(f) 659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 660e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' if (dpy != NULL) {' 661e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 662e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_parameters != []: 663e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 664e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 665e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 666e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 667e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_vendorpriv != 0: 668e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 669e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 670e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 671e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 672e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "pc", " ", 0, 0) 673e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 674e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 675e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.output != None: 676e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_size = f.output.p_type.size 677e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_str = f.output.name 678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_size = 0 680e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_str = "NULL" 681e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_return_type != 'void': 683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return_str = " retval = (%s)" % (f.fn_return_type) 684e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 685e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return_str = " (void)" 686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.reply_always_array: 688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick aa = "GL_TRUE" 689e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick aa = "GL_FALSE" 691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print " %s read_reply(gc->currentDpy, %s, %s, %s);" % (return_str, output_size, output_str, aa) 693e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' UnlockDisplay(gc->currentDpy); SyncHandle();' 695e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s' % f.return_string() 697e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 699e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 70347719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 70447719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 70547719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 70647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 70747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 70847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # x86, this save about 26KB in the libGL.so binary. 70947719fda0c2fba13c81e84e33523d5489263182eIan Romanick 710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.variable_length_parameter() == None and len(f.fn_parameters) == 1: 711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.fn_parameters[0] 712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_pointer: 713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick [cmdlen, size_string] = f.command_payload_length() 714e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_just_header(f) 716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 717e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 718e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 719e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 721e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_header(f) 722e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 724e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' if (cmdlen <= gc->maxSmallRenderCommandSize) {' 725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = " " 726e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = "" 728e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 729e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 730e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "gc->pc", indent, 4, 0) 732e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 733e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 734e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 735e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 736e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 737e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' else {' 738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLint op = %s;' % (f.opcode_real_name()) 739e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint cmdlenLarge = cmdlen + 4;' 740e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' (void) memcpy((void *)(gc->pc + 0), (void *)(&op), 4);' 741e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' (void) memcpy((void *)(gc->pc + 4), (void *)(&cmdlenLarge), 4);' 742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick offset = self.common_emit_args(f, "gc->pc", indent, 8, 1) 743e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 745e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __glXSendLargeCommand(gc, gc->pc, %u, %s, %s);' % (offset + 8, p.name, p.size_string()) 746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 747e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 748e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass PrintGlxProtoInit_c(GlxProto): 754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 755e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GlxProto.__init__(self) 756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 773e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 793e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.ignore: return 817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.category != self.last_category: 819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = f.category 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' /* %s */' % (self.last_category) 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' glAPI->%s = __indirect_gl%s;' % (f.name, f.name) 825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass PrintGlxProtoInit_h(GlxProto): 828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GlxProto.__init__(self) 830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _INDIRECT_H_ ) 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define _INDIRECT_H_ 848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printVisibility( "HIDDEN", "hidden" ) 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef HIDDEN" 855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "#endif /* !defined( _INDIRECT_H_ ) */" 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.ignore: return 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string()) 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass PrintGlxSizeStubs(GlxProto): 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GlxProto.__init__(self) 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases = [] 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs = {} 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect_size.h"' 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printPure() 876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printFastcall() 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printVisibility( "INTERNAL", "internal" ) 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#ifdef HAVE_ALIAS' 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS2(from,to) \\' 884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __attribute__ ((alias( # to )));' 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )' 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#else' 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS(from,to) \\' 889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' { return __gl ## to ## _size( e ); }' 891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#endif' 892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for a in self.aliases: 897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print a 898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_functions.has_key(f.name): 901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef = self.glx_enum_functions[f.name] 902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sig = ef.signature(); 904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_sigs.has_key(sig): 905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick n = self.glx_enum_sigs[sig]; 906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick a = 'ALIAS( %s, %s )' % (f.name, n) 907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases.append(a) 908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef.Print( f.name ) 910e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs[sig] = f.name; 911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickclass PrintGlxSizeStubs_h(GlxProto): 915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GlxProto.__init__(self) 917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases = [] 919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs = {} 920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 924e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 925e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for functions used to determine the number of data elements in 926e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * various GLX protocol messages. 927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 928e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 931e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _GLXSIZE_H_ ) 932e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define _GLXSIZE_H_ 933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printPure(); 936e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 937e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printFastcall(); 938e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 939e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick printVisibility( "INTERNAL", "internal" ); 940e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 942e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 943e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 944e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef INTERNAL" 945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef PURE" 946e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef FASTCALL" 947e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "#endif /* !defined( _GLXSIZE_H_ ) */" 948e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 949e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 950e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 951e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_functions.has_key(f.name): 952e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef = self.glx_enum_functions[f.name] 953b53df18624a1b3870c1dcfe3981c07c089efe262Ian Romanick print 'extern INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (f.name) 954e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0] 958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 964e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 965e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:") 966e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 967e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 968e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 969e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 970e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 973e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 974e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 975e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 977e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoStubs() 978e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 979e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_c() 980e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 981e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_h() 982e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "size_c": 983e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxSizeStubs() 984e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "size_h": 985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxSizeStubs_h() 986e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 987e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 988e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 989e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser = make_parser() 990e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setFeature(feature_namespaces, 0) 991e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setContentHandler(dh) 992e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 993e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f = open(file_name) 994e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 995e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printHeader() 996e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.parse(f) 997e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printFooter() 998