glX_proto_send.py revision 5f1f229f8da255ca9b390da1757ad781978cf619
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 1045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.count_parameters = func.count_parameters 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 = {} 116e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 117e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect.h"' 122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "glxclient.h"' 1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '#include "indirect_size.h"' 124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 125e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 12874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printFastcall() 12974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printNoinline() 130e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 131990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#if !defined __GNUC__ || __GNUC__ < 3' 132990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 133990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 134990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 136e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static NOINLINE CARD32 144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickread_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 15083fcf49647f423741a0a2143e03dbaa2d43d31a1Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLint bytes = (reply_is_always_array) 152e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ? (4 * reply.length) : (reply.size * size); 153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLint extra = 4 - (bytes & 3); 154e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 155e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick _XRead(dpy, dest, bytes); 15683fcf49647f423741a0a2143e03dbaa2d43d31a1Ian Romanick if ( extra < 4 ) { 157e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick _XEatData(dpy, extra); 158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 159e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else { 161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 170990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte * 171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_single_request( __GLXcontext * gc, GLint sop, GLint cmdlen ) 172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanickstatic NOINLINE FASTCALL GLubyte * 186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanicksetup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 2055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 2065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 2075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 2085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 2095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 2105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 2115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 2125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.handcode or f.ignore: return 221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_rop != 0 or f.vectorequiv != None: 2235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image: 2245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.printPixelFunction(f) 2255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 2265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.printRenderFunction(f) 227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif f.glx_sop != 0 or f.glx_vendorpriv != 0: 228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.printSingleFunction(f) 229e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 230e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "/* Missing GLX protocol for %s. */" % (f.name) 231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 2333385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 243990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 244e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2453385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 247e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 248e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_one_arg(self, p, offset, pc, indent, adjust): 249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick t = p.p_type 250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick % (indent, pc, offset + adjust, src_ptr, p.size_string() ) 257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_args(self, f, pc, indent, adjust, skip_vla): 259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick offset = 0 260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if skip_vla: 2621d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick r = 1 263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 2641d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick r = 2 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2661d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick for p in f.parameterIterator(1, r): 2671d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick self.common_emit_one_arg(p, offset, pc, indent, adjust) 2681d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick offset += p.size() 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return offset 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def pixel_emit_args(self, f, pc, indent, adjust, dim, large): 2745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 2755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 2765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 2775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 2785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 2795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = 0 2815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick for p in f.parameterIterator(1, 1): 2825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.common_emit_one_arg(p, offset, pc, indent, adjust) 2835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += p.size() 2845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.pad_after(p): 2865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust) 2875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += 4 2885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_null_flag: 2905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if large: 2915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust) 2925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 2935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name) 2945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += 4 2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return offset 2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def large_emit_begin(self, indent, f, op_name = None): 3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s const GLint op = %s;' % (indent, op_name) 3053276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s const GLuint cmdlenLarge = cmdlen + 4;' % (indent) 3063276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 3073276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent) 3083276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent) 3093276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 3103276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 3113276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_func_print_just_header(self, f): 313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define %s %d' % (f.opcode_name(), f.opcode_value()) 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s' % (f.fn_return_type) 316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string()) 317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '{' 318e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 319e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_just_start(self, f): 321e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 322990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 323990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 324990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 325990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 326990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 327990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 328990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 329990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 330990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 331990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 332990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 333990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 334990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 335990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 336990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 337990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 338e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_return_type != 'void': 339e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type) 340e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 341e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.count_parameters != None: 342e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint compsize = __gl%s_size(%s);' % (f.name, f.count_parameters) 3435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick elif f.image: 3445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, w, h, d, junk] = f.dimensions() 3455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick compsize = '__glImageSize(%s, %s, %s, %s, %s, %s)' % (w, h, d, f.image.img_format, f.image.img_type, f.image.img_target) 3475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not f.image.img_send_null: 3485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick compsize = '(%s != NULL) ? %s : 0' % (f.image.name, compsize) 3495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print ' const GLuint compsize = %s;' % (compsize) 3515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 352e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 353e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint cmdlen = %s;' % (f.command_length()) 354e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 355990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.counter: 356990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 357990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition) 358990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 359990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "%s >= 0" % (f.counter) 360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 362990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 363990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 364990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 365990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 366990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 368e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_header(self, f): 3705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.common_func_print_just_header(f) 3715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return self.common_func_print_just_start(f) 3725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printSingleFunction(self, f): 376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_header(f) 377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 378e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_parameters != []: 379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 380e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 381e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_vendorpriv != 0: 384e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s setup_vendor_request(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "pc", " ", 0, 0) 389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.output != None: 392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_size = f.output.p_type.size 393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_str = f.output.name 394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_size = 0 396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick output_str = "NULL" 397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_return_type != 'void': 399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return_str = " retval = (%s)" % (f.fn_return_type) 400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return_str = " (void)" 402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.reply_always_array: 404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick aa = "GL_TRUE" 405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick aa = "GL_FALSE" 407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 408990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print " %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa) 409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 410990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s' % f.return_string() 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def printPixelFunction(self, f): 4195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """This function could use some major refactoring. :(""" 4205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # There is a code-space optimization that we can do here. 4225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # Functions that are marked img_pad_dimensions have a version 4235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # with an odd number of dimensions and an even number of 4245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # dimensions. TexSubImage1D and TexSubImage2D are examples. 4255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # We can emit a single function that does both, and have the 4265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # real functions call the utility function with the correct 4275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters. 4285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # 4295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # The only quirk to this is that utility funcitons will be 4305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # generated for 3D and 4D functions, but 4D (e.g., 4315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # GL_SGIS_texture4D) isn't typically supported. This is 4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # probably not an issue. However, it would be possible to 4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # look at the total set of functions and determine if there 4345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # is another function that would actually use the utility 4355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function. If not, then fallback to the normal way of 4365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # generating code. 4375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_pad_dimensions: 4395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # Determine the hash key and the name for the utility 4405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function that is used to implement the real 4415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function. 4425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [h, n] = hash_pixel_function(f) 4445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # If the utility function is not yet known, generate 4475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # it. 4485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not self.pixel_stubs.has_key(h): 4505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.pixel_stubs[h] = n 4515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixel_func = glXPixelFunctionUtility(f, n) 4525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print 'static void' 4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string()) 4555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '{' 4565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.common_func_print_just_start(pixel_func): 4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = " " 4595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 4605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 4615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = "" 4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 4635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pixel_func.can_be_large: 4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 4685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 4695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent += " " 4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, width, height, depth, extent] = pixel_func.dimensions() 4735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if dim < 3: 4755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust = 20 + 4 4765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 4775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust = 36 + 4 4785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 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 4845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [s, junk] = pixel_func.command_payload_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() 5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if dim < 3: 5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust = 20 + 4 5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust = 36 + 4 5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0) 5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [s, junk] = f.command_payload_length() 5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "gc->pc + 4" 5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "gc->pc + %u" % (s + 4) 5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_send_null: 5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (f.image.name) 5805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = 'compsize > 0' 5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (%s) {' % (indent, condition) 5845f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s else {' % (indent) 5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim) 5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust += 4 5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 5975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%selse {' % (indent) 5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.large_emit_begin(indent, f) 6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1) 6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "pc + 8" 6035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "pc + %u" % (s + 8) 6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6055f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 6065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 6085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 6105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '}' 6115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '' 6125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 6135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 615e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 61647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 61747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 61847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 61947719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 62047719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 6211d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 62247719fda0c2fba13c81e84e33523d5489263182eIan Romanick 623e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.variable_length_parameter() == None and len(f.fn_parameters) == 1: 624e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.fn_parameters[0] 625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_pointer: 626e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick [cmdlen, size_string] = f.command_payload_length() 627e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 628e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_just_header(f) 629e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 630e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 631e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 632e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 633e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 634990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if self.common_func_print_header(f): 635e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = " " 636990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 637e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = "" 639990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 640990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 641990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 642990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 643990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 644990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 645990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s }' % (indent) 646990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick indent += " " 647e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 648e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 649e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 650e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "gc->pc", indent, 4, 0) 651e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 652990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 655990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 656990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%selse {' % (indent) 6573276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 6583276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick self.large_emit_begin(indent, f) 659990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick offset = self.common_emit_args(f, "pc", indent, 8, 1) 660e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 661e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 662990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string()) 663990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 664e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 665990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 666e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 667e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 668e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 669e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 670e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 67174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto): 672e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 67374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 674e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 675e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 676e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 677e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 680e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 681e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 684e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 685e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 689e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 693e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 695e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 697e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 698e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 699e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 701e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 703e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 704e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 705e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 706e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 707e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 709e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 714e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 717e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 718e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 719e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 720e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 721e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 722e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 724e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 726e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 728e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 729e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 730e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 732e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 733e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 734e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.ignore: return 735e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 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") 752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 755e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _INDIRECT_H_ ) 765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define _INDIRECT_H_ 766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 76874764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printVisibility( "HIDDEN", "hidden" ) 769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef HIDDEN" 773e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "#endif /* !defined( _INDIRECT_H_ ) */" 774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_offset < 0 or f.ignore: return 777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string()) 778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 78074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs(glX_XML.GlxProto): 781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 78274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases = [] 785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs = {} 786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect_size.h"' 791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 79374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printPure() 794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 79574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printFastcall() 796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 79774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printVisibility( "INTERNAL", "internal" ) 798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#ifdef HAVE_ALIAS' 801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS2(from,to) \\' 802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __attribute__ ((alias( # to )));' 804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )' 805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#else' 806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '# define ALIAS(from,to) \\' 807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' { return __gl ## to ## _size( e ); }' 809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#endif' 810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for a in self.aliases: 815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print a 816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_functions.has_key(f.name): 819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef = self.glx_enum_functions[f.name] 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sig = ef.signature(); 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_sigs.has_key(sig): 823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick n = self.glx_enum_sigs[sig]; 824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick a = 'ALIAS( %s, %s )' % (f.name, n) 825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases.append(a) 826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef.Print( f.name ) 828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs[sig] = f.name; 829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 83274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxSizeStubs_h(glX_XML.GlxProto): 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 83474764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.aliases = [] 837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.glx_enum_sigs = {} 838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for functions used to determine the number of data elements in 844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * various GLX protocol messages. 845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#if !defined( _GLXSIZE_H_ ) 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# define _GLXSIZE_H_ 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 85374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printPure(); 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 85574764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printFastcall(); 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 85774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.printVisibility( "INTERNAL", "internal" ); 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef INTERNAL" 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef PURE" 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "# undef FASTCALL" 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "#endif /* !defined( _GLXSIZE_H_ ) */" 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if self.glx_enum_functions.has_key(f.name): 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick ef = self.glx_enum_functions[f.name] 871b53df18624a1b3870c1dcfe3981c07c089efe262Ian Romanick print 'extern INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (f.name) 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0] 876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:") 884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoStubs() 896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_c() 898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_h() 900e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "size_c": 901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxSizeStubs() 902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "size_h": 903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxSizeStubs_h() 904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser = make_parser() 908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setFeature(feature_namespaces, 0) 909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setContentHandler(dh) 910e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f = open(file_name) 912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printHeader() 914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.parse(f) 915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printFooter() 916