glX_proto_send.py revision 3f35fbbf668dab4c1a572f77a0912f4b7c8d857c
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
1043fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		self.count_parameter_list = func.count_parameter_list
1055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.counter = func.counter
106d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick		self.img_reset = None
1075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
109e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
11074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto):
111e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
11274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
113e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
1145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
115e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
1171fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		self.debug = 0
118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
123e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
128e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
129e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
130c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
131c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
133990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
134990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
135990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
136990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
152a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
153a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
154a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
155a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
156a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
157a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
158a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
159a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
160a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
161a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
162a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
163a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
164a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1701fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
1711fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
172d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
173d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
174d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
175d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
176d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
177d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
178d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
179d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
180d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
181d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
182d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
183d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
184d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
185d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
186d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
187d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
188d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
189d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
190d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
191d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
192d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
193d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
194d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
195d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
196d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
197d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
198d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
199d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
200d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
201d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
202d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
203d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
204d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
205d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
206d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
207d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
208d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
209d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
210d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
211d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
212e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2141fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2151fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen )
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
224e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
225e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
226e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2291fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
2515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
2525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
2535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
2545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
2555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
2565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
2643fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if f.client_handcode: return
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_rop != 0 or f.vectorequiv != None:
2675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.image:
2685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printPixelFunction(f)
2695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printRenderFunction(f)
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif f.glx_sop != 0 or f.glx_vendorpriv != 0:
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printSingleFunction(f)
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "/* Missing GLX protocol for %s. */" % (f.name)
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
2773385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
287990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2893385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_one_arg(self, p, offset, pc, indent, adjust):
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		t = p.p_type
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
297e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
298e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
299e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
300e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			% (indent, pc, offset + adjust, src_ptr, p.size_string() )
301e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
302e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
303e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		offset = 0
304e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
305e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if skip_vla:
3061d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 1
307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
3081d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 2
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3101d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		for p in f.parameterIterator(1, r):
311d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
312d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				self.common_emit_one_arg(p, offset, pc, indent, adjust)
313d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				offset += p.size()
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return offset
316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def pixel_emit_args(self, f, pc, indent, adjust, dim, large):
3195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
3205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
3215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
3225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
3235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
3245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = 0
3265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in f.parameterIterator(1, 1):
3275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
3285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += p.size()
3295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.pad_after(p):
3315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
3325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset += 4
3335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_null_flag:
3355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if large:
3365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
3375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
3385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name)
3395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += 4
3415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return offset
3435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
3465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
3475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
3485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
3503276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
3513276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
3523276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
3533276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
3543276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
3553276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
3563276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
357e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_just_header(self, f):
358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define %s %d' % (f.opcode_name(), f.opcode_value())
359e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s' % (f.fn_return_type)
361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string())
362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '{'
363e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
364e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
367990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
368990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
369990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
370990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
371990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
372990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
373990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
374990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
375d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image and f.image.is_output:
376d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				print '    const __GLXattribute * const state = gc->client_state_private;'
377d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
378990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
379990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
380990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
381990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
382990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
383990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
384990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
385990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_return_type != 'void':
387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type)
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3893fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if not f.output_parameter():
3903fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			compsize = self.size_call( f )
3913fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			if compsize:
3923fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick				print '    const GLuint compsize = %s;' % (compsize)
393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    const GLuint cmdlen = %s;' % (f.command_length())
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
396990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.counter:
397990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			if skip_condition:
398990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition)
399990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			else:
400990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "%s >= 0" % (f.counter)
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
403990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
404990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
405990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
406990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
407990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_header(self, f):
4115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.common_func_print_just_header(f)
4125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return self.common_func_print_just_start(f)
4135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
4201fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
4211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_parameters != []:
423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
4281fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
4301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
431e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
432e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
433d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick		if f.image and f.image.is_output:
434d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			o = f.command_fixed_length() - 4
435d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			print '        *(int32_t *)(pc + %u) = 0;' % (o)
436d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP":
437d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
438d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
439d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
440d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
441d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
442e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
443e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
444d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image and f.image.is_output:
445d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				[dim, w, h, d, junk] = f.dimensions()
446d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.dimensions_in_reply:
4471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick					print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, f.image.img_format, f.image.img_type, f.image.name)
448d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
4491fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick					print "        __glXReadPixelReply(dpy, gc, %u, %s, %s, %s, %s, %s, %s, GL_FALSE);" % (dim, w, h, d, f.image.img_format, f.image.img_type, f.image.name)
450e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
451d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.output != None:
4523f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					if f.output.p_type.size == 0:
4533f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick						output_size = 1
4543f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
4553f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick						output_size = f.output.p_type.size
4563f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
457d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_str = f.output.name
458d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
459d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_size = 0
460d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_str = "NULL"
461e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
462d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.fn_return_type != 'void':
463d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					return_str = " retval = (%s)" % (f.fn_return_type)
464d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
465d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					return_str = " (void)"
466e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
467d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.reply_always_array:
468d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					aa = "GL_TRUE"
469d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
470d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					aa = "GL_FALSE"
471d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
4721fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick				print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
4751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
4761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
4771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
4781fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
4791fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
4801fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
4811fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
482e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
483990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
484e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    }'
485e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    %s' % f.return_string()
486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
487e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
488e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
489e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
490e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def printPixelFunction(self, f):
4925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""This function could use some major refactoring. :("""
4935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# There is a code-space optimization that we can do here.
4955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# Functions that are marked img_pad_dimensions have a version
4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# with an odd number of dimensions and an even number of
4975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# dimensions.  TexSubImage1D and TexSubImage2D are examples.
4985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# We can emit a single function that does both, and have the
4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# real functions call the utility function with the correct
5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
5015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		#
5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The only quirk to this is that utility funcitons will be
5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generated for 3D and 4D functions, but 4D (e.g.,
5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# GL_SGIS_texture4D) isn't typically supported.  This is
5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# probably not an issue.  However, it would be possible to
5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# look at the total set of functions and determine if there
5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# is another function that would actually use the utility
5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# function.  If not, then fallback to the normal way of
5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generating code.
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_pad_dimensions:
5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Determine the hash key and the name for the utility
5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function that is used to implement the real
5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function.
5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[h, n] = hash_pixel_function(f)
5175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# If the utility function is not yet known, generate
5205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# it.
5215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if not self.pixel_stubs.has_key(h):
5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.pixel_stubs[h] = n
5245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixel_func = glXPixelFunctionUtility(f, n)
5255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print 'static void'
5275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string())
5285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '{'
5295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if self.common_func_print_just_start(pixel_func):
5315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = "    "
5325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = "    }"
5335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
5345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = ""
5355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = None
5365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.can_be_large:
5395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
5415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
5425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        }' % (indent)
5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent += "    "
5445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				[dim, width, height, depth, extent] = pixel_func.dimensions()
5460246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				adjust = pixel_func.offset_of_first_parameter() + 4
5475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    emit_header(gc->pc, opcode, cmdlen);' % (indent)
5495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
5515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5520246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				s = pixel_func.command_fixed_length()
5535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixHeaderPtr = "gc->pc + 4"
5555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pcPtr = "gc->pc + %u" % (s + 4)
5565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.image.img_send_null:
5585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = '(compsize > 0) && (%s != NULL)' % (pixel_func.image.name)
5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = 'compsize > 0'
5615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (%s) {' % (indent, condition)
5635f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    else {' % (indent)
5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
5685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    gc->pc += cmdlen;' % (indent)
5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.can_be_large:
5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					adjust += 4
5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%selse {' % (indent)
5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					self.large_emit_begin(indent, pixel_func, "opcode")
5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					offset = self.pixel_emit_args(pixel_func, "pc", indent, adjust, dim, 1)
5805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pixHeaderPtr = "pc + 8"
5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pcPtr = "pc + %u" % (s + 8)
5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5845f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if trailer: print trailer
5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '}'
5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print ''
5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Generate the real function as a call to the
5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# utility function.
5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_func_print_just_header(f)
5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[dim, junk, junk, junk, junk] = f.dimensions()
6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			for p in gl_XML.glFunction.parameterIterator(f):
6035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				p_string += ", " + p.name
6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.pad_after(p):
6065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
6075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '    %s(%s, %u%s );' % (n, f.opcode_name(), dim, p_string)
6095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '}'
6105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print ''
6115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
6125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.common_func_print_header(f):
6155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
6165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
6175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
6185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
6195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
6205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
6235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
6245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
6255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
6265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
6275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
6285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		[dim, width, height, depth, extent] = f.dimensions()
6300246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		adjust = f.offset_of_first_parameter() + 4
6315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
6335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
6355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6360246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		s = f.command_fixed_length()
6375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pixHeaderPtr = "gc->pc + 4"
6395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pcPtr = "gc->pc + %u" % (s + 4)
6405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_send_null:
6425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = '(compsize > 0) && (%s != NULL)' % (f.image.name)
6435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
6445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = 'compsize > 0'
6455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (%s) {' % (indent, condition)
6475f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
6485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
6495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    else {' % (indent)
6505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
6515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
6525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
6545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
6555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
6575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			adjust += 4
6585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
6605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
6615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.large_emit_begin(indent, f)
6635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1)
6645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pixHeaderPtr = "pc + 8"
6665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pcPtr = "pc + %u" % (s + 8)
6675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6685f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
6695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
6715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
6735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '}'
6745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print ''
6755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
6765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
67947719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
68047719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
68147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
68247719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
68347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
6841d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
68547719fda0c2fba13c81e84e33523d5489263182eIan Romanick
686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.fn_parameters[0]
688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if p.is_pointer:
6890246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					self.common_func_print_just_header(f)
692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
693e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '}'
694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print ''
695e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
697990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if self.common_func_print_header(f):
698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
699990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
702990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
703990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
7041fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7051fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
7061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
707990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
708990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
709990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
710990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
711990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
712990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
714e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
717e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
718990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
719e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
721990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
722990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
7233276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
7243276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
725990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			offset = self.common_emit_args(f, "pc", indent, 8, 1)
7261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
728990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string())
729990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
730e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7311fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7321fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    __indirect_glFinish();' % (indent)
7331fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
7341fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
735990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
736e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
737e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
739e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
740e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
74174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto):
742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
74374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
745e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
747e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
748e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
755e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
773e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
793e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.category != self.last_category:
805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.last_category = f.category
806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    /* %s */' % (self.last_category)
808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    glAPI->%s = __indirect_gl%s;' % (f.name, f.name)
811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
81374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto):
814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
81574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
82016c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
82316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
831c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
8321fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
8331fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
8341fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8351fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
8361fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
8371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
8391fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
8401fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8411fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
8421fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
8431fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
8441fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
8451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
8471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
8481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8491fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
8501fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
8511fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
85216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string())
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
8591fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
8601fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
8611fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
8691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
8801fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
8811fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoStubs()
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_c()
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_h()
889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser = make_parser()
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setFeature(feature_namespaces, 0)
894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setContentHandler(dh)
895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	f = open(file_name)
897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8981fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	dh.debug = debug
899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printHeader()
900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.parse(f)
901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printFooter()
902