100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#!/usr/bin/env python
200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# (C) Copyright IBM Corporation 2004, 2005
400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# All Rights Reserved.
500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#
600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Permission is hereby granted, free of charge, to any person obtaining a
700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# copy of this software and associated documentation files (the "Software"),
800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# to deal in the Software without restriction, including without limitation
900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub
1000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# license, and/or sell copies of the Software, and to permit persons to whom
1100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# the Software is furnished to do so, subject to the following conditions:
1200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#
1300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# The above copyright notice and this permission notice (including the next
1400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# paragraph) shall be included in all copies or substantial portions of the
1500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Software.
1600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#
1700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
2000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IN THE SOFTWARE.
2400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#
2500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Authors:
2600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#    Ian Romanick <idr@us.ibm.com>
2700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
2866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML
2900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickimport license
3066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string
3100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
3200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
3366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_enum_function:
3466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def __init__(self, func_name, enum_dict):
3566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = func_name
3666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.mode = 1
3766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.sig = None
383fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick
3966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# "enums" is a set of lists.  The element in the set is the
4066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# value of the enum.  The list is the list of names for that
4166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# value.  For example, [0x8126] = {"POINT_SIZE_MIN",
4266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# "POINT_SIZE_MIN_ARB", "POINT_SIZE_MIN_EXT",
4366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# "POINT_SIZE_MIN_SGIS"}.
445aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
4566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.enums = {}
465aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
4766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# "count" is indexed by count values.  Each element of count
4866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# is a list of index to "enums" that have that number of
4966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# associated data elements.  For example, [4] =
5066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# {GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION,
5166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# GL_AMBIENT_AND_DIFFUSE} (the enum names are used here,
5266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# but the actual hexadecimal values would be in the array).
5366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.count = {}
555aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
565aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
5766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# Fill self.count and self.enums using the dictionary of enums
589a3a1497e5d709015486d0c7801688812ca446daIan Romanick		# that was passed in.  The generic Get functions (e.g.,
599a3a1497e5d709015486d0c7801688812ca446daIan Romanick		# GetBooleanv and friends) are handled specially here.  In
609a3a1497e5d709015486d0c7801688812ca446daIan Romanick		# the data the generic Get functions are refered to as "Get".
619a3a1497e5d709015486d0c7801688812ca446daIan Romanick
629a3a1497e5d709015486d0c7801688812ca446daIan Romanick		if func_name in ["GetIntegerv", "GetBooleanv", "GetFloatv", "GetDoublev"]:
639a3a1497e5d709015486d0c7801688812ca446daIan Romanick			match_name = "Get"
649a3a1497e5d709015486d0c7801688812ca446daIan Romanick		else:
659a3a1497e5d709015486d0c7801688812ca446daIan Romanick			match_name = func_name
6666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		mode_set = 0
6866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for enum_name in enum_dict:
6966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			e = enum_dict[ enum_name ]
709a3a1497e5d709015486d0c7801688812ca446daIan Romanick
719a3a1497e5d709015486d0c7801688812ca446daIan Romanick			if e.functions.has_key( match_name ):
729a3a1497e5d709015486d0c7801688812ca446daIan Romanick				[count, mode] = e.functions[ match_name ]
735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
7466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if mode_set and mode != self.mode:
7566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					raise RuntimeError("Not all enums for %s have the same mode." % (func_name))
765aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
7766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.mode = mode
785aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
7966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if self.enums.has_key( e.value ):
8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if e.name not in self.enums[ e.value ]:
8166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						self.enums[ e.value ].append( e )
8266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
8366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if not self.count.has_key( count ):
8466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						self.count[ count ] = []
855aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
8666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.enums[ e.value ] = [ e ]
8766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.count[ count ].append( e.value )
885aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
895aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
905aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick		return
915aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
925aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def signature( self ):
9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.sig == None:
9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.sig = ""
9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for i in self.count:
9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if i == None:
9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					raise RuntimeError("i is None.  WTF?")
9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.count[i].sort()
10166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for e in self.count[i]:
1029a3a1497e5d709015486d0c7801688812ca446daIan Romanick					self.sig += "%04x,%d," % (e, i)
1039a3a1497e5d709015486d0c7801688812ca446daIan Romanick
10466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return self.sig
10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def is_set( self ):
10866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return self.mode
10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
11066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def PrintUsingTable(self):
11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		"""Emit the body of the __gl*_size function using a pair
11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		of look-up tables and a mask.  The mask is calculated such
11466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		that (e & mask) is unique for all the valid values of e for
11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		this function.  The result of (e & mask) is used as an index
11666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		into the first look-up table.  If it matches e, then the
11766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		same entry of the second table is returned.  Otherwise zero
11866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		is returned.
11966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
12066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		It seems like this should cause better code to be generated.
12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		However, on x86 at least, the resulting .o file is about 20%
12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		larger then the switch-statment version.  I am leaving this
12366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		code in because the results may be different on other
12466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		platforms (e.g., PowerPC or x86-64)."""
12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
12666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return 0
12766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		count = 0
12866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for a in self.enums:
12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			count += 1
13066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
13166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.count.has_key(-1):
13266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			return 0
13366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# Determine if there is some mask M, such that M = (2^N) - 1,
13566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# that will generate unique values for all of the enums.
13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		mask = 0
13866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for i in [1, 2, 3, 4, 5, 6, 7, 8]:
13966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			mask = (1 << i) - 1
14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			fail = 0;
14266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for a in self.enums:
14366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for b in self.enums:
14466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if a != b:
14566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if (a & mask) == (b & mask):
14666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							fail = 1;
14766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
14866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not fail:
14966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				break;
15066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
15166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				mask = 0
15266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
15366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if (mask != 0) and (mask < (2 * count)):
15466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			masked_enums = {}
15566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			masked_count = {}
15666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
15766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for i in range(0, mask + 1):
15866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				masked_enums[i] = "0";
15966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				masked_count[i] = 0;
16066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
16166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for c in self.count:
16266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for e in self.count[c]:
16366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					i = e & mask
16466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					enum_obj = self.enums[e][0]
16566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					masked_enums[i] = '0x%04x /* %s */' % (e, enum_obj.name )
16666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					masked_count[i] = c
16766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
16866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
16966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    static const GLushort a[%u] = {' % (mask + 1)
17066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for e in masked_enums:
17166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        %s, ' % (masked_enums[e])
17266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    };'
1735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
17466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    static const GLubyte b[%u] = {' % (mask + 1)
17566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for c in masked_count:
17666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        %u, ' % (masked_count[c])
17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    };'
1785aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
17966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    const unsigned idx = (e & 0x%02xU);' % (mask)
18066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print ''
18166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    return (e == a[idx]) ? (GLint) b[idx] : 0;'
18266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			return 1;
18366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
18466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			return 0;
18566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
18666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
18766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def PrintUsingSwitch(self, name):
18866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		"""Emit the body of the __gl*_size function using a
18966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		switch-statement."""
19066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
19166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    switch( e ) {'
19266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
19366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for c in self.count:
19466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for e in self.count[c]:
19566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				first = 1
19666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
19766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# There may be multiple enums with the same
19866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# value.  This happens has extensions are
19966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# promoted from vendor-specific or EXT to
20066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# ARB and to the core.  Emit the first one as
20166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# a case label, and emit the others as
20266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				# commented-out case labels.
20366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
20466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				list = {}
20566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for enum_obj in self.enums[e]:
20666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					list[ enum_obj.priority() ] = enum_obj.name
20766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
20866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				keys = list.keys()
20966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				keys.sort()
21066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for k in keys:
21166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					j = list[k]
21266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if first:
21366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '        case GL_%s:' % (j)
21466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						first = 0
21566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
21666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '/*      case GL_%s:*/' % (j)
21766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
21866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if c == -1:
21966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '            return __gl%s_variable_size( e );' % (name)
22066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
22166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '            return %u;' % (c)
22266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
22366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        default: return 0;'
22466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
22566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
22666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
22766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def Print(self, name):
2280c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '_X_INTERNAL PURE FASTCALL GLint'
22966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '__gl%s_size( GLenum e )' % (name)
23066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '{'
23166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
23266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if not self.PrintUsingTable():
23366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.PrintUsingSwitch(name)
23466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
23566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '}'
23666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print ''
23766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
23866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
23966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_server_enum_function(glx_enum_function):
24066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def __init__(self, func, enum_dict):
24166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		glx_enum_function.__init__(self, func.name, enum_dict)
24266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
24366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.function = func
24466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
2455aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
2465aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
247ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def signature( self ):
248ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		if self.sig == None:
24966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			sig = glx_enum_function.signature(self)
250ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
25166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = self.function.variable_length_parameter()
25266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p:
25366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				sig += "%u" % (p.size())
254ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
255ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			self.sig = sig
256ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
257ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		return self.sig;
258ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
259ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
26066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def Print(self, name, printer):
26166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		f = self.function
26266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer.common_func_print_just_header( f )
263ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
264ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		fixup = []
26566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
26666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		foo = {}
26766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param_name in f.count_parameter_list:
26866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			o = f.offset_of( param_name )
26966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			foo[o] = param_name
27066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
27166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param_name in f.counter_list:
27266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			o = f.offset_of( param_name )
27366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			foo[o] = param_name
27466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
27566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		keys = foo.keys()
27666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		keys.sort()
27766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for o in keys:
27866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters_by_name[ foo[o] ]
27966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
280990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			printer.common_emit_one_arg(p, "pc", 0)
28166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			fixup.append( p.name )
282ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
283ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
284ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    GLsizei compsize;'
285ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
286ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
28766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer.common_emit_fixups(fixup)
288ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
289ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
29066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    compsize = __gl%s_size(%s);' % (f.name, string.join(f.count_parameter_list, ","))
291ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		p = f.variable_length_parameter()
292ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    return __GLX_PAD(%s);' % (p.size_string())
293ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
294ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '}'
295ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
296ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
297ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
29866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxSizeStubs_common(gl_XML.gl_print_base):
2995aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	do_get = (1 << 0)
3005aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	do_set = (1 << 1)
3015aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
3025aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	def __init__(self, which_functions):
30366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
30400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
30566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_size.py (from Mesa)"
30666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
3075aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
30866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_set = ((which_functions & PrintGlxSizeStubs_common.do_set) != 0)
30966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_get = ((which_functions & PrintGlxSizeStubs_common.do_get) != 0)
31066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
3115aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
3125aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
3135aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanickclass PrintGlxSizeStubs_c(PrintGlxSizeStubs_common):
31400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	def printRealHeader(self):
31500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
3160c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '#include <X11/Xfuncproto.h>'
31700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#include <GL/gl.h>'
31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.emit_get:
31980a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick			print '#include "indirect_size_get.h"'
3203a6d968f37683835bd92b1b853e0ac8cadd0fdefKristian Høgsberg			print '#include "glxserver.h"'
3213a6d968f37683835bd92b1b853e0ac8cadd0fdefKristian Høgsberg			print '#include "indirect_util.h"'
32200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
32380a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick		print '#include "indirect_size.h"'
32480a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick
32500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
326c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printPure()
32700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
328c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
32900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
33000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
331903986ca128d51ff031cc9eafa1976618834a8deBrian Paul		print '#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(GLX_USE_APPLEGL)'
332f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane		print '#  undef HAVE_ALIAS'
333f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane		print '#endif'
33400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#ifdef HAVE_ALIAS'
33500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#  define ALIAS2(from,to) \\'
3360c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '    _X_INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
33700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '        __attribute__ ((alias( # to )));'
33800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#  define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )'
33900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#else'
34000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#  define ALIAS(from,to) \\'
3410c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '    _X_INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
34200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '    { return __gl ## to ## _size( e ); }'
34300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print '#endif'
34400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
34500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
34600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
3475aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		enum_sigs = {}
35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		aliases = []
35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			ef = glx_enum_function( func.name, api.enums_by_name )
35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(ef.enums) == 0:
35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				continue
35600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if (ef.is_set() and self.emit_set) or (not ef.is_set() and self.emit_get):
35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				sig = ef.signature()
35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if enum_sigs.has_key( sig ):
36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					aliases.append( [func.name, enum_sigs[ sig ]] )
36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					enum_sigs[ sig ] = func.name
36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					ef.Print( func.name )
3645aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
36500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
36666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for [alias_name, real_name] in aliases:
36766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'ALIAS( %s, %s )' % (alias_name, real_name)
36800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
36900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
37000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
3715aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanickclass PrintGlxSizeStubs_h(PrintGlxSizeStubs_common):
37200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	def printRealHeader(self):
37316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
37400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * \\file
37500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * Prototypes for functions used to determine the number of data elements in
37600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * various GLX protocol messages.
37700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick *
37800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * \\author Ian Romanick <idr@us.ibm.com>
37900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick */
38000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick"""
3810c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '#include <X11/Xfuncproto.h>'
3820c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print ''
383c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printPure();
38400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
385c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall();
38600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		print ''
38700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
38800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
38966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			ef = glx_enum_function( func.name, api.enums_by_name )
39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(ef.enums) == 0:
39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				continue
39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if (ef.is_set() and self.emit_set) or (not ef.is_set() and self.emit_get):
3960c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick				print 'extern _X_INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (func.name)
39700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
39800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
39966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxReqSize_common(gl_XML.gl_print_base):
40000e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick	"""Common base class for PrintGlxSizeReq_h and PrintGlxSizeReq_h.
40100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick
40200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick	The main purpose of this common base class is to provide the infrastructure
40300e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick	for the derrived classes to iterate over the same set of functions.
40400e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick	"""
40500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick
406ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def __init__(self):
40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
409ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.name = "glX_proto_size.py (from Mesa)"
410ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2005", "IBM")
41100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick
41200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick
41300e760c971ccd6ffab7895a157b5256d54aba24eIan Romanickclass PrintGlxReqSize_h(PrintGlxReqSize_common):
41400e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick	def __init__(self):
41500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick		PrintGlxReqSize_common.__init__(self)
416ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.header_tag = "_INDIRECT_REQSIZE_H_"
417ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
418ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
419ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def printRealHeader(self):
4200c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print '#include <X11/Xfuncproto.h>'
421ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
422c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printPure()
423ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
424ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
425ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
42666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
42866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not func.ignore and func.has_variable_size_request():
4290c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick				print 'extern PURE _X_HIDDEN int __glX%sReqSize(const GLbyte *pc, Bool swap);' % (func.name)
430ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
431ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
43200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanickclass PrintGlxReqSize_c(PrintGlxReqSize_common):
4339a3a1497e5d709015486d0c7801688812ca446daIan Romanick	"""Create the server-side 'request size' functions.
4349a3a1497e5d709015486d0c7801688812ca446daIan Romanick
4359a3a1497e5d709015486d0c7801688812ca446daIan Romanick	Create the server-side functions that are used to determine what the
4369a3a1497e5d709015486d0c7801688812ca446daIan Romanick	size of a varible length command should be.  The server then uses
4379a3a1497e5d709015486d0c7801688812ca446daIan Romanick	this value to determine if the incoming command packed it malformed.
4389a3a1497e5d709015486d0c7801688812ca446daIan Romanick	"""
4399a3a1497e5d709015486d0c7801688812ca446daIan Romanick
440ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def __init__(self):
44100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick		PrintGlxReqSize_common.__init__(self)
442ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.counter_sigs = {}
443ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
444ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
445ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def printRealHeader(self):
446ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
447ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#include <GL/gl.h>'
448ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#include "glxserver.h"'
4495ca107a4f215b84176123fd7a2d5fe14508a9f62Ian Romanick		print '#include "glxbyteorder.h"'
450ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#include "indirect_size.h"'
451ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#include "indirect_reqsize.h"'
4529a3a1497e5d709015486d0c7801688812ca446daIan Romanick		print ''
453ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#define __GLX_PAD(x)  (((x) + 3) & ~3)'
454ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
455f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane		print '#if defined(__CYGWIN__) || defined(__MINGW32__)'
456f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane		print '#  undef HAVE_ALIAS'
457f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane		print '#endif'
458ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#ifdef HAVE_ALIAS'
459ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#  define ALIAS2(from,to) \\'
460ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\'
461ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '        __attribute__ ((alias( # to )));'
462ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#  define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )'
463ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#else'
464ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#  define ALIAS(from,to) \\'
465ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\'
466ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    { return __glX ## to ## ReqSize( pc, swap ); }'
467ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '#endif'
468ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
469ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
470ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
471ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		aliases = []
47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		enum_functions = {}
47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		enum_sigs = {}
476ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not func.has_variable_size_request(): continue
479ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			ef = glx_server_enum_function( func, api.enums_by_name )
48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(ef.enums) == 0: continue
48200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick
48366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			sig = ef.signature()
484ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not enum_functions.has_key(func.name):
48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				enum_functions[ func.name ] = sig
487ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not enum_sigs.has_key( sig ):
48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				enum_sigs[ sig ] = ef
49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
49166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Even though server-handcode fuctions are on "the
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# list", and prototypes are generated for them, there
49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# isn't enough information to generate a size
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# function.  If there was enough information, they
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# probably wouldn't need to be handcoded in the first
49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# place!
50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
50166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.server_handcode: continue
50266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not func.has_variable_size_request(): continue
50366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
50466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if enum_functions.has_key(func.name):
50566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				sig = enum_functions[func.name]
50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				ef = enum_sigs[ sig ]
50766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
50866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if ef.name != func.name:
50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					aliases.append( [func.name, ef.name] )
51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					ef.Print( func.name, self )
51266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			elif func.images:
51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			elif func.has_variable_size_request():
51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				a = self.printCountedFunction(func)
51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if a: aliases.append(a)
51866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
51966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
52066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for [alias_name, real_name] in aliases:
52166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'ALIAS( %s, %s )' % (alias_name, real_name)
52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
524ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
525ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
526ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def common_emit_fixups(self, fixup):
527ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		"""Utility function to emit conditional byte-swaps."""
528ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
529ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		if fixup:
530ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    if (swap) {'
531ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			for name in fixup:
5325ca107a4f215b84176123fd7a2d5fe14508a9f62Ian Romanick				print '        %s = bswap_32(%s);' % (name, name)
533ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    }'
534ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
535ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		return
536ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
537ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
538990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_one_arg(self, p, pc, adjust):
53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		offset = p.offset
54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		dst = p.string()
54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		src = '(%s *)' % (p.type_string())
542990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '%-18s = *%11s(%s + %u);' % (dst, src, pc, offset + adjust);
543ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		return
544ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
545ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
546ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def common_func_print_just_header(self, f):
547ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print 'int'
548ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '__glX%sReqSize( const GLbyte * pc, Bool swap )' % (f.name)
549ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '{'
550ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
551ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
552ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def printPixelFunction(self, f):
553ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.common_func_print_just_header(f)
554ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		f.offset_of( f.parameters[0].name )
5569a3a1497e5d709015486d0c7801688812ca446daIan Romanick		[dim, w, h, d, junk] = f.get_images()[0].get_dimensions()
557ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
558ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '    GLint row_length   = *  (GLint *)(pc +  4);'
559ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
560ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		if dim < 3:
561ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			fixup = ['row_length', 'skip_rows', 'alignment']
562ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint image_height = 0;'
563ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint skip_images  = 0;'
564ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint skip_rows    = *  (GLint *)(pc +  8);'
565ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint alignment    = *  (GLint *)(pc + 16);'
566ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		else:
567ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			fixup = ['row_length', 'image_height', 'skip_rows', 'skip_images', 'alignment']
568ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint image_height = *  (GLint *)(pc +  8);'
569ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint skip_rows    = *  (GLint *)(pc + 16);'
570ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint skip_images  = *  (GLint *)(pc + 20);'
571ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    GLint alignment    = *  (GLint *)(pc + 32);'
572ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		img = f.images[0]
57466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend():
57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.name in [w, h, d, img.img_format, img.img_type, img.img_target]:
576990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, "pc", 0)
577ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick				fixup.append( p.name )
578ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
579ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
580ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
581ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		self.common_emit_fixups(fixup)
582ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
5831709ab01ef24279c782e420568e9257b4b92b224Neil Roberts		if img.img_null_flag:
5841709ab01ef24279c782e420568e9257b4b92b224Neil Roberts			print ''
5851709ab01ef24279c782e420568e9257b4b92b224Neil Roberts			print '	   if (*(CARD32 *) (pc + %s))' % (img.offset - 4)
5861709ab01ef24279c782e420568e9257b4b92b224Neil Roberts			print '	       return 0;'
5871709ab01ef24279c782e420568e9257b4b92b224Neil Roberts
588ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
58966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return __glXImageSize(%s, %s, %s, %s, %s, %s,' % (img.img_format, img.img_type, img.img_target, w, h, d )
590ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '                          image_height, row_length, skip_images,'
591ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '                          skip_rows, alignment);'
592ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print '}'
593ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		print ''
594ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		return
595ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
596ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
597ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	def printCountedFunction(self, f):
598ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
599ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		sig = ""
600ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		offset = 0
601ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		fixup = []
602ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		params = []
603ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		plus = ''
604ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		size = ''
605ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		param_offsets = {}
606ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
607ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# Calculate the offset of each counter parameter and the
608ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# size string for the variable length parameter(s).  While
609ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# that is being done, calculate a unique signature for this
610ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# function.
611ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend():
613ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			if p.is_counter:
614ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick				fixup.append( p.name )
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				params.append( p )
616ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			elif p.counter:
61766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				s = p.size()
618ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick				if s == 0: s = 1
619ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				sig += "(%u,%u)" % (f.offset_of(p.counter), s)
621ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick				size += '%s%s' % (plus, p.size_string())
622ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick				plus = ' + '
623ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
624ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
62500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick		# If the calculated signature matches a function that has
626ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# already be emitted, don't emit this function.  Instead, add
627ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		# it to the list of function aliases.
628ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
629ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		if self.counter_sigs.has_key(sig):
630ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			n = self.counter_sigs[sig];
63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			alias = [f.name, n]
632ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick		else:
63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			alias = None
634ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			self.counter_sigs[sig] = f.name
635ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
636ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			self.common_func_print_just_header(f)
637ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
63866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in params:
639990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, "pc", 0)
640ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
641ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
642ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print ''
643ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			self.common_emit_fixups(fixup)
644ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print ''
645ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
646ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '    return __GLX_PAD(%s);' % (size)
647ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print '}'
648ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick			print ''
649ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return alias
651ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
652ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick
65300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickdef show_usage():
6545aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print "Usage: %s [-f input_file_name] -m output_mode [--only-get | --only-set] [--get-alias-set]" % sys.argv[0]
6555aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print "    -m output_mode   Output mode can be one of 'size_c' or 'size_h'."
6565aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print "    --only-get       Only emit 'get'-type functions."
6575aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print "    --only-set       Only emit 'set'-type functions."
6585aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print ""
6595aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	print "By default, both 'get' and 'set'-type functions are emitted."
66000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	sys.exit(1)
66100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
66200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
66300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickif __name__ == '__main__':
66400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	file_name = "gl_API.xml"
66500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
66600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	try:
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:h:", ["only-get", "only-set", "header-tag"])
66800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	except Exception,e:
66900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		show_usage()
67000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
6715aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	mode = None
67216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick	header_tag = None
6735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick	which_functions = PrintGlxSizeStubs_common.do_get | PrintGlxSizeStubs_common.do_set
6745aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick
67500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	for (arg,val) in args:
67600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		if arg == "-f":
67700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick			file_name = val
67800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		elif arg == "-m":
67900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick			mode = val
6805aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick		elif arg == "--only-get":
6815aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick			which_functions = PrintGlxSizeStubs_common.do_get
6825aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick		elif arg == "--only-set":
6835aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick			which_functions = PrintGlxSizeStubs_common.do_set
68416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		elif (arg == '-h') or (arg == "--header-tag"):
68516c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick			header_tag = val
68600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
68700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	if mode == "size_c":
68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxSizeStubs_c( which_functions )
68900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	elif mode == "size_h":
69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxSizeStubs_h( which_functions )
69116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		if header_tag:
69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			printer.header_tag = header_tag
693ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	elif mode == "reqsize_c":
69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxReqSize_c()
695ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick	elif mode == "reqsize_h":
69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxReqSize_h()
69700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick	else:
69800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick		show_usage()
69900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
70266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
704