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