glX_proto_send.py revision f3f51bc844c8749250724d164722402cb9a07dc7
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"' 169f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#include "dispatch.h"' 170f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#include "glthread.h"' 171e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#include <GL/glxproto.h>' 1722eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 173b8f26126e2874a00321af084bc2cdb486a62aa8fIan Romanick print '#include <X11/Xlib-xcb.h>' 1743d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/xcb.h>' 1753d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print '#include <xcb/glx.h>' 1762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#endif /* USE_XCB */' 17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 178e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 179e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 180e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 181c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 182c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printNoinline() 183e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 184990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#if !defined __GNUC__ || __GNUC__ < 3' 185990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '# define __builtin_expect(x, y) x' 186990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '#endif' 187990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print '' 188e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '/* If the size and opcode values are known at compile-time, this will, on' 189e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' * x86 at least, emit them with a single instruction.' 190e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' */' 191e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '#define emit_header(dest, op, size) \\' 192e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' do { union { short s[2]; int i; } temp; \\' 193e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' temp.s[0] = (size); temp.s[1] = (op); \\' 194e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' *((int *)(dest)) = temp.i; } while(0)' 195e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print '' 1961fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """NOINLINE CARD32 1971fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 198e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 199e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReply reply; 200e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 201e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 202e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if (size != 0) { 203a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ((reply.length > 0) || reply_is_always_array) { 204a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint bytes = (reply_is_always_array) 205a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick ? (4 * reply.length) : (reply.size * size); 206a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick const GLint extra = 4 - (bytes & 3); 207a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick 208a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XRead(dpy, dest, bytes); 209a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick if ( extra < 4 ) { 210a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick _XEatData(dpy, extra); 211a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 212a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 213a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick else { 214a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick (void) memcpy( dest, &(reply.pad3), size); 215a02b83115a865a58d3f0d118a6b3ad2922a0ab75Ian Romanick } 216e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 217e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 218e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return reply.retval; 219e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 220e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2211fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE void 2221fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXReadPixelReply( Display *dpy, __GLXcontext * gc, unsigned max_dim, 223d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint width, GLint height, GLint depth, GLenum format, GLenum type, 224d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * dest, GLboolean dimensions_in_reply ) 225d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick{ 226d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick xGLXSingleReply reply; 227d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick GLint size; 228d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 229d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick (void) _XReply(dpy, (xReply *) & reply, 0, False); 230d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 231d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( dimensions_in_reply ) { 232d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick width = reply.pad3; 233d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick height = reply.pad4; 234d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick depth = reply.pad5; 235d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 236d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((height == 0) || (max_dim < 2)) { height = 1; } 237d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ((depth == 0) || (max_dim < 3)) { depth = 1; } 238d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 239d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 240d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick size = reply.length * 4; 241d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if (size != 0) { 242d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick void * buf = Xmalloc( size ); 243d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 244d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( buf == NULL ) { 245d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, size); 246d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glXSetError(gc, GL_OUT_OF_MEMORY); 247d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 248d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else { 249d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick const GLint extra = 4 - (size & 3); 250d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 251d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XRead(dpy, buf, size); 252d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if ( extra < 4 ) { 253d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick _XEatData(dpy, extra); 254d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 255d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 256d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick __glEmptyImage(gc, 3, width, height, depth, format, type, 257d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick buf, dest); 258d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick Xfree(buf); 259d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 260d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick } 261d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick} 262d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 263e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#define X_GLXSingle 0 264e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2651fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2661fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupSingleRequest( __GLXcontext * gc, GLint sop, GLint cmdlen ) 267e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 268e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXSingleReq * req; 269e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 270e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 271e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 272e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 273e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXSingle, cmdlen, req); 274e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 275e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 276e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = sop; 277e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXSingleReq; 278e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 279e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 2801fd3bbc42e8ad267c552a3818f64b0850c188927Ian RomanickNOINLINE FASTCALL GLubyte * 2811fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick__glXSetupVendorRequest( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ) 282e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 283e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick xGLXVendorPrivateReq * req; 284e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick Display * const dpy = gc->currentDpy; 285e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 286e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) __glXFlushRenderBuffer(gc, gc->pc); 287e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick LockDisplay(dpy); 288e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GetReqExtra(GLXVendorPrivate, cmdlen, req); 289e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->reqType = gc->majorOpcode; 290e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->glxCode = code; 291e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->vendorCode = vop; 292e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick req->contextTag = gc->currentContextTag; 293e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 294e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 2955f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2965f1f229f8da255ca9b390da1757ad781978cf619Ian Romanickconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 2975f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 2985f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define zero (__glXDefaultPixelStore+0) 2995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define one (__glXDefaultPixelStore+8) 3005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D (__glXDefaultPixelStore+4) 3015f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_1D_size 20 3025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D (__glXDefaultPixelStore+4) 3035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_2D_size 20 3045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D (__glXDefaultPixelStore+0) 3055f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_3D_size 36 3065f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D (__glXDefaultPixelStore+0) 3075f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick#define default_pixel_store_4D_size 36 308e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 309e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 310e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for size in self.generic_sizes: 311e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.print_generic_function(size) 312e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 313e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 314e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 31566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 31666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 31766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs = {} 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs = [] 31966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 32166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.client_handcode: continue 32266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If the function is a pixel function with a certain 32466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GLX protocol signature, create a fake stub function 32566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # for it. For example, create a single stub function 32666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that is used to implement both glTexImage1D and 32766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage2D. 32866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 32966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0: 33066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 0 33166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for image in func.get_images(): 33266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if image.img_pad_dimensions: 33366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick do_it = 1 33466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 33566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 33766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if do_it: 33866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [h, n] = hash_pixel_function(func) 33966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.pixel_stubs[ func.name ] = n 34266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if h not in generated_stubs: 34366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick generated_stubs.append(h) 34466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fake_func = glx_pixel_function_stub( func, n ) 346f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(fake_func, fake_func.name) 34766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 349f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.name) 350f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.glx_sop and func.glx_vendorpriv: 351f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printFunction(func, func.glx_vendorpriv_names[0]) 35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 356f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printFunction(self, func, name): 357f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n' 35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop == ~0: 35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'static %s' % (func.return_type) 36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 361f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 363f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(name): 364f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.return_type == "void": 365f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = '' 366f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 367f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick ret_string = "return " 368f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 369f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick func_name = func.static_glx_name(name) 370f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv) 371f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string()) 372f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 373f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 374f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '' 375f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' if (gc->isDirect) {' 376f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' %sCALL_%s(GET_DISPATCH(), (%s));' % (ret_string, func.name, func.get_called_parameter_string()) 377f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' } else {' 378f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick footer = '}\n}\n' 379f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 380f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 38166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 382f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string()) 383f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print '{' 38466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 38566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 38666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.glx_rop != 0 or func.vectorequiv != None: 38766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(func.images): 38866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 3895f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printRenderFunction(func) 39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 392f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick self.printSingleFunction(func, name) 39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pass 394e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 395f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print "/* Missing GLX protocol for %s. */" % (name) 39666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 397f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print footer 39866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 39966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 400e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 401e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def print_generic_function(self, n): 4023385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick size = (n + 3) & ~3 403e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """static FASTCALL NOINLINE void 404e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickgeneric_%u_byte( GLint rop, const void * ptr ) 405e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 406e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLXcontext * const gc = __glXGetCurrentContext(); 407e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick const GLuint cmdlen = %u; 408e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 409e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick emit_header(gc->pc, rop, cmdlen); 410e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick (void) memcpy((void *)(gc->pc + 4), ptr, %u); 411e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick gc->pc += cmdlen; 412990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 413e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 4143385d7cec3308129f6f1fc5990023417e4e4be47Ian Romanick""" % (n, size + 4, size) 41566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 416e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 417e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 418990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_one_arg(self, p, pc, adjust, extra_offset): 419e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if p.is_array(): 420e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = p.name 421e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 422e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick src_ptr = "&" + p.name 423e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 42466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not extra_offset: 425990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 426990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, src_ptr, p.size_string() ) 42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 428990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 429990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 430e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 431990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_args(self, f, pc, adjust, skip_vla): 43266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = None 433e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 43466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend( not skip_vla ): 435d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if p.name != f.img_reset: 436990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(p, pc, adjust, extra_offset) 43766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 43866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_variable_length(): 43966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick temp = p.size_string() 44066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if extra_offset: 44166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset += " + %s" % (temp) 44266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 44366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_offset = temp 444e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 44566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 446e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 447e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 448990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def pixel_emit_args(self, f, pc, large): 4495f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick """Emit the arguments for a pixel function. This differs from 4505f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick common_emit_args in that pixel functions may require padding 4515f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted (i.e., for the missing width field for 4525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick TexImage1D), and they may also require a 'NULL image' flag 4535f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick be inserted before the image data.""" 4545f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 45566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 45666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 8 45766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 45866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick adjust = 4 45966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 46066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 46166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not param.is_image(): 462990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(param, pc, adjust, None) 4635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 46466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 465990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust) 4665f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 4675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 46866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, width, height, depth, extent] = param.get_dimensions() 46966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 47066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = "dim" 47166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dim_str = str(dim) 47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_null_flag: 47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if large: 476990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust) 47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 478990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name) 47966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 4805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pixHeaderPtr = "%s + %u" % (pc, adjust) 48266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick pcPtr = "%s + %u" % (pc, param.offset + adjust) 4835f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 48466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not large: 48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.img_send_null: 48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = '(compsize > 0) && (%s != NULL)' % (param.name) 48766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition = 'compsize > 0' 48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 490990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (%s) {' % (condition) 491990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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) 492990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '} else {' 493990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim) 494990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 496990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian 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) 49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 4995f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 5005f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 501990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def large_emit_begin(self, f, op_name = None): 5025f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if not op_name: 5035f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick op_name = f.opcode_real_name() 5045f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 505990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLint op = %s;' % (op_name) 506990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'const GLuint cmdlenLarge = cmdlen + 4;' 507990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' 508990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' 509990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);' 5103276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick return 5113276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 5123276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 5135f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick def common_func_print_just_start(self, f): 514e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' __GLXcontext * const gc = __glXGetCurrentContext();' 51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 516990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # The only reason that single and vendor private commands need 517990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # a variable called 'dpy' is becuase they use the SyncHandle 518990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # macro. For whatever brain-dead reason, that macro is hard- 519990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # coded to use a variable called 'dpy' instead of taking a 520990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick # parameter. 521990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME Simplify the logic related to skip_condition and 52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition_list in this function. Basically, remove 52466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME skip_condition, and just append the "dpy != NULL" type 52566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME condition to condition_list from the start. The only 52666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME reason it's done in this confusing way now is to 52766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # FIXME minimize the diffs in the generated code. 52866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 529990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if not f.glx_rop: 53066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 53166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 53266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const __GLXattribute * const state = gc->client_state_private;' 53366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break 534d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 535990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' Display * const dpy = gc->currentDpy;' 536990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "dpy != NULL" 537990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick elif f.can_be_large: 538990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = "gc->currentDpy != NULL" 539990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 540990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick skip_condition = None 541990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 542990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 54366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 54466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 545e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 546e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 54766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_packet_size_calculation(f, 0) 548e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 54966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list = [] 55066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateCounters(): 55166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( "%s >= 0" % (p.name) ) 552e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 553990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if skip_condition: 55466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick condition_list.append( skip_condition ) 55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 55666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 0: 55766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len( condition_list ) > 1: 55866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 55966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 56066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick skip_condition = "%s" % (condition_list.pop(0)) 56166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 562990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 563990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 1 564990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick else: 565990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick return 0 566e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 567e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 568f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick def printSingleFunction(self, f, name): 56966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.common_func_print_just_start(f) 57066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5711fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 5721fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 574f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 5752eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 5762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # XCB specific: 5772eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#ifdef USE_XCB' 5782eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if self.debug: 5792eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' printf("\\tUsing XCB.\\n");' 5803d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' xcb_connection_t *c = XGetXCBConnection(dpy);' 5812eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 582f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick xcb_name = 'xcb_glx%s' % convertStringForXCB(name) 58366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5842eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams=[] 58566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams = [] 58666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = None 58766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterator(): 58866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_output: 58966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick output = p 59066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 59166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 59266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 59366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("state->storePack.swapEndian") 59466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 59566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 59666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 59766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Hardcode this in. lsb_first param (apparently always GL_FALSE) 59866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # also present in GetPolygonStipple, but taken care of above. 5993d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb if xcb_name == "xcb_glx_read_pixels": 60066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick extra_iparams.append("0") 60166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 6022eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul iparams.append(p.name) 6032eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 60466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 60566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 6062eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6072eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul if f.needs_reply(): 6083d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 60966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if output and f.reply_always_array: 6103d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 6113fb86eefe8b22e8d95111ef49feb0a91d865fd00Jeremy Kolb 61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif output and not f.reply_always_array: 6132636e853f60cf6944d04c9eb4bf25e8ef83c1cb3Ian Romanick if not output.is_image(): 6143d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy Kolb print ' if (%s_data_length(reply) == 0)' % (xcb_name) 61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 6162eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' else' 6173d7ee324adca4f4c20a793d5d01921c6e757b681Jeremy 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()) 6182eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 6191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 6212eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' retval = reply->ret_val;' 6222eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' free(reply);' 6232eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul else: 6242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print ' ' + xcb_request + ';' 6252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul print '#else' 6262eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul # End of XCB specific. 62766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 62966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.parameters != []: 630e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "GLubyte const * pc =" 631e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 632e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick pc_decl = "(void)" 633e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 634f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name in f.glx_vendorpriv_names: 635f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name)) 636e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 6371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 638e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 639990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 0, 0) 640d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 64166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick images = f.get_images() 64266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 64366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for img in images: 64466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.is_output: 64566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.command_fixed_length() - 4 64666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' *(int32_t *)(pc + %u) = 0;' % (o) 64766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 64866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 64966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 650d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick if f.img_reset: 651d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 652d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 653e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 65466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = '' 655e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.needs_reply(): 65666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.return_type != 'void': 65766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_name = " retval" 65866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " retval = (%s)" % (f.return_type) 659e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 66066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return_str = " (void)" 66166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 0 66366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 66466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateOutputs(): 66566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_image(): 66666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, w, h, d, junk] = p.get_dimensions() 66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.dimensions_in_reply: 66866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 6693f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick else: 67066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian 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) 6713f35fbbf668dab4c1a572f77a0912f4b7c8d857cIan Romanick 67266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 673d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick else: 67466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.reply_always_array: 67566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_TRUE" 67666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 67766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aa = "GL_FALSE" 678e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 67966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # gl_parameter.size() returns the size 68066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # of the entire data item. If the 68166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # item is a fixed-size array, this is 68266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # the size of the whole array. This 68366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is not what __glXReadReply wants. It 68466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # wants the size of a single data 68566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # element in the reply packet. 68666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Dividing by the array size (1 for 68766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # non-arrays) gives us this. 688e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 68966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() / p.get_element_count() 69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 69166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick got_reply = 1 69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 69366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # If a reply wasn't read to fill an output parameter, 69566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # read a NULL reply to get the return value. 69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 69766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not got_reply: 69866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 699d863424032deb7c6bcb3a0b906be29b573f18c2dIan Romanick 700e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 7011fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif self.debug: 7021fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # Only emit the extra glFinish call for functions 7031fca5632325e1da42e278909e404dd57e0a62252Ian Romanick # that don't already require a reply from the server. 7041fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print ' __indirect_glFinish();' 7051fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 7061fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 707f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print ' printf( "Exit %%s.\\n", "gl%s" );' % (name) 7085f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7095f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 71066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' UnlockDisplay(dpy); SyncHandle();' 7115f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 712f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if name not in f.glx_vendorpriv_names: 71366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '#endif /* USE_XCB */' 7145f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 71566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 71666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return%s;' % (return_name) 71766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 7185f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7195f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 72066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printPixelFunction(self, f): 72166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.pixel_stubs.has_key( f.name ): 72266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Normally gl_function::get_parameter_string could be 72366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # used. However, this call needs to have the missing 72466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # dimensions (e.g., a fake height value for 72566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # glTexImage1D) added in. 7265f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7275f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string = "" 72866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param in f.parameterIterateGlxSend(): 72966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p_string += ", " + param.name 73066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 73166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if param.is_image(): 73266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick [dim, junk, junk, junk, junk] = param.get_dimensions() 7335f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.pad_after(param): 7355f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick p_string += ", 1" 7365f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 73766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 7385f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7395f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7405f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 74166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 7425f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = " }" 7435f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 7445f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick trailer = None 7455f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7465f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7475f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 748990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 749990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 750990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 751990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 7525f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 75366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.glx_rop == ~0: 75466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = "opcode" 7555f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick else: 75666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick opcode = f.opcode_real_name() 7575f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 758990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (opcode) 7595f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 760990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args( f, "gc->pc", 0 ) 761990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 762990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 7635f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7645f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if f.can_be_large: 765990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 766990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 7675f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 768990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f, opcode) 769990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.pixel_emit_args(f, "pc", 1) 7705f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 771990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 7725f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7735f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if trailer: print trailer 7745f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick return 7755f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 7765f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 777e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRenderFunction(self, f): 77847719fda0c2fba13c81e84e33523d5489263182eIan Romanick # There is a class of GL functions that take a single pointer 77947719fda0c2fba13c81e84e33523d5489263182eIan Romanick # as a parameter. This pointer points to a fixed-size chunk 78047719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of data, and the protocol for this functions is very 78147719fda0c2fba13c81e84e33523d5489263182eIan Romanick # regular. Since they are so regular and there are so many 78247719fda0c2fba13c81e84e33523d5489263182eIan Romanick # of them, special case them with generic functions. On 7831d27084043855d2609b54d3435f0bd85e39762e2Ian Romanick # x86, this saves about 26KB in the libGL.so binary. 78466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 78566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if f.variable_length_parameter() == None and len(f.parameters) == 1: 78666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters[0] 78766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.is_pointer(): 7880246b2a5c0f45788a5c418d62ccf5a3a72d16d4aIan Romanick cmdlen = f.command_fixed_length() 789e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if cmdlen in self.generic_sizes: 790e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 791e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 792e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 79366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.common_func_print_just_start(f): 794990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = " }" 795e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 796990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick trailer = None 797990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick 7981fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 799990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 8001fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 801990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if f.can_be_large: 802990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 803990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 804990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 805990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' }' 806e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 807990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name()) 808e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 809990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "gc->pc", 4, 0) 810990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'gc->pc += cmdlen;' 811990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 812e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 813e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if f.can_be_large: 814990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 815990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'else {' 8163276c192b7bfe4fd21967224b3d13e1c1681758eIan Romanick 817990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.large_emit_begin(f) 818990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_args(f, "pc", 8, 1) 8191fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 820e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick p = f.variable_length_parameter() 821990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print ' __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string()) 822990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '}' 823e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 8241fca5632325e1da42e278909e404dd57e0a62252Ian Romanick if self.debug: 825990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '__indirect_glFinish();' 826990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 8271fca5632325e1da42e278909e404dd57e0a62252Ian Romanick 828990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick if trailer: print trailer 829e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 830e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 831e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 83266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 833e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 83466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 83566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 83666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 837e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 838e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 839e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 84066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 841e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 842e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 843e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 844e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """/** 845e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file indirect_init.c 846e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Initialize indirect rendering dispatch table. 847e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 848e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 849e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Brian Paul <brian@precisioninsight.com> 850e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 851e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 852e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 853e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect_init.h" 854e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "indirect.h" 855e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick#include "glapi.h" 856e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 857e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 858e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 859e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * No-op function used to initialize functions that have no GLX protocol 860e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * support. 861e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 862e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickstatic int NoOp(void) 863e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 864e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return 0; 865e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 866e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 867e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick/** 868e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Create and initialize a new GL dispatch table. The table is initialized 869e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * with GLX indirect rendering protocol functions. 870e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 871e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick__GLapi * __glXNewIndirectAPI( void ) 872e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick{ 873e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick __GLapi *glAPI; 874e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick GLuint entries; 875e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 876e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick entries = _glapi_get_dispatch_table_size(); 877e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick glAPI = (__GLapi *) Xmalloc(entries * sizeof(void *)); 878e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 879e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* first, set all entries to point to no-op functions */ 880e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick { 881e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick int i; 882e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick void **dispatch = (void **) glAPI; 883e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (i = 0; i < entries; i++) { 884e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick dispatch[i] = (void *) NoOp; 885e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 886e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick } 887e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 888e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick /* now, initialize the entries we understand */""" 889e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 890e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealFooter(self): 891e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick print """ 892e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick return glAPI; 893e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick} 894e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 89566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 896e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 897e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 89866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 899eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for [name, number] in api.categoryIterate(): 900eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if number != None: 901eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %3u. %s */\n\n' % (int(number), name) 902eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick else: 903eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '\n /* %s */\n\n' % (name) 904e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 905eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick for func in api.functionIterateByCategory(name): 906eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick if func.client_supported_for_indirect(): 907eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick print '%s glAPI->%s = __indirect_gl%s;' % (preamble, func.name, func.name) 908eaeaaf6205b304be290f2f869b3d224c318be749Ian Romanick preamble = '' 90966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 91166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 914e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def __init__(self): 91566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 91666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 91766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_send.py (from Mesa)" 918e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick self.license = license.bsd_license_template % ( \ 919e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 920e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 92116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick self.header_tag = "_INDIRECT_H_" 922e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 92366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.last_category = "" 92466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 92566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 92666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 927e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick def printRealHeader(self): 92816c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 929e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\file 930e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * Prototypes for indirect rendering functions. 931e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * 932e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Kevin E. Martin <kevin@precisioninsight.com> 933e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick * \\author Ian Romanick <idr@us.ibm.com> 934e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick */ 935e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick""" 936c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printVisibility( "HIDDEN", "hidden" ) 9371fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printFastcall() 9381fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick self.printNoinline() 9391fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9401fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick print """ 9411fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick#include "glxclient.h" 9421fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9431fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 9441fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick void * dest, GLboolean reply_is_always_array ); 9451fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9461fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 9471fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, unsigned max_dim, GLint width, GLint height, 9481fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLint depth, GLenum format, GLenum type, void * dest, 9491fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick GLboolean dimensions_in_reply ); 9501fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9511fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 9521fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint sop, GLint cmdlen ); 9531fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick 9541fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanickextern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 9551fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen ); 9561fd3bbc42e8ad267c552a3818f64b0850c188927Ian Romanick""" 95716c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick 958e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 95966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 96066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 961f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick params = func.get_parameter_string() 962f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 963f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params) 964f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 965f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick for n in func.entry_points: 966f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if func.has_different_protocol(n): 967f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick asdf = func.static_glx_name(n) 968f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick if asdf not in func.static_entry_points: 969f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params) 970f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick else: 971f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params) 972f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 973f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick break 974f3f51bc844c8749250724d164722402cb9a07dc7Ian Romanick 975e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 976e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 977e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickdef show_usage(): 9781fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 9791fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 9801fca5632325e1da42e278909e404dd57e0a62252Ian Romanick print " -d Enable extra debug information in the generated code." 981e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick sys.exit(1) 982e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 983e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 984e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanickif __name__ == '__main__': 985e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = "gl_API.xml" 986e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 987e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick try: 9881fca5632325e1da42e278909e404dd57e0a62252Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 989e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick except Exception,e: 990e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 991e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 9921fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 0 993e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = "proto" 994e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick for (arg,val) in args: 995e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if arg == "-f": 996e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick file_name = val 997e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif arg == "-m": 998e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick mode = val 9991fca5632325e1da42e278909e404dd57e0a62252Ian Romanick elif arg == "-d": 10001fca5632325e1da42e278909e404dd57e0a62252Ian Romanick debug = 1 1001e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1002e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick if mode == "proto": 100366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoStubs() 1004e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_c": 100566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_c() 1006e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick elif mode == "init_h": 100766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxProtoInit_h() 1008e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick else: 1009e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick show_usage() 1010e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 1011e9789cf07186e710ee212effb2c25be96f7cbff2Ian Romanick 101266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.debug = debug 101366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 101466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 101566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 1016