glX_proto_send.py revision 66a5548fbbf4c04a74b0bbc451718a8fc95502d9
166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick#!/usr/bin/env python
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
2866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML, glX_proto_common, license
2966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string
305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func):
325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Generate a 'unique' key for a pixel function.  The key is based on
335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	the parameters written in the command packet.  This includes any
345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	padding that might be added for the original function and the 'NULL
355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	image' flag."""
365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	h = ""
3966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	hash_pre = ""
4066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	hash_suf = ""
4166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	for param in func.parameterIterateGlxSend():
4266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if param.is_image():
4366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			[dim, junk, junk, junk, junk] = param.get_dimensions()
445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			d = (dim + 1) & ~1
4666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			hash_pre = "%uD%uD_" % (d - 1, d)
475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if param.img_null_flag:
4966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				hash_suf = "_NF"
5066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		h += "%u" % (param.size())
5266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.pad_after(param):
545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			h += "4"
555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = func.name.replace("%uD" % (dim), "")
585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = "__glx_%s_%uD%uD" % (n, d - 1, d)
5966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	h = hash_pre + h + hash_suf
615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	return [h, n]
625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_pixel_function_stub(glX_XML.glx_function):
655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Dummy class used to generate pixel "utility" functions that are
665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	shared by multiple dimension image functions.  For example, these
675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	objects are used to generate shared functions used to send GLX
685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	protocol for TexImage1D and TexImage2D, TexSubImage1D and
695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	TexSubImage2D, etc."""
705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def __init__(self, func, name):
725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The parameters to the utility function are the same as the
735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters to the real function except for the added "pad"
745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.name = name
7766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.images = []
7866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.parameters = []
7966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.parameters_by_name = {}
8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for _p in func.parameterIterator():
8166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = copy.copy(_p)
8266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.parameters.append(p)
8366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.parameters_by_name[ p.name ] = p
8466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
8566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
8666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_image():
8766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.images.append(p)
8866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p.height = "height"
8966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
9066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.img_yoff == None:
9166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					p.img_yoff = "yoffset"
9266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.depth:
9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.extent == None:
9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						p.extent = "extent"
9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.img_woff == None:
9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						p.img_woff = "woffset"
9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pad_name = func.pad_after(p)
1025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if pad_name:
1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad = copy.copy(p)
1045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad.name = pad_name
10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.parameters.append(pad)
10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.parameters_by_name[ pad.name ] = pad
1075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.return_type = func.return_type
1105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_rop = ~0
11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_sop = 0
11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_vendorpriv = 0
1145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_doubles_in_order = func.glx_doubles_in_order
1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
11766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.vectorequiv = None
11866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.output = None
11966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.can_be_large = func.can_be_large
12066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.reply_always_array = func.reply_always_array
12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.dimensions_in_reply = func.dimensions_in_reply
12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.img_reset = None
1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
12466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.server_handcode = 0
12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.client_handcode = 0
12666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.ignore = 0
1275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1283fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		self.count_parameter_list = func.count_parameter_list
12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.counter_list = func.counter_list
13066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.offsets_calculated = 0
1315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
133e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		glX_proto_common.glx_print_proto.__init__(self)
13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
1385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
13966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
1441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		self.debug = 0
145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
1542eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#ifdef USE_XCB'
1552eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/xcl.h>'
1562eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/XCB/xcb.h>'
1572eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/XCB/glx.h>'
1582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#endif /* USE_XCB */'
15966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
163c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
164c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
166990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
167990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
168990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
169990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
185a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
186a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
187a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
188a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
189a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
190a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
191a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
192a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
193a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
194a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
195a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
196a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
197a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2031fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
2041fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
205d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
206d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
207d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
208d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
209d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
210d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
211d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
212d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
213d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
214d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
215d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
216d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
217d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
218d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
219d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
220d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
221d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
222d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2471fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen )
249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2621fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2631fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
2845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
2855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
2865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
2875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
2885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
2895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
29766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
29866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
29966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_stubs = {}
30066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		generated_stubs = []
30166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
30266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
30366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.client_handcode: continue
30466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
30566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If the function is a pixel function with a certain
30666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# GLX protocol signature, create a fake stub function
30766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# for it.  For example, create a single stub function
30866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# that is used to implement both glTexImage1D and
30966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage2D.
31066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.glx_rop != 0:
31266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				do_it = 0
31366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for image in func.get_images():
31466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if image.img_pad_dimensions:
31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						do_it = 1
31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						break
31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if do_it:
32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[h, n] = hash_pixel_function(func)
32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.pixel_stubs[ func.name ] = n
32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if h not in generated_stubs:
32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						generated_stubs.append(h)
32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						fake_func = glx_pixel_function_stub( func, n )
32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						self.printFunction( fake_func )
32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.printFunction( func )
33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printFunction(self, func):
33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop == ~0:
33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'static %s' % (func.return_type)
33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#define %s %d' % (func.opcode_name(), func.opcode_value())
34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s' % (func.return_type)
34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '__indirect_gl%s(%s)' % (func.name, func.get_parameter_string())
34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '{'
34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
3535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.printSingleFunction(func)
35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print "/* Missing GLX protocol for %s. */" % (func.name)
36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '}'
36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print ''
36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
36566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
3683385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
369e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
370e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
371e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
372e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
373e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
378990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
3803385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
38466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def common_emit_one_arg(self, p, pc, indent, adjust, extra_offset):
385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if not extra_offset:
39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			    % (indent, pc, p.offset + adjust, src_ptr, p.size_string() )
39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    (void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			    % (indent, pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
39866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
401d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
40266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.common_emit_one_arg(p, pc, indent, adjust, extra_offset)
40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
40466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
40566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
40666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
41466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def pixel_emit_args(self, f, pc, indent, large):
4155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
4165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
4175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
4185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
4195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
4205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
42166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
42266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
42366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
42566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
42666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
42866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.common_emit_one_arg(param, pc, indent, adjust, None)
4295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
43066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
43166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset + param.size()) + adjust)
4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
43566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
43666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset - 4) + adjust)
44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, (param.offset - 4) + adjust, param.name)
44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
44866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
45366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
45466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    if (%s) {' % (indent, condition)
45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s        (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    }' % (indent)
45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    else {' % (indent)
46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    }' % (indent)
46266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    __glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
46566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
4695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
4733276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
4743276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
4753276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
4763276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
4773276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
4783276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
4793276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
48266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
483990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
484990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
485990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
486990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
487990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
488990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
49166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
496990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
501d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
502990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
503990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
504990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
505990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
506990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
507990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
508990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
509990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
512e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
513e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
515e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
51866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
519e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
52166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
530990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
531990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
532990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
533e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
534e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
53666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.common_func_print_just_start(f)
53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5381fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5391fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
541af1a72997224610420b1105f967b0f5a8272858dBrian Paul		if f.glx_vendorpriv == 0:
5422eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5432eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
5442eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
5452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
5462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
5472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        XCBConnection *c = XCBConnectionOfDisplay(dpy);'
5482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
549af1a72997224610420b1105f967b0f5a8272858dBrian Paul			xcb_name = 'XCBGlx%s' % f.name
55066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
55266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
55366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
55466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
55966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
56066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
56266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
56366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
56466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
56566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if xcb_name == "XCBGlxReadPixels":
56766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
56866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
5692eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
5702eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
57166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
57266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
5732eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
5752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        %sRep *reply = %sReply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
57666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        %s = (%s)%sData(reply);' % (output.name, output.type_string(), xcb_name)
57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if not output.is_image():
5802eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        if (%sDataLength(reply) == 0)' % (xcb_name)
58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
5822eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        (void)memcpy(%s, %sData(reply), %sDataLength(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
5842eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
5872eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
5882eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
5892eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
5902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
5912eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
5922eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
59466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
596e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
597e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
598e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
599e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
600e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
6011fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
602e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
6031fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
604e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
606d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
60766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
60866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
616d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
617d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
618d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
62266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
62366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
63466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
6353f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
63666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, %s, %s, %s, %s, %s, %s, GL_FALSE);" % (dim, w, h, d, p.img_format, p.img_type, p.name)
6373f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
63866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
639d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
64066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
644e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
65266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
65366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
65666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
665d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
666e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
6671fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
6681fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
6691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
6701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
6711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
6721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
6731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
6745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
6775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_vendorpriv == 0:
67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
6805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
6845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
6925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
6995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
7015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
7025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
7045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
7055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
7085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
7105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
7115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
7125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
7135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
7165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
7175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
7205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
7215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
72366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
7245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
72566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, opcode)
7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_emit_args( f, "gc->pc", indent, 0 )
7305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.large_emit_begin(indent, f, opcode)
73866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.pixel_emit_args( f, "pc", indent, 1 )
7395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
7445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
74747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
74847719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
74947719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
75047719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
75147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
7521d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
7570246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
76266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
764990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
767990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
768990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
7691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
7711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
772990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
773990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
774990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
775990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
776990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
777990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
783990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
786990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
787990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
7883276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
7893276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
79066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.common_emit_args(f, "pc", indent, 8, 1)
7911fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, p.offset + 8, p.name, p.size_string())
794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7961fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7971fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    __indirect_glFinish();' % (indent)
7981fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
7991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
800990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
80466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
80666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
80866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
86766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
87066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printCategory(self, category_group, show_num):
87166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		cat_keys = category_group.keys()
87266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		cat_keys.sort()
87366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for cat_num in cat_keys:
87466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			first = 1
87566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for offset in category_group[ cat_num ]:
87666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[cat_name, func_name] = category_group[ cat_num ][ offset ]
87766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
87866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if first:
87966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print ''
88066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if show_num:
88166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '    /* % 3u. %s */' % (cat_num, cat_name)
88266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
88366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '    /* %s */' % (cat_name)
88466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print ''
88566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					first = 0
88666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
88766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '    glAPI->%s = __indirect_gl%s;' % (func_name, func_name)
88866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
88966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
89066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
89166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		core_categories = {}
89266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		arb_categories = {}
89366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		other_categories = {}
89466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		next_unnum = 1000
89566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
89666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
89766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			[cat, num] = api.get_category_for_name( func.name )
89866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
89966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# There are three groups of "categories" that we
90066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# care about here.  We want to separate the core GL
90166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# version categories from extensions.  We also want to
90266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# separate the ARB extensions from the non-ARB
90366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# extensions.
90466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			#
90566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# This is done by first trying to convert the category
90666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# name to a floating point number.  All core GL
90766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# versions are of the form "N.M" where both N and M
90866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# are integers.  If the cast to float fails, an
90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# exception will be thrown.  Once down that path,
91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# we can look at the start of the extension string.
91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If it begins with "GL_ARB_", it's an ARB extension.
91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			#
91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Once the categories are separated, the are ordered
91466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# by number.  The un-numbered non-ARB extensions
91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# (e.g., GL_INGR_blend_func_separate) are assigned
91666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# arbitrary numbers starting at 1000.
91766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			#
91866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# FIXME In order to maintain repeatability, the
91966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# FIXME unnumbered extensions should be put in their
92066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# FIXME own dictionary and ordered by name (since they
92166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# FIXME have no number).
92266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
92366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			try:
92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				num = float(cat)
92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not core_categories.has_key( num ):
92666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					core_categories[ num ] = {}
92766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
92866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				core_categories[ num ][ func.offset ] = [cat, func.name]
92966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			except Exception, e:
93166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not num:
93266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					num = next_unnum
93366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					next_unnum += 1
93466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
93566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					num = int(num)
93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if cat.startswith( "GL_ARB_" ):
93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if not arb_categories.has_key( num ):
93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						arb_categories[ num ] = {}
94066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
94166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					arb_categories[ num ][ func.offset ] = [cat, func.name]
94266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
94366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if not other_categories.has_key( num ):
94466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						other_categories[ num ] = {}
945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
94666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					other_categories[ num ][ func.offset ] = [cat, func.name]
94766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
94866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.printCategory( core_categories,  0 )
94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.printCategory( arb_categories,   1 )
95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.printCategory( other_categories, 1 )
95166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
95266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
95366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
95466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
95666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
95766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
95866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
96216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
96466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
96566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
96666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
96766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
968e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
96916c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
970e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
973e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
974e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
975e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
977c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
9781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
9791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
9801fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9811fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
9821fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
9831fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9841fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
9851fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
9861fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9871fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
9881fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
9891fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
9901fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
9911fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9921fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
9931fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
9941fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
9961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
9971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
99816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
999e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
100066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
100166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
100266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, func.get_parameter_string())
1003e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1005e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
10061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
10071fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
10081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1015e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
10161fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
1017e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
1018e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1019e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10201fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
1021e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
1022e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
1023e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
1024e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
1025e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
1026e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
10271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
10281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
1029e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1030e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
103166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
1032e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
103366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
1034e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
103566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
1036e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
1037e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1038e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1039e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
104066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
104166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
104266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
104366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
1044