glX_proto_send.py revision eaeaaf6205b304be290f2f869b3d224c318be749
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"'
169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
1702eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#ifdef USE_XCB'
1712eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#include <X11/xcl.h>'
1723d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/xcb.h>'
1733d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb		print '#include <xcb/glx.h>'
1742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul		print '#endif /* USE_XCB */'
17566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
179c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
180c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
182990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
183990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
184990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
1941fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """NOINLINE CARD32
1951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
201a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
202a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
203a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2191fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void
2201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
221d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
222d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    void * dest, GLboolean dimensions_in_reply )
223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{
224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    xGLXSingleReply reply;
225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    GLint size;
226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if ( dimensions_in_reply ) {
230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        width  = reply.pad3;
231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        height = reply.pad4;
232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        depth  = reply.pad5;
233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((height == 0) || (max_dim < 2)) { height = 1; }
235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick	if ((depth  == 0) || (max_dim < 3)) { depth  = 1; }
236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    size = reply.length * 4;
239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    if (size != 0) {
240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        void * buf = Xmalloc( size );
241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        if ( buf == NULL ) {
243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XEatData(dpy, size);
244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glXSetError(gc, GL_OUT_OF_MEMORY);
245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        else {
247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            const GLint extra = 4 - (size & 3);
248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            _XRead(dpy, buf, size);
250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            if ( extra < 4 ) {
251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                _XEatData(dpy, extra);
252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            }
253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            __glEmptyImage(gc, 3, width, height, depth, format, type,
255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick                           buf, dest);
256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick            Xfree(buf);
257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick        }
258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick    }
259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick}
260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2631fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2641fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen )
265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2781fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte *
2791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
306e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
31366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
31466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_stubs = {}
31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		generated_stubs = []
31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.client_handcode: continue
32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If the function is a pixel function with a certain
32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# GLX protocol signature, create a fake stub function
32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# for it.  For example, create a single stub function
32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# that is used to implement both glTexImage1D and
32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage2D.
32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if func.glx_rop != 0:
32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				do_it = 0
32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				for image in func.get_images():
33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if image.img_pad_dimensions:
33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						do_it = 1
33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						break
33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if do_it:
33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[h, n] = hash_pixel_function(func)
33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					self.pixel_stubs[ func.name ] = n
34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if h not in generated_stubs:
34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						generated_stubs.append(h)
34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						fake_func = glx_pixel_function_stub( func, n )
34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						self.printFunction( fake_func )
34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.printFunction( func )
34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printFunction(self, func):
35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop == ~0:
35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'static %s' % (func.return_type)
35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#define %s %d' % (func.opcode_name(), func.opcode_value())
35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s' % (func.return_type)
36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '__indirect_gl%s(%s)' % (func.name, func.get_parameter_string())
36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '{'
36466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
36666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if func.glx_rop != 0 or func.vectorequiv != None:
36766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len(func.images):
36866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printPixelFunction(func)
3695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
37066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.printRenderFunction(func)
37166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
37266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.printSingleFunction(func)
37366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			pass
374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
37566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print "/* Missing GLX protocol for %s. */" % (func.name)
37666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
37766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '}'
37866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print ''
37966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
38066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
3843385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
394990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
3963385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
39766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def common_emit_one_arg(self, p, pc, indent, adjust, extra_offset):
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
40666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if not extra_offset:
40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			    % (indent, pc, p.offset + adjust, src_ptr, p.size_string() )
40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
41066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    (void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \
41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			    % (indent, pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() )
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
41466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		extra_offset = None
415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
41666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateGlxSend( not skip_vla ):
417d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick			if p.name != f.img_reset:
41866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.common_emit_one_arg(p, pc, indent, adjust, extra_offset)
41966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
42066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_variable_length():
42166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					temp = p.size_string()
42266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if extra_offset:
42366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset += " + %s" % (temp)
42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
42566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						extra_offset = temp
426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
428e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
43066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def pixel_emit_args(self, f, pc, indent, large):
4315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
4345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
4355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
4365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if large:
43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 8
43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		else:
44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			adjust = 4
44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for param in f.parameterIterateGlxSend():
44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not param.is_image():
44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				self.common_emit_one_arg(param, pc, indent, adjust, None)
4455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset + param.size()) + adjust)
4485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				[dim, width, height, depth, extent] = param.get_dimensions()
45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.glx_rop == ~0:
45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = "dim"
45366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
45466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					dim_str = str(dim)
45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.img_null_flag:
45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if large:
45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset - 4) + adjust)
45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, (param.offset - 4) + adjust, param.name)
46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pixHeaderPtr = "%s + %u" % (pc, adjust)
46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				pcPtr = "%s + %u" % (pc, param.offset + adjust)
4655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
46666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if not large:
46766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if param.img_send_null:
46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = '(compsize > 0) && (%s != NULL)' % (param.name)
46966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
47066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						condition = 'compsize > 0'
47166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    if (%s) {' % (indent, condition)
47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s        (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    }' % (indent)
47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    else {' % (indent)
47666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    }' % (indent)
47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '%s    __glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr)
48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
4825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
4855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
4865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
4875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
4893276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
4903276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
4913276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
4923276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
4933276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
4943276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
4953276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
497e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
499990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
500990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
501990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
502990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
503990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
504990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
50566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME Simplify the logic related to skip_condition and
50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition_list in this function.  Basically, remove
50766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME skip_condition, and just append the "dpy != NULL" type
50866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME condition to condition_list from the start.  The only
50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME reason it's done in this confusing way now is to
51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		# FIXME minimize the diffs in the generated code.
51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
512990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '    const __GLXattribute * const state = gc->client_state_private;'
51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					break
517d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
518990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
519990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
521990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
522990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
523990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
524990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
525990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.return_type != 'void':
52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
528e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
529e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
53066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.emit_packet_size_calculation(f, 0)
531e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
53266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		condition_list = []
53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for p in f.parameterIterateCounters():
53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( "%s >= 0" % (p.name) )
535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
536990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			condition_list.append( skip_condition )
53866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if len( condition_list ) > 0:
54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if len( condition_list ) > 1:
54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "(%s)" % (string.join( condition_list, ") && (" ))
54266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			else:
54366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				skip_condition = "%s" % (condition_list.pop(0))
54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
545990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
546990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
547990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
548990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
549e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
550e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
551e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
55266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.common_func_print_just_start(f)
55366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5541fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
5551fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
557af1a72997224610420b1105f967b0f5a8272858dBrian Paul		if f.glx_vendorpriv == 0:
5582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5592eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# XCB specific:
5602eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#ifdef USE_XCB'
5612eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if self.debug:
5622eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        printf("\\tUsing XCB.\\n");'
5633d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
5642eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
5653d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb			xcb_name = 'xcb_glx%s' % convertStringForXCB(f.name)
56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
5672eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			iparams=[]
56866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			extra_iparams = []
56966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			output = None
57066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterator():
57166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_output:
57266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					output = p
57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
57466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if p.is_image():
57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP":
57666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("state->storePack.swapEndian")
57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						else:
57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
58066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# Hardcode this in.  lsb_first param (apparently always GL_FALSE)
58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						# also present in GetPolygonStipple, but taken care of above.
5823d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						if xcb_name == "xcb_glx_read_pixels":
58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick							extra_iparams.append("0")
58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				else:
5852eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					iparams.append(p.name)
5862eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams))
5892eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
5902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			if f.needs_reply():
5913d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if output and f.reply_always_array:
5933d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
5943fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb
59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				elif output and not f.reply_always_array:
5962636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick					if not output.is_image():
5973d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
59866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
5992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul						print '        else'
6003d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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())
6012eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul
6021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
60366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.return_type != 'void':
6042eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul					print '        retval = reply->ret_val;'
6052eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        free(reply);'
6062eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			else:
6072eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul				print '        ' + xcb_request + ';'
6082eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			print '#else'
6092eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul			# End of XCB specific.
61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.parameters != []:
613e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
614e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
615e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
616e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
617e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
6181fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
6201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick			print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
622e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
623d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		images = f.get_images()
62566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for img in images:
62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if img.is_output:
62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				o = f.command_fixed_length() - 4
62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print '        *(int32_t *)(pc + %u) = 0;' % (o)
63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP":
63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print '        * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
633d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				if f.img_reset:
634d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick					print '        * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
635d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
636e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
63766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return_name = ''
638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
63966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if f.return_type != 'void':
64066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_name = " retval"
64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " retval = (%s)" % (f.return_type)
642e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				return_str = " (void)"
64466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			got_reply = 0
64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for p in f.parameterIterateOutputs():
64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if p.is_image():
64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, w, h, d, junk] = p.get_dimensions()
65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.dimensions_in_reply:
65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						print "        __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name)
6523f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick					else:
65366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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)
6543f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick
65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
656d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick				else:
65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					if f.reply_always_array:
65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_TRUE"
65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					else:
66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick						aa = "GL_FALSE"
661e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# gl_parameter.size() returns the size
66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# of the entire data item.  If the
66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# item is a fixed-size array, this is
66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# the size of the whole array.  This
66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# is not what __glXReadReply wants. It
66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# wants the size of a single data
66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# element in the reply packet.
66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# Dividing by the array size (1 for
67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					# non-arrays) gives us this.
671e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					s = p.size() / p.get_element_count()
67366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					print "       %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa)
67466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					got_reply = 1
67566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# If a reply wasn't read to fill an output parameter,
67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# read a NULL reply to get the return value.
67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if not got_reply:
68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				print "       %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str)
682d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick
683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
6841fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
6851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
6861fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
6871fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
6881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
6891fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
6901fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
6915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
69366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
6945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_vendorpriv == 0:
69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '#endif /* USE_XCB */'
6975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    }'
69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '    return%s;' % (return_name)
70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
7015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printPixelFunction(self, f):
70466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.pixel_stubs.has_key( f.name ):
70566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# Normally gl_function::get_parameter_string could be
70666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# used.  However, this call needs to have the missing
70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# dimensions (e.g., a fake height value for
70866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			# glTexImage1D) added in.
7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
71166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			for param in f.parameterIterateGlxSend():
71266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				p_string += ", " + param.name
71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if param.is_image():
71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick					[dim, junk, junk, junk, junk] = param.get_dimensions()
7165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick				if f.pad_after(param):
7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '    %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string)
7215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
7225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
72466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
7255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
7275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
7295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
7305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
7375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.glx_rop == ~0:
74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = "opcode"
7415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
74266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			opcode = f.opcode_real_name()
7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, opcode)
7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.pixel_emit_args( f, "gc->pc", indent, 0 )
7475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
7485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
7495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
7515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
7535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.large_emit_begin(indent, f, opcode)
75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.pixel_emit_args( f, "pc", indent, 1 )
7565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
7585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
7605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
7615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
7625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
76447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
76547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
76647719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
76747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
76847719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
7691d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
77066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
77166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if f.variable_length_parameter() == None and len(f.parameters) == 1:
77266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			p = f.parameters[0]
77366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			if p.is_pointer():
7740246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
77966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		if self.common_func_print_just_start(f):
780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
781990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
784990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
785990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
7861fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
7871fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
7881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
789990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
790990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
791990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
792990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
793990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
800990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
803990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
804990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
8053276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
8063276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			self.common_emit_args(f, "pc", indent, 8, 1)
8081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
81066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, p.offset + 8, p.name, p.size_string())
811990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8131fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
8141fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    __indirect_glFinish();' % (indent)
8151fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
8161fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
817990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
82166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base):
822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
82366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
82466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
82566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
82966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
88466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
88766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
888eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick		for [name, number] in api.categoryIterate():
889eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			if number != None:
890eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %3u. %s */\n\n' % (int(number), name)
891eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			else:
892eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				preamble = '\n    /* %s */\n\n' % (name)
893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
894eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick			for func in api.functionIterateByCategory(name):
895eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick				if func.client_supported_for_indirect():
896eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					print '%s    glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name)
897eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick					preamble = ''
89866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
89966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
90066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
90166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
90266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base):
903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
90466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
90566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
90666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.name = "glX_proto_send.py (from Mesa)"
907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
91016c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.last_category = ""
91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		return
91466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
91716c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
924e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
925c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
9261fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printFastcall()
9271fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		self.printNoinline()
9281fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9291fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick		print """
9301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h"
9311fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9321fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size,
9331fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    void * dest, GLboolean reply_is_always_array );
9341fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9351fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy,
9361fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, unsigned max_dim, GLint width, GLint height,
9371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLint depth, GLenum format, GLenum type, void * dest,
9381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    GLboolean dimensions_in_reply );
9391fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9401fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest(
9411fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint sop, GLint cmdlen );
9421fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick
9431fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
9441fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick    __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen );
9451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick"""
94616c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
947e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
94866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def printBody(self, api):
94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for func in api.functionIterateGlx():
95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, func.get_parameter_string())
951e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
952e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
953e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
9541fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
9551fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
9561fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
9641fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
965e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
966e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
967e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
9681fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
969e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
970e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
973e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
974e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
9751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
9761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
977e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
978e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
97966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoStubs()
980e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
98166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_c()
982e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
98366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		printer = PrintGlxProtoInit_h()
984e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
986e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
987e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
98866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.debug = debug
98966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() )
99066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
99166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer.Print( api )
992