glX_proto_send.py revision 66a5548fbbf4c04a74b0bbc451718a8fc95502d9
166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick#!/usr/bin/env python 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 2866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML, glX_proto_common, license 2966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string 305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func): 325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Generate a 'unique' key for a pixel function. The key is based on 335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick the parameters written in the command packet. This includes any 345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick padding that might be added for the original function and the 'NULL 355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick image' flag.""" 365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 3866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h = "" 3966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_pre = "" 4066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_suf = "" 4166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in func.parameterIterateGlxSend(): 4266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 4366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick d = (dim + 1) & ~1 4666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_pre = "%uD%uD_" % (d - 1, d) 475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 4966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_suf = "_NF" 5066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h += "%u" % (param.size()) 5266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.pad_after(param): 545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h += "4" 555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = func.name.replace("%uD" % (dim), "") 585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = "__glx_%s_%uD%uD" % (n, d - 1, d) 5966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h = hash_pre + h + hash_suf 615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return [h, n] 625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_pixel_function_stub(glX_XML.glx_function): 655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Dummy class used to generate pixel "utility" functions that are 665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick shared by multiple dimension image functions. For example, these 675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick objects are used to generate shared functions used to send GLX 685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick protocol for TexImage1D and TexImage2D, TexSubImage1D and 695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexSubImage2D, etc.""" 705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def __init__(self, func, name): 725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # The parameters to the utility function are the same as the 735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters to the real function except for the added "pad" 745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters. 755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.name = name 7766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.images = [] 7866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters = [] 7966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name = {} 8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for _p in func.parameterIterator(): 8166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = copy.copy(_p) 8266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters.append(p) 8366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name[ p.name ] = p 8466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 8566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 8666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 8766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.images.append(p) 8866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.height = "height" 8966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 9066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_yoff == None: 9166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.img_yoff = "yoffset" 9266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.depth: 9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.extent == None: 9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.extent = "extent" 9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_woff == None: 9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.img_woff = "woffset" 9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 1005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad_name = func.pad_after(p) 1025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pad_name: 1035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad = copy.copy(p) 1045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad.name = pad_name 10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters.append(pad) 10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name[ pad.name ] = pad 1075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.return_type = func.return_type 1105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_rop = ~0 11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_sop = 0 11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_vendorpriv = 0 1145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_doubles_in_order = func.glx_doubles_in_order 1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 11766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.vectorequiv = None 11866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.output = None 11966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.can_be_large = func.can_be_large 12066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.reply_always_array = func.reply_always_array 12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.dimensions_in_reply = func.dimensions_in_reply 12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.img_reset = None 1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 12466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.server_handcode = 0 12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.client_handcode = 0 12666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.ignore = 0 1275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1283fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick self.count_parameter_list = func.count_parameter_list 12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.counter_list = func.counter_list 13066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.offsets_calculated = 0 1315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 132e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 133e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoStubs(glX_proto_common.glx_print_proto): 135e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick glX_proto_common.glx_print_proto.__init__(self) 13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 1385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM") 13966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 142e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 1435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.pixel_stubs = {} 1441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick self.debug = 0 145e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 146e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 147e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 150e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect.h"' 151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "glxclient.h"' 1525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '#include "indirect_size.h"' 153e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 1542eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 1552eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#include <X11/xcl.h>' 1562eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#include <X11/XCB/xcb.h>' 1572eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#include <X11/XCB/glx.h>' 1582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#endif /* USE_XCB */' 15966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 160e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 163c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 164c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 166990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#if !defined __GNUC__ || __GNUC__ < 3' 167990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 168990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 169990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 170e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 173e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 174e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 175e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 182e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 185a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 186a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 187a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 188a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 189a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 190a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 191a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 192a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 193a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 194a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 195a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 196a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 197a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2031fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 2041fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim, 205d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 206d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 207d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 208d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 209d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 210d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 211d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 212d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 213d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 214d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 215d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 216d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 217d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 218d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 219d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 220d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 221d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 222d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 245e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 246e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2471fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen ) 249e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 250e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 251e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 252e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 253e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 254e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 255e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 256e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 257e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 258e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 259e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 260e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2621fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2631fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 2825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 2835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 2845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 2855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 2865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 2875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 2885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 2895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 296e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 29766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 29866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 29966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs = {} 30066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs = [] 30166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 30266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 30366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.client_handcode: continue 30466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 30566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If the function is a pixel function with a certain 30666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GLX protocol signature, create a fake stub function 30766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # for it. For example, create a single stub function 30866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that is used to implement both glTexImage1D and 30966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage2D. 31066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0: 31266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 0 31366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for image in func.get_images(): 31466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if image.img_pad_dimensions: 31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 1 31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if do_it: 32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [h, n] = hash_pixel_function(func) 32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs[ func.name ] = n 32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if h not in generated_stubs: 32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs.append(h) 32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fake_func = glx_pixel_function_stub( func, n ) 32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printFunction( fake_func ) 32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printFunction( func ) 33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printFunction(self, func): 33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop == ~0: 33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'static %s' % (func.return_type) 33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s' % (func.return_type) 34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '__indirect_gl%s(%s)' % (func.name, func.get_parameter_string()) 34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '{' 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0 or func.vectorequiv != None: 35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(func.images): 35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 3535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printRenderFunction(func) 35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printSingleFunction(func) 35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pass 358e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print "/* Missing GLX protocol for %s. */" % (func.name) 36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '}' 36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 36566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 366e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 367e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 3683385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 369e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 370e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 371e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 372e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 373e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 375e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 376e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 377e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 378990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 379e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 3803385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 38466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def common_emit_one_arg(self, p, pc, indent, adjust, extra_offset): 385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not extra_offset: 39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick % (indent, pc, p.offset + adjust, src_ptr, p.size_string() ) 39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick % (indent, pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 396e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 397e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_args(self, f, pc, indent, adjust, skip_vla): 39866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = None 399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend( not skip_vla ): 401d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 40266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_one_arg(p, pc, indent, adjust, extra_offset) 40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 40466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_variable_length(): 40566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick temp = p.size_string() 40666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if extra_offset: 40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset += " + %s" % (temp) 40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = temp 410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 41466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def pixel_emit_args(self, f, pc, indent, large): 4155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 4165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 4175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 4185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 4195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 4205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 42166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 42266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 8 42366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 4 42566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 42666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not param.is_image(): 42866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_one_arg(param, pc, indent, adjust, None) 4295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 43066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 43166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset + param.size()) + adjust) 4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, width, height, depth, extent] = param.get_dimensions() 43566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 43666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = "dim" 43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = str(dim) 43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset - 4) + adjust) 44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, (param.offset - 4) + adjust, param.name) 44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 4465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pixHeaderPtr = "%s + %u" % (pc, adjust) 44866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pcPtr = "%s + %u" % (pc, param.offset + adjust) 4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not large: 45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_send_null: 45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (param.name) 45366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 45466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = 'compsize > 0' 45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s if (%s) {' % (indent, condition) 45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s }' % (indent) 45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s else {' % (indent) 46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim) 46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s }' % (indent) 46266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s __glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 46566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def large_emit_begin(self, indent, f, op_name = None): 4695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 4705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s const GLint op = %s;' % (indent, op_name) 4733276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s const GLuint cmdlenLarge = cmdlen + 4;' % (indent) 4743276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 4753276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent) 4763276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent) 4773276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 4783276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 4793276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_just_start(self, f): 481e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 48266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 483990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 484990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 485990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 486990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 487990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 488990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME Simplify the logic related to skip_condition and 49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition_list in this function. Basically, remove 49166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME skip_condition, and just append the "dpy != NULL" type 49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition to condition_list from the start. The only 49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME reason it's done in this confusing way now is to 49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME minimize the diffs in the generated code. 49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 496990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 501d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 502990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 503990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 504990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 505990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 506990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 507990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 508990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 509990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 512e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 513e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_packet_size_calculation(f, 0) 515e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list = [] 51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateCounters(): 51866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( "%s >= 0" % (p.name) ) 519e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 52166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( skip_condition ) 52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 0: 52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 1: 52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "%s" % (condition_list.pop(0)) 52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 530990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 531990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 532990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 533e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 534e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printSingleFunction(self, f): 53666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_func_print_just_start(f) 53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5381fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 5391fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 541af1a72997224610420b1105f967b0f5a8272858dBrian Paul if f.glx_vendorpriv == 0: 5422eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5432eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # XCB specific: 5442eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 5452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if self.debug: 5462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' printf("\\tUsing XCB.\\n");' 5472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' XCBConnection *c = XCBConnectionOfDisplay(dpy);' 5482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 549af1a72997224610420b1105f967b0f5a8272858dBrian Paul xcb_name = 'XCBGlx%s' % f.name 55066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams=[] 55266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams = [] 55366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = None 55466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterator(): 55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_output: 55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = p 55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 55966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 56066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("state->storePack.swapEndian") 56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 56266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 56366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 56466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Hardcode this in. lsb_first param (apparently always GL_FALSE) 56566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # also present in GetPolygonStipple, but taken care of above. 56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if xcb_name == "XCBGlxReadPixels": 56766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 56866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 5692eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams.append(p.name) 5702eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 57166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 57266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 5732eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if f.needs_reply(): 5752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' %sRep *reply = %sReply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 57666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if output and f.reply_always_array: 57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s = (%s)%sData(reply);' % (output.name, output.type_string(), xcb_name) 57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif output and not f.reply_always_array: 57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not output.is_image(): 5802eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' if (%sDataLength(reply) == 0)' % (xcb_name) 58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 5822eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' else' 58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, %sData(reply), %sDataLength(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string()) 5842eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 5872eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' retval = reply->ret_val;' 5882eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' free(reply);' 5892eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul else: 5902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' ' + xcb_request + ';' 5912eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#else' 5922eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # End of XCB specific. 59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 59466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.parameters != []: 596e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 597e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 598e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 599e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 600e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_vendorpriv != 0: 6011fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 602e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 6031fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 604e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "pc", " ", 0, 0) 606d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 60766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick images = f.get_images() 60866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for img in images: 61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.is_output: 61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.command_fixed_length() - 4 61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 616d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 617d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 618d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = '' 621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 62266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 62366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = " retval" 62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " retval = (%s)" % (f.return_type) 625e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " (void)" 62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 0 62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, w, h, d, junk] = p.get_dimensions() 63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.dimensions_in_reply: 63466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 6353f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick else: 63666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, %s, %s, %s, %s, %s, %s, GL_FALSE);" % (dim, w, h, d, p.img_format, p.img_type, p.name) 6373f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick 63866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 639d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 64066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.reply_always_array: 64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_TRUE" 64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_FALSE" 644e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # gl_parameter.size() returns the size 64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # of the entire data item. If the 64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # item is a fixed-size array, this is 64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # the size of the whole array. This 64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is not what __glXReadReply wants. It 65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # wants the size of a single data 65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # element in the reply packet. 65266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Dividing by the array size (1 for 65366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # non-arrays) gives us this. 654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() / p.get_element_count() 65666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If a reply wasn't read to fill an output parameter, 66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # read a NULL reply to get the return value. 66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not got_reply: 66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 665d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 666e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 6671fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 6681fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 6691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 6701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 6711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 6721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 6731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 6745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 6775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_vendorpriv == 0: 67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#endif /* USE_XCB */' 6805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return%s;' % (return_name) 68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 6845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printPixelFunction(self, f): 68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.pixel_stubs.has_key( f.name ): 68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Normally gl_function::get_parameter_string could be 68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # used. However, this call needs to have the missing 69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # dimensions (e.g., a fake height value for 69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage1D) added in. 6925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p_string += ", " + param.name 69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 6995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 7015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 7025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 7045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 7085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = " " 7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 7105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 7115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = "" 7125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 7135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 7165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 7175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 7205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent += " " 7215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 72366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = "opcode" 7245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 72566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = f.opcode_real_name() 7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, opcode) 7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_emit_args( f, "gc->pc", indent, 0 ) 7305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%selse {' % (indent) 7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.large_emit_begin(indent, f, opcode) 73866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_emit_args( f, "pc", indent, 1 ) 7395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 7415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 746e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 74747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 74847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 74947719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 75047719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 75147719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 7521d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.variable_length_parameter() == None and len(f.parameters) == 1: 75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters[0] 75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_pointer(): 7570246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 758e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 759e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 761e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 76266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = " " 764990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 765e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 766e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = "" 767990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 768990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 7691fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 7701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name) 7711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 772990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 773990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 774990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 775990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 776990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s }' % (indent) 777990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick indent += " " 778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 779e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 781e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "gc->pc", indent, 4, 0) 782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 783990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 784e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 785e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 786990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 787990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%selse {' % (indent) 7883276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 7893276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick self.large_emit_begin(indent, f) 79066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_args(f, "pc", indent, 8, 1) 7911fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, p.offset + 8, p.name, p.size_string()) 794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 7961fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 7971fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s __indirect_glFinish();' % (indent) 7981fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name) 7991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 800990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 803e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 80466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 805e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 80666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 80866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 810e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 811e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 814e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 815e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 821e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 824e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 825e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 86766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 87066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printCategory(self, category_group, show_num): 87166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick cat_keys = category_group.keys() 87266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick cat_keys.sort() 87366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for cat_num in cat_keys: 87466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 1 87566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for offset in category_group[ cat_num ]: 87666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [cat_name, func_name] = category_group[ cat_num ][ offset ] 87766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 87866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if first: 87966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 88066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if show_num: 88166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' /* % 3u. %s */' % (cat_num, cat_name) 88266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 88366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' /* %s */' % (cat_name) 88466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 88566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 0 88666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 88766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' glAPI->%s = __indirect_gl%s;' % (func_name, func_name) 88866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 88966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 89066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 89166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories = {} 89266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories = {} 89366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories = {} 89466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick next_unnum = 1000 89566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 89666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 89766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [cat, num] = api.get_category_for_name( func.name ) 89866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 89966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # There are three groups of "categories" that we 90066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # care about here. We want to separate the core GL 90166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # version categories from extensions. We also want to 90266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # separate the ARB extensions from the non-ARB 90366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # extensions. 90466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 90566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # This is done by first trying to convert the category 90666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # name to a floating point number. All core GL 90766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # versions are of the form "N.M" where both N and M 90866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # are integers. If the cast to float fails, an 90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # exception will be thrown. Once down that path, 91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # we can look at the start of the extension string. 91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If it begins with "GL_ARB_", it's an ARB extension. 91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Once the categories are separated, the are ordered 91466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # by number. The un-numbered non-ARB extensions 91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # (e.g., GL_INGR_blend_func_separate) are assigned 91666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # arbitrary numbers starting at 1000. 91766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 91866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME In order to maintain repeatability, the 91966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME unnumbered extensions should be put in their 92066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME own dictionary and ordered by name (since they 92166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME have no number). 92266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 92366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick try: 92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = float(cat) 92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not core_categories.has_key( num ): 92666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories[ num ] = {} 92766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 92866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories[ num ][ func.offset ] = [cat, func.name] 92966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 93066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick except Exception, e: 93166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not num: 93266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = next_unnum 93366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick next_unnum += 1 93466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 93566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = int(num) 93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 93766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if cat.startswith( "GL_ARB_" ): 93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not arb_categories.has_key( num ): 93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories[ num ] = {} 94066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories[ num ][ func.offset ] = [cat, func.name] 94266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 94366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not other_categories.has_key( num ): 94466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories[ num ] = {} 945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 94666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories[ num ][ func.offset ] = [cat, func.name] 94766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( core_categories, 0 ) 94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( arb_categories, 1 ) 95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( other_categories, 1 ) 95166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 95266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 95666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 95766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 96216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 96466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 96566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 96666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 96766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 968e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 96916c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 970e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 973e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 974e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 975e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 977c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 9781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 9791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 9801fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9811fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 9821fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 9831fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9841fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 9851fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 9861fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9871fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 9881fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, unsigned max_dim, GLint width, GLint height, 9891fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 9901fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 9911fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9921fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 9931fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint sop, GLint cmdlen ); 9941fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 9961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ); 9971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 99816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 999e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 100066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 100166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 100266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, func.get_parameter_string()) 1003e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1005e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 10061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 10071fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 10081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1015e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 10161fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 1017e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 1018e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1019e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 10201fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 1021e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 1022e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 1023e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 1024e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 1025e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 1026e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 10271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 10281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 1029e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1030e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 103166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoStubs() 1032e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 103366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_c() 1034e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 103566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_h() 1036e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 1037e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1038e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1039e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 104066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.debug = debug 104166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 104266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 104366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 1044