glX_proto_send.py revision e4dbfa44ed018d124e1531077d506c8c914c1a51
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"'
169c28d0f779aec13f937d452de01a1b34a2ec44de8Brian Paul		print '#include "glapi.h"'
170f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print '#include "glthread.h"'
171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
1722eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#ifdef USE_XCB'
173b8f26126e2874a00321af084bc2cdb486a62aa8fIan Romanick		print '#include <X11/Xlib-xcb.h>'
1743d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/xcb.h>'
1753d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/glx.h>'
1762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#endif /* USE_XCB */'
17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
181c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
182c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1846e8e4b918d1dac8a0c20e7a5d6f4665a1eaf174fIan Romanick		print '#ifndef __GNUC__'
185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
187990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
203a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
214a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
215a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2211fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
222c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXReadPixelReply( Display *dpy, struct glx_context * gc, unsigned max_dim,
223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
261d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
262d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2651fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
266c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupSingleRequest( struct glx_context * gc, GLint sop, GLint cmdlen )
267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2801fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
281c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupVendorRequest( struct glx_context * gc, GLint code, GLint vop, GLint cmdlen )
282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
3065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
3075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_stubs = {}
31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		generated_stubs = []
31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.client_handcode: continue
32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If the function is a pixel function with a certain
32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# GLX protocol signature, create a fake stub function
32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# for it.  For example, create a single stub function
32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# that is used to implement both glTexImage1D and
32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage2D.
32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.glx_rop != 0:
33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				do_it = 0
33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for image in func.get_images():
33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if image.img_pad_dimensions:
33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						do_it = 1
33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						break
3350f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if do_it:
33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[h, n] = hash_pixel_function(func)
33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.pixel_stubs[ func.name ] = n
34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if h not in generated_stubs:
34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						generated_stubs.append(h)
34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						fake_func = glx_pixel_function_stub( func, n )
346f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						self.printFunction(fake_func, fake_func.name)
34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
349f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printFunction(func, func.name)
350f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			if func.glx_sop and func.glx_vendorpriv:
351f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				self.printFunction(func, func.glx_vendorpriv_names[0])
35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
356f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printFunction(self, func, name):
357f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		footer = '}\n'
35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop == ~0:
35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'static %s' % (func.return_type)
36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
361f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '{'
36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
363f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			if func.has_different_protocol(name):
364f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.return_type == "void":
365f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = ''
366f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				else:
367f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = "return "
368f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
369f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				func_name = func.static_glx_name(name)
370f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv)
371f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string())
372f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
373c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg				print '    struct glx_context * const gc = __glXGetCurrentContext();'
374f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print ''
375903986ca128d51ff031cc9eafa1976618834a8deBrian Paul				print '#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)'
376c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg				print '    if (gc->isDirect) {'
377b5022ad03584f119b27c143b53e7ed80e8c12ffbChia-I Wu				print '    %sGET_DISPATCH()->%s(%s);' % (ret_string, func.name, func.get_called_parameter_string())
378c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '    } else'
379c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '#endif'
380c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '    {'
381c428f467b65f1b79f77103db249936273d645fecIan Romanick
382f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				footer = '}\n}\n'
383f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			else:
384f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_name(), func.opcode_value())
38566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
386f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string())
387f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
38866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
3935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
396f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printSingleFunction(func, name)
39766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
399f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print "/* Missing GLX protocol for %s. */" % (name)
40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
401f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print footer
40266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
4063385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
410c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * const gc = __glXGetCurrentContext();
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
416990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
4183385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
41966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
422990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_one_arg(self, p, pc, adjust, extra_offset):
423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4280f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		if p.is_padding:
4290f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			print '(void) memset((void *)(%s + %u), 0, %s);' \
4300f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			    % (pc, p.offset + adjust, p.size_string() )
4310f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		elif not extra_offset:
432990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
433990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, src_ptr, p.size_string() )
43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
435990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
436990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
437e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
438990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_args(self, f, pc, adjust, skip_vla):
43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
440e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
442d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
443990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, pc, adjust, extra_offset)
44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
44866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
44966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
451e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
453e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
455990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def pixel_emit_args(self, f, pc, large):
4565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
4595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
4605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
4615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
46266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
46566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
46666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
46766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
469990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(param, pc, adjust, None)
4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
47166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
472990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust)
4735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
47666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4810f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
4820f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					print '(void) memset((void *)(%s + %u), 0, %s);' \
4830f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					% (pc, (param.offset - 4) + adjust, param.size_string() )
4840f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
487990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust)
48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
489990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name)
49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
4945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
501990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print 'if (%s) {' % (condition)
502990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
503990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '} else {'
504990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '    (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim)
505990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '}'
50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
507990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
50866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
512990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def large_emit_begin(self, f, op_name = None):
5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
516990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLint op = %s;' % (op_name)
517990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLuint cmdlenLarge = cmdlen + 4;'
518990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);'
519990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);'
520990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);'
5213276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
5223276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
5233276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
524d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer	def common_func_print_just_start(self, f, name):
525c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg		print '    struct glx_context * const gc = __glXGetCurrentContext();'
52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
527990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
528990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
530990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
531990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
532990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
53566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
53666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
53866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
540990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
542d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer				if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"):
54366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
545d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
546990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
547990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
548990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
549990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
550990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
551990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
552990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
553990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
55466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
556e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
557e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
558d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
559d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#ifndef USE_XCB'
56066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
561d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
562d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#endif'
563e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
56466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
56566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
567a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			# 'counter' parameters cannot be negative
568a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    if (%s < 0) {" % p.name
569a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "        __glXSetError(gc, GL_INVALID_VALUE);"
570a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			if f.return_type != 'void':
571a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return 0;"
572a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			else:
573a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return;"
574a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    }"
575e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
576990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
58066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
58266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
585990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
586990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
587990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
588990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
589e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
590e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
591f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printSingleFunction(self, f, name):
592d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		self.common_func_print_just_start(f, name)
59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5941fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5951fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
59666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
597f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
5982eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
6002eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
6012eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
6022eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
6033d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
6042eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
605f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			xcb_name = 'xcb_glx%s' % convertStringForXCB(name)
60666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6072eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
60866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
61666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
61766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
61866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
61966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
62166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
6223d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						if xcb_name == "xcb_glx_read_pixels":
62366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
6252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
6262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
6292eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6302eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
6313d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
6333d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6343fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb
63566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
6362636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick					if not output.is_image():
6373d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
63866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
6392eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
6403d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6412eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6421fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
6442eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
6452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
6462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
6472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
6482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
6492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
65266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
655e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
656e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
657f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name in f.glx_vendorpriv_names:
658f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name))
659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
6601fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
661e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
662990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "pc", 0, 0)
663d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
67166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
673d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
674d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
675d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
676e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
68566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
6923f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
69366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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)
6943f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
696d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
70266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
70466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
70566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
70666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
70866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
70966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
71066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
71266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
71866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
71966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
722d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
7251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
7261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
7271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
7281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
7291fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
730f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (name)
7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
735f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
73666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
7375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
7415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
74366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
74566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
74766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
74866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
7495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
75166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
7520f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
7530f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					continue
7540f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
75766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
75866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
76066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
7615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
7625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
76366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
7645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
7655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
767d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
7685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
7695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
7705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
7715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
774990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
775990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
776990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
777990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
7785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
77966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
78066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
7815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
78266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
7835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
784990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (opcode)
7855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
786990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.pixel_emit_args( f, "gc->pc", 0 )
787990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
788990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
7895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
791990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
792990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
7935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
794990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f, opcode)
795990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.pixel_emit_args(f, "pc", 1)
7965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
797990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
7985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
8005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
8015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
80447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
80547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
80647719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
80747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
80847719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
8091d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
81066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
81166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
81366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
8140246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
819d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
820990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
822990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
823990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
8241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
8261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
827990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
828990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
829990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
830990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
831990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
833990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name())
834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
835990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "gc->pc", 4, 0)
836990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
837990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
840990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
841990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
8423276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
843990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f)
844990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.common_emit_args(f, "pc", 8, 1)
8451fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
847990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string())
848990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8501fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
851990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '__indirect_glFinish();'
852990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
8531fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
854990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
85866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
86066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
86166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
86266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
86666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
897699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieristruct _glapi_table * __glXNewIndirectAPI( void )
898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
899699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri    struct _glapi_table *glAPI;
900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
903699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri    glAPI = (struct _glapi_table *) Xmalloc(entries * sizeof(void *));
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
910e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
92166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
925eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick		for [name, number] in api.categoryIterate():
926eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			if number != None:
927eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %3u. %s */\n\n' % (int(number), name)
928eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			else:
929eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %s */\n\n' % (name)
930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
931eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			for func in api.functionIterateByCategory(name):
932eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				if func.client_supported_for_indirect():
933eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					print '%s    glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name)
934eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					preamble = ''
93566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
93766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
940e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
94166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
94266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
94366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
944e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
946e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
94716c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
948e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
95166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
95266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
953e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
95416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
962c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
9631fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
9641fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
9651fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9661fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
9671fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
9681fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9691fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
9701fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
9711fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9721fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
973c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, unsigned max_dim, GLint width, GLint height,
9741fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
9751fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
9761fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9771fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
978c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, GLint sop, GLint cmdlen );
9791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9801fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
981c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, GLint code, GLint vop, GLint cmdlen );
9821fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
98316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
984e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
98566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
98666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
987f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			params = func.get_parameter_string()
988f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
989f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params)
990f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
991f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			for n in func.entry_points:
992f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.has_different_protocol(n):
993f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					asdf = func.static_glx_name(n)
994f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					if asdf not in func.static_entry_points:
995f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params)
996e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu						# give it a easy-to-remember name
997e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu						if func.client_handcode:
998e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu							print '#define gl_dispatch_stub_%s gl%s' % (n, asdf)
999f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					else:
1000f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params)
1001f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
1002f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					break
1003f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1005e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1006e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
10071fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
10081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
10091fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
1015e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1016e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
10171fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
1018e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
1019e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1020e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
1022e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
1023e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
1024e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
1025e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
1026e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
1027e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
10281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
10291fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
1030e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1031e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
103266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
1033e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
103466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
1035e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
103666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
1037e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
1038e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1039e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1040e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
104166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
104266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
104366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
104466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
1045