glX_proto_send.py revision 0f73302d24f4201813da2939742c5bcb6964b3b1
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>
273d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb#    Jeremy Kolb <jkolb@brandeis.edu>
28e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML, glX_proto_common, license
3066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string
315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
323d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolbdef convertStringForXCB(str):
333d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb    tmp = ""
343d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb    special = [ "ARB" ]
353d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb    i = 0
363d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb    while i < len(str):
373d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb        if str[i:i+3] in special:
383d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb            tmp = '%s_%s' % (tmp, string.lower(str[i:i+3]))
393d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb            i = i + 2;
403d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb        elif str[i].isupper():
413d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb            tmp = '%s_%s' % (tmp, string.lower(str[i]))
423d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb        else:
433d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb            tmp = '%s%s' % (tmp, str[i])
443d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb        i += 1
453d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb    return tmp
463d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb
475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func):
485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Generate a 'unique' key for a pixel function.  The key is based on
495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	the parameters written in the command packet.  This includes any
505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	padding that might be added for the original function and the 'NULL
515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	image' flag."""
525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	h = ""
5566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	hash_pre = ""
5666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	hash_suf = ""
5766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	for param in func.parameterIterateGlxSend():
5866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if param.is_image():
5966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			[dim, junk, junk, junk, junk] = param.get_dimensions()
605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			d = (dim + 1) & ~1
6266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			hash_pre = "%uD%uD_" % (d - 1, d)
635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if param.img_null_flag:
6566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				hash_suf = "_NF"
6666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		h += "%u" % (param.size())
6866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.pad_after(param):
705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			h += "4"
715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = func.name.replace("%uD" % (dim), "")
745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = "__glx_%s_%uD%uD" % (n, d - 1, d)
7566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
7666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	h = hash_pre + h + hash_suf
775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	return [h, n]
785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_pixel_function_stub(glX_XML.glx_function):
815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Dummy class used to generate pixel "utility" functions that are
825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	shared by multiple dimension image functions.  For example, these
835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	objects are used to generate shared functions used to send GLX
845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	protocol for TexImage1D and TexImage2D, TexSubImage1D and
855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	TexSubImage2D, etc."""
865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def __init__(self, func, name):
885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The parameters to the utility function are the same as the
895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters to the real function except for the added "pad"
905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.name = name
9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.images = []
9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.parameters = []
9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.parameters_by_name = {}
9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for _p in func.parameterIterator():
9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = copy.copy(_p)
9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.parameters.append(p)
9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.parameters_by_name[ p.name ] = p
10066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_image():
10366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.images.append(p)
10466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p.height = "height"
10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.img_yoff == None:
10766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					p.img_yoff = "yoffset"
10866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.depth:
11066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.extent == None:
11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						p.extent = "extent"
11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.img_woff == None:
11466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						p.img_woff = "woffset"
11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pad_name = func.pad_after(p)
1185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if pad_name:
1195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad = copy.copy(p)
1205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad.name = pad_name
12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.parameters.append(pad)
12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.parameters_by_name[ pad.name ] = pad
1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.return_type = func.return_type
1265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
12766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_rop = ~0
12866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_sop = 0
12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_vendorpriv = 0
1305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
13166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.glx_doubles_in_order = func.glx_doubles_in_order
1325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
13366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.vectorequiv = None
13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.output = None
13566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.can_be_large = func.can_be_large
13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.reply_always_array = func.reply_always_array
13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.dimensions_in_reply = func.dimensions_in_reply
13866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.img_reset = None
1395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.server_handcode = 0
14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.client_handcode = 0
14266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.ignore = 0
1435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1443fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		self.count_parameter_list = func.count_parameter_list
14566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.counter_list = func.counter_list
14666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.offsets_calculated = 0
1475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
15066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
15266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		glX_proto_common.glx_print_proto.__init__(self)
15366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
1545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
15566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
15666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
15766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
1601fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		self.debug = 0
161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
169f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print '#include "dispatch.h"'
170c28d0f779aec13f937d452de01a1b34a2ec44de8Brian Paul		print '#include "glapi.h"'
171f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print '#include "glthread.h"'
172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
1732eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#ifdef USE_XCB'
174b8f26126e2874a00321af084bc2cdb486a62aa8fIan Romanick		print '#include <X11/Xlib-xcb.h>'
1753d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/xcb.h>'
1763d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/glx.h>'
1772eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#endif /* USE_XCB */'
17866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
182c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
183c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
187990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
188990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1981fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
203e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
214a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
215a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
216a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2221fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
2231fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
261d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
262d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
263d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2661fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2671fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen )
268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2811fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2821fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
3065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
3075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
3085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_stubs = {}
31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		generated_stubs = []
32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.client_handcode: continue
32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If the function is a pixel function with a certain
32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# GLX protocol signature, create a fake stub function
32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# for it.  For example, create a single stub function
32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# that is used to implement both glTexImage1D and
32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage2D.
32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.glx_rop != 0:
33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				do_it = 0
33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for image in func.get_images():
33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if image.img_pad_dimensions:
33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						do_it = 1
33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						break
3360f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if do_it:
33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[h, n] = hash_pixel_function(func)
34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.pixel_stubs[ func.name ] = n
34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if h not in generated_stubs:
34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						generated_stubs.append(h)
34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						fake_func = glx_pixel_function_stub( func, n )
347f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						self.printFunction(fake_func, fake_func.name)
34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
350f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printFunction(func, func.name)
351f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			if func.glx_sop and func.glx_vendorpriv:
352f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				self.printFunction(func, func.glx_vendorpriv_names[0])
35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
357f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printFunction(self, func, name):
358f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		footer = '}\n'
35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop == ~0:
36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'static %s' % (func.return_type)
36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
362f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '{'
36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
364f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			if func.has_different_protocol(name):
365f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.return_type == "void":
366f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = ''
367f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				else:
368f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = "return "
369f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
370f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				func_name = func.static_glx_name(name)
371f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv)
372f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string())
373f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
374f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    __GLXcontext * const gc = __glXGetCurrentContext();'
375f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print ''
376020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg				print '    if (gc->driContext) {'
377f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    %sCALL_%s(GET_DISPATCH(), (%s));' % (ret_string, func.name, func.get_called_parameter_string())
378f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    } else {'
379f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				footer = '}\n}\n'
380f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			else:
381f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_name(), func.opcode_value())
38266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
383f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string())
384f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
38566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
38866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
38966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
3905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
393f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printSingleFunction(func, name)
39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
396f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print "/* Missing GLX protocol for %s. */" % (name)
39766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
398f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print footer
39966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
4033385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
413990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
4153385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
41666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
419990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_one_arg(self, p, pc, adjust, extra_offset):
420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4250f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		if p.is_padding:
4260f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			print '(void) memset((void *)(%s + %u), 0, %s);' \
4270f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			    % (pc, p.offset + adjust, p.size_string() )
4280f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		elif not extra_offset:
429990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
430990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, src_ptr, p.size_string() )
43166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
432990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
433990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
434e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
435990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_args(self, f, pc, adjust, skip_vla):
43666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
437e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
439d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
440990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, pc, adjust, extra_offset)
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
448e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
44966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
450e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
451e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
452990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def pixel_emit_args(self, f, pc, large):
4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
4555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
4565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
46266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
46566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
466990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(param, pc, adjust, None)
4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
469990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust)
4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
47666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4780f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
4790f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					print '(void) memset((void *)(%s + %u), 0, %s);' \
4800f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					% (pc, (param.offset - 4) + adjust, param.size_string() )
4810f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
48266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
48366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
484990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust)
48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
486990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name)
48766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
498990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print 'if (%s) {' % (condition)
499990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '    (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
500990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '} else {'
501990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '    (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim)
502990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '}'
50366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
504990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '__glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
50566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
509990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def large_emit_begin(self, f, op_name = None):
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
513990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLint op = %s;' % (op_name)
514990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLuint cmdlenLarge = cmdlen + 4;'
515990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);'
516990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);'
517990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);'
5183276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
5193276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
5203276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
521d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer	def common_func_print_just_start(self, f, name):
522e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
524990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
525990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
526990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
527990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
528990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
53066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
53166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
53266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
53566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
53666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
537990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
53866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
539d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer				if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"):
54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
542d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
543990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
544990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
545990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
546990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
547990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
548990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
549990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
550990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
55166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
55266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
553e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
554e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
555d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
556d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#ifndef USE_XCB'
55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
558d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
559d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#endif'
560e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
56266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
56366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
564a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			# 'counter' parameters cannot be negative
565a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    if (%s < 0) {" % p.name
566a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "        __glXSetError(gc, GL_INVALID_VALUE);"
567a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			if f.return_type != 'void':
568a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return 0;"
569a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			else:
570a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return;"
571a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    }"
572e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
573990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
57466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
57666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
58066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
582990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
583990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
584990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
585990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
586e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
587e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
588f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printSingleFunction(self, f, name):
589d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		self.common_func_print_just_start(f, name)
59066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5911fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5921fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
594f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
5952eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5962eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
5972eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
5982eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
5992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
6003d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
6012eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
602f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			xcb_name = 'xcb_glx%s' % convertStringForXCB(name)
60366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6042eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
60566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
60666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
60766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
60866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
61666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
61766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
61866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
6193d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						if xcb_name == "xcb_glx_read_pixels":
62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
62166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
6222eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
6232eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
6262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6272eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
6283d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
6303d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb					print '        (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
6313fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb
63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
6332636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick					if not output.is_image():
6343d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
63566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
6362eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
6373d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb					print '        (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
6382eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6391fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
64066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
6412eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
6422eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
6432eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
6442eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
6452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
6462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
650e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
651e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
652e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
654f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name in f.glx_vendorpriv_names:
655f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name))
656e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
6571fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
658e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
659990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "pc", 0, 0)
660d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
670d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
671d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
672d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
673e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
67466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
675e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
68566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
6893f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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)
6913f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
693d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
70266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
70466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
70566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
70666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
70966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
71066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
71166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
71266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
71866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
719d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
7221fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
7231fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
7241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
7251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
7261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
727f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (name)
7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
732f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
73366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
73666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
74166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
74266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
74366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
74566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
7465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
74866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
7490f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
7500f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					continue
7510f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
75266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
7565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
75766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
7585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
76066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
7615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
7625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
764d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
7655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
7665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
7675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
7685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
771990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
772990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
773990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
774990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
7755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
77666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
77766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
7785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
77966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
7805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
781990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (opcode)
7825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
783990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.pixel_emit_args( f, "gc->pc", 0 )
784990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
785990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
7865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
788990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
789990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
7905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
791990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f, opcode)
792990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.pixel_emit_args(f, "pc", 1)
7935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
794990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
7955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
7975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
7985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
80147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
80247719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
80347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
80447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
80547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
8061d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
80866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
80966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
81066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
8110246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
816d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
817990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
819990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
820990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
8211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
822990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
8231fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
824990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
827990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
828990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
830990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name())
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
832990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "gc->pc", 4, 0)
833990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
834990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
837990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
838990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
8393276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
840990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f)
841990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.common_emit_args(f, "pc", 8, 1)
8421fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
844990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string())
845990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8471fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
848990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '__indirect_glFinish();'
849990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
8501fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
851990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
85566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
85766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
85866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
85966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
86366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
910e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
91866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
92166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
922eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick		for [name, number] in api.categoryIterate():
923eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			if number != None:
924eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %3u. %s */\n\n' % (int(number), name)
925eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			else:
926eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %s */\n\n' % (name)
927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
928eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			for func in api.functionIterateByCategory(name):
929eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				if func.client_supported_for_indirect():
930eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					print '%s    glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name)
931eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					preamble = ''
93266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
93466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
937e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
94066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
942e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
943e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
94416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
94666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
94766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
94866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
950e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
95116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
952e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
953e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
954e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
959c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
9601fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
9611fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
9621fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9631fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
9641fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
9651fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9661fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
9671fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
9681fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9691fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
9701fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
9711fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
9721fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
9731fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9741fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
9751fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
9761fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9771fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
9781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
9791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
98016c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
981e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
98266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
98366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
984f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			params = func.get_parameter_string()
985f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
986f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params)
987f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
988f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			for n in func.entry_points:
989f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.has_different_protocol(n):
990f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					asdf = func.static_glx_name(n)
991f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					if asdf not in func.static_entry_points:
992f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params)
993f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					else:
994f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params)
995f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
996f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					break
997f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
998e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
999e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1000e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
10011fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
10021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
10031fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
1005e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1006e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1007e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
1008e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
10111fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10151fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
1016e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
1017e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
1018e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
1019e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
1020e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
1021e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
10221fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
10231fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
1024e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1025e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
102666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
1027e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
102866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
1029e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
103066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
1031e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
1032e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1033e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1034e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
103566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
103666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
103766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
103866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
1039