glX_proto_send.py revision e8c7d7598fb48237508f566204c71ba8f74d544f
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> 273d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb# Jeremy Kolb <jkolb@brandeis.edu> 28e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML, glX_proto_common, license 3066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string 315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 323d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolbdef convertStringForXCB(str): 333d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb tmp = "" 343d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb special = [ "ARB" ] 353d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb i = 0 363d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb while i < len(str): 373d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb if str[i:i+3] in special: 383d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb tmp = '%s_%s' % (tmp, string.lower(str[i:i+3])) 393d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb i = i + 2; 403d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb elif str[i].isupper(): 413d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb tmp = '%s_%s' % (tmp, string.lower(str[i])) 423d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb else: 433d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb tmp = '%s%s' % (tmp, str[i]) 443d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb i += 1 453d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb return tmp 463d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb 475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickdef hash_pixel_function(func): 485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Generate a 'unique' key for a pixel function. The key is based on 495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick the parameters written in the command packet. This includes any 505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick padding that might be added for the original function and the 'NULL 515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick image' flag.""" 525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h = "" 5566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_pre = "" 5666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_suf = "" 5766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in func.parameterIterateGlxSend(): 5866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 5966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick d = (dim + 1) & ~1 6266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_pre = "%uD%uD_" % (d - 1, d) 635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 6566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick hash_suf = "_NF" 6666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h += "%u" % (param.size()) 6866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.pad_after(param): 705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick h += "4" 715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = func.name.replace("%uD" % (dim), "") 745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick n = "__glx_%s_%uD%uD" % (n, d - 1, d) 7566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 7666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick h = hash_pre + h + hash_suf 775f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return [h, n] 785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_pixel_function_stub(glX_XML.glx_function): 815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Dummy class used to generate pixel "utility" functions that are 825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick shared by multiple dimension image functions. For example, these 835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick objects are used to generate shared functions used to send GLX 845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick protocol for TexImage1D and TexImage2D, TexSubImage1D and 855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexSubImage2D, etc.""" 865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def __init__(self, func, name): 885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # The parameters to the utility function are the same as the 895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters to the real function except for the added "pad" 905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick # parameters. 915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.name = name 9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.images = [] 9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters = [] 9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name = {} 9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for _p in func.parameterIterator(): 9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = copy.copy(_p) 9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters.append(p) 9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name[ p.name ] = p 10066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 10366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.images.append(p) 10466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.height = "height" 10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_yoff == None: 10766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.img_yoff = "yoffset" 10866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.depth: 11066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.extent == None: 11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.extent = "extent" 11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_woff == None: 11466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p.img_woff = "woffset" 11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 1165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad_name = func.pad_after(p) 1185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if pad_name: 1195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad = copy.copy(p) 1205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick pad.name = pad_name 12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters.append(pad) 12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.parameters_by_name[ pad.name ] = pad 1235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1245f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.return_type = func.return_type 1265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 12766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_rop = ~0 12866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_sop = 0 12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_vendorpriv = 0 1305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 13166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.glx_doubles_in_order = func.glx_doubles_in_order 1325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 13366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.vectorequiv = None 13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.output = None 13566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.can_be_large = func.can_be_large 13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.reply_always_array = func.reply_always_array 13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.dimensions_in_reply = func.dimensions_in_reply 13866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.img_reset = None 1395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.server_handcode = 0 14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.client_handcode = 0 14266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.ignore = 0 1435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 1443fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick self.count_parameter_list = func.count_parameter_list 14566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.counter_list = func.counter_list 14666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.offsets_calculated = 0 1475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 148e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 149e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 15066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoStubs(glX_proto_common.glx_print_proto): 151e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 15266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick glX_proto_common.glx_print_proto.__init__(self) 15366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 1545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM") 15566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 15666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 15766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 158e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 1595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick self.pixel_stubs = {} 1601fca5632325e1da42e278909e404dd57e0a62252Ian Romanick self.debug = 0 161e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 162e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 163e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 164e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 165e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/gl.h>' 166e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "indirect.h"' 167e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include "glxclient.h"' 1685f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '#include "indirect_size.h"' 169c28d0f779aec13f937d452de01a1b34a2ec44de8Brian Paul print '#include "glapi.h"' 170f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#include "glthread.h"' 171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 1722eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 173b8f26126e2874a00321af084bc2cdb486a62aa8fIan Romanick print '#include <X11/Xlib-xcb.h>' 1743d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/xcb.h>' 1753d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/glx.h>' 1762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#endif /* USE_XCB */' 17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 181c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 182c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1846e8e4b918d1dac8a0c20e7a5d6f4665a1eaf174fIan Romanick print '#ifndef __GNUC__' 185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 187990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 203a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 214a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 215a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2211fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 222c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXReadPixelReply( Display *dpy, struct glx_context * gc, unsigned max_dim, 223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 261d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 262d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2651fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 266c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupSingleRequest( struct glx_context * gc, GLint sop, GLint cmdlen ) 267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2801fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 281c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupVendorRequest( struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ) 282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 3065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 3075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs = {} 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs = [] 31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.client_handcode: continue 32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If the function is a pixel function with a certain 32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GLX protocol signature, create a fake stub function 32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # for it. For example, create a single stub function 32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that is used to implement both glTexImage1D and 32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage2D. 32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0: 33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 0 33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for image in func.get_images(): 33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if image.img_pad_dimensions: 33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 1 33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 3350f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if do_it: 33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [h, n] = hash_pixel_function(func) 33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs[ func.name ] = n 34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if h not in generated_stubs: 34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs.append(h) 34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fake_func = glx_pixel_function_stub( func, n ) 346f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(fake_func, fake_func.name) 34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 349f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.name) 350f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.glx_sop and func.glx_vendorpriv: 351f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.glx_vendorpriv_names[0]) 35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 353e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu self.printGetProcAddress(api) 354e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu return 355e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 356e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu def printGetProcAddress(self, api): 357e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu procs = {} 358e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu for func in api.functionIterateGlx(): 359e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu for n in func.entry_points: 360e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu if func.has_different_protocol(n): 361e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu procs[n] = func.static_glx_name(n) 362e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 363e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print """ 364e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu#ifdef GLX_SHARED_GLAPI 365e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 366e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wustatic const struct proc_pair 367e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{ 368e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu const char *name; 369e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu _glapi_proc proc; 370e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu} proc_pairs[%d] = {""" % len(procs) 371e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu names = procs.keys() 372e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu names.sort() 373e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu for i in xrange(len(names)): 374e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu comma = ',' if i < len(names) - 1 else '' 375e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print ' { "%s", (_glapi_proc) gl%s }%s' % (names[i], procs[names[i]], comma) 376e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print """}; 377e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 378e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wustatic int 379e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu__indirect_get_proc_compare(const void *key, const void *memb) 380e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{ 381e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu const struct proc_pair *pair = (const struct proc_pair *) memb; 382e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu return strcmp((const char *) key, pair->name); 383e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu} 384e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 385e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu_glapi_proc 386e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu__indirect_get_proc_address(const char *name) 387e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu{ 388e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu const struct proc_pair *pair; 389e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 390e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu /* skip "gl" */ 391e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu name += 2; 392e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 393e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu pair = (const struct proc_pair *) bsearch((const void *) name, 394e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu (const void *) proc_pairs, ARRAY_SIZE(proc_pairs), sizeof(proc_pairs[0]), 395e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu __indirect_get_proc_compare); 396e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 397e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu return (pair) ? pair->proc : NULL; 398e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu} 399e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu 400e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu#endif /* GLX_SHARED_GLAPI */ 401e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu""" 40266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 40466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 405f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printFunction(self, func, name): 406f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n' 40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop == ~0: 40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'static %s' % (func.return_type) 40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 410f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 412f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(name): 413f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.return_type == "void": 414f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = '' 415f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 416f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = "return " 417f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 418f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick func_name = func.static_glx_name(name) 419f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv) 420f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string()) 421f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 422c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg print ' struct glx_context * const gc = __glXGetCurrentContext();' 423f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '' 424903986ca128d51ff031cc9eafa1976618834a8deBrian Paul print '#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)' 425c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg print ' if (gc->isDirect) {' 426b5022ad03584f119b27c143b53e7ed80e8c12ffbChia-I Wu print ' %sGET_DISPATCH()->%s(%s);' % (ret_string, func.name, func.get_called_parameter_string()) 427c428f467b65f1b79f77103db249936273d645fecIan Romanick print ' } else' 428c428f467b65f1b79f77103db249936273d645fecIan Romanick print '#endif' 429c428f467b65f1b79f77103db249936273d645fecIan Romanick print ' {' 430c428f467b65f1b79f77103db249936273d645fecIan Romanick 431f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n}\n' 432f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 433f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 435f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string()) 436f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0 or func.vectorequiv != None: 44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(func.images): 44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 4425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printRenderFunction(func) 44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 445f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printSingleFunction(func, name) 44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pass 447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 448f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print "/* Missing GLX protocol for %s. */" % (name) 44966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 450f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print footer 45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 453e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 4553385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 456e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 457e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 458e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 459c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * const gc = __glXGetCurrentContext(); 460e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 461e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 462e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 463e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 464e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 465990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 466e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 4673385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 469e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 470e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 471990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_one_arg(self, p, pc, adjust, extra_offset): 472e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 473e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 474e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 475e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 476e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4770f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if p.is_padding: 4780f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick print '(void) memset((void *)(%s + %u), 0, %s);' \ 4790f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick % (pc, p.offset + adjust, p.size_string() ) 4800f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick elif not extra_offset: 481990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 482990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, src_ptr, p.size_string() ) 48366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 484990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 485990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 486e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 487990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_args(self, f, pc, adjust, skip_vla): 48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = None 489e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend( not skip_vla ): 491d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 492990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(p, pc, adjust, extra_offset) 49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_variable_length(): 49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick temp = p.size_string() 49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if extra_offset: 49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset += " + %s" % (temp) 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = temp 500e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 50166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 502e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 503e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 504990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def pixel_emit_args(self, f, pc, large): 5055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 5065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 5075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 5085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 5095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 5105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 51266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 8 51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 4 51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not param.is_image(): 518990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(param, pc, adjust, None) 5195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 52066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 521990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust) 5225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, width, height, depth, extent] = param.get_dimensions() 52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = "dim" 52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = str(dim) 52966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5300f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if param.is_padding: 5310f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick print '(void) memset((void *)(%s + %u), 0, %s);' \ 5320f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick % (pc, (param.offset - 4) + adjust, param.size_string() ) 5330f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 53566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 536990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust) 53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 538990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name) 53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pixHeaderPtr = "%s + %u" % (pc, adjust) 54266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pcPtr = "%s + %u" % (pc, param.offset + adjust) 5435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not large: 54566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_send_null: 54666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (param.name) 54766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 54866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = 'compsize > 0' 54966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 550990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (%s) {' % (condition) 551990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 552990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '} else {' 553990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim) 554990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 556990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '__glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 5595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 561990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def large_emit_begin(self, f, op_name = None): 5625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 5635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 5645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 565990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLint op = %s;' % (op_name) 566990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLuint cmdlenLarge = cmdlen + 4;' 567990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' 568990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' 569990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);' 5703276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 5713276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 5723276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 573d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer def common_func_print_just_start(self, f, name): 574c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg print ' struct glx_context * const gc = __glXGetCurrentContext();' 57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 576990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 577990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 578990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 579990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 580990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 581990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 58266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME Simplify the logic related to skip_condition and 58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition_list in this function. Basically, remove 58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME skip_condition, and just append the "dpy != NULL" type 58566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition to condition_list from the start. The only 58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME reason it's done in this confusing way now is to 58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME minimize the diffs in the generated code. 58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 589990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 59066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 591d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"): 59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 594d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 595990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 596990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 597990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 598990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 599990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 600990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 601990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 602990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 60366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 60466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 605e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 606e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 607d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if name != None and name not in f.glx_vendorpriv_names: 608d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer print '#ifndef USE_XCB' 60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_packet_size_calculation(f, 0) 610d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if name != None and name not in f.glx_vendorpriv_names: 611d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer print '#endif' 612e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list = [] 61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateCounters(): 61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( "%s >= 0" % (p.name) ) 616a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian # 'counter' parameters cannot be negative 617a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " if (%s < 0) {" % p.name 618a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " __glXSetError(gc, GL_INVALID_VALUE);" 619a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian if f.return_type != 'void': 620a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " return 0;" 621a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian else: 622a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " return;" 623a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " }" 624e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 625990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( skip_condition ) 62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 0: 62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 1: 63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "%s" % (condition_list.pop(0)) 63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 634990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 635990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 636990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 637990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 639e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 640f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printSingleFunction(self, f, name): 641d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer self.common_func_print_just_start(f, name) 64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6431fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 6441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 646f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 6472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # XCB specific: 6492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 6502eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if self.debug: 6512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' printf("\\tUsing XCB.\\n");' 6523d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' xcb_connection_t *c = XGetXCBConnection(dpy);' 6532eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 654f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick xcb_name = 'xcb_glx%s' % convertStringForXCB(name) 65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6562eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams=[] 65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams = [] 65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = None 65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterator(): 66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_output: 66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = p 66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("state->storePack.swapEndian") 66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Hardcode this in. lsb_first param (apparently always GL_FALSE) 67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # also present in GetPolygonStipple, but taken care of above. 6713d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb if xcb_name == "xcb_glx_read_pixels": 67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 67366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 6742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams.append(p.name) 6752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 6782eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6792eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if f.needs_reply(): 6803d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if output and f.reply_always_array: 6823d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string()) 6833fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb 68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif output and not f.reply_always_array: 6852636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick if not output.is_image(): 6863d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' if (%s_data_length(reply) == 0)' % (xcb_name) 68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 6882eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' else' 6893d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string()) 6902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6911fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 6932eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' retval = reply->ret_val;' 6942eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' free(reply);' 6952eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul else: 6962eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' ' + xcb_request + ';' 6972eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#else' 6982eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # End of XCB specific. 69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.parameters != []: 702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 703e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 704e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 705e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 706f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name in f.glx_vendorpriv_names: 707f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name)) 708e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 7091fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 710e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 711990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 0, 0) 712d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick images = f.get_images() 71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for img in images: 71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.is_output: 71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.command_fixed_length() - 4 71866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 71966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 722d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 723d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 724d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 725e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 72666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = '' 727e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 72866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = " retval" 73066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " retval = (%s)" % (f.return_type) 731e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 73266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " (void)" 73366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 73466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 0 73566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 73666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 73866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, w, h, d, junk] = p.get_dimensions() 73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.dimensions_in_reply: 74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 7413f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick else: 74266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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) 7433f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick 74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 745d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.reply_always_array: 74766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_TRUE" 74866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 74966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_FALSE" 750e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 75166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # gl_parameter.size() returns the size 75266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # of the entire data item. If the 75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # item is a fixed-size array, this is 75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # the size of the whole array. This 75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is not what __glXReadReply wants. It 75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # wants the size of a single data 75766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # element in the reply packet. 75866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Dividing by the array size (1 for 75966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # non-arrays) gives us this. 760e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 76166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() / p.get_element_count() 76266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 76366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 76466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 76566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 76666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If a reply wasn't read to fill an output parameter, 76766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # read a NULL reply to get the return value. 76866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 76966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not got_reply: 77066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 771d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 772e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 7731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 7741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 7751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 7761fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 7771fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 7781fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 779f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (name) 7805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 78266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 7835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 784f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 78566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#endif /* USE_XCB */' 7865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 78766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 78866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return%s;' % (return_name) 78966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 7905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 79266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printPixelFunction(self, f): 79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.pixel_stubs.has_key( f.name ): 79466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Normally gl_function::get_parameter_string could be 79566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # used. However, this call needs to have the missing 79666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # dimensions (e.g., a fake height value for 79766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage1D) added in. 7985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 80066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 8010f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if param.is_padding: 8020f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick continue 8030f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 80466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p_string += ", " + param.name 80566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 80666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 8085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 80966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 8105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 8115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 8135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 8145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 816d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if self.common_func_print_just_start(f, None): 8175f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 8185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 8195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 8205f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 823990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 824990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 8275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 82866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 82966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = "opcode" 8305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 83166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = f.opcode_real_name() 8325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 833990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (opcode) 8345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 835990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args( f, "gc->pc", 0 ) 836990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 837990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 8385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 840990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 841990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 8425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 843990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f, opcode) 844990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args(f, "pc", 1) 8455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 846990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 8475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 8495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 8505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 85347719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 85447719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 85547719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 85647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 85747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 8581d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 85966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 86066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.variable_length_parameter() == None and len(f.parameters) == 1: 86166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters[0] 86266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_pointer(): 8630246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 868d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if self.common_func_print_just_start(f, None): 869990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 871990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 872990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 8731fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 874990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 8751fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 876990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 877990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 878990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 879990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 880990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 882990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name()) 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 884990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "gc->pc", 4, 0) 885990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 886990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 889990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 890990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 8913276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 892990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f) 893990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 8, 1) 8941fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 896990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string()) 897990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 898e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 900990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '__indirect_glFinish();' 901990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 9021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 903990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 90766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 924e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 925e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 926e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 928e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 931e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 932e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 936e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 937e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 938e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 939e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 940e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 942e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 943e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 944e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 946699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieristruct _glapi_table * __glXNewIndirectAPI( void ) 947e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 948699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri struct _glapi_table *glAPI; 949e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 950e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 951e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 952699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri glAPI = (struct _glapi_table *) Xmalloc(entries * sizeof(void *)); 953e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 954e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 955e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 963e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 964e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 965e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 966e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 967e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 968e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 969e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 97066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 971e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 97366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 974eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for [name, number] in api.categoryIterate(): 975eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if number != None: 976eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %3u. %s */\n\n' % (int(number), name) 977eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick else: 978eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %s */\n\n' % (name) 979e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 980eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for func in api.functionIterateByCategory(name): 981eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if func.client_supported_for_indirect(): 982eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick print '%s glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name) 983eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '' 98466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 98566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 98666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 98766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 98866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 989e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 99066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 99166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 99266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 993e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 994e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 995e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 99616c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 997e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 99866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 99966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 100066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 100166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 1002e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 100316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 1005e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 1006e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 1007e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 1008e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 1011c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 10121fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 10131fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 10141fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10151fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 10161fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 10171fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10181fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 10191fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 10201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10211fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 1022c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, unsigned max_dim, GLint width, GLint height, 10231fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 10241fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 10251fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10261fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 1027c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, GLint sop, GLint cmdlen ); 10281fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10291fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 1030c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ); 10311fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 103216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 1033e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 103466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 103566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 1036f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick params = func.get_parameter_string() 1037f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1038f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params) 1039f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1040f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick for n in func.entry_points: 1041f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(n): 1042f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick asdf = func.static_glx_name(n) 1043f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if asdf not in func.static_entry_points: 1044f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params) 1045e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu # give it a easy-to-remember name 1046e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu if func.client_handcode: 1047e4dbfa44ed018d124e1531077d506c8c914c1a51Chia-I Wu print '#define gl_dispatch_stub_%s gl%s' % (n, asdf) 1048f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 1049f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params) 1050f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1051f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick break 1052f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1053e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print '' 1054e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print '#ifdef GLX_SHARED_GLAPI' 1055e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print 'extern HIDDEN void (*__indirect_get_proc_address(const char *name))(void);' 1056e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu print '#endif' 1057e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1058e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1059e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 10601fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 10611fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 10621fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 1063e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 1064e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1065e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1066e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 1067e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 1068e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1069e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 10701fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 1071e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 1072e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1073e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 10741fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 1075e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 1076e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 1077e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 1078e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 1079e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 1080e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 10811fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 10821fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 1083e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1084e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 108566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoStubs() 1086e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 108766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_c() 1088e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 108966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_h() 1090e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 1091e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1092e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1093e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 109466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.debug = debug 109566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 109666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 109766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 1098