glX_proto_send.py revision 2eb147e7f5754a97cb1a5617db7d529754cfe002
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 Romanickimport gl_XML
2974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickimport glX_XML
30e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport license
315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickimport sys, getopt, copy
325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func):
345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Generate a 'unique' key for a pixel function.  The key is based on
355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	the parameters written in the command packet.  This includes any
365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	padding that might be added for the original function and the 'NULL
375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	image' flag."""
385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	[dim, junk, junk, junk, junk] = func.dimensions()
405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	d = (dim + 1) & ~1
425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	h = "%uD%uD_" % (d - 1, d)
435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	for p in func.parameterIterator(1, 1):
455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h = "%s%u" % (h, p.size())
465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.pad_after(p):
485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			h += "4"
495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	if func.image.img_null_flag:
515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h += "_NF"
525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = func.name.replace("%uD" % (dim), "")
545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = "__glx_%s_%uD%uD" % (n, d - 1, d)
555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	return [h, n]
565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickclass glXPixelFunctionUtility(glX_XML.glXFunction):
595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Dummy class used to generate pixel "utility" functions that are
605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	shared by multiple dimension image functions.  For example, these
615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	objects are used to generate shared functions used to send GLX
625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	protocol for TexImage1D and TexImage2D, TexSubImage1D and
635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	TexSubImage2D, etc."""
645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def __init__(self, func, name):
665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The parameters to the utility function are the same as the
675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters to the real function except for the added "pad"
685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.name = name
715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.image = copy.copy(func.image)
725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.fn_parameters = []
735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in gl_XML.glFunction.parameterIterator(func):
745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.fn_parameters.append(p)
755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pad_name = func.pad_after(p)
775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if pad_name:
785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad = copy.copy(p)
795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad.name = pad_name
805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.fn_parameters.append(pad)
815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.height == None:
845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.height = "height"
855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.img_yoff == None:
875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.img_yoff = "yoffset"
885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.image.depth:
905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.extent == None:
915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.extent = "extent"
925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.img_woff == None:
945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.img_woff = "woffset"
955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.set_return_type( func.fn_return_type )
985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.glx_rop = ~0
995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.can_be_large = func.can_be_large
1003fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		self.count_parameter_list = func.count_parameter_list
1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.counter = func.counter
102d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick		self.img_reset = None
1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
104e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
105e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10674764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto):
107e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
10874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
109e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
1105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
111e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
1131fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		self.debug = 0
114e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
115e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
116e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
1232eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#ifdef USE_XCB'
1242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/xcl.h>'
1252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/XCB/xcb.h>'
1262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/XCB/glx.h>'
1272eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#endif /* USE_XCB */'
1282eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
129e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
130e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
131e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
132c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
133c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
134e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
135990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
136990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
137990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
138990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
152e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
154a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
155a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
156a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
157a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
158a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
159a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
160a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
161a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
162a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
163a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
164a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
165a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
166a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1721fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
1731fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
174d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
175d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
176d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
177d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
178d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
179d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
180d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
181d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
182d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
183d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
184d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
185d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
186d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
187d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
188d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
189d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
190d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
191d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
192d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
193d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
194d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
195d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
196d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
197d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
198d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
199d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
200d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
201d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
202d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
203d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
204d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
205d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
206d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
207d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
208d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
209d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
210d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
211d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
212d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
213d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2161fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2171fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen )
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
224e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
225e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
226e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2311fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2321fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
244e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
2535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
2545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
2555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
2565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
2575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
2585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
2663fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if f.client_handcode: return
267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_rop != 0 or f.vectorequiv != None:
2695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.image:
2705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printPixelFunction(f)
2715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printRenderFunction(f)
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif f.glx_sop != 0 or f.glx_vendorpriv != 0:
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printSingleFunction(f)
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "/* Missing GLX protocol for %s. */" % (f.name)
277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
2793385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
289990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2913385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_one_arg(self, p, offset, pc, indent, adjust):
295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		t = p.p_type
296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
297e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
298e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
299e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
300e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
301e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
302e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			% (indent, pc, offset + adjust, src_ptr, p.size_string() )
303e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
304e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
305e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		offset = 0
306e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if skip_vla:
3081d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 1
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
3101d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 2
311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3121d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		for p in f.parameterIterator(1, r):
313d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
314d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				self.common_emit_one_arg(p, offset, pc, indent, adjust)
315d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				offset += p.size()
316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return offset
318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def pixel_emit_args(self, f, pc, indent, adjust, dim, large):
3215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
3225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
3235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
3245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
3255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
3265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = 0
3285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in f.parameterIterator(1, 1):
3295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
3305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += p.size()
3315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.pad_after(p):
3335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
3345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset += 4
3355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_null_flag:
3375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if large:
3385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
3395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
3405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name)
3415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += 4
3435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return offset
3455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
3485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
3495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
3505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
3523276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
3533276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
3543276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
3553276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
3563276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
3573276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
3583276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
359e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_just_header(self, f):
360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define %s %d' % (f.opcode_name(), f.opcode_value())
361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s' % (f.fn_return_type)
363e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string())
364e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '{'
365e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
368e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
369990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
370990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
371990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
372990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
373990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
374990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
375990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
376990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
377d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image and f.image.is_output:
378d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				print '    const __GLXattribute * const state = gc->client_state_private;'
379d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
380990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
381990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
382990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
383990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
384990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
385990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
386990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
387990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_return_type != 'void':
389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type)
390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3913fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if not f.output_parameter():
3923fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			compsize = self.size_call( f )
3933fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			if compsize:
3943fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick				print '    const GLuint compsize = %s;' % (compsize)
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    const GLuint cmdlen = %s;' % (f.command_length())
397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
398990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.counter:
399990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			if skip_condition:
400990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition)
401990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			else:
402990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "%s >= 0" % (f.counter)
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
405990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
406990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
407990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
408990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
409990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_header(self, f):
4135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.common_func_print_just_header(f)
4145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return self.common_func_print_just_start(f)
4155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
4202eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
4221fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
4232eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		if f.glx_vendorpriv == 0 and f.opcode_name()[-3:] != "ARB" and f.opcode_name()[-2:] != "NV":
4242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
4262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
4272eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
4282eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
4292eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        XCBConnection *c = XCBConnectionOfDisplay(dpy);'
4302eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
4312eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			xcb_name = 'XCBGlx%s' % (f.opcode_name().rsplit("_", 1)[1]);
4322eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
4332eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			for p in f.fn_parameters:
4342eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				if p.is_output == 0:
4352eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
4362eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4372eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.image and f.image.is_output:
4382eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP":
4392eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append("state->storePack.swapEndian")
4402eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				else:
4412eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append("0")
4422eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4432eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
4442eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				# also present in GetPolygonStipple, but taken care of above.
4452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				if xcb_name == "XCBGlxReadPixels": iparams.append("0")
4462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams))
4482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
4502eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        %sRep *reply = %sReply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
4512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				if f.output and f.reply_always_array:
4522eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
4532eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				elif f.output and not f.reply_always_array:
4542eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					if not f.image:
4552eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        if (%sDataLength(reply) == 0)' % (xcb_name)
4562eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '            %s = (%s *) &reply->datum;' % (f.output.name, f.output.p_type.name)
4572eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
4582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '            %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
4592eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					else:
4602eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
4612eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
4621fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
4632eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				if f.fn_return_type != 'void':
4642eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
4652eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
4662eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
4672eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
4682eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
4692eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
4702eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
471e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_parameters != []:
472e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
474e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
475e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
476e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
4771fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
478e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
4791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
480e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
482d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick		if f.image and f.image.is_output:
483d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			o = f.command_fixed_length() - 4
484d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			print '        *(int32_t *)(pc + %u) = 0;' % (o)
485d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP":
486d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
487d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
488d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
489d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
490d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
491e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
492e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
493d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if f.image and f.image.is_output:
494d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				[dim, w, h, d, junk] = f.dimensions()
495d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.dimensions_in_reply:
4961fd3bbc42e8ad267c552a3818f64b0850c188927Ian 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)
497d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
4981fd3bbc42e8ad267c552a3818f64b0850c188927Ian 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)
499e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
500d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.output != None:
5013f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					if f.output.p_type.size == 0:
5023f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick						output_size = 1
5033f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
5043f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick						output_size = f.output.p_type.size
5053f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
506d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_str = f.output.name
507d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
508d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_size = 0
509d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					output_str = "NULL"
510e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
511d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.fn_return_type != 'void':
512d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					return_str = " retval = (%s)" % (f.fn_return_type)
513d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
514d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					return_str = " (void)"
515e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
516d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.reply_always_array:
517d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					aa = "GL_TRUE"
518d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
519d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					aa = "GL_FALSE"
520d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
5211fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick				print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
522e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
5231fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
5241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
5251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
5261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
5271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
5282eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '        UnlockDisplay(dpy); SyncHandle();'
5292eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5302eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		if f.glx_vendorpriv == 0 and f.opcode_name()[-3:] != "ARB" and f.opcode_name()[-2:] != "NV":
5312eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#endif /* USE_XCB */'
5322eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5331fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5341fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    }'
536e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    %s' % f.return_string()
537e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
538e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
539e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
540e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
541e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
5425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def printPixelFunction(self, f):
5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""This function could use some major refactoring. :("""
5445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# There is a code-space optimization that we can do here.
5465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# Functions that are marked img_pad_dimensions have a version
5475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# with an odd number of dimensions and an even number of
5485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# dimensions.  TexSubImage1D and TexSubImage2D are examples.
5495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# We can emit a single function that does both, and have the
5505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# real functions call the utility function with the correct
5515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
5525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		#
5535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The only quirk to this is that utility funcitons will be
5545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generated for 3D and 4D functions, but 4D (e.g.,
5555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# GL_SGIS_texture4D) isn't typically supported.  This is
5565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# probably not an issue.  However, it would be possible to
5575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# look at the total set of functions and determine if there
5585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# is another function that would actually use the utility
5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# function.  If not, then fallback to the normal way of
5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generating code.
5615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_pad_dimensions:
5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Determine the hash key and the name for the utility
5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function that is used to implement the real
5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function.
5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[h, n] = hash_pixel_function(f)
5685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# If the utility function is not yet known, generate
5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# it.
5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if not self.pixel_stubs.has_key(h):
5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.pixel_stubs[h] = n
5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixel_func = glXPixelFunctionUtility(f, n)
5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print 'static void'
5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string())
5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '{'
5805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if self.common_func_print_just_start(pixel_func):
5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = "    "
5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = "    }"
5845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = ""
5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = None
5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.can_be_large:
5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        }' % (indent)
5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent += "    "
5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				[dim, width, height, depth, extent] = pixel_func.dimensions()
5970246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				adjust = pixel_func.offset_of_first_parameter() + 4
5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    emit_header(gc->pc, opcode, cmdlen);' % (indent)
6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6030246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				s = pixel_func.command_fixed_length()
6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixHeaderPtr = "gc->pc + 4"
6065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pcPtr = "gc->pc + %u" % (s + 4)
6075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.image.img_send_null:
6095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = '(compsize > 0) && (%s != NULL)' % (pixel_func.image.name)
6105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
6115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = 'compsize > 0'
6125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (%s) {' % (indent, condition)
6145f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
6155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
6165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    else {' % (indent)
6175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
6185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
6195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    gc->pc += cmdlen;' % (indent)
6215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
6225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.can_be_large:
6245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					adjust += 4
6255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
6275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%selse {' % (indent)
6285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					self.large_emit_begin(indent, pixel_func, "opcode")
6305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					offset = self.pixel_emit_args(pixel_func, "pc", indent, adjust, dim, 1)
6315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pixHeaderPtr = "pc + 8"
6335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pcPtr = "pc + %u" % (s + 8)
6345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6355f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
6365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
6385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if trailer: print trailer
6405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '}'
6415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print ''
6425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Generate the real function as a call to the
6465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# utility function.
6475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_func_print_just_header(f)
6495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[dim, junk, junk, junk, junk] = f.dimensions()
6515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
6535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			for p in gl_XML.glFunction.parameterIterator(f):
6545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				p_string += ", " + p.name
6555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.pad_after(p):
6575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
6585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '    %s(%s, %u%s );' % (n, f.opcode_name(), dim, p_string)
6605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '}'
6615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print ''
6625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
6635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.common_func_print_header(f):
6665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
6675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
6685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
6695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
6705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
6715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
6745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
6755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
6765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
6775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
6785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
6795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		[dim, width, height, depth, extent] = f.dimensions()
6810246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		adjust = f.offset_of_first_parameter() + 4
6825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
6845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
6865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6870246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		s = f.command_fixed_length()
6885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pixHeaderPtr = "gc->pc + 4"
6905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pcPtr = "gc->pc + %u" % (s + 4)
6915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_send_null:
6935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = '(compsize > 0) && (%s != NULL)' % (f.image.name)
6945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
6955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = 'compsize > 0'
6965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (%s) {' % (indent, condition)
6985f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
6995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
7005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    else {' % (indent)
7015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
7025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
7035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
7055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
7065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
7085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			adjust += 4
7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
7125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.large_emit_begin(indent, f)
7145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1)
7155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pixHeaderPtr = "pc + 8"
7175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pcPtr = "pc + %u" % (s + 8)
7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7195f1f229f8da255ca9b390da1757ad781978cf619Ian 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)
7205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
7245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '}'
7255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print ''
7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
7275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
729e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
73047719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
73147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
73247719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
73347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
73447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
7351d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
7362eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
737e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.fn_parameters[0]
739e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if p.is_pointer:
7400246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
741e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					self.common_func_print_just_header(f)
743e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '}'
745e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print ''
746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
747e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
748990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if self.common_func_print_header(f):
749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
750990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
753990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
754990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
7551fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7561fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
7571fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
758990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
759990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
760990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
761990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
762990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
763990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
769990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
772990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
773990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
7743276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
7753276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
776990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			offset = self.common_emit_args(f, "pc", indent, 8, 1)
7771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
779990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string())
780990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7821fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7831fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    __indirect_glFinish();' % (indent)
7841fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
7851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
786990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
79274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto):
793e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
79474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.category != self.last_category:
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.last_category = f.category
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    /* %s */' % (self.last_category)
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    glAPI->%s = __indirect_gl%s;' % (f.name, f.name)
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
86474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto):
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
86674764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
87116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
87416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
882c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
8831fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
8841fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
8851fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8861fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
8871fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
8881fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8891fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
8901fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
8911fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8921fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
8931fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
8941fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
8951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
8961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
8971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
8981fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
8991fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9001fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
9011fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
9021fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
90316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string())
907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
9101fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
9111fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
9121fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
9201fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
9241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
925e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
926e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
928e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
9311fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
9321fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoStubs()
936e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
937e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_c()
938e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
939e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_h()
940e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
942e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
943e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
9441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	dh.debug = debug
94593d2d54e7a11cf1a01c976ede37db2320ccc2dffIan Romanick	gl_XML.parse_GL_API( dh, file_name )
946