glX_proto_send.py revision 1fd3bbc42e8ad267c552a3818f64b0850c188927
1e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#!/usr/bin/python2 2e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 35f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick# (C) Copyright IBM Corporation 2004, 2005 4e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# All Rights Reserved. 5e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 6e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Permission is hereby granted, free of charge, to any person obtaining a 7e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# copy of this software and associated documentation files (the "Software"), 8e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# to deal in the Software without restriction, including without limitation 9e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub 10e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# license, and/or sell copies of the Software, and to permit persons to whom 11e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# the Software is furnished to do so, subject to the following conditions: 12e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 13e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# The above copyright notice and this permission notice (including the next 14e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# paragraph) shall be included in all copies or substantial portions of the 15e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Software. 16e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 17e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# IN THE SOFTWARE. 24e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# 25e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Authors: 26e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick# Ian Romanick <idr@us.ibm.com> 27e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 28e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import saxutils 29e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax import make_parser 30e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickfrom xml.sax.handler import feature_namespaces 31e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 32e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport gl_XML 3374764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickimport glX_XML 34e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickimport license 355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickimport sys, getopt, copy 365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func): 385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Generate a 'unique' key for a pixel function. The key is based on 395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick the parameters written in the command packet. This includes any 405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick padding that might be added for the original function and the 'NULL 415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick image' flag.""" 425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, junk, junk, junk, junk] = func.dimensions() 445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick d = (dim + 1) & ~1 465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h = "%uD%uD_" % (d - 1, d) 475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick for p in func.parameterIterator(1, 1): 495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h = "%s%u" % (h, p.size()) 505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if func.pad_after(p): 525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h += "4" 535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if func.image.img_null_flag: 555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h += "_NF" 565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = func.name.replace("%uD" % (dim), "") 585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = "__glx_%s_%uD%uD" % (n, d - 1, d) 595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return [h, n] 605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickclass glXPixelFunctionUtility(glX_XML.glXFunction): 635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Dummy class used to generate pixel "utility" functions that are 645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick shared by multiple dimension image functions. For example, these 655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick objects are used to generate shared functions used to send GLX 665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick protocol for TexImage1D and TexImage2D, TexSubImage1D and 675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexSubImage2D, etc.""" 685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def __init__(self, func, name): 705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # The parameters to the utility function are the same as the 715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters to the real function except for the added "pad" 725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters. 735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.name = name 755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.image = copy.copy(func.image) 765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.fn_parameters = [] 775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick for p in gl_XML.glFunction.parameterIterator(func): 785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.fn_parameters.append(p) 795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad_name = func.pad_after(p) 815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pad_name: 825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad = copy.copy(p) 835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad.name = pad_name 845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.fn_parameters.append(pad) 855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.image.height == None: 885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.image.height = "height" 895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.image.img_yoff == None: 915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.image.img_yoff = "yoffset" 925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if func.image.depth: 945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.image.extent == None: 955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.image.extent = "extent" 965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.image.img_woff == None: 985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.image.img_woff = "woffset" 995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.set_return_type( func.fn_return_type ) 1025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.glx_rop = ~0 1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.can_be_large = func.can_be_large 1043fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick self.count_parameter_list = func.count_parameter_list 1055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.counter = func.counter 106d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick self.img_reset = None 1075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 108e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 109e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 11074764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoStubs(glX_XML.GlxProto): 111e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 11274764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 113e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 1145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM") 115e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.pixel_stubs = {} 1171fca5632325e1da42e278909e404dd57e0a62252Ian Romanick self.debug = 0 118e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 119e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 120e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 121e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 122e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 123e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect.h"' 124e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "glxclient.h"' 1255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '#include "indirect_size.h"' 126e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 127e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 128e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 129e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 130c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 131c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 133990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#if !defined __GNUC__ || __GNUC__ < 3' 134990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 135990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 136990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 137e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 138e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 139e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 140e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 141e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 143e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 144e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 152a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 153a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 154a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 155a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 156a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 157a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 158a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 159a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 160a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 161a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 162a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 163a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 164a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 168e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1701fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 1711fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim, 172d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 173d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 174d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 175d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 176d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 177d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 178d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 179d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 180d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 181d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 182d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 183d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 184d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 185d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 186d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 187d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 188d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 189d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 190d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 191d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 192d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 193d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 194d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 195d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 196d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 197d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 198d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 199d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 200d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 201d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 202d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 203d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 204d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 205d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 206d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 207d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 208d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 209d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 210d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 211d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 212e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 213e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2141fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2151fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen ) 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 222e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 223e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 224e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 225e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 226e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 227e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 228e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2291fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 231e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 232e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 233e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 234e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 235e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 236e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 237e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 238e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 239e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 240e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 241e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 242e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 243e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 2495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 2505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 2515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 2525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 2535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 2545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 2555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 2565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 2643fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick if f.client_handcode: return 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_rop != 0 or f.vectorequiv != None: 2675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image: 2685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.printPixelFunction(f) 2695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 2705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.printRenderFunction(f) 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif f.glx_sop != 0 or f.glx_vendorpriv != 0: 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.printSingleFunction(f) 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print "/* Missing GLX protocol for %s. */" % (f.name) 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 2773385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 287990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2893385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_one_arg(self, p, offset, pc, indent, adjust): 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick t = p.p_type 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 297e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 298e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 299e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 300e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick % (indent, pc, offset + adjust, src_ptr, p.size_string() ) 301e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 302e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_args(self, f, pc, indent, adjust, skip_vla): 303e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick offset = 0 304e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 305e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if skip_vla: 3061d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick r = 1 307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 3081d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick r = 2 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3101d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick for p in f.parameterIterator(1, r): 311d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 312d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick self.common_emit_one_arg(p, offset, pc, indent, adjust) 313d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick offset += p.size() 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return offset 316e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 317e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def pixel_emit_args(self, f, pc, indent, adjust, dim, large): 3195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 3205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 3215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 3225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 3235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 3245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = 0 3265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick for p in f.parameterIterator(1, 1): 3275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.common_emit_one_arg(p, offset, pc, indent, adjust) 3285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += p.size() 3295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.pad_after(p): 3315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust) 3325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += 4 3335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_null_flag: 3355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if large: 3365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, offset + adjust) 3375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 3385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, offset + adjust, f.image.name) 3395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset += 4 3415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return offset 3435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def large_emit_begin(self, indent, f, op_name = None): 3465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 3475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 3485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s const GLint op = %s;' % (indent, op_name) 3503276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s const GLuint cmdlenLarge = cmdlen + 4;' % (indent) 3513276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 3523276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent) 3533276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent) 3543276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 3553276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 3563276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 357e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_func_print_just_header(self, f): 358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define %s %d' % (f.opcode_name(), f.opcode_value()) 359e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 360e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s' % (f.fn_return_type) 361e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '__indirect_gl%s(%s)' % (f.name, f.get_parameter_string()) 362e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '{' 363e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 364e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_just_start(self, f): 366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 367990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 368990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 369990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 370990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 371990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 372990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 373990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 374990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 375d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.image and f.image.is_output: 376d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 377d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 378990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 379990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 380990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 381990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 382990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 383990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 384990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 385990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_return_type != 'void': 387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s retval = (%s) 0;' % (f.fn_return_type, f.fn_return_type) 388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 3893fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick if not f.output_parameter(): 3903fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick compsize = self.size_call( f ) 3913fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick if compsize: 3923fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick print ' const GLuint compsize = %s;' % (compsize) 393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' const GLuint cmdlen = %s;' % (f.command_length()) 395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 396990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.counter: 397990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 398990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "(%s >= 0) && (%s)" % (f.counter, skip_condition) 399990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 400990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "%s >= 0" % (f.counter) 401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 403990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 404990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 405990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 406990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 407990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_header(self, f): 4115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.common_func_print_just_header(f) 4125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return self.common_func_print_just_start(f) 4135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printSingleFunction(self, f): 417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_header(f) 418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 4201fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 4211fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.fn_parameters != []: 423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_vendorpriv != 0: 4281fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 4301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 431e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 432e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "pc", " ", 0, 0) 433d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.image and f.image.is_output: 434d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick o = f.command_fixed_length() - 4 435d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 436d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP": 437d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 438d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 439d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 440d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 441d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 442e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 443e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 444d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.image and f.image.is_output: 445d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick [dim, w, h, d, junk] = f.dimensions() 446d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.dimensions_in_reply: 4471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, f.image.img_format, f.image.img_type, f.image.name) 448d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 4491fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, %s, %s, %s, %s, %s, %s, GL_FALSE);" % (dim, w, h, d, f.image.img_format, f.image.img_type, f.image.name) 450e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 451d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.output != None: 452d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick output_size = f.output.p_type.size 453d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick output_str = f.output.name 454d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 455d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick output_size = 0 456d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick output_str = "NULL" 457e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 458d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.fn_return_type != 'void': 459d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick return_str = " retval = (%s)" % (f.fn_return_type) 460d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 461d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick return_str = " (void)" 462e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 463d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.reply_always_array: 464d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick aa = "GL_TRUE" 465d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 466d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick aa = "GL_FALSE" 467d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 4681fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa) 469e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 4711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 4721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 4731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 4741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 4751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 4761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 4771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 478e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 479990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 480e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' }' 481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' %s' % f.return_string() 482e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 483e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 484e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 485e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def printPixelFunction(self, f): 4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """This function could use some major refactoring. :(""" 4895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # There is a code-space optimization that we can do here. 4915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # Functions that are marked img_pad_dimensions have a version 4925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # with an odd number of dimensions and an even number of 4935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # dimensions. TexSubImage1D and TexSubImage2D are examples. 4945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # We can emit a single function that does both, and have the 4955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # real functions call the utility function with the correct 4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters. 4975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # 4985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # The only quirk to this is that utility funcitons will be 4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # generated for 3D and 4D functions, but 4D (e.g., 5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # GL_SGIS_texture4D) isn't typically supported. This is 5015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # probably not an issue. However, it would be possible to 5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # look at the total set of functions and determine if there 5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # is another function that would actually use the utility 5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function. If not, then fallback to the normal way of 5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # generating code. 5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_pad_dimensions: 5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # Determine the hash key and the name for the utility 5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function that is used to implement the real 5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # function. 5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [h, n] = hash_pixel_function(f) 5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # If the utility function is not yet known, generate 5165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # it. 5175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not self.pixel_stubs.has_key(h): 5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.pixel_stubs[h] = n 5205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixel_func = glXPixelFunctionUtility(f, n) 5215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print 'static void' 5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (n, pixel_func.get_parameter_string()) 5245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '{' 5255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.common_func_print_just_start(pixel_func): 5275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = " " 5285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 5295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 5305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = "" 5315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 5325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pixel_func.can_be_large: 5355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 5365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 5375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 5385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 5395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent += " " 5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, width, height, depth, extent] = pixel_func.dimensions() 5420246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick adjust = pixel_func.offset_of_first_parameter() + 4 5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s emit_header(gc->pc, opcode, cmdlen);' % (indent) 5455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0) 5475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5480246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick s = pixel_func.command_fixed_length() 5495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "gc->pc + 4" 5515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "gc->pc + %u" % (s + 4) 5525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pixel_func.image.img_send_null: 5545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (pixel_func.image.name) 5555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 5565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = 'compsize > 0' 5575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (%s) {' % (indent, condition) 5595f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 5615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s else {' % (indent) 5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim) 5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 5665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 5675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 5695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust += 4 5705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 5725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%selse {' % (indent) 5735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.large_emit_begin(indent, pixel_func, "opcode") 5755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(pixel_func, "pc", indent, adjust, dim, 1) 5765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "pc + 8" 5785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "pc + %u" % (s + 8) 5795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5805f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 5815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 5835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 5855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '}' 5865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '' 5875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # Generate the real function as a call to the 5915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # utility function. 5925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.common_func_print_just_header(f) 5945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, junk, junk, junk, junk] = f.dimensions() 5965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 5985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick for p in gl_XML.glFunction.parameterIterator(f): 5995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", " + p.name 6005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.pad_after(p): 6025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 6035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print ' %s(%s, %u%s );' % (n, f.opcode_name(), dim, p_string) 6055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '}' 6065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '' 6075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 6085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if self.common_func_print_header(f): 6115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = " " 6125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 6135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 6145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = "" 6155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 6165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 6195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 6205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 6215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 6225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 6235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent += " " 6245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick [dim, width, height, depth, extent] = f.dimensions() 6260246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick adjust = f.offset_of_first_parameter() + 4 6275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 6295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0) 6315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6320246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick s = f.command_fixed_length() 6335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "gc->pc + 4" 6355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "gc->pc + %u" % (s + 4) 6365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.image.img_send_null: 6385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (f.image.name) 6395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 6405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick condition = 'compsize > 0' 6415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (%s) {' % (indent, condition) 6435f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 6445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 6455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s else {' % (indent) 6465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim) 6475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 6485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 6505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 6515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 6535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick adjust += 4 6545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 6565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%selse {' % (indent) 6575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.large_emit_begin(indent, f) 6595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick offset = self.pixel_emit_args(f, "pc", indent, adjust, dim, 1) 6605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pixHeaderPtr = "pc + 8" 6625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pcPtr = "pc + %u" % (s + 8) 6635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6645f1f229f8da255ca9b390da1757ad781978cf619Ian 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) 6655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 6675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 6695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '}' 6705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '' 6715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 6725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 674e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 67547719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 67647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 67747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 67847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 67947719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 6801d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 68147719fda0c2fba13c81e84e33523d5489263182eIan Romanick 682e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.variable_length_parameter() == None and len(f.fn_parameters) == 1: 683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.fn_parameters[0] 684e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_pointer: 6850246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 686e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 687e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_func_print_just_header(f) 688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 689e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 690e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 691e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 692e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 693990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if self.common_func_print_header(f): 694e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = " " 695990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 696e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 697e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = "" 698990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 699990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 7001fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 7011fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name) 7021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 703990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 704990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 705990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 706990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 707990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s }' % (indent) 708990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick indent += " " 709e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 711e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "gc->pc", indent, 4, 0) 713e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 714990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 715e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 716e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 717990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 718990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%selse {' % (indent) 7193276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 7203276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick self.large_emit_begin(indent, f) 721990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick offset = self.common_emit_args(f, "pc", indent, 8, 1) 7221fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 723e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 724990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string()) 725990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 726e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 7271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 7281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s __indirect_glFinish();' % (indent) 7291fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name) 7301fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 731990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 732e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '}' 733e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 734e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 735e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 736e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 73774764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_c(glX_XML.GlxProto): 738e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 73974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 740e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 741e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 742e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 743e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 744e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 745e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 747e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 748e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 749e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 751e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 752e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 753e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 754e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 755e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 756e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 757e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 762e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 764e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 767e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 768e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 769e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 770e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 771e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 773e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 774e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 786e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 787e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 788e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 793e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 794e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 800e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.category != self.last_category: 801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = f.category 802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' /* %s */' % (self.last_category) 804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' glAPI->%s = __indirect_gl%s;' % (f.name, f.name) 807e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 80974764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanickclass PrintGlxProtoInit_h(glX_XML.GlxProto): 810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 81174764061facb8f518c3ac7ebdb844bcd27a36ee0Ian Romanick glX_XML.GlxProto.__init__(self) 812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.last_category = "" 813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 81616c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 81916c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 827c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 8281fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 8291fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 8301fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 8311fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 8321fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 8331fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 8341fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 8351fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 8361fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 8371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 8381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, unsigned max_dim, GLint width, GLint height, 8391fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 8401fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 8411fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 8421fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 8431fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint sop, GLint cmdlen ); 8441fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 8451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 8461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ); 8471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 84816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printFunction(self, f): 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (f.fn_return_type, f.name, f.get_parameter_string()) 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 8551fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 8561fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 8571fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 8651fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 8761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 8771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoStubs() 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_c() 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh = PrintGlxProtoInit_h() 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser = make_parser() 889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setFeature(feature_namespaces, 0) 890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.setContentHandler(dh) 891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick f = open(file_name) 893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8941fca5632325e1da42e278909e404dd57e0a62252Ian Romanick dh.debug = debug 895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printHeader() 896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick parser.parse(f) 897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dh.printFooter() 898