glX_proto_send.py revision f3f51bc844c8749250724d164722402cb9a07dc7
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"'
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 ''
184990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
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
2221fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * 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 *
2661fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * 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 *
2811fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * 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
33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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 '{'
373f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    __GLXcontext * const gc = __glXGetCurrentContext();'
374f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print ''
375f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    if (gc->isDirect) {'
376f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    %sCALL_%s(GET_DISPATCH(), (%s));' % (ret_string, func.name, func.get_called_parameter_string())
377f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '    } else {'
378f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				footer = '}\n}\n'
379f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			else:
380f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_name(), func.opcode_value())
38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
382f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string())
383f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
38466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
38766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
38866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
3895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
392f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printSingleFunction(func, name)
39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
395f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print "/* Missing GLX protocol for %s. */" % (name)
39666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
397f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print footer
39866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
39966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
4023385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
412990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
4143385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
41566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
418990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_one_arg(self, p, pc, adjust, extra_offset):
419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if not extra_offset:
425990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
426990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, src_ptr, p.size_string() )
42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
428990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
429990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
430e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
431990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_args(self, f, pc, adjust, skip_vla):
43266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
433e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
435d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
436990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, pc, adjust, extra_offset)
43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
444e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
446e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
448990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def pixel_emit_args(self, f, pc, large):
4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
4505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
4515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
4525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
462990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(param, pc, adjust, None)
4635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
465990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust)
4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
46966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
47066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
47166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
476990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust)
47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
478990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name)
47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
48266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
48466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
48766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
490990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print 'if (%s) {' % (condition)
491990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
492990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '} else {'
493990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '    (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim)
494990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '}'
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
496990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
501990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def large_emit_begin(self, f, op_name = None):
5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
505990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLint op = %s;' % (op_name)
506990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLuint cmdlenLarge = cmdlen + 4;'
507990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);'
508990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);'
509990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);'
5103276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
5113276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
5123276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
514e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
516990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
517990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
518990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
519990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
521990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
53066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
53166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
53266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
534d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
535990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
536990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
537990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
538990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
539990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
540990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
541990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
542990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
54366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
545e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
546e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
54766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
548e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
54966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
55066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
55166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
552e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
553990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
55466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
55966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
56066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
562990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
563990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
564990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
565990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
566e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
567e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
568f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printSingleFunction(self, f, name):
56966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.common_func_print_just_start(f)
57066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
574f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
5752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
5772eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
5782eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
5792eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
5803d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
5812eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
582f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			xcb_name = 'xcb_glx%s' % convertStringForXCB(name)
58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5842eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
58566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
58966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
59066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
59166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
59466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
59666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
59766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
59866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
5993d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						if xcb_name == "xcb_glx_read_pixels":
60066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
60166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
6022eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
6032eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
60466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
60566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
6062eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6072eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
6083d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
6103d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6113fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
6132636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick					if not output.is_image():
6143d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
6162eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
6173d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6182eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
6212eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
6222eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
6232eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
6242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
6252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
6262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
630e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
631e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
632e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
633e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
634f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name in f.glx_vendorpriv_names:
635f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name))
636e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
6371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
639990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "pc", 0, 0)
640d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
64466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
650d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
651d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
652d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
65466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
655e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
65666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
6693f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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)
6713f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
673d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
67466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
67566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
68566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
69366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
699d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7011fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
7021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
7031fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
7041fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
7051fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
7061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
707f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (name)
7085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
71066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
7115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
712f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
7145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
72266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
72366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
72466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
72566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
72866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
73066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
73166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
73266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
7395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
74166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
7445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
748990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
749990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
750990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
751990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
7525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
7555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
7575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
758990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (opcode)
7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
760990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.pixel_emit_args( f, "gc->pc", 0 )
761990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
762990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
7635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
765990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
766990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
7675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
768990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f, opcode)
769990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.pixel_emit_args(f, "pc", 1)
7705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
771990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
7725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
7745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
7755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
77847719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
77947719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
78047719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
78147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
78247719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
7831d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
78466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
78566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
78666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
78766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
7880246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
796990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
797990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
7981fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
799990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
8001fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
801990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
802990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
803990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
804990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
805990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
807990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name())
808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
809990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "gc->pc", 4, 0)
810990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
811990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
814990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
815990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
8163276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
817990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f)
818990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.common_emit_args(f, "pc", 8, 1)
8191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
821990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string())
822990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '__indirect_glFinish();'
826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
8271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
828990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
83266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
83466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
83566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
83666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
84066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
89566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
89866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
899eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick		for [name, number] in api.categoryIterate():
900eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			if number != None:
901eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %3u. %s */\n\n' % (int(number), name)
902eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			else:
903eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %s */\n\n' % (name)
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
905eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			for func in api.functionIterateByCategory(name):
906eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				if func.client_supported_for_indirect():
907eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					print '%s    glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name)
908eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					preamble = ''
90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
91666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
92116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
92366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
92666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
92816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
931e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
932e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
936c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
9371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
9381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
9391fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9401fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
9411fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
9421fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9431fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
9441fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
9451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
9471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
9481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
9491fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
9501fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9511fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
9521fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
9531fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9541fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
9551fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
9561fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
95716c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
95966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
96066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
961f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			params = func.get_parameter_string()
962f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
963f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params)
964f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
965f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			for n in func.entry_points:
966f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.has_different_protocol(n):
967f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					asdf = func.static_glx_name(n)
968f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					if asdf not in func.static_entry_points:
969f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params)
970f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					else:
971f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params)
972f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
973f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					break
974f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
975e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
977e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
9781fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
9791fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
9801fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
981e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
982e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
983e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
984e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
986e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
987e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
9881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
989e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
990e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
991e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
9921fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
993e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
994e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
995e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
996e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
997e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
998e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
9991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
10001fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
1001e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1002e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
100366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
100566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
1006e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
100766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
1008e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
101266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
101366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
101466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
101566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
1016