166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick#!/usr/bin/env python
20f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
30f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# (C) Copyright IBM Corporation 2004, 2005
40f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# All Rights Reserved.
50f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick#
60f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# Permission is hereby granted, free of charge, to any person obtaining a
70f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# copy of this software and associated documentation files (the "Software"),
80f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# to deal in the Software without restriction, including without limitation
90f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub
100f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# license, and/or sell copies of the Software, and to permit persons to whom
110f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# the Software is furnished to do so, subject to the following conditions:
120f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick#
130f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# The above copyright notice and this permission notice (including the next
140f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# paragraph) shall be included in all copies or substantial portions of the
150f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# Software.
160f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick#
170f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
180f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
190f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
200f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
210f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
220f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
230f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# IN THE SOFTWARE.
240f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick#
250f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick# Authors:
260f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick#    Ian Romanick <idr@us.ibm.com>
270f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML, glX_proto_common, license
290f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanickimport sys, getopt
300f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
310f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
3266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_doc_item_factory(glX_proto_common.glx_proto_item_factory):
330f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	"""Factory to create GLX protocol documentation oriented objects derived from glItem."""
340f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
3566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def create_item(self, name, element, context):
3666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if name == "parameter":
3766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			return glx_doc_parameter(element, context)
380f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
3966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			return glX_proto_common.glx_proto_item_factory.create_item(self, name, element, context)
400f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
410f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
4266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_doc_parameter(gl_XML.gl_parameter):
4366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def packet_type(self, type_dict):
440f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		"""Get the type string for the packet header
450f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
460f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		GLX protocol documentation uses type names like CARD32,
470f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		FLOAT64, LISTofCARD8, and ENUM.  This function converts the
480f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		type of the parameter to one of these names."""
490f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
500f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		list_of = ""
510f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if self.is_array():
520f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			list_of = "LISTof"
530f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
5466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		t_name = self.get_base_type_string()
5566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if not type_dict.has_key( t_name ):
560f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			type_name = "CARD8"
570f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
5866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			type_name = type_dict[ t_name ]
590f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
600f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return "%s%s" % (list_of, type_name)
610f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
6266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
630f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def packet_size(self):
640f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		p = None
650f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		s = self.size()
660f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if s == 0:
670f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			a_prod = "n"
680f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			b_prod = self.p_type.size
690f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
703fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			if not self.count_parameter_list and self.counter:
710f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				a_prod = self.counter
723fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			elif self.count_parameter_list and not self.counter or self.is_output:
730f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				pass
743fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			elif self.count_parameter_list and self.counter:
750f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				b_prod = self.counter
760f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			else:
770f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				raise RuntimeError("Parameter '%s' to function '%s' has size 0." % (self.name, self.context.name))
780f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
790f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			ss = "%s*%s" % (a_prod, b_prod)
800f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
810f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			return [ss, p]
820f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
830f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			if s % 4 != 0:
840f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				p = "p"
850f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
860f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			return [str(s), p]
870f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
8866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoText(gl_XML.gl_print_base):
890f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def __init__(self):
9066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
910f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		self.license = ""
920f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
940f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def printHeader(self):
950f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return
960f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
980f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def body_size(self, f):
990f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		# At some point, refactor this function and
1000f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		# glXFunction::command_payload_length.
1010f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1020f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		size = 0;
1030f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		size_str = ""
1040f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		pad_str = ""
1050f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		plus = ""
10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend():
1070f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			[s, pad] = p.packet_size()
1080f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			try:
1090f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				size += int(s)
1100f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			except Exception,e:
1110f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				size_str += "%s%s" % (plus, s)
1120f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				plus = "+"
1130f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1140f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			if pad != None:
1150f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				pad_str = pad
1160f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1170f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return [size, size_str, pad_str]
1180f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
11966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1200f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def print_render_header(self, f):
1210f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		[size, size_str, pad_str] = self.body_size(f)
1220f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		size += 4;
1230f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1240f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if size_str == "":
1250f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u" % ((size + 3) & ~3)
1260f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		elif pad_str != "":
1270f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u+%s+%s" % (size, size_str, pad_str)
1280f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
1290f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u+%s" % (size, size_str)
1300f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1310f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            2        %-15s rendering command length' % (s)
1320f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            2        %-4u            rendering command opcode' % (f.glx_rop)
1330f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return
1340f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1350f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1360f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def print_single_header(self, f):
1370f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		[size, size_str, pad_str] = self.body_size(f)
1380f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		size = ((size + 3) / 4) + 2;
1390f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1400f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if f.glx_vendorpriv != 0:
1410f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			size += 1
1420f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1430f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            1        CARD8           opcode (X assigned)'
1440f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            1        %-4u            GLX opcode (%s)' % (f.opcode_real_value(), f.opcode_real_name())
1450f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1460f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if size_str == "":
1470f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u" % (size)
1480f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		elif pad_str != "":
1490f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u+((%s+%s)/4)" % (size, size_str, pad_str)
1500f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
1510f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			s = "%u+((%s)/4)" % (size, size_str)
1520f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1530f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            2        %-15s request length' % (s)
1540f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1550f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if f.glx_vendorpriv != 0:
1560f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4        %-4u            vendor specific opcode' % (f.opcode_value())
1570f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1580f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            4        GLX_CONTEXT_TAG context tag'
1590f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1600f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return
1610f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
16266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1630f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def print_reply(self, f):
1640f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '          =>'
1650f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            1        1               reply'
1660f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            1                        unused'
1670f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		print '            2        CARD16          sequence number'
1680f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1690f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if f.output == None:
1700f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4        0               reply length'
1710f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		elif f.reply_always_array:
1720f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4        m               reply length'
1730f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
1740f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4        m               reply length, m = (n == 1 ? 0 : n)'
1750f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
1760f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		output = None
17866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for x in f.parameterIterateOutputs():
17966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = x
18066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			break
18166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
18266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1830f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		unused = 24
18466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
18566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '            4        %-15s return value' % (f.return_type)
1860f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			unused -= 4
18766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif output != None:
1880f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4                        unused'
1890f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			unused -= 4
1900f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
19166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if output != None:
1920f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            4        CARD32          n'
1930f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			unused -= 4
1940f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
19566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if output != None:
1960f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			if not f.reply_always_array:
1970f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print ''
1980f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print '            if (n = 1) this follows:'
1990f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print ''
20066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '            4        CARD32          %s' % (output.name)
2010f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print '            %-2u                       unused' % (unused - 4)
2020f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print ''
2030f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print '            otherwise this follows:'
2040f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				print ''
2050f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2060f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            %-2u                       unused' % (unused)
20766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
20866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			[s, pad] = output.packet_size()
20966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '            %-8s %-15s %s' % (s, output.packet_type( self.type_map ), output.name)
2100f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			if pad != None:
2110f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				try:
2120f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					bytes = int(s)
2130f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					bytes = 4 - (bytes & 3)
2140f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					print '            %-8u %-15s unused' % (bytes, "")
2150f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				except Exception,e:
2160f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					print '            %-8s %-15s unused, %s=pad(%s)' % (pad, "", pad, s)
2170f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		else:
2180f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			print '            %-2u                       unused' % (unused)
2190f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2200f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2210f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	def print_body(self, f):
22266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend():
2230f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			[s, pad] = p.packet_size()
22466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '            %-8s %-15s %s' % (s, p.packet_type( self.type_map ), p.name)
2250f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			if pad != None:
2260f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				try:
2270f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					bytes = int(s)
2280f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					bytes = 4 - (bytes & 3)
2290f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					print '            %-8u %-15s unused' % (bytes, "")
2300f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick				except Exception,e:
2310f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick					print '            %-8s %-15s unused, %s=pad(%s)' % (pad, "", pad, s)
2320f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
23366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
23466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.type_map = {}
23566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for t in api.typeIterate():
23666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.type_map[ "GL" + t.name ] = t.glx_name
23766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
23866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
2390f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		# At some point this should be expanded to support pixel
2400f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		# functions, but I'm not going to lose any sleep over it now.
2410f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
24266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for f in api.functionIterateByOffset():
24366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.client_handcode or f.server_handcode or f.vectorequiv or len(f.get_images()):
24466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				continue
2450f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2460f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
24766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.glx_rop:
24866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        %s' % (f.name)
24966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.print_render_header(f)
25066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			elif f.glx_sop or f.glx_vendorpriv:
25166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        %s' % (f.name)
25266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.print_single_header(f)
25366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
25466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				continue
2550f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
25666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.print_body(f)
2570f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
25866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.needs_reply():
25966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.print_reply(f)
26066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
26166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print ''
2620f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		return
2630f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2640f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2650f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanickif __name__ == '__main__':
2660f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	file_name = "gl_API.xml"
2670f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2680f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	try:
2690f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:")
2700f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	except Exception,e:
2710f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		show_usage()
2720f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
2730f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick	for (arg,val) in args:
2740f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick		if arg == "-f":
2750f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick			file_name = val
2760f34f3efb894fb78c293e94cd51fe20a65cf9ae4Ian Romanick
27766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glx_doc_item_factory() )
27866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
27966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer = PrintGlxProtoText()
28066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
281