glX_proto_send.py revision a02b83115a865a58d3f0d118a6b3ad2922a0ab75
1e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#!/usr/bin/python2
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>
27e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
28e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import saxutils
29e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import make_parser
30e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax.handler import feature_namespaces
31e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
32e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport gl_XML
3374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickimport glX_XML
34e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport license
355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickimport sys, getopt, copy
365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func):
385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Generate a 'unique' key for a pixel function.  The key is based on
395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	the parameters written in the command packet.  This includes any
405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	padding that might be added for the original function and the 'NULL
415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	image' flag."""
425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	[dim, junk, junk, junk, junk] = func.dimensions()
445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	d = (dim + 1) & ~1
465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	h = "%uD%uD_" % (d - 1, d)
475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	for p in func.parameterIterator(1, 1):
495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h = "%s%u" % (h, p.size())
505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.pad_after(p):
525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			h += "4"
535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	if func.image.img_null_flag:
555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		h += "_NF"
565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = func.name.replace("%uD" % (dim), "")
585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	n = "__glx_%s_%uD%uD" % (n, d - 1, d)
595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	return [h, n]
605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickclass glXPixelFunctionUtility(glX_XML.glXFunction):
635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	"""Dummy class used to generate pixel "utility" functions that are
645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	shared by multiple dimension image functions.  For example, these
655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	objects are used to generate shared functions used to send GLX
665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	protocol for TexImage1D and TexImage2D, TexSubImage1D and
675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	TexSubImage2D, etc."""
685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def __init__(self, func, name):
705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The parameters to the utility function are the same as the
715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters to the real function except for the added "pad"
725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.name = name
755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.image = copy.copy(func.image)
765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.fn_parameters = []
775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in gl_XML.glFunction.parameterIterator(func):
785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.fn_parameters.append(p)
795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pad_name = func.pad_after(p)
815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if pad_name:
825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad = copy.copy(p)
835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pad.name = pad_name
845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.fn_parameters.append(pad)
855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.height == None:
885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.height = "height"
895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.image.img_yoff == None:
915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.image.img_yoff = "yoffset"
925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if func.image.depth:
945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.extent == None:
955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.extent = "extent"
965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if self.image.img_woff == None:
985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.image.img_woff = "woffset"
995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.set_return_type( func.fn_return_type )
1025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.glx_rop = ~0
1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.can_be_large = func.can_be_large
1043fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		self.count_parameter_list = func.count_parameter_list
1055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.counter = func.counter
1065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
107e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
10974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto):
110e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
11174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
112e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
1135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
114e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
1155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.pixel_stubs = {}
1161fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		self.debug = 0
117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
123e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
1245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '#include "indirect_size.h"'
125e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
128e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
129c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printFastcall()
130c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printNoinline()
131e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
132990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#if !defined __GNUC__ || __GNUC__ < 3'
133990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#  define __builtin_expect(x, y) x'
134990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '#endif'
135990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print ''
136e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static NOINLINE CARD32
145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickread_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
151a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        if ((reply.length > 0) || reply_is_always_array) {
152a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint bytes = (reply_is_always_array)
153a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick              ? (4 * reply.length) : (reply.size * size);
154a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            const GLint extra = 4 - (bytes & 3);
155a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick
156a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            _XRead(dpy, dest, bytes);
157a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            if ( extra < 4 ) {
158a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick                _XEatData(dpy, extra);
159a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            }
160a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
161a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        else {
162a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick            (void) memcpy( dest, &(reply.pad3), size);
163a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick        }
164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
171990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte *
172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen )
173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
185e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte *
187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
2035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero                        (__glXDefaultPixelStore+0)
2055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one                         (__glXDefaultPixelStore+8)
2065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
2075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20
2085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
2095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20
2105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
2115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36
2125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
2135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36
214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
2213fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if f.client_handcode: return
222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_rop != 0 or f.vectorequiv != None:
2245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.image:
2255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printPixelFunction(f)
2265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.printRenderFunction(f)
228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif f.glx_sop != 0 or f.glx_vendorpriv != 0:
229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printSingleFunction(f)
230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "/* Missing GLX protocol for %s. */" % (f.name)
232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
2343385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick		size = (n + 3) & ~3
235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
244990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
2463385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size)
247e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
248e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_one_arg(self, p, offset, pc, indent, adjust):
250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		t = p.p_type
251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			% (indent, pc, offset + adjust, src_ptr, p.size_string() )
258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		offset = 0
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if skip_vla:
2631d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 1
264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
2651d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 2
266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2671d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		for p in f.parameterIterator(1, r):
2681d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
2691d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			offset += p.size()
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return offset
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
2745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def pixel_emit_args(self, f, pc, indent, adjust, dim, large):
2755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""Emit the arguments for a pixel function.  This differs from
2765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		common_emit_args in that pixel functions may require padding
2775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted (i.e., for the missing width field for
2785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		TexImage1D), and they may also require a 'NULL image' flag
2795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		be inserted before the image data."""
2805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = 0
2825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		for p in f.parameterIterator(1, 1):
2835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
2845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += p.size()
2855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if f.pad_after(p):
2875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
2885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset += 4
2895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_null_flag:
2915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if large:
2925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust)
2935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			else:
2945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name)
2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset += 4
2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return offset
2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def large_emit_begin(self, indent, f, op_name = None):
3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if not op_name:
3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			op_name = f.opcode_real_name()
3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    const GLint op = %s;' % (indent, op_name)
3063276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    const GLuint cmdlenLarge = cmdlen + 4;' % (indent)
3073276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
3083276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent)
3093276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		print '%s    (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent)
3103276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick		return
3113276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
3123276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_just_header(self, f):
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define %s %d' % (f.opcode_name(), f.opcode_value())
315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s' % (f.fn_return_type)
317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string())
318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '{'
319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
320e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_just_start(self, f):
322e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
323990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
324990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# The only reason that single and vendor private commands need
325990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# a variable called 'dpy' is becuase they use the SyncHandle
326990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# macro.  For whatever brain-dead reason, that macro is hard-
327990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# coded to use a variable called 'dpy' instead of taking a
328990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		# parameter.
329990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
330990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if not f.glx_rop:
331990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    Display * const dpy = gc->currentDpy;'
332990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "dpy != NULL"
333990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		elif f.can_be_large:
334990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = "gc->currentDpy != NULL"
335990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
336990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			skip_condition = None
337990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
338990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
339e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_return_type != 'void':
340e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type)
341e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3423fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick		if not f.output_parameter():
3433fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			compsize = self.size_call( f )
3443fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick			if compsize:
3453fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick				print '    const GLuint compsize = %s;' % (compsize)
346e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
347e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    const GLuint cmdlen = %s;' % (f.command_length())
348e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
349990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.counter:
350990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			if skip_condition:
351990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition)
352990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			else:
353990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick				skip_condition = "%s >= 0" % (f.counter)
354e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
355e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
356990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if skip_condition:
357990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '    if (__builtin_expect(%s, 1)) {' % (skip_condition)
358990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 1
359990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		else:
360990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			return 0
361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def common_func_print_header(self, f):
3645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		self.common_func_print_just_header(f)
3655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return self.common_func_print_just_start(f)
3665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
3685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
369e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
370e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
371e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
3731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
3741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_parameters != []:
376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
378e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
380e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
381e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
384e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.output != None:
389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = f.output.p_type.size
390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = f.output.name
391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = 0
393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = "NULL"
394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.fn_return_type != 'void':
396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " retval = (%s)" % (f.fn_return_type)
397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " (void)"
399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.reply_always_array:
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_TRUE"
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_FALSE"
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
405990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print "       %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
4061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif self.debug:
4071fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# Only emit the extra glFinish call for functions
4081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			# that don't already require a reply from the server.
4091fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        __indirect_glFinish();'
4101fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
4111fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
4121fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
4131fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
415990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '        UnlockDisplay(dpy); SyncHandle();'
416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    }'
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    %s' % f.return_string()
418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
4235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick	def printPixelFunction(self, f):
4245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		"""This function could use some major refactoring. :("""
4255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# There is a code-space optimization that we can do here.
4275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# Functions that are marked img_pad_dimensions have a version
4285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# with an odd number of dimensions and an even number of
4295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# dimensions.  TexSubImage1D and TexSubImage2D are examples.
4305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# We can emit a single function that does both, and have the
4315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# real functions call the utility function with the correct
4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# parameters.
4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		#
4345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# The only quirk to this is that utility funcitons will be
4355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generated for 3D and 4D functions, but 4D (e.g.,
4365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# GL_SGIS_texture4D) isn't typically supported.  This is
4375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# probably not an issue.  However, it would be possible to
4385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# look at the total set of functions and determine if there
4395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# is another function that would actually use the utility
4405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# function.  If not, then fallback to the normal way of
4415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		# generating code.
4425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_pad_dimensions:
4445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Determine the hash key and the name for the utility
4455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function that is used to implement the real
4465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# function.
4475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[h, n] = hash_pixel_function(f)
4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# If the utility function is not yet known, generate
4525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# it.
4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			if not self.pixel_stubs.has_key(h):
4555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				self.pixel_stubs[h] = n
4565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixel_func = glXPixelFunctionUtility(f, n)
4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print 'static void'
4595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string())
4605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '{'
4615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if self.common_func_print_just_start(pixel_func):
4635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = "    "
4645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = "    }"
4655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent = ""
4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					trailer = None
4685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.can_be_large:
4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
4725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
4735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
4745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s        }' % (indent)
4755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					indent += "    "
4765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				[dim, width, height, depth, extent] = pixel_func.dimensions()
4780246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				adjust = pixel_func.offset_of_first_parameter() + 4
4795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    emit_header(gc->pc, opcode, cmdlen);' % (indent)
4815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4840246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				s = pixel_func.command_fixed_length()
4855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pixHeaderPtr = "gc->pc + 4"
4875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				pcPtr = "gc->pc + %u" % (s + 4)
4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if pixel_func.image.img_send_null:
4905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = '(compsize > 0) && (%s != NULL)' % (pixel_func.image.name)
4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				else:
4925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					condition = 'compsize > 0'
4935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
4945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (%s) {' % (indent, condition)
4955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (*gc->fillImage)(gc, dim, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, width, height, depth, pixel_func.image.img_format, pixel_func.image.img_type, pixel_func.image.name, pcPtr, pixHeaderPtr)
4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
4975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    else {' % (indent)
4985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    }' % (indent)
5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    gc->pc += cmdlen;' % (indent)
5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.can_be_large:
5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					adjust += 4
5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%selse {' % (indent)
5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					self.large_emit_begin(indent, pixel_func, "opcode")
5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					offset = self.pixel_emit_args(pixel_func, "pc", indent, adjust, dim, 1)
5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pixHeaderPtr = "pc + 8"
5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					pcPtr = "pc + %u" % (s + 8)
5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s    __glXSendLargeImage(gc, compsize, dim, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
5175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					print '%s}' % (indent)
5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if trailer: print trailer
5215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print '}'
5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				print ''
5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# Generate the real function as a call to the
5275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			# utility function.
5285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.common_func_print_just_header(f)
5305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			[dim, junk, junk, junk, junk] = f.dimensions()
5325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			p_string = ""
5345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			for p in gl_XML.glFunction.parameterIterator(f):
5355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				p_string += ", " + p.name
5365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick				if f.pad_after(p):
5385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick					p_string += ", 1"
5395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '    %s(%s, %u%s );' % (n, f.opcode_name(), dim, p_string)
5415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '}'
5425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print ''
5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			return
5445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if self.common_func_print_header(f):
5475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = "    "
5485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = "    }"
5495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
5505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent = ""
5515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			trailer = None
5525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
5555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
5565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
5575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
5585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s        }' % (indent)
5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			indent += "    "
5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		[dim, width, height, depth, extent] = f.dimensions()
5620246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		adjust = f.offset_of_first_parameter() + 4
5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5680246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick		s = f.command_fixed_length()
5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pixHeaderPtr = "gc->pc + 4"
5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		pcPtr = "gc->pc + %u" % (s + 4)
5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.image.img_send_null:
5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = '(compsize > 0) && (%s != NULL)' % (f.image.name)
5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		else:
5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			condition = 'compsize > 0'
5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (%s) {' % (indent, condition)
5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (*gc->fillImage)(gc, %u, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
5805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    else {' % (indent)
5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s        (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim)
5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    }' % (indent)
5845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if f.can_be_large:
5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			adjust += 4
5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%selse {' % (indent)
5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			self.large_emit_begin(indent, f)
5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1)
5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
5975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pixHeaderPtr = "pc + 8"
5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			pcPtr = "pc + %u" % (s + 8)
5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s    __glXSendLargeImage(gc, compsize, %u, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim, width, height, depth, f.image.img_format, f.image.img_type, f.image.name, pcPtr, pixHeaderPtr)
6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick			print '%s}' % (indent)
6035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		if trailer: print trailer
6055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print '}'
6065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		print ''
6075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick		return
6085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
6095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick
610e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
61147719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
61247719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
61347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
61447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
61547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
6161d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
61747719fda0c2fba13c81e84e33523d5489263182eIan Romanick
618e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.fn_parameters[0]
620e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if p.is_pointer:
6210246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick				cmdlen = f.command_fixed_length()
622e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
623e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					self.common_func_print_just_header(f)
624e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '}'
626e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print ''
627e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
628e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
629990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if self.common_func_print_header(f):
630e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
631990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = "    }"
632e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
633e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
634990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			trailer = None
635990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick
6361fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
6371fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
6381fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
639990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if f.can_be_large:
640990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
641990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
642990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s            (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent)
643990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s        }' % (indent)
644990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			indent += "    "
645e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
646e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
647e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
648e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
649e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
650990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		print '%s    if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
651e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
652e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
653990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
654990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%selse {' % (indent)
6553276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick
6563276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick			self.large_emit_begin(indent, f)
657990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			offset = self.common_emit_args(f, "pc", indent, 8, 1)
6581fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
660990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string())
661990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick			print '%s}' % (indent)
662e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
6631fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		if self.debug:
6641fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    __indirect_glFinish();' % (indent)
6651fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
6661fca5632325e1da42e278909e404dd57e0a62252Ian Romanick
667990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick		if trailer: print trailer
668e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
669e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
670e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
671e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
672e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
67374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto):
674e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
67574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
676e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
677e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
680e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
681e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
684e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
685e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
689e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
693e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
695e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
697e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
699e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
703e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
704e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
705e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
706e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
707e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
709e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
714e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
717e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
718e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
719e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
721e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
722e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
724e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
726e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
728e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
729e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
730e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
732e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
733e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
734e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
735e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
736e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.category != self.last_category:
737e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.last_category = f.category
738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
739e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    /* %s */' % (self.last_category)
740e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
741e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    glAPI->%s = __indirect_gl%s;' % (f.name, f.name)
743e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
74574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto):
746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
74774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
748e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
75216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		self.header_tag = "_INDIRECT_H_"
753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
75516c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick		print """/**
756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
763c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick		self.printVisibility( "HIDDEN", "hidden" )
76416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick
765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string())
768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
7711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
7721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
7731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	print "    -d               Enable extra debug information in the generated code."
774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
7811fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
7851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	debug = 0
786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
7921fca5632325e1da42e278909e404dd57e0a62252Ian Romanick		elif arg == "-d":
7931fca5632325e1da42e278909e404dd57e0a62252Ian Romanick			debug = 1
794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoStubs()
797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_c()
799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_h()
801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser = make_parser()
805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setFeature(feature_namespaces, 0)
806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setContentHandler(dh)
807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	f = open(file_name)
809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
8101fca5632325e1da42e278909e404dd57e0a62252Ian Romanick	dh.debug = debug
811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printHeader()
812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.parse(f)
813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printFooter()
814