glX_proto_send.py revision e9789cf07186e710ee212effb2c25be96f7cbff2
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/python2 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (C) Copyright IBM Corporation 2004 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# All Rights Reserved. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Permission is hereby granted, free of charge, to any person obtaining a 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copy of this software and associated documentation files (the "Software"), 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# to deal in the Software without restriction, including without limitation 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# on the rights to use, copy, modify, merge, publish, distribute, sub 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# license, and/or sell copies of the Software, and to permit persons to whom 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the Software is furnished to do so, subject to the following conditions: 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# The above copyright notice and this permission notice (including the next 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# paragraph) shall be included in all copies or substantial portions of the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Software. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# IN THE SOFTWARE. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Authors: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Ian Romanick <idr@us.ibm.com> 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from xml.sax import saxutils 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from xml.sax import make_parser 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from xml.sax.handler import feature_namespaces 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import gl_XML 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import license 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys, getopt 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def printPure(): 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print """# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PURE __attribute__((pure)) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PURE 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif""" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def printFastcall(): 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print """# if defined(__i386__) && defined(__GNUC__) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FASTCALL __attribute__((fastcall)) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FASTCALL 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif""" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def printVisibility(S, s): 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print """# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define %s __attribute__((visibility("%s"))) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define %s 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif""" % (S, s, S) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def printNoinline(): 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print """# if defined(__GNUC__) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define NOINLINE __attribute__((noinline)) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# else 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define NOINLINE 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif""" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class glXItemFactory(gl_XML.glItemFactory): 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Factory to create GLX protocol oriented objects derived from glItem.""" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def create(self, context, name, attrs): 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name == "function": 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return glXFunction(context, name, attrs) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif name == "enum": 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return glXEnum(context, name, attrs) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif name == "param": 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return glXParameter(context, name, attrs) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_XML.glItemFactory.create(self, context, name, attrs) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class glXEnumFunction: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, name): 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.name = name 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # "enums" is a set of lists. The element in the set is the 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # value of the enum. The list is the list of names for that 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # value. For example, [0x8126] = {"POINT_SIZE_MIN", 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # "POINT_SIZE_MIN_ARB", "POINT_SIZE_MIN_EXT", 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # "POINT_SIZE_MIN_SGIS"}. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.enums = {} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # "count" is indexed by count values. Each element of count 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # is a list of index to "enums" that have that number of 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # associated data elements. For example, [4] = 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # {GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # GL_AMBIENT_AND_DIFFUSE} (the enum names are used here, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # but the actual hexadecimal values would be in the array). 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.count = {} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def append(self, count, value, name): 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.enums.has_key( value ): 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.enums[value].append(name) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not self.count.has_key(count): 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.count[count] = [] 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.enums[value] = [] 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.enums[value].append(name) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.count[count].append(value) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def signature( self ): 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig = "" 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for i in self.count: 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for e in self.count[i]: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig += "%04x,%u," % (e, i) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sig; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def PrintUsingTable(self): 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Emit the body of the __gl*_size function using a pair 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) of look-up tables and a mask. The mask is calculated such 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) that (e & mask) is unique for all the valid values of e for 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this function. The result of (e & mask) is used as an index 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) into the first look-up table. If it matches e, then the 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) same entry of the second table is returned. Otherwise zero 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is returned. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) It seems like this should cause better code to be generated. 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) However, on x86 at least, the resulting .o file is about 20% 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) larger then the switch-statment version. I am leaving this 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) code in because the results may be different on other 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) platforms (e.g., PowerPC or x86-64).""" 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) count = 0 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for a in self.enums: 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) count += 1 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Determine if there is some mask M, such that M = (2^N) - 1, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # that will generate unique values for all of the enums. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = 0 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for i in [1, 2, 3, 4, 5, 6, 7, 8]: 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = (1 << i) - 1 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fail = 0; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for a in self.enums: 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for b in self.enums: 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if a != b: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (a & mask) == (b & mask): 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fail = 1; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not fail: 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = 0 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mask != 0) and (mask < (2 * count)): 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_enums = {} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_count = {} 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for i in range(0, mask): 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_enums[i] = "0"; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_count[i] = 0; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for c in self.count: 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for e in self.count[c]: 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i = e & mask 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_enums[i] = '0x%04x /* %s */' % (e, self.enums[e][0]) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masked_count[i] = c 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' static const GLushort a[%u] = {' % (mask + 1) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for e in masked_enums: 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %s, ' % (masked_enums[e]) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' };' 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' static const GLubyte b[%u] = {' % (mask + 1) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for c in masked_count: 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %u, ' % (masked_count[c]) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' };' 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' const unsigned idx = (e & 0x%02xU);' % (mask) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' return (e == a[idx]) ? (GLint) b[idx] : 0;' 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def PrintUsingSwitch(self): 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Emit the body of the __gl*_size function using a 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch-statement.""" 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' switch( e ) {' 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for c in self.count: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for e in self.count[c]: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first = 1 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # There may be multiple enums with the same 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # value. This happens has extensions are 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # promoted from vendor-specific or EXT to 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ARB and to the core. Emit the first one as 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # a case label, and emit the others as 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # commented-out case labels. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for j in self.enums[e]: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if first: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' case %s:' % (j) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first = 0 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '/* case %s:*/' % (j) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' return %u;' % (c) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' default: return 0;' 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' }' 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Print(self, name): 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print 'INTERNAL PURE FASTCALL GLint' 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '__gl%s_size( GLenum e )' % (name) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '{' 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not self.PrintUsingTable(): 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.PrintUsingSwitch() 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '}' 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class glXEnum(gl_XML.glEnum): 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, context, name, attrs): 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.glEnum.__init__(self, context, name, attrs) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_functions = [] 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def startElement(self, name, attrs): 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if name == "size": 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = attrs.get('name', None) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not self.context.glx_enum_functions.has_key( n ): 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = glXEnumFunction( n ) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.context.glx_enum_functions[ f.name ] = f 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp = attrs.get('count', None) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = int(temp) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except Exception,e: 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise RuntimeError('Invalid count value "%s" for enum "%s" in function "%s" when an integer was expected.' % (temp, self.name, n)) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.context.glx_enum_functions[ n ].append( c, self.value, self.name ) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_XML.glEnum.startElement(self, context, name, attrs) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class glXParameter(gl_XML.glParameter): 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, context, name, attrs): 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.order = 1; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.glParameter.__init__(self, context, name, attrs); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class glXFunction(gl_XML.glFunction): 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glx_rop = 0 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glx_sop = 0 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glx_vendorpriv = 0 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # If this is set to true, it means that GLdouble parameters should be 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # written to the GLX protocol packet in the order they appear in the 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # prototype. This is different from the "classic" ordering. In the 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # classic ordering GLdoubles are written to the protocol packet first, 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # followed by non-doubles. NV_vertex_program was the first extension 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # to break with this tradition. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glx_doubles_in_order = 0 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vectorequiv = None 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handcode = 0 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore = 0 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_be_large = 0 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, context, name, attrs): 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.vectorequiv = attrs.get('vectorequiv', None) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.count_parameters = None 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.counter = None 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.output = None 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.can_be_large = 0 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.reply_always_array = 0 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_XML.glFunction.__init__(self, context, name, attrs) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def startElement(self, name, attrs): 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Process elements within a function that are specific to GLX.""" 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if name == "glx": 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_rop = int(attrs.get('rop', "0")) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_sop = int(attrs.get('sop', "0")) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_vendorpriv = int(attrs.get('vendorpriv', "0")) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if attrs.get('handcode', "false") == "true": 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.handcode = 1 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.handcode = 0 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if attrs.get('ignore', "false") == "true": 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.ignore = 1 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.ignore = 0 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if attrs.get('large', "false") == "true": 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.can_be_large = 1 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.can_be_large = 0 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if attrs.get('doubles_in_order', "false") == "true": 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_doubles_in_order = 1 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_doubles_in_order = 0 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if attrs.get('always_array', "false") == "true": 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.reply_always_array = 1 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.reply_always_array = 0 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.glFunction.startElement(self, name, attrs) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def append(self, tag_name, p): 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.glFunction.append(self, tag_name, p) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_variable_length_array(): 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.order = 2; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif not self.glx_doubles_in_order and p.p_type.size == 8: 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.order = 0; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.p_count_parameters != None: 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.count_parameters = p.p_count_parameters 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if p.is_counter: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.counter = p.name 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if p.is_output: 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.output = p 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def variable_length_parameter(self): 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for param in self.fn_parameters: 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if param.is_variable_length_array(): 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return param 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return None 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def command_payload_length(self): 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = 0 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_string = "" 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for p in self: 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_output: continue 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp = p.size_string() 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = int(temp) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size += s 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except Exception,e: 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_string = size_string + " + __GLX_PAD(%s)" % (temp) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [size, size_string] 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def command_length(self): 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [size, size_string] = self.command_payload_length() 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.glx_rop != 0: 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size += 4 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size = ((size + 3) & ~3) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "%u%s" % (size, size_string) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def opcode_value(self): 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.glx_rop != 0: 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.glx_rop 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif self.glx_sop != 0: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.glx_sop 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif self.glx_vendorpriv != 0: 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.glx_vendorpriv 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def opcode_rop_basename(self): 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.vectorequiv == None: 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.name 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.vectorequiv 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def opcode_name(self): 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.glx_rop != 0: 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "X_GLrop_%s" % (self.opcode_rop_basename()) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif self.glx_sop != 0: 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "X_GLsop_%s" % (self.name) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif self.glx_vendorpriv != 0: 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "X_GLvop_%s" % (self.name) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "ERROR" 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def opcode_real_name(self): 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.glx_vendorpriv != 0: 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.needs_reply(): 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "X_GLXVendorPrivateWithReply" 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "X_GLXVendorPrivate" 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.opcode_name() 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def return_string(self): 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.fn_return_type != 'void': 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "return retval;" 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "return;" 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def needs_reply(self): 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.fn_return_type != 'void' or self.output != None 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GlxProto(gl_XML.FilterGLAPISpecBase): 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = "glX_proto_send.py (from Mesa)" 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self): 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.FilterGLAPISpecBase.__init__(self) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.factory = glXItemFactory() 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.glx_enum_functions = {} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def endElement(self, name): 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if name == 'OpenGLAPI': 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Once all the parsing is done, we have to go back and 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # fix-up some cross references between different 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # functions. 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for k in self.functions: 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = self.functions[k] 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.vectorequiv != None: 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) equiv = self.find_function(f.vectorequiv) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if equiv != None: 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.glx_doubles_in_order = equiv.glx_doubles_in_order 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.glx_rop = equiv.glx_rop 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise RuntimeError("Could not find the vector equiv. function %s for %s!" % (f.name, f.vectorequiv)) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_XML.FilterGLAPISpecBase.endElement(self, name) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrintGlxProtoStubs(GlxProto): 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self): 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlxProto.__init__(self) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.last_category = "" 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def printRealHeader(self): 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '#include <GL/gl.h>' 47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) print '#include "indirect.h"' 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '#include "glxclient.h"' 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '#include "size.h"' 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '#include <GL/glxproto.h>' 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '' 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printFastcall() 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printNoinline() 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '' 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '/* If the size and opcode values are known at compile-time, this will, on' 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' * x86 at least, emit them with a single instruction.' 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' */' 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '#define emit_header(dest, op, size) \\' 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' do { union { short s[2]; int i; } temp; \\' 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' temp.s[0] = (size); temp.s[1] = (op); \\' 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' *((int *)(dest)) = temp.i; } while(0)' 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print """static NOINLINE CARD32 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)read_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xGLXSingleReply reply; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (void) _XReply(dpy, (xReply *) & reply, 0, False); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size != 0) { 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((reply.size >= 1) || reply_is_always_array) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLint bytes = (reply_is_always_array) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ? (4 * reply.length) : (reply.size * size); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLint extra = 4 - (bytes & 3); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _XRead(dpy, dest, bytes); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( extra != 0 ) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _XEatData(dpy, extra); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) memcpy( dest, &(reply.pad3), size); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reply.retval; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define X_GLXSingle 0 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static NOINLINE GLubyte * 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)setup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen ) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xGLXSingleReq * req; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Display * const dpy = gc->currentDpy; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (void) __glXFlushRenderBuffer(gc, gc->pc); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LockDisplay(dpy); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetReqExtra(GLXSingle, cmdlen, req); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->reqType = gc->majorOpcode; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->contextTag = gc->currentContextTag; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req->glxCode = sop; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (GLubyte *)(req) + sz_xGLXSingleReq; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static NOINLINE GLubyte * 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)setup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xGLXVendorPrivateReq * req; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Display * const dpy = gc->currentDpy; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) __glXFlushRenderBuffer(gc, gc->pc); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockDisplay(dpy); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetReqExtra(GLXVendorPrivate, cmdlen, req); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req->reqType = gc->majorOpcode; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req->glxCode = code; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->vendorCode = vop; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->contextTag = gc->currentContextTag; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for size in self.generic_sizes: 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.print_generic_function(size) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def printFunction(self, f): 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.fn_offset < 0 or f.handcode or f.ignore: return 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.glx_rop != 0 or f.vectorequiv != None: 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.printRenderFunction(f) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif f.glx_sop != 0 or f.glx_vendorpriv != 0: 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.printSingleFunction(f) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print "/* Missing GLX protocol for %s. */" % (f.name) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def print_generic_function(self, n): 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print """static FASTCALL NOINLINE void 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)generic_%u_byte( GLint rop, const void * ptr ) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __GLXcontext * const gc = __glXGetCurrentContext(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint cmdlen = %u; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emit_header(gc->pc, rop, cmdlen); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) memcpy((void *)(gc->pc + 4), ptr, %u); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gc->pc += cmdlen; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" % (n, n + 4, n) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def common_emit_one_arg(self, p, offset, pc, indent, adjust): 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_output: return 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t = p.p_type 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_array(): 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_ptr = p.name 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_ptr = "&" + p.name 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) % (indent, pc, offset + adjust, src_ptr, p.size_string() ) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def common_emit_args(self, f, pc, indent, adjust, skip_vla): 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # First emit all of the fixed-length 8-byte (i.e., GLdouble) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # parameters. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = 0 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if skip_vla: 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r = [0, 1] 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r = [0, 1, 2] 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for order in r: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for p in f: 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_output or p.order != order: continue 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.common_emit_one_arg(p, offset, pc, indent, adjust) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset += p.size() 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return offset 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def common_func_print_just_header(self, f): 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '#define %s %d' % (f.opcode_name(), f.opcode_value()) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '%s' % (f.fn_return_type) 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string()) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '{' 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def common_func_print_header(self, f): 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.common_func_print_just_header(f) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' __GLXcontext * const gc = __glXGetCurrentContext();' 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' Display * const dpy = gc->currentDpy;' 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.fn_return_type != 'void': 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.count_parameters != None: 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' const GLuint compsize = __gl%s_size(%s);' % (f.name, f.count_parameters) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' const GLuint cmdlen = %s;' % (f.command_length()) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.counter != None: 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' if (%s < 0) %s' % (f.counter, f.return_string()) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.can_be_large: 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' if (dpy == NULL) return;' 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' if ( ((gc->pc + cmdlen) > gc->bufEnd)' 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' || (cmdlen > gc->maxSmallRenderCommandSize)) {' 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' }' 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' (void) dpy;' 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def printSingleFunction(self, f): 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.common_func_print_header(f) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' if (dpy != NULL) {' 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.fn_parameters != []: 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_decl = "GLubyte const * pc =" 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_decl = "(void)" 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.glx_vendorpriv != 0: 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.common_emit_args(f, "pc", " ", 0, 0) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.needs_reply(): 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.output != None: 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_size = f.output.p_type.size 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_str = f.output.name 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_size = 0 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_str = "NULL" 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.fn_return_type != 'void': 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return_str = " retval = (%s)" % (f.fn_return_type) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_str = " (void)" 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.reply_always_array: 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aa = "GL_TRUE" 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aa = "GL_FALSE" 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print " %s read_reply(gc->currentDpy, %s, %s, %s);" % (return_str, output_size, output_str, aa) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' UnlockDisplay(gc->currentDpy); SyncHandle();' 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' }' 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' %s' % f.return_string() 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '}' 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '' 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def printRenderFunction(self, f): 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.variable_length_parameter() == None and len(f.fn_parameters) == 1: 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = f.fn_parameters[0] 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if p.is_pointer: 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) [cmdlen, size_string] = f.command_payload_length() 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if cmdlen in self.generic_sizes: 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.common_func_print_just_header(f) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '}' 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.common_func_print_header(f) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.can_be_large: 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' if (cmdlen <= gc->maxSmallRenderCommandSize) {' 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indent = " " 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indent = "" 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.common_emit_args(f, "gc->pc", indent, 4, 0) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '%s gc->pc += cmdlen;' % (indent) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if f.can_be_large: 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' }' 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' else {' 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' const GLint op = %s;' % (f.opcode_real_name()) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' const GLuint cmdlenLarge = cmdlen + 4;' 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' (void) memcpy((void *)(gc->pc + 0), (void *)(&op), 4);' 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' (void) memcpy((void *)(gc->pc + 4), (void *)(&cmdlenLarge), 4);' 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offset = self.common_emit_args(f, "gc->pc", indent, 8, 1) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = f.variable_length_parameter() 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' __glXSendLargeCommand(gc, gc->pc, %u, %s, %s);' % (offset + 8, p.name, p.size_string()) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ' }' 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '}' 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print '' 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintGlxProtoInit_c(GlxProto): 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self): 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlxProto.__init__(self) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.last_category = "" 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.license = license.bsd_license_template % ( \ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def printRealHeader(self): 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print """/** 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \\file indirect_init.c 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize indirect rendering dispatch table. 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \\author Kevin E. Martin <kevin@precisioninsight.com> 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \\author Brian Paul <brian@precisioninsight.com> 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * \\author Ian Romanick <idr@us.ibm.com> 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "indirect_init.h" 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "indirect.h" 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "glapi.h" 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * No-op function used to initialize functions that have no GLX protocol 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * support. 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int NoOp(void) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Create and initialize a new GL dispatch table. The table is initialized 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * with GLX indirect rendering protocol functions. 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__GLapi * __glXNewIndirectAPI( void ) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __GLapi *glAPI; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint entries; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries = _glapi_get_dispatch_table_size(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* first, set all entries to point to no-op functions */ 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int i; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void **dispatch = (void **) glAPI; 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (i = 0; i < entries; i++) { 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dispatch[i] = (void *) NoOp; 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* now, initialize the entries we understand */""" 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def printRealFooter(self): 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print """ 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return glAPI; 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def printFunction(self, f): 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.fn_offset < 0 or f.ignore: return 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if f.category != self.last_category: 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.last_category = f.category 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '' 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print ' /* %s */' % (self.last_category) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '' 807 808 print ' glAPI->%s = __indirect_gl%s;' % (f.name, f.name) 809 810 811class PrintGlxProtoInit_h(GlxProto): 812 def __init__(self): 813 GlxProto.__init__(self) 814 self.last_category = "" 815 self.license = license.bsd_license_template % ( \ 816"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 817(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 818 819 820 def printRealHeader(self): 821 print """ 822/** 823 * \\file 824 * Prototypes for indirect rendering functions. 825 * 826 * \\author Kevin E. Martin <kevin@precisioninsight.com> 827 * \\author Ian Romanick <idr@us.ibm.com> 828 */ 829 830#if !defined( _INDIRECT_H_ ) 831# define _INDIRECT_H_ 832 833""" 834 printVisibility( "HIDDEN", "hidden" ) 835 836 837 def printRealFooter(self): 838 print "# undef HIDDEN" 839 print "#endif /* !defined( _INDIRECT_H_ ) */" 840 841 def printFunction(self, f): 842 if f.fn_offset < 0 or f.ignore: return 843 print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string()) 844 845 846class PrintGlxSizeStubs(GlxProto): 847 def __init__(self): 848 GlxProto.__init__(self) 849 self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 850 self.aliases = [] 851 self.glx_enum_sigs = {} 852 853 def printRealHeader(self): 854 print '' 855 print '#include <GL/gl.h>' 856 print '#include "indirect_size.h"' 857 858 print '' 859 printPure() 860 print '' 861 printFastcall() 862 print '' 863 printVisibility( "INTERNAL", "internal" ) 864 print '' 865 print '' 866 print '#ifdef HAVE_ALIAS' 867 print '# define ALIAS2(from,to) \\' 868 print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 869 print ' __attribute__ ((alias( # to )));' 870 print '# define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )' 871 print '#else' 872 print '# define ALIAS(from,to) \\' 873 print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 874 print ' { return __gl ## to ## _size( e ); }' 875 print '#endif' 876 print '' 877 print '' 878 879 def printRealFooter(self): 880 for a in self.aliases: 881 print a 882 883 def printFunction(self, f): 884 if self.glx_enum_functions.has_key(f.name): 885 ef = self.glx_enum_functions[f.name] 886 887 sig = ef.signature(); 888 if self.glx_enum_sigs.has_key(sig): 889 n = self.glx_enum_sigs[sig]; 890 a = 'ALIAS( %s, %s )' % (f.name, n) 891 self.aliases.append(a) 892 else: 893 ef.Print( f.name ) 894 self.glx_enum_sigs[sig] = f.name; 895 896 897 898class PrintGlxSizeStubs_h(GlxProto): 899 def __init__(self): 900 GlxProto.__init__(self) 901 self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 902 self.aliases = [] 903 self.glx_enum_sigs = {} 904 905 def printRealHeader(self): 906 print """ 907/** 908 * \\file 909 * Prototypes for functions used to determine the number of data elements in 910 * various GLX protocol messages. 911 * 912 * \\author Ian Romanick <idr@us.ibm.com> 913 */ 914 915#if !defined( _GLXSIZE_H_ ) 916# define _GLXSIZE_H_ 917 918""" 919 printPure(); 920 print '' 921 printFastcall(); 922 print '' 923 printVisibility( "INTERNAL", "internal" ); 924 print '' 925 926 def printRealFooter(self): 927 print '' 928 print "# undef INTERNAL" 929 print "# undef PURE" 930 print "# undef FASTCALL" 931 print "#endif /* !defined( _GLXSIZE_H_ ) */" 932 933 934 def printFunction(self, f): 935 if self.glx_enum_functions.has_key(f.name): 936 ef = self.glx_enum_functions[f.name] 937 print 'extern INTERNAL GLint __gl%s_size(GLenum) PURE FASTCALL;' % (f.name) 938 939 940def show_usage(): 941 print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0] 942 sys.exit(1) 943 944 945if __name__ == '__main__': 946 file_name = "gl_API.xml" 947 948 try: 949 (args, trail) = getopt.getopt(sys.argv[1:], "f:m:") 950 except Exception,e: 951 show_usage() 952 953 mode = "proto" 954 for (arg,val) in args: 955 if arg == "-f": 956 file_name = val 957 elif arg == "-m": 958 mode = val 959 960 if mode == "proto": 961 dh = PrintGlxProtoStubs() 962 elif mode == "init_c": 963 dh = PrintGlxProtoInit_c() 964 elif mode == "init_h": 965 dh = PrintGlxProtoInit_h() 966 elif mode == "size_c": 967 dh = PrintGlxSizeStubs() 968 elif mode == "size_h": 969 dh = PrintGlxSizeStubs_h() 970 else: 971 show_usage() 972 973 parser = make_parser() 974 parser.setFeature(feature_namespaces, 0) 975 parser.setContentHandler(dh) 976 977 f = open(file_name) 978 979 dh.printHeader() 980 parser.parse(f) 981 dh.printFooter() 982