glX_proto_send.py revision 1d27084043855d2609b54d3435f0bd85e39762e2
1e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#!/usr/bin/python2
2e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# (C) Copyright IBM Corporation 2004
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
35e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport sys, getopt
36e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
37e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
3874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto):
39e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
4074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
41e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
42e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
43e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
44e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
45e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
46e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
47e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
48e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
49e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect.h"'
50e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "glxclient.h"'
51e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "size.h"'
52e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/glxproto.h>'
53e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
54e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
55e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
5674764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall()
5774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printNoinline()
58e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
59e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '/* If the size and opcode values are known at compile-time, this will, on'
60e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' * x86 at least, emit them with a single instruction.'
61e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ' */'
62e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define emit_header(dest, op, size)            \\'
63e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    do { union { short s[2]; int i; } temp;    \\'
64e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         temp.s[0] = (size); temp.s[1] = (op); \\'
65e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '         *((int *)(dest)) = temp.i; } while(0)'
66e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
67e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static NOINLINE CARD32
68e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickread_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array )
69e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
70e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReply reply;
71e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
72e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) _XReply(dpy, (xReply *) & reply, 0, False);
73e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (size != 0) {
74e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if ((reply.size >= 1) || reply_is_always_array) {
75e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    const GLint bytes = (reply_is_always_array)
76e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	      ? (4 * reply.length) : (reply.size * size);
77e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    const GLint extra = 4 - (bytes & 3);
78e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
79e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    _XRead(dpy, dest, bytes);
80e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    if ( extra != 0 ) {
81e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		_XEatData(dpy, extra);
82e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    }
83e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	}
84e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else {
85e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	    (void) memcpy( dest, &(reply.pad3), size);
86e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	}
87e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
88e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
89e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return reply.retval;
90e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
91e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
92e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0
93e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
94e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic NOINLINE GLubyte *
95e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen )
96e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
97e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXSingleReq * req;
98e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
99e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
100e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
101e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
102e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXSingle, cmdlen, req);
103e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
104e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
105e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = sop;
106e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXSingleReq;
107e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
109e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic NOINLINE GLubyte *
110e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
111e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
112e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    xGLXVendorPrivateReq * req;
113e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    Display * const dpy = gc->currentDpy;
114e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
115e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) __glXFlushRenderBuffer(gc, gc->pc);
116e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    LockDisplay(dpy);
117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GetReqExtra(GLXVendorPrivate, cmdlen, req);
118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->reqType = gc->majorOpcode;
119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->glxCode = code;
120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->vendorCode = vop;
121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    req->contextTag = gc->currentContextTag;
122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return (GLubyte *)(req) + sz_xGLXVendorPrivateReq;
123e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
125e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for size in self.generic_sizes:
127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.print_generic_function(size)
128e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
129e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
130e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
131e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.handcode or f.ignore: return
132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
133e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_rop != 0 or f.vectorequiv != None:
134e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printRenderFunction(f)
135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif f.glx_sop != 0 or f.glx_vendorpriv != 0:
136e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.printSingleFunction(f)
137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "/* Missing GLX protocol for %s. */" % (f.name)
139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def print_generic_function(self, n):
141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """static FASTCALL NOINLINE void
142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr )
143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLXcontext * const gc = __glXGetCurrentContext();
145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    const GLuint cmdlen = %u;
146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    emit_header(gc->pc, rop, cmdlen);
148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    (void) memcpy((void *)(gc->pc + 4), ptr, %u);
149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    gc->pc += cmdlen;
150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
152e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" % (n, n + 4, n)
153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
154e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
155e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_one_arg(self, p, offset, pc, indent, adjust):
156e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		t = p.p_type
157e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if p.is_array():
158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = p.name
159e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			src_ptr = "&" + p.name
161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			% (indent, pc, offset + adjust, src_ptr, p.size_string() )
164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_emit_args(self, f, pc, indent, adjust, skip_vla):
166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		offset = 0
167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if skip_vla:
1691d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 1
170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
1711d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			r = 2
172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
1731d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		for p in f.parameterIterator(1, r):
1741d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			self.common_emit_one_arg(p, offset, pc, indent, adjust)
1751d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick			offset += p.size()
176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return offset
178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_just_header(self, f):
181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#define %s %d' % (f.opcode_name(), f.opcode_value())
182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s' % (f.fn_return_type)
184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string())
185e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '{'
186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def common_func_print_header(self, f):
189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_just_header(f)
190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    __GLXcontext * const gc = __glXGetCurrentContext();'
192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    Display * const dpy = gc->currentDpy;'
193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_return_type != 'void':
195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type)
196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.count_parameters != None:
198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    const GLuint compsize = __gl%s_size(%s);' % (f.name, f.count_parameters)
199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    const GLuint cmdlen = %s;' % (f.command_length())
201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.counter != None:
203e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    if (%s < 0) %s' % (f.counter, f.return_string())
204e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
205e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
206e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    if (dpy == NULL) return;'
207e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    if ( ((gc->pc + cmdlen) > gc->bufEnd)'
208e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '         || (cmdlen > gc->maxSmallRenderCommandSize)) {'
209e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
210e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    }'
211e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
212e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    (void) dpy;'
213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printSingleFunction(self, f):
218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    if (dpy != NULL) {'
221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_parameters != []:
223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "GLubyte const * pc ="
224e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
225e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			pc_decl = "(void)"
226e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.glx_vendorpriv != 0:
228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "pc", "    ", 0, 0)
233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.needs_reply():
235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.output != None:
236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = f.output.p_type.size
237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = f.output.name
238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_size = 0
240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				output_str = "NULL"
241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.fn_return_type != 'void':
243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " retval = (%s)" % (f.fn_return_type)
244e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				return_str = " (void)"
246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
247e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if f.reply_always_array:
248e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_TRUE"
249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				aa = "GL_FALSE"
251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print "       %s read_reply(gc->currentDpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '        UnlockDisplay(gc->currentDpy); SyncHandle();'
255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    }'
256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    %s' % f.return_string()
257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRenderFunction(self, f):
26347719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# There is a class of GL functions that take a single pointer
26447719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# as a parameter.  This pointer points to a fixed-size chunk
26547719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of data, and the protocol for this functions is very
26647719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# regular.  Since they are so regular and there are so many
26747719fda0c2fba13c81e84e33523d5489263182eIan Romanick		# of them, special case them with generic functions.  On
2681d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick		# x86, this saves about 26KB in the libGL.so binary.
26947719fda0c2fba13c81e84e33523d5489263182eIan Romanick
270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.fn_parameters[0]
272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if p.is_pointer:
273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				[cmdlen, size_string] = f.command_payload_length()
274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				if cmdlen in self.generic_sizes:
275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					self.common_func_print_just_header(f)
276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print '}'
278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					print ''
279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick					return
280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_func_print_header(f)
282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    if (cmdlen <= gc->maxSmallRenderCommandSize) {'
285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = "    "
286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		else:
287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			indent = ""
288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.common_emit_args(f, "gc->pc", indent, 4, 0)
292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    gc->pc += cmdlen;' % (indent)
293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '%s    if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent)
294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.can_be_large:
296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    }'
297e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    else {'
298e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        const GLint op = %s;' % (f.opcode_real_name())
299e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        const GLuint cmdlenLarge = cmdlen + 4;'
300e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        (void) memcpy((void *)(gc->pc + 0), (void *)(&op), 4);'
301e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        (void) memcpy((void *)(gc->pc + 4), (void *)(&cmdlenLarge), 4);'
302e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			offset = self.common_emit_args(f, "gc->pc", indent, 8, 1)
303e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
304e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			p = f.variable_length_parameter()
305e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '        __glXSendLargeCommand(gc, gc->pc, %u, %s, %s);' % (offset + 8, p.name, p.size_string())
306e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    }'
307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '}'
309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		return
311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
31374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto):
314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
31574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
320e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
321e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
322e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
323e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """/**
324e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c
325e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table.
326e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
327e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
328e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com>
329e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
330e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
331e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
332e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h"
333e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h"
334e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h"
335e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
336e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
337e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
338e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol
339e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support.
340e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
341e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void)
342e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
343e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return 0;
344e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
345e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
346e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
347e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table.  The table is initialized
348e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions.
349e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
350e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void )
351e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{
352e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    __GLapi *glAPI;
353e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    GLuint entries;
354e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
355e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    entries = _glapi_get_dispatch_table_size();
356e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *));
357e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* first, set all entries to point to no-op functions */
359e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    {
360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       int i;
361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       void **dispatch = (void **) glAPI;
362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       for (i = 0; i < entries; i++) {
363e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick          dispatch[i] = (void *) NoOp;
364e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick       }
365e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    }
366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    /* now, initialize the entries we understand */"""
368e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
369e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
370e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
371e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick    return glAPI;
372e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick}
373e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.ignore: return
377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
378e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.category != self.last_category:
379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			self.last_category = f.category
380e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
381e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print '    /* %s */' % (self.last_category)
382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print ''
383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
384e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    glAPI->%s = __indirect_gl%s;' % (f.name, f.name)
385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
38774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto):
388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
38974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.last_category = ""
391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( \
392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM")
394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions.
401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com>
403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _INDIRECT_H_ )
407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#  define _INDIRECT_H_
408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
41074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "HIDDEN", "hidden" )
411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef HIDDEN"
415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#endif /* !defined( _INDIRECT_H_ ) */"
416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if f.fn_offset < 0 or f.ignore: return
419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string())
420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
42274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs(glX_XML.GlxProto):
423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
42474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.aliases = []
427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.glx_enum_sigs = {}
428e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
430e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
431e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include <GL/gl.h>'
432e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#include "indirect_size.h"'
433e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
434e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
43574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printPure()
436e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
43774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall()
438e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
43974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "INTERNAL", "internal" )
440e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
441e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
442e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#ifdef HAVE_ALIAS'
443e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS2(from,to) \\'
444e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
445e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '        __attribute__ ((alias( # to )));'
446e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )'
447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#else'
448e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#  define ALIAS(from,to) \\'
449e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\'
450e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '    { return __gl ## to ## _size( e ); }'
451e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print '#endif'
452e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
453e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
455e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
456e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		for a in self.aliases:
457e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			print a
458e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
459e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
460e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if self.glx_enum_functions.has_key(f.name):
461e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			ef = self.glx_enum_functions[f.name]
462e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
463e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			sig = ef.signature();
464e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			if self.glx_enum_sigs.has_key(sig):
465e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				n = self.glx_enum_sigs[sig];
466e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				a = 'ALIAS( %s, %s )' % (f.name, n)
467e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				self.aliases.append(a)
468e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			else:
469e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				ef.Print( f.name )
470e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick				self.glx_enum_sigs[sig] = f.name;
471e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
472e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
47474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs_h(glX_XML.GlxProto):
475e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def __init__(self):
47674764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.GlxProto.__init__(self)
477e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM")
478e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.aliases = []
479e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		self.glx_enum_sigs = {}
480e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealHeader(self):
482e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print """
483e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/**
484e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file
485e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for functions used to determine the number of data elements in
486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * various GLX protocol messages.
487e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick *
488e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com>
489e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */
490e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
491e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _GLXSIZE_H_ )
492e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#  define _GLXSIZE_H_
493e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
494e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""
49574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printPure();
496e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
49774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printFastcall();
498e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
49974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick		glX_XML.printVisibility( "INTERNAL", "internal" );
500e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
501e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
502e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printRealFooter(self):
503e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print ''
504e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef INTERNAL"
505e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef PURE"
506e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#  undef FASTCALL"
507e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		print "#endif /* !defined( _GLXSIZE_H_ ) */"
508e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
509e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
510e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	def printFunction(self, f):
511e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if self.glx_enum_functions.has_key(f.name):
512e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			ef = self.glx_enum_functions[f.name]
513b53df18624a1b3870c1dcfe3981c07c089efe262Ian Romanick			print 'extern INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (f.name)
514e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
515e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
516e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage():
517e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
518e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	sys.exit(1)
519e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
520e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
521e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__':
522e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	file_name = "gl_API.xml"
523e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
524e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	try:
525e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
526e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	except Exception,e:
527e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
528e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
529e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	mode = "proto"
530e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	for (arg,val) in args:
531e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		if arg == "-f":
532e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			file_name = val
533e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		elif arg == "-m":
534e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick			mode = val
535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
536e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	if mode == "proto":
537e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoStubs()
538e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_c":
539e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_c()
540e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "init_h":
541e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxProtoInit_h()
542e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "size_c":
543e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxSizeStubs()
544e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	elif mode == "size_h":
545e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		dh = PrintGlxSizeStubs_h()
546e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	else:
547e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick		show_usage()
548e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
549e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser = make_parser()
550e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setFeature(feature_namespaces, 0)
551e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.setContentHandler(dh)
552e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
553e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	f = open(file_name)
554e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick
555e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printHeader()
556e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	parser.parse(f)
557e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick	dh.printFooter()
558