glX_proto_send.py revision 3d7ee324adca4f4c20a793d5d01921c6e757b681
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"' 169e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 1702eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 1712eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#include <X11/xcl.h>' 1723d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/xcb.h>' 1733d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/glx.h>' 1742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#endif /* USE_XCB */' 17566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 176e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 177e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 179c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 180c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 181e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 182990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#if !defined __GNUC__ || __GNUC__ < 3' 183990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 184990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 186e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 187e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1941fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 196e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 197e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 201a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 202a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 203a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 214e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 215e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2191fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 2201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim, 221d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 222d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 261e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 262e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2631fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2641fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen ) 265e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 266e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2781fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2791fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 280e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 281e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2935f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 306e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 307e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 31366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 31466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs = {} 31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs = [] 31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.client_handcode: continue 32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If the function is a pixel function with a certain 32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GLX protocol signature, create a fake stub function 32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # for it. For example, create a single stub function 32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that is used to implement both glTexImage1D and 32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage2D. 32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0: 32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 0 32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for image in func.get_images(): 33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if image.img_pad_dimensions: 33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 1 33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if do_it: 33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [h, n] = hash_pixel_function(func) 33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs[ func.name ] = n 34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if h not in generated_stubs: 34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs.append(h) 34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fake_func = glx_pixel_function_stub( func, n ) 34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printFunction( fake_func ) 34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printFunction( func ) 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printFunction(self, func): 35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop == ~0: 35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'static %s' % (func.return_type) 35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 35666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s' % (func.return_type) 36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '__indirect_gl%s(%s)' % (func.name, func.get_parameter_string()) 36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '{' 36466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 36666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0 or func.vectorequiv != None: 36766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(func.images): 36866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 3695f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 37066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printRenderFunction(func) 37166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 37266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printSingleFunction(func) 37366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pass 374e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 37566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print "/* Missing GLX protocol for %s. */" % (func.name) 37666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 37766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '}' 37866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 37966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 38066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 382e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 383e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 3843385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 385e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 386e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 387e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 388e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 389e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 390e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 391e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 392e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 393e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 394990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 395e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 3963385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 39766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 398e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 399e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 40066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def common_emit_one_arg(self, p, pc, indent, adjust, extra_offset): 401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 402e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 40666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not extra_offset: 40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick % (indent, pc, p.offset + adjust, src_ptr, p.size_string() ) 40966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 41066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 41166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick % (indent, pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 412e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def common_emit_args(self, f, pc, indent, adjust, skip_vla): 41466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = None 415e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 41666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend( not skip_vla ): 417d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 41866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_one_arg(p, pc, indent, adjust, extra_offset) 41966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 42066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_variable_length(): 42166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick temp = p.size_string() 42266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if extra_offset: 42366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset += " + %s" % (temp) 42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 42566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = temp 426e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 428e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 429e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 43066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def pixel_emit_args(self, f, pc, indent, large): 4315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 4325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 4335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 4345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 4355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 4365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 8 43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 4 44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not param.is_image(): 44466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_one_arg(param, pc, indent, adjust, None) 4455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 44666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 44766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset + param.size()) + adjust) 4485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 45066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, width, height, depth, extent] = param.get_dimensions() 45166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 45266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = "dim" 45366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 45466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = str(dim) 45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), zero, 4);' % (indent, pc, (param.offset - 4) + adjust) 45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (indent, pc, (param.offset - 4) + adjust, param.name) 46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 4625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 46366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pixHeaderPtr = "%s + %u" % (pc, adjust) 46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pcPtr = "%s + %u" % (pc, param.offset + adjust) 4655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 46666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not large: 46766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_send_null: 46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (param.name) 46966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 47066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = 'compsize > 0' 47166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s if (%s) {' % (indent, condition) 47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (*gc->fillImage)(gc, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s }' % (indent) 47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s else {' % (indent) 47666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (indent, pixHeaderPtr, dim, dim) 47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s }' % (indent) 47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s __glXSendLargeImage(gc, compsize, %s, %s, %s, %s, %s, %s, %s, %s, %s);' % (indent, dim_str, width, height, depth, param.img_format, param.img_type, param.name, pcPtr, pixHeaderPtr) 48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 4825f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4845f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def large_emit_begin(self, indent, f, op_name = None): 4855f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 4865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 4875f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s const GLint op = %s;' % (indent, op_name) 4893276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s const GLuint cmdlenLarge = cmdlen + 4;' % (indent) 4903276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 4913276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' % (indent) 4923276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick print '%s (void) memcpy((void *)(pc + 4), (void *)(&op), 4);' % (indent) 4933276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 4943276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 4953276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 4965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_just_start(self, f): 497e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 499990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 500990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 501990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 502990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 503990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 504990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 50566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME Simplify the logic related to skip_condition and 50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition_list in this function. Basically, remove 50766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME skip_condition, and just append the "dpy != NULL" type 50866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition to condition_list from the start. The only 50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME reason it's done in this confusing way now is to 51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME minimize the diffs in the generated code. 51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 512990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 517d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 518990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 519990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 521990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 522990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 523990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 524990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 525990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 528e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 529e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 53066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_packet_size_calculation(f, 0) 531e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 53266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list = [] 53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateCounters(): 53466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( "%s >= 0" % (p.name) ) 535e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 536990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 53766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( skip_condition ) 53866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 0: 54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 1: 54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 54266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 54366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "%s" % (condition_list.pop(0)) 54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 545990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 546990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 547990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 548990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 549e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 550e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 551e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printSingleFunction(self, f): 55266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_func_print_just_start(f) 55366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5541fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 5551fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 557af1a72997224610420b1105f967b0f5a8272858dBrian Paul if f.glx_vendorpriv == 0: 5582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5592eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # XCB specific: 5602eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 5612eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if self.debug: 5622eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' printf("\\tUsing XCB.\\n");' 5633d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' xcb_connection_t *c = XGetXCBConnection(dpy);' 5642eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 5653d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb xcb_name = 'xcb_glx%s' % convertStringForXCB(f.name) 56666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5672eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams=[] 56866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams = [] 56966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = None 57066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterator(): 57166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_output: 57266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = p 57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 57466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 57666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("state->storePack.swapEndian") 57766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 57866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 57966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 58066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Hardcode this in. lsb_first param (apparently always GL_FALSE) 58166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # also present in GetPolygonStipple, but taken care of above. 5823d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb if xcb_name == "xcb_glx_read_pixels": 58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 58466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 5852eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams.append(p.name) 5862eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 5892eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5902eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if f.needs_reply(): 5913d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if output and f.reply_always_array: 5933d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 5943fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb 59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif output and not f.reply_always_array: 5962636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick if not output.is_image(): 5973d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' if (%s_data_length(reply) == 0)' % (xcb_name) 59866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 5992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' else' 6003d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 6012eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 60366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 6042eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' retval = reply->ret_val;' 6052eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' free(reply);' 6062eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul else: 6072eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' ' + xcb_request + ';' 6082eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#else' 6092eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # End of XCB specific. 61066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 61166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.parameters != []: 613e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 614e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 615e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 616e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 617e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.glx_vendorpriv != 0: 6181fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name()) 619e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 6201fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 621e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 622e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "pc", " ", 0, 0) 623d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 62466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick images = f.get_images() 62566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for img in images: 62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.is_output: 62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.command_fixed_length() - 4 62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 63066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 63266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 633d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 634d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 635d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 636e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 63766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = '' 638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 63966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 64066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = " retval" 64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " retval = (%s)" % (f.return_type) 642e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " (void)" 64466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 0 64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, w, h, d, junk] = p.get_dimensions() 65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.dimensions_in_reply: 65166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 6523f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick else: 65366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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) 6543f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick 65566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 656d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.reply_always_array: 65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_TRUE" 65966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_FALSE" 661e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # gl_parameter.size() returns the size 66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # of the entire data item. If the 66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # item is a fixed-size array, this is 66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # the size of the whole array. This 66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is not what __glXReadReply wants. It 66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # wants the size of a single data 66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # element in the reply packet. 66966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Dividing by the array size (1 for 67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # non-arrays) gives us this. 671e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() / p.get_element_count() 67366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 67466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 67566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If a reply wasn't read to fill an output parameter, 67866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # read a NULL reply to get the return value. 67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not got_reply: 68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 682d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 683e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 6841fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 6851fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 6861fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 6871fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 6881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 6891fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 6901fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 6915f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 6925f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 69366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 6945f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_vendorpriv == 0: 69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#endif /* USE_XCB */' 6975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 69966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return%s;' % (return_name) 70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 7015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printPixelFunction(self, f): 70466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.pixel_stubs.has_key( f.name ): 70566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Normally gl_function::get_parameter_string could be 70666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # used. However, this call needs to have the missing 70766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # dimensions (e.g., a fake height value for 70866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage1D) added in. 7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7105f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 71166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 71266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p_string += ", " + param.name 71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 71466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 7165f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 7215f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7225f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7235f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 7255f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = " " 7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 7275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 7285f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent = "" 7295f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 7305f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7315f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7325f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 7345f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s }' % (indent) 7375f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick indent += " " 7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 74066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = "opcode" 7415f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 74266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = f.opcode_real_name() 7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 74466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, opcode) 7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 74666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_emit_args( f, "gc->pc", indent, 0 ) 7475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 7485f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 7495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 7515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 7525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%selse {' % (indent) 7535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.large_emit_begin(indent, f, opcode) 75566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_emit_args( f, "pc", indent, 1 ) 7565f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick print '%s}' % (indent) 7585f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 7605f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7625f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 763e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 76447719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 76547719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 76647719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 76747719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 76847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 7691d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 77066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 77166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.variable_length_parameter() == None and len(f.parameters) == 1: 77266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters[0] 77366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_pointer(): 7740246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 775e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 776e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 778e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 77966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 780e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = " " 781990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 782e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 783e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick indent = "" 784990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 785990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 7861fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 7871fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name) 7881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 789990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 790990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent) 791990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent) 792990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s (void) __glXFlushRenderBuffer(gc, gc->pc);' % (indent) 793990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s }' % (indent) 794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick indent += " " 795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 796e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name()) 797e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 798e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.common_emit_args(f, "gc->pc", indent, 4, 0) 799e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '%s gc->pc += cmdlen;' % (indent) 800990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' % (indent) 801e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 802e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 803990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 804990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%selse {' % (indent) 8053276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 8063276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick self.large_emit_begin(indent, f) 80766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_emit_args(f, "pc", indent, 8, 1) 8081fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 809e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 81066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, p.offset + 8, p.name, p.size_string()) 811990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '%s}' % (indent) 812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8131fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 8141fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s __indirect_glFinish();' % (indent) 8151fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print '%s printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name) 8161fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 817990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 818e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 819e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 82166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 822e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 82366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 82466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 82566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 826e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 827e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 828e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 82966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 832e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 834e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 835e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 836e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 840e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 88466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 88766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printCategory(self, category_group, show_num): 88866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick cat_keys = category_group.keys() 88966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick cat_keys.sort() 89066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for cat_num in cat_keys: 89166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 1 89266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for offset in category_group[ cat_num ]: 89366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [cat_name, func_name] = category_group[ cat_num ][ offset ] 89466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 89566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if first: 89666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 89766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if show_num: 8983bca4f679a411246306e7e141c562253cb5f4c2dIan Romanick print ' /* %3u. %s */' % (cat_num, cat_name) 89966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 90066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' /* %s */' % (cat_name) 90166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 90266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 0 90366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 90466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' glAPI->%s = __indirect_gl%s;' % (func_name, func_name) 90566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 90666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 90766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 90866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories = {} 90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories = {} 91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories = {} 91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick next_unnum = 1000 91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 91466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [cat, num] = api.get_category_for_name( func.name ) 91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # There are three groups of "categories" that we 91766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # care about here. We want to separate the core GL 91866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # version categories from extensions. We also want to 91966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # separate the ARB extensions from the non-ARB 92066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # extensions. 92166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 92266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # This is done by first trying to convert the category 92366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # name to a floating point number. All core GL 92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # versions are of the form "N.M" where both N and M 92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # are integers. If the cast to float fails, an 92666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # exception will be thrown. Once down that path, 92766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # we can look at the start of the extension string. 92866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If it begins with "GL_ARB_", it's an ARB extension. 92966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 93066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Once the categories are separated, the are ordered 93166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # by number. The un-numbered non-ARB extensions 93266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # (e.g., GL_INGR_blend_func_separate) are assigned 93366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # arbitrary numbers starting at 1000. 93466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # 93566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME In order to maintain repeatability, the 93666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME unnumbered extensions should be put in their 93766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME own dictionary and ordered by name (since they 93866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME have no number). 93966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick try: 94166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = float(cat) 94266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not core_categories.has_key( num ): 94366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories[ num ] = {} 94466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick core_categories[ num ][ func.offset ] = [cat, func.name] 94666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 94766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick except Exception, e: 94866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not num: 94966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = next_unnum 95066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick next_unnum += 1 95166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 95266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick num = int(num) 95366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if cat.startswith( "GL_ARB_" ): 95566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not arb_categories.has_key( num ): 95666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories[ num ] = {} 95766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 95866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick arb_categories[ num ][ func.offset ] = [cat, func.name] 95966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 96066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not other_categories.has_key( num ): 96166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories[ num ] = {} 962e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 96366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick other_categories[ num ][ func.offset ] = [cat, func.name] 96466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 96566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( core_categories, 0 ) 96666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( arb_categories, 1 ) 96766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printCategory( other_categories, 1 ) 96866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 96966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 97066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 97166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 972e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 97366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 97466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 97566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 977e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 978e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 97916c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 980e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 98166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 98266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 98366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 98466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 98616c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 987e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 988e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 989e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 990e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 991e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 992e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 993e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 994c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 9951fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 9961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 9971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9981fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 9991fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 10001fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10011fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 10021fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 10031fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10041fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 10051fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, unsigned max_dim, GLint width, GLint height, 10061fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 10071fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 10081fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10091fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 10101fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint sop, GLint cmdlen ); 10111fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 10121fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 10131fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ); 10141fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 101516c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 1016e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 101766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 101866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 101966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, func.get_parameter_string()) 1020e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1021e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1022e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 10231fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 10241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 10251fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 1026e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 1027e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1028e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1029e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 1030e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 1031e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1032e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 10331fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 1034e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 1035e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1036e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 10371fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 1038e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 1039e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 1040e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 1041e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 1042e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 1043e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 10441fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 10451fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 1046e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1047e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 104866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoStubs() 1049e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 105066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_c() 1051e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 105266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_h() 1053e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 1054e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1055e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1056e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 105766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.debug = debug 105866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 105966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 106066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 1061