glX_proto_send.py revision 0246b2a5c0f45788a5c418d62ccf5a3a72d16d4a
1e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#!/usr/bin/python2
2e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
35f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick# (C) Copyright IBM Corporation 2004, 2005
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
3374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickimport glX_XML
34e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport license
355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickimport sys, getopt, copy
365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func):
385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Generate a 'unique' key for a pixel function.  The key is based on
395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	the parameters written in the command packet.  This includes any
405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	padding that might be added for the original function and the 'NULL
415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	image' flag."""
425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	[dim, junk, junk, junk, junk] = func.dimensions()
445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	d = (dim + 1) & ~1
465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	h = "%uD%uD_" % (d - 1, d)
475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	for p in func.parameterIterator(1, 1):
495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h = "%s%u" % (h, p.size())
505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.pad_after(p):
525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			h += "4"
535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	if func.image.img_null_flag:
555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h += "_NF"
565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = func.name.replace("%uD" % (dim), "")
585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = "__glx_%s_%uD%uD" % (n, d - 1, d)
595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	return [h, n]
605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickclass glXPixelFunctionUtility(glX_XML.glXFunction):
635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Dummy class used to generate pixel "utility" functions that are
645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	shared by multiple dimension image functions.  For example, these
655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	objects are used to generate shared functions used to send GLX
665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	protocol for TexImage1D and TexImage2D, TexSubImage1D and
675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	TexSubImage2D, etc."""
685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def __init__(self, func, name):
705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The parameters to the utility function are the same as the
715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters to the real function except for the added "pad"
725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.name = name
755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.image = copy.copy(func.image)
765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.fn_parameters = []
775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in gl_XML.glFunction.parameterIterator(func):
785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.fn_parameters.append(p)
795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pad_name = func.pad_after(p)
815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if pad_name:
825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad = copy.copy(p)
835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad.name = pad_name
845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.fn_parameters.append(pad)
855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.height == None:
885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.height = "height"
895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.img_yoff == None:
915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.img_yoff = "yoffset"
925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.image.depth:
945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.extent == None:
955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.extent = "extent"
965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.img_woff == None:
985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.img_woff = "woffset"
995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.set_return_type( func.fn_return_type )
1025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.glx_rop = ~0
1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.can_be_large = func.can_be_large
1045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.count_parameters = func.count_parameters
1055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.counter = func.counter
1065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
107e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto):
110e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
11174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
112e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
1135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
114e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
116e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
125e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
12874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall()
12974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printNoinline()
130e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
131990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
132990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
133990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
134990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
136e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static NOINLINE CARD32
144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickread_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
15083fcf49647f423741a0a2143e03dbaa2d43d31a1Ian Romanick	if ((reply.length > 0) || reply_is_always_array) {
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    const GLint bytes = (reply_is_always_array)
152e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	      ? (4 * reply.length) : (reply.size * size);
153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    const GLint extra = 4 - (bytes & 3);
154e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
155e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    _XRead(dpy, dest, bytes);
15683fcf49647f423741a0a2143e03dbaa2d43d31a1Ian Romanick	    if ( extra < 4 ) {
157e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		_XEatData(dpy, extra);
158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    }
159e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	}
160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else {
161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    (void) memcpy( dest, &(reply.pad3), size);
162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	}
163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
170990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte *
171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen )
172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte *
186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
2075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
2085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
2095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
2105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
2115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
2125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.handcode or f.ignore: return
221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_rop != 0 or f.vectorequiv != None:
2235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.image:
2245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printPixelFunction(f)
2255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printRenderFunction(f)
227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif f.glx_sop != 0 or f.glx_vendorpriv != 0:
228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printSingleFunction(f)
229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "/* Missing GLX protocol for %s. */" % (f.name)
231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
2333385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
243990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
244e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2453385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
247e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
248e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_one_arg(self, p, offset, pc, indent, adjust):
249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		t = p.p_type
250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			% (indent, pc, offset + adjust, src_ptr, p.size_string() )
257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		offset = 0
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if skip_vla:
2621d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 1
263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
2641d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 2
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2661d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		for p in f.parameterIterator(1, r):
2671d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
2681d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			offset += p.size()
269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return offset
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def pixel_emit_args(self, f, pc, indent, adjust, dim, large):
2745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
2755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
2765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
2775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
2785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
2795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = 0
2815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in f.parameterIterator(1, 1):
2825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
2835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += p.size()
2845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.pad_after(p):
2865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
2875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset += 4
2885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_null_flag:
2905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if large:
2915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
2925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name)
2945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += 4
2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return offset
2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
3053276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
3063276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
3073276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
3083276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
3093276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
3103276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
3113276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_just_header(self, f):
313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define %s %d' % (f.opcode_name(), f.opcode_value())
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s' % (f.fn_return_type)
316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string())
317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '{'
318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
321e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
322990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
323990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
324990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
325990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
326990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
327990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
328990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
329990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
330990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
331990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
332990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
333990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
334990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
335990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
336990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
337990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
338e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_return_type != 'void':
339e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type)
340e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
341e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.count_parameters != None:
342e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    const GLuint compsize = __gl%s_size(%s);' % (f.name, f.count_parameters)
3435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		elif f.image:
3445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[dim, w, h, d, junk] = f.dimensions()
3455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			compsize = '__glImageSize(%s, %s, %s, %s, %s, %s)' % (w, h, d, f.image.img_format, f.image.img_type, f.image.img_target)
3475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if not f.image.img_send_null:
3485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				compsize = '(%s != NULL) ? %s : 0' % (f.image.name, compsize)
3495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '    const GLuint compsize = %s;' % (compsize)
3515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
352e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
353e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    const GLuint cmdlen = %s;' % (f.command_length())
354e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
355990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.counter:
356990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			if skip_condition:
357990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition)
358990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			else:
359990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "%s >= 0" % (f.counter)
360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
362990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
363990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
364990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
365990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
366990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
368e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_header(self, f):
3705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.common_func_print_just_header(f)
3715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return self.common_func_print_just_start(f)
3725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
378e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_parameters != []:
379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
380e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
381e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
384e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.output != None:
392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = f.output.p_type.size
393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = f.output.name
394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = 0
396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = "NULL"
397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.fn_return_type != 'void':
399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " retval = (%s)" % (f.fn_return_type)
400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " (void)"
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.reply_always_array:
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_TRUE"
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_FALSE"
407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
408990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print "       %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
410990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    }'
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    %s' % f.return_string()
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def printPixelFunction(self, f):
4195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""This function could use some major refactoring. :("""
4205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# There is a code-space optimization that we can do here.
4225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# Functions that are marked img_pad_dimensions have a version
4235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# with an odd number of dimensions and an even number of
4245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# dimensions.  TexSubImage1D and TexSubImage2D are examples.
4255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# We can emit a single function that does both, and have the
4265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# real functions call the utility function with the correct
4275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
4285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		#
4295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The only quirk to this is that utility funcitons will be
4305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generated for 3D and 4D functions, but 4D (e.g.,
4315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# GL_SGIS_texture4D) isn't typically supported.  This is
4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# probably not an issue.  However, it would be possible to
4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# look at the total set of functions and determine if there
4345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# is another function that would actually use the utility
4355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# function.  If not, then fallback to the normal way of
4365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generating code.
4375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_pad_dimensions:
4395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Determine the hash key and the name for the utility
4405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function that is used to implement the real
4415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function.
4425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[h, n] = hash_pixel_function(f)
4445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# If the utility function is not yet known, generate
4475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# it.
4485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if not self.pixel_stubs.has_key(h):
4505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.pixel_stubs[h] = n
4515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixel_func = glXPixelFunctionUtility(f, n)
4525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print 'static void'
4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string())
4555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '{'
4565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if self.common_func_print_just_start(pixel_func):
4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = "    "
4595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = "    }"
4605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
4615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = ""
4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = None
4635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.can_be_large:
4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
4685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
4695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        }' % (indent)
4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent += "    "
4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				[dim, width, height, depth, extent] = pixel_func.dimensions()
4730246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				adjust = pixel_func.offset_of_first_parameter() + 4
4745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    emit_header(gc->pc, opcode, cmdlen);' % (indent)
4765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
4785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4790246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				s = pixel_func.command_fixed_length()
4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixHeaderPtr = "gc->pc + 4"
4825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pcPtr = "gc->pc + %u" % (s + 4)
4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.image.img_send_null:
4855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = '(compsize > 0) && (%s != NULL)' % (pixel_func.image.name)
4865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
4875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = 'compsize > 0'
4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (%s) {' % (indent, condition)
4905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (*gc->fillImage)(gc, dim, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, width, height, depth, pixel_func.image.img_format, pixel_func.image.img_type, pixel_func.image.name, pcPtr, pixHeaderPtr)
4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
4925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    else {' % (indent)
4935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
4945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
4955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    gc->pc += cmdlen;' % (indent)
4975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
4985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.can_be_large:
5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					adjust += 4
5015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%selse {' % (indent)
5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					self.large_emit_begin(indent, pixel_func, "opcode")
5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					offset = self.pixel_emit_args(pixel_func, "pc", indent, adjust, dim, 1)
5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pixHeaderPtr = "pc + 8"
5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pcPtr = "pc + %u" % (s + 8)
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    __glXSendLargeImage(gc, compsize, dim, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if trailer: print trailer
5165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '}'
5175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print ''
5185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Generate the real function as a call to the
5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# utility function.
5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_func_print_just_header(f)
5255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[dim, junk, junk, junk, junk] = f.dimensions()
5275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
5295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			for p in gl_XML.glFunction.parameterIterator(f):
5305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				p_string += ", " + p.name
5315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.pad_after(p):
5335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
5345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '    %s(%s, %u%s );' % (n, f.opcode_name(), dim, p_string)
5365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '}'
5375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print ''
5385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
5395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.common_func_print_header(f):
5425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
5445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
5455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
5465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
5475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
5505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
5515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
5525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
5535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
5545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
5555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		[dim, width, height, depth, extent] = f.dimensions()
5570246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		adjust = f.offset_of_first_parameter() + 4
5585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5630246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		s = f.command_fixed_length()
5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pixHeaderPtr = "gc->pc + 4"
5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pcPtr = "gc->pc + %u" % (s + 4)
5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_send_null:
5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = '(compsize > 0) && (%s != NULL)' % (f.image.name)
5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = 'compsize > 0'
5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (%s) {' % (indent, condition)
5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (*gc->fillImage)(gc, %u, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    else {' % (indent)
5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
5845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			adjust += 4
5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.large_emit_begin(indent, f)
5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1)
5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pixHeaderPtr = "pc + 8"
5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pcPtr = "pc + %u" % (s + 8)
5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    __glXSendLargeImage(gc, compsize, %u, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '}'
6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print ''
6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
6035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
60647719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
60747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
60847719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
60947719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
61047719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
6111d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
61247719fda0c2fba13c81e84e33523d5489263182eIan Romanick
613e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
614e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.fn_parameters[0]
615e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if p.is_pointer:
6160246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
617e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
618e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					self.common_func_print_just_header(f)
619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
620e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '}'
621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print ''
622e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
623e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
624990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if self.common_func_print_header(f):
625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
626990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
627e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
628e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
629990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
630990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
631990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
632990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
633990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
634990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
635990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
636990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
637e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
639e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
640e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
641e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
642990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
643e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
644e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
645990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
646990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
6473276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
6483276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
649990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			offset = self.common_emit_args(f, "pc", indent, 8, 1)
650e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
651e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
652990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string())
653990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
655990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
656e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
657e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
658e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
660e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
66174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto):
662e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
66374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
664e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
665e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
666e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
667e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
668e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
669e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
670e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
671e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
672e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
673e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
674e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
675e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
676e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
677e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
680e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
681e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
684e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
685e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
689e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
693e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
695e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
697e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
699e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
703e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
704e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
705e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
706e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
707e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
709e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
714e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
717e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
718e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
719e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
721e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
722e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
724e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.ignore: return
725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
726e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.category != self.last_category:
727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.last_category = f.category
728e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
729e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    /* %s */' % (self.last_category)
730e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
732e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    glAPI->%s = __indirect_gl%s;' % (f.name, f.name)
733e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
734e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
73574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto):
736e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
73774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
739e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
740e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
741e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
743e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
745e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
747e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
748e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _INDIRECT_H_ )
755e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#  define _INDIRECT_H_
756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
75874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "HIDDEN", "hidden" )
759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef HIDDEN"
763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#endif /* !defined( _INDIRECT_H_ ) */"
764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.ignore: return
767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string())
768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
77074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs(glX_XML.GlxProto):
771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
77274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
773e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.aliases = []
775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.glx_enum_sigs = {}
776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect_size.h"'
781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
7837f958e9e11badab294339c8b83e7b2e58f7dfe21Ian Romanick		glX_XML.printHaveAlias()
7847f958e9e11badab294339c8b83e7b2e58f7dfe21Ian Romanick		print ''
78574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printPure()
786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
78774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall()
788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
78974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "INTERNAL", "internal" )
790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#ifdef HAVE_ALIAS'
793e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS2(from,to) \\'
794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '        __attribute__ ((alias( # to )));'
796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )'
797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#else'
798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS(from,to) \\'
799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    { return __gl ## to ## _size( e ); }'
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#endif'
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for a in self.aliases:
807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print a
808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if self.glx_enum_functions.has_key(f.name):
811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			ef = self.glx_enum_functions[f.name]
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			sig = ef.signature();
814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if self.glx_enum_sigs.has_key(sig):
815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				n = self.glx_enum_sigs[sig];
816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				a = 'ALIAS( %s, %s )' % (f.name, n)
817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				self.aliases.append(a)
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				ef.Print( f.name )
820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				self.glx_enum_sigs[sig] = f.name;
821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
82474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs_h(glX_XML.GlxProto):
825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
82674764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.aliases = []
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.glx_enum_sigs = {}
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for functions used to determine the number of data elements in
836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * various GLX protocol messages.
837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _GLXSIZE_H_ )
842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#  define _GLXSIZE_H_
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
84574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printPure();
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
84774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall();
848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
84974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "INTERNAL", "internal" );
850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef INTERNAL"
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef PURE"
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef FASTCALL"
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#endif /* !defined( _GLXSIZE_H_ ) */"
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if self.glx_enum_functions.has_key(f.name):
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			ef = self.glx_enum_functions[f.name]
863b53df18624a1b3870c1dcfe3981c07c089efe262Ian Romanick			print 'extern INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (f.name)
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoStubs()
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_c()
890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_h()
892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "size_c":
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxSizeStubs()
894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "size_h":
895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxSizeStubs_h()
896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser = make_parser()
900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setFeature(feature_namespaces, 0)
901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setContentHandler(dh)
902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	f = open(file_name)
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printHeader()
906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.parse(f)
907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printFooter()
908