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