glX_proto_send.py revision 699c82e30ce78c3975b3ce1a6fba148c70a9a78a
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"' 1694cb13b433cfdaa1295e5df048d7ef614545f6e16Chia-I Wu print '#include "glapidispatch.h"' 170c28d0f779aec13f937d452de01a1b34a2ec44de8Brian Paul print '#include "glapi.h"' 171f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#include "glthread.h"' 172e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 1732eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 174b8f26126e2874a00321af084bc2cdb486a62aa8fIan Romanick print '#include <X11/Xlib-xcb.h>' 1753d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/xcb.h>' 1763d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/glx.h>' 1772eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#endif /* USE_XCB */' 17866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 182c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 183c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 184e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1856e8e4b918d1dac8a0c20e7a5d6f4665a1eaf174fIan Romanick print '#ifndef __GNUC__' 186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 187990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 188990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1981fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 203e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 214a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 215a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 216a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 221e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2221fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 223c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXReadPixelReply( Display *dpy, struct glx_context * gc, unsigned max_dim, 224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 261d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 262d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 263d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2661fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 267c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupSingleRequest( struct glx_context * gc, GLint sop, GLint cmdlen ) 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2811fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 282c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSetupVendorRequest( struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ) 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 295e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 3065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 3075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 3085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 315e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs = {} 31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs = [] 32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.client_handcode: continue 32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If the function is a pixel function with a certain 32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GLX protocol signature, create a fake stub function 32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # for it. For example, create a single stub function 32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that is used to implement both glTexImage1D and 32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage2D. 32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0: 33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 0 33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for image in func.get_images(): 33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if image.img_pad_dimensions: 33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 1 33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 3360f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if do_it: 33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [h, n] = hash_pixel_function(func) 34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs[ func.name ] = n 34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if h not in generated_stubs: 34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs.append(h) 34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fake_func = glx_pixel_function_stub( func, n ) 347f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(fake_func, fake_func.name) 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 350f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.name) 351f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.glx_sop and func.glx_vendorpriv: 352f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.glx_vendorpriv_names[0]) 35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 357f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printFunction(self, func, name): 358f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n' 35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop == ~0: 36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'static %s' % (func.return_type) 36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 362f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 364f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(name): 365f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.return_type == "void": 366f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = '' 367f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 368f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = "return " 369f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 370f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick func_name = func.static_glx_name(name) 371f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv) 372f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string()) 373f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 374c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg print ' struct glx_context * const gc = __glXGetCurrentContext();' 375f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '' 376903986ca128d51ff031cc9eafa1976618834a8deBrian Paul print '#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)' 377c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg print ' if (gc->isDirect) {' 378f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' %sCALL_%s(GET_DISPATCH(), (%s));' % (ret_string, func.name, func.get_called_parameter_string()) 379c428f467b65f1b79f77103db249936273d645fecIan Romanick print ' } else' 380c428f467b65f1b79f77103db249936273d645fecIan Romanick print '#endif' 381c428f467b65f1b79f77103db249936273d645fecIan Romanick print ' {' 382c428f467b65f1b79f77103db249936273d645fecIan Romanick 383f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n}\n' 384f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 385f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 38666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 387f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string()) 388f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 38966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0 or func.vectorequiv != None: 39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(func.images): 39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 3945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printRenderFunction(func) 39666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 397f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printSingleFunction(func, name) 39866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pass 399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 400f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print "/* Missing GLX protocol for %s. */" % (name) 40166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 402f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print footer 40366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 40466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 4073385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 411c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * const gc = __glXGetCurrentContext(); 412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 414e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 417990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 418e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 4193385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 42066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 423990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_one_arg(self, p, pc, adjust, extra_offset): 424e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 425e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 427e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 428e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 4290f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if p.is_padding: 4300f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick print '(void) memset((void *)(%s + %u), 0, %s);' \ 4310f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick % (pc, p.offset + adjust, p.size_string() ) 4320f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick elif not extra_offset: 433990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 434990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, src_ptr, p.size_string() ) 43566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 436990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 437990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 438e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 439990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_args(self, f, pc, adjust, skip_vla): 44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = None 441e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend( not skip_vla ): 443d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 444990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(p, pc, adjust, extra_offset) 44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_variable_length(): 44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick temp = p.size_string() 44866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if extra_offset: 44966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset += " + %s" % (temp) 45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = temp 452e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 45366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 454e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 455e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 456990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def pixel_emit_args(self, f, pc, large): 4575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 4585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 4595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 4605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 4615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 8 46566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 46666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 4 46766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 46966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not param.is_image(): 470990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(param, pc, adjust, None) 4715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 473990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust) 4745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 47666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, width, height, depth, extent] = param.get_dimensions() 47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = "dim" 47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = str(dim) 48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 4820f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if param.is_padding: 4830f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick print '(void) memset((void *)(%s + %u), 0, %s);' \ 4840f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick % (pc, (param.offset - 4) + adjust, param.size_string() ) 4850f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 48766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 488990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust) 48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 490990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name) 49166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 4925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pixHeaderPtr = "%s + %u" % (pc, adjust) 49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pcPtr = "%s + %u" % (pc, param.offset + adjust) 4955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not large: 49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_send_null: 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (param.name) 49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = 'compsize > 0' 50166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 502990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (%s) {' % (condition) 503990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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) 504990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '} else {' 505990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim) 506990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 50766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 508990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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) 50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 5115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5125f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 513990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def large_emit_begin(self, f, op_name = None): 5145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 5155f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 5165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 517990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLint op = %s;' % (op_name) 518990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLuint cmdlenLarge = cmdlen + 4;' 519990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' 520990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' 521990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);' 5223276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 5233276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 5243276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 525d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer def common_func_print_just_start(self, f, name): 526c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg print ' struct glx_context * const gc = __glXGetCurrentContext();' 52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 528990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 530990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 531990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 532990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 533990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME Simplify the logic related to skip_condition and 53566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition_list in this function. Basically, remove 53666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME skip_condition, and just append the "dpy != NULL" type 53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition to condition_list from the start. The only 53866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME reason it's done in this confusing way now is to 53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME minimize the diffs in the generated code. 54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 541990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 54266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 543d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"): 54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 54566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 546d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 547990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 548990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 549990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 550990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 551990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 552990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 553990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 554990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 557e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 558e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 559d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if name != None and name not in f.glx_vendorpriv_names: 560d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer print '#ifndef USE_XCB' 56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_packet_size_calculation(f, 0) 562d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if name != None and name not in f.glx_vendorpriv_names: 563d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer print '#endif' 564e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 56566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list = [] 56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateCounters(): 56766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( "%s >= 0" % (p.name) ) 568a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian # 'counter' parameters cannot be negative 569a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " if (%s < 0) {" % p.name 570a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " __glXSetError(gc, GL_INVALID_VALUE);" 571a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian if f.return_type != 'void': 572a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " return 0;" 573a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian else: 574a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " return;" 575a52ce9de7d3ba1b244edaadbe976a0c794b0cc62Brian print " }" 576e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 577990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( skip_condition ) 57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 58066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 0: 58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 1: 58266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "%s" % (condition_list.pop(0)) 58566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 586990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 587990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 588990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 589990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 590e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 591e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 592f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printSingleFunction(self, f, name): 593d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer self.common_func_print_just_start(f, name) 59466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5951fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 5961fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 59766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 598f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 5992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6002eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # XCB specific: 6012eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 6022eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if self.debug: 6032eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' printf("\\tUsing XCB.\\n");' 6043d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' xcb_connection_t *c = XGetXCBConnection(dpy);' 6052eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 606f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick xcb_name = 'xcb_glx%s' % convertStringForXCB(name) 60766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6082eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams=[] 60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams = [] 61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = None 61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterator(): 61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_output: 61366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = p 61466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 61666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 61766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("state->storePack.swapEndian") 61866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 61966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Hardcode this in. lsb_first param (apparently always GL_FALSE) 62266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # also present in GetPolygonStipple, but taken care of above. 6233d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb if xcb_name == "xcb_glx_read_pixels": 62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 62566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 6262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams.append(p.name) 6272eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 6302eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6312eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if f.needs_reply(): 6323d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if output and f.reply_always_array: 6343d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 6353fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb 63666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif output and not f.reply_always_array: 6372636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick if not output.is_image(): 6383d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' if (%s_data_length(reply) == 0)' % (xcb_name) 63966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 6402eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' else' 6413d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 6422eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6431fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 64466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 6452eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' retval = reply->ret_val;' 6462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' free(reply);' 6472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul else: 6482eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' ' + xcb_request + ';' 6492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#else' 6502eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # End of XCB specific. 65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 65266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 65366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.parameters != []: 654e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 655e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 656e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 657e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 658f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name in f.glx_vendorpriv_names: 659f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name)) 660e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 6611fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 662e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 663990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 0, 0) 664d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick images = f.get_images() 66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for img in images: 66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.is_output: 66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.command_fixed_length() - 4 67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 67166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 67366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 674d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 675d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 676d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 677e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = '' 679e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = " retval" 68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " retval = (%s)" % (f.return_type) 683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " (void)" 68566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 0 68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, w, h, d, junk] = p.get_dimensions() 69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.dimensions_in_reply: 69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 6933f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick else: 69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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) 6953f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick 69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 697d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.reply_always_array: 69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_TRUE" 70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_FALSE" 702e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # gl_parameter.size() returns the size 70466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # of the entire data item. If the 70566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # item is a fixed-size array, this is 70666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # the size of the whole array. This 70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is not what __glXReadReply wants. It 70866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # wants the size of a single data 70966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # element in the reply packet. 71066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Dividing by the array size (1 for 71166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # non-arrays) gives us this. 712e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() / p.get_element_count() 71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 71866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If a reply wasn't read to fill an output parameter, 71966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # read a NULL reply to get the return value. 72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not got_reply: 72266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 723d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 724e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 7251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 7261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 7271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 7281fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 7291fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 7301fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 731f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (name) 7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 736f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#endif /* USE_XCB */' 7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return%s;' % (return_name) 74166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printPixelFunction(self, f): 74566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.pixel_stubs.has_key( f.name ): 74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Normally gl_function::get_parameter_string could be 74766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # used. However, this call needs to have the missing 74866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # dimensions (e.g., a fake height value for 74966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage1D) added in. 7505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 75266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 7530f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick if param.is_padding: 7540f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick continue 7550f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick 75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p_string += ", " + param.name 75766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 75866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 75966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 7605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 76166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 7625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 7635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 76466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 7655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 768d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if self.common_func_print_just_start(f, None): 7695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 7705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 7715f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 7725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 775990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 776990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 777990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 778990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 7795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 78066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 78166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = "opcode" 7825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 78366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = f.opcode_real_name() 7845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 785990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (opcode) 7865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 787990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args( f, "gc->pc", 0 ) 788990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 789990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 7905f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 792990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 793990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 7945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 795990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f, opcode) 796990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args(f, "pc", 1) 7975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 798990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 7995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 8015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 8025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 8035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 804e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 80547719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 80647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 80747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 80847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 80947719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 8101d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 81166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 81266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.variable_length_parameter() == None and len(f.parameters) == 1: 81366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters[0] 81466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_pointer(): 8150246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 816e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 817e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 820d2f19a554a9089fddb5e978e3a732bbf71d77f93Michel Dänzer if self.common_func_print_just_start(f, None): 821990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 823990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 824990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 8251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 8271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 828990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 829990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 830990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 831990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 832990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 834990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name()) 835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 836990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "gc->pc", 4, 0) 837990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 838990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 841990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 842990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 8433276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 844990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f) 845990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 8, 1) 8461fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 848990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string()) 849990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8511fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 852990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '__indirect_glFinish();' 853990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 8541fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 855990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 85966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 86166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 86266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 86366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 86766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 895e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 898699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieristruct _glapi_table * __glXNewIndirectAPI( void ) 899e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 900699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri struct _glapi_table *glAPI; 901e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 902e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 903e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 904699c82e30ce78c3975b3ce1a6fba148c70a9a78aLuca Barbieri glAPI = (struct _glapi_table *) Xmalloc(entries * sizeof(void *)); 905e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 906e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 907e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 908e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 909e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 910e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 911e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 912e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 913e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 915e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 916e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 917e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 921e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 92266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 923e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 924e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 926eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for [name, number] in api.categoryIterate(): 927eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if number != None: 928eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %3u. %s */\n\n' % (int(number), name) 929eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick else: 930eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %s */\n\n' % (name) 931e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 932eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for func in api.functionIterateByCategory(name): 933eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if func.client_supported_for_indirect(): 934eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick print '%s glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name) 935eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '' 93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 93766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 941e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 94266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 94366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 945e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 946e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 947e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 94816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 949e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 95166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 95266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 954e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 95516c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 956e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 957e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 959e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 960e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 961e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 963c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 9641fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 9651fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 9661fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9671fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 9681fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 9691fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9701fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 9711fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 9721fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9731fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 974c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, unsigned max_dim, GLint width, GLint height, 9751fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 9761fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 9771fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9781fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 979c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, GLint sop, GLint cmdlen ); 9801fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9811fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 982c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ); 9831fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 98416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 98666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 98766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 988f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick params = func.get_parameter_string() 989f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 990f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params) 991f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 992f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick for n in func.entry_points: 993f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(n): 994f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick asdf = func.static_glx_name(n) 995f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if asdf not in func.static_entry_points: 996f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params) 997f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 998f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params) 999f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1000f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick break 1001f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 1002e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1003e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 10051fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 10061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 10071fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 1008e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 1012e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 1013e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1014e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 10151fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 1016e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 1017e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1018e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 10191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 1020e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 1021e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 1022e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 1023e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 1024e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 1025e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 10261fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 10271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 1028e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1029e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 103066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoStubs() 1031e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 103266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_c() 1033e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 103466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_h() 1035e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 1036e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1037e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1038e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 103966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.debug = debug 104066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 104166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 104266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 1043