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