glX_proto_send.py revision f5dffb7e36487ff8a012725aaf78a4b7d3169102
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
353e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		self.printGetProcAddress(api)
354e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		return
355e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
356e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu	def printGetProcAddress(self, api):
357e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		procs = {}
358e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		for func in api.functionIterateGlx():
359e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu			for n in func.entry_points:
360e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu				if func.has_different_protocol(n):
361e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu					procs[n] = func.static_glx_name(n)
362e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
363e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		print """
364027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner#ifdef GLX_SHARED_GLAPI
365027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner
366e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wustatic const struct proc_pair
367e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{
368e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   const char *name;
369e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   _glapi_proc proc;
370e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu} proc_pairs[%d] = {""" % len(procs)
371e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		names = procs.keys()
372e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		names.sort()
373e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		for i in xrange(len(names)):
374e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu			comma = ',' if i < len(names) - 1 else ''
375e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu			print '   { "%s", (_glapi_proc) gl%s }%s' % (names[i], procs[names[i]], comma)
376e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		print """};
377e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
378e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wustatic int
379e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu__indirect_get_proc_compare(const void *key, const void *memb)
380e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{
381e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   const struct proc_pair *pair = (const struct proc_pair *) memb;
382e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   return strcmp((const char *) key, pair->name);
383e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu}
384e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
385e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu_glapi_proc
386e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu__indirect_get_proc_address(const char *name)
387e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{
388e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   const struct proc_pair *pair;
389e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
390e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   /* skip "gl" */
391e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   name += 2;
392e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
393e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   pair = (const struct proc_pair *) bsearch((const void *) name,
394e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      (const void *) proc_pairs, ARRAY_SIZE(proc_pairs), sizeof(proc_pairs[0]),
395e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      __indirect_get_proc_compare);
396e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu
397e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu   return (pair) ? pair->proc : NULL;
398e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu}
399027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner
400027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner#endif /* GLX_SHARED_GLAPI */
401e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu"""
40266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
40466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
405f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printFunction(self, func, name):
406f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		footer = '}\n'
40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop == ~0:
40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'static %s' % (func.return_type)
40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
410f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '{'
41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
412f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			if func.has_different_protocol(name):
413f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.return_type == "void":
414f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = ''
415f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				else:
416f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					ret_string = "return "
417f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
418f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				func_name = func.static_glx_name(name)
419f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv)
420f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string())
421f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
422c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg				print '    struct glx_context * const gc = __glXGetCurrentContext();'
423f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print ''
424903986ca128d51ff031cc9eafa1976618834a8deBrian Paul				print '#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)'
425c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg				print '    if (gc->isDirect) {'
426b5022ad03584f119b27c143b53e7ed80e8c12ffbChia-I Wu				print '    %sGET_DISPATCH()->%s(%s);' % (ret_string, func.name, func.get_called_parameter_string())
427c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '    } else'
428c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '#endif'
429c428f467b65f1b79f77103db249936273d645fecIan Romanick				print '    {'
430c428f467b65f1b79f77103db249936273d645fecIan Romanick
431f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				footer = '}\n}\n'
432f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			else:
433f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '#define %s %d' % (func.opcode_name(), func.opcode_value())
43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
435f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string())
436f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				print '{'
43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
4425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
445f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			self.printSingleFunction(func, name)
44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
448f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print "/* Missing GLX protocol for %s. */" % (name)
44966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
450f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		print footer
45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
453e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
4553385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
456e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
457e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
458e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
459c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * const gc = __glXGetCurrentContext();
460e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
461e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
462e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
463e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
464e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
465990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
466e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
4673385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
469e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
470e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
471990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_one_arg(self, p, pc, adjust, extra_offset):
472e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
474e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
475e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
476e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4770f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		if p.is_padding:
4780f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			print '(void) memset((void *)(%s + %u), 0, %s);' \
4790f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick			    % (pc, p.offset + adjust, p.size_string() )
4800f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick		elif not extra_offset:
481990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
482990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, src_ptr, p.size_string() )
48366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
484990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
485990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			    % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
487990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def common_emit_args(self, f, pc, adjust, skip_vla):
48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
489e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
491d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
492990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(p, pc, adjust, extra_offset)
49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
500e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
50166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
502e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
503e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
504990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def pixel_emit_args(self, f, pc, large):
5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
51266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
518990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick				self.common_emit_one_arg(param, pc, adjust, None)
5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
52066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
521990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust)
5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
52966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5300f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
5310f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					print '(void) memset((void *)(%s + %u), 0, %s);' \
5320f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					% (pc, (param.offset - 4) + adjust, param.size_string() )
5330f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
53566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
536990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust)
53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
538990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick						print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name)
53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
54266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
54566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
54666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
54766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
54866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
54966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
550990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print 'if (%s) {' % (condition)
551990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
552990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '} else {'
553990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '    (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim)
554990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick					print '}'
55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
556990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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)
55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
561990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick	def large_emit_begin(self, f, op_name = None):
5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
565990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLint op = %s;' % (op_name)
566990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'const GLuint cmdlenLarge = cmdlen + 4;'
567990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);'
568990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);'
569990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);'
5703276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
5713276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
5723276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
573d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer	def common_func_print_just_start(self, f, name):
574c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg		print '    struct glx_context * const gc = __glXGetCurrentContext();'
57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
576990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
577990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
578990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
579990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
580990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
581990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
58266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
58566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
589990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
59066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
591d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer				if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"):
59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
594d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
595990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
596990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
597990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
598990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
599990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
600990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
601990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
602990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
60366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
60466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
606e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
607d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
608d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#ifndef USE_XCB'
60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
610d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if name != None and name not in f.glx_vendorpriv_names:
611d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer			print '#endif'
612e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
616a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			# 'counter' parameters cannot be negative
617a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    if (%s < 0) {" % p.name
618a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "        __glXSetError(gc, GL_INVALID_VALUE);"
619a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			if f.return_type != 'void':
620a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return 0;"
621a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			else:
622a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian				print "        return;"
623a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian			print "    }"
624e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
625990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
634990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
635990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
636990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
637990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
639e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
640f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick	def printSingleFunction(self, f, name):
641d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		self.common_func_print_just_start(f, name)
64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6431fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
6441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
646f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
6472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
6492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
6502eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
6512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
6523d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
6532eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
654f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			xcb_name = 'xcb_glx%s' % convertStringForXCB(name)
65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
6562eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
6713d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						if xcb_name == "xcb_glx_read_pixels":
67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
67366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
6742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
6752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
6782eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6792eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
6803d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
6823d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6833fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb
68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
6852636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick					if not output.is_image():
6863d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
6882eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
6893d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6911fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
6932eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
6942eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
6952eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
6962eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
6972eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
6982eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
703e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
704e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
705e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
706f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name in f.glx_vendorpriv_names:
707f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name))
708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
7091fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
711990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "pc", 0, 0)
712d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
71866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
71966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
722d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
723d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
724d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
72666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
72866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
73066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
73266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
73366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
73466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
73566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
73666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
73866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
7413f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
74266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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)
7433f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
745d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
74766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
74866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
74966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
75166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
75266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
75766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
75866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
75966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
76166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
76266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
76366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
76466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
76566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
76666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
76766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
76866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
76966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
77066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
771d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
7741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
7751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
7761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
7771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
7781fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
779f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (name)
7805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
78266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
7835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
784f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick		if name not in f.glx_vendorpriv_names:
78566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
7865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
78766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
78866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
78966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
7905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
79266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
79466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
79566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
79666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
79766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
7985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
80066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
8010f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick				if param.is_padding:
8020f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					continue
8030f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
80466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
80566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
80666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
8085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
80966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
8105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
8115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
8135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
8145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
816d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
8175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
8185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
8195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
8205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
823990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
824990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
8275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
82866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
82966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
8305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
83166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
8325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
833990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (opcode)
8345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
835990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.pixel_emit_args( f, "gc->pc", 0 )
836990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
837990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
8385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
840990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
841990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
8425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
843990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f, opcode)
844990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.pixel_emit_args(f, "pc", 1)
8455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
846990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
8475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
8495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
8505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
8515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
85347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
85447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
85547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
85647719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
85747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
8581d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
85966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
86066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
86166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
86266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
8630246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
868d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer		if self.common_func_print_just_start(f, None):
869990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
871990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
872990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
8731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
874990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
8751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
876990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
877990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {'
878990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    if ( (gc->pc + cmdlen) > gc->bufEnd ) {'
879990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
880990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    }'
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
882990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name())
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
884990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		self.common_emit_args(f, "gc->pc", 4, 0)
885990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'gc->pc += cmdlen;'
886990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick		print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }'
887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
889990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
890990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'else {'
8913276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
892990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.large_emit_begin(f)
893990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			self.common_emit_args(f, "pc", 8, 1)
8941fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
896990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string())
897990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '}'
898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
900990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print '__indirect_glFinish();'
901990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick			print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
9021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
903990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
90766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
924e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
925e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
926e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
928e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
931f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick#include <assert.h>
932e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
936e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
937e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
938e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
939e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
940e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
942e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
943e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
944e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
946e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
947699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieristruct _glapi_table * __glXNewIndirectAPI( void )
948e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
949f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    _glapi_proc *table;
950f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    unsigned entries;
951f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    unsigned i;
952f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    int o;
953e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
954e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
955f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    table = (_glapi_proc *) Xmalloc(entries * sizeof(_glapi_proc));
956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
958f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    for (i = 0; i < entries; i++) {
959f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick       table[i] = (_glapi_proc) NoOp;
960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
964e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
965e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
966f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick    return (struct _glapi_table *) table;
967e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
968e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
96966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
970e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
97266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
973eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick		for [name, number] in api.categoryIterate():
974eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			if number != None:
975f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick				preamble = '\n    /* %3u. %s */\n' % (int(number), name)
976eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			else:
977f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick				preamble = '\n    /* %s */\n' % (name)
978e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
979eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			for func in api.functionIterateByCategory(name):
980eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				if func.client_supported_for_indirect():
981f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick					if preamble:
982f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						print preamble
983f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						preamble = None
984f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick
985f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick					if func.is_abi():
986f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						print '    table[{offset}] = (_glapi_proc) __indirect_gl{name};'.format(name = func.name, offset = func.offset)
987f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick					else:
988f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						print '    o = _glapi_get_proc_offset("gl{0}");'.format(func.name)
989f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						print '    assert(o > 0);'
990f5dffb7e36487ff8a012725aaf78a4b7d3169102Ian Romanick						print '    table[o] = (_glapi_proc) __indirect_gl{0};'.format(func.name)
99166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
99266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
99366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
99466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
99566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
996e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
99766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
99866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
99966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
1000e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
1001e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
1002e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
100316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
100566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
100666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
100766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
100866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
101016c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
1015e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
1016e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
1017e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
10181fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
10191fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
10201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
10211fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
10220c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick#include <X11/Xfuncproto.h>
10231fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
10241fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
10250c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanickextern _X_HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
10261fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
10271fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
10280c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanickextern _X_HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
1029c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, unsigned max_dim, GLint width, GLint height,
10301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
10311fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
10321fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
10330c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanickextern _X_HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
1034c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, GLint sop, GLint cmdlen );
10351fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
10360c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanickextern _X_HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
1037c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    struct glx_context * gc, GLint code, GLint vop, GLint cmdlen );
10381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
103916c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
1040e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
104166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
104266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
1043f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			params = func.get_parameter_string()
1044f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
10450c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick			print 'extern _X_HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params)
1046f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
1047f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick			for n in func.entry_points:
1048f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick				if func.has_different_protocol(n):
1049f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					asdf = func.static_glx_name(n)
1050f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					if asdf not in func.static_entry_points:
10510c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick						print 'extern _X_HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params)
1052e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu						# give it a easy-to-remember name
1053e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu						if func.client_handcode:
1054e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu							print '#define gl_dispatch_stub_%s gl%s' % (n, asdf)
1055f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					else:
1056f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick						print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params)
1057f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
1058f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick					break
1059f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick
1060e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu		print ''
1061027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner		print '#ifdef GLX_SHARED_GLAPI'
10620c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick		print 'extern _X_HIDDEN void (*__indirect_get_proc_address(const char *name))(void);'
1063027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner		print '#endif'
1064e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1065e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1066e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
10671fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
10681fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
10691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
1070e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
1071e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1072e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1073e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
1074e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
1075e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1076e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
10771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
1078e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
1079e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1080e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10811fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
1082e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
1083e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
1084e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
1085e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
1086e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
1087e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
10881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
10891fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
1090e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1091e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
109266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
1093e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
109466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
1095e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
109666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
1097e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
1098e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
1099e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1100e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
110166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
110266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
110366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
110466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
1105