1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#!/usr/bin/env python 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# (C) Copyright IBM Corporation 2004, 2005 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# copy of this software and associated documentation files (the "Software"), 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# to deal in the Software without restriction, including without limitation 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# on the rights to use, copy, modify, merge, publish, distribute, sub 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# license, and/or sell copies of the Software, and to permit persons to whom 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# the Software is furnished to do so, subject to the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# The above copyright notice and this permission notice (including the next 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# paragraph) shall be included in all copies or substantial portions of the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Authors: 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Ian Romanick <idr@us.ibm.com> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Jeremy Kolb <jkolb@brandeis.edu> 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport gl_XML, glX_XML, glX_proto_common, license 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport sys, getopt, copy, string 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdef convertStringForXCB(str): 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = "" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org special = [ "ARB" ] 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = 0 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while i < len(str): 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if str[i:i+3] in special: 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = '%s_%s' % (tmp, string.lower(str[i:i+3])) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = i + 2; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif str[i].isupper(): 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = '%s_%s' % (tmp, string.lower(str[i])) 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = '%s%s' % (tmp, str[i]) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i += 1 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tmp 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdef hash_pixel_function(func): 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org """Generate a 'unique' key for a pixel function. The key is based on 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the parameters written in the command packet. This includes any 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org padding that might be added for the original function and the 'NULL 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image' flag.""" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = "" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_pre = "" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_suf = "" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for param in func.parameterIterateGlxSend(): 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.is_image(): 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [dim, junk, junk, junk, junk] = param.get_dimensions() 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d = (dim + 1) & ~1 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_pre = "%uD%uD_" % (d - 1, d) 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.img_null_flag: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_suf = "_NF" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h += "%u" % (param.size()) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.pad_after(param): 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h += "4" 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = func.name.replace("%uD" % (dim), "") 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = "__glx_%s_%uD%uD" % (n, d - 1, d) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = hash_pre + h + hash_suf 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return [h, n] 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass glx_pixel_function_stub(glX_XML.glx_function): 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org """Dummy class used to generate pixel "utility" functions that are 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shared by multiple dimension image functions. For example, these 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org objects are used to generate shared functions used to send GLX 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protocol for TexImage1D and TexImage2D, TexSubImage1D and 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexSubImage2D, etc.""" 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self, func, name): 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # The parameters to the utility function are the same as the 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # parameters to the real function except for the added "pad" 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # parameters. 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.name = name 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.images = [] 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters = [] 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters_by_name = {} 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for _p in func.parameterIterator(): 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = copy.copy(_p) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters.append(p) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters_by_name[ p.name ] = p 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_image(): 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.images.append(p) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p.height = "height" 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.img_yoff == None: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p.img_yoff = "yoffset" 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.depth: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.extent == None: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p.extent = "extent" 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.img_woff == None: 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p.img_woff = "woffset" 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pad_name = func.pad_after(p) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if pad_name: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pad = copy.copy(p) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pad.name = pad_name 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters.append(pad) 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.parameters_by_name[ pad.name ] = pad 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.return_type = func.return_type 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.glx_rop = ~0 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.glx_sop = 0 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.glx_vendorpriv = 0 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.glx_doubles_in_order = func.glx_doubles_in_order 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.vectorequiv = None 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.output = None 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.can_be_large = func.can_be_large 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.reply_always_array = func.reply_always_array 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.dimensions_in_reply = func.dimensions_in_reply 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.img_reset = None 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.server_handcode = 0 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.client_handcode = 0 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.ignore = 0 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.count_parameter_list = func.count_parameter_list 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.counter_list = func.counter_list 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.offsets_calculated = 0 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PrintGlxProtoStubs(glX_proto_common.glx_print_proto): 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self): 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org glX_proto_common.glx_print_proto.__init__(self) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.name = "glX_proto_send.py (from Mesa)" 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM") 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.last_category = "" 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32] 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pixel_stubs = {} 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.debug = 0 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printRealHeader(self): 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include <GL/gl.h>' 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include "indirect.h"' 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include "glxclient.h"' 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include "indirect_size.h"' 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include "glapi.h"' 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include "glthread.h"' 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include <GL/glxproto.h>' 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#ifdef USE_XCB' 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include <X11/Xlib-xcb.h>' 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include <xcb/xcb.h>' 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#include <xcb/glx.h>' 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif /* USE_XCB */' 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#define __GLX_PAD(n) (((n) + 3) & ~3)' 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printFastcall() 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printNoinline() 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#ifndef __GNUC__' 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '# define __builtin_expect(x, y) x' 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif' 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '/* If the size and opcode values are known at compile-time, this will, on' 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' * x86 at least, emit them with a single instruction.' 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' */' 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#define emit_header(dest, op, size) \\' 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' do { union { short s[2]; int i; } temp; \\' 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' temp.s[0] = (size); temp.s[1] = (op); \\' 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' *((int *)(dest)) = temp.i; } while(0)' 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """NOINLINE CARD32 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXReadReply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_array ) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXSingleReply reply; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) _XReply(dpy, (xReply *) & reply, 0, False); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size != 0) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((reply.length > 0) || reply_is_always_array) { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint bytes = (reply_is_always_array) 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (4 * reply.length) : (reply.size * size); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint extra = 4 - (bytes & 3); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XRead(dpy, dest, bytes); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( extra < 4 ) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XEatData(dpy, extra); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy( dest, &(reply.pad3), size); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reply.retval; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNOINLINE void 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXReadPixelReply( Display *dpy, struct glx_context * gc, unsigned max_dim, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, GLenum format, GLenum type, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * dest, GLboolean dimensions_in_reply ) 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXSingleReply reply; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint size; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) _XReply(dpy, (xReply *) & reply, 0, False); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( dimensions_in_reply ) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = reply.pad3; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = reply.pad4; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = reply.pad5; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((height == 0) || (max_dim < 2)) { height = 1; } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((depth == 0) || (max_dim < 3)) { depth = 1; } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = reply.length * 4; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size != 0) { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * buf = Xmalloc( size ); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( buf == NULL ) { 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XEatData(dpy, size); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXSetError(gc, GL_OUT_OF_MEMORY); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint extra = 4 - (size & 3); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XRead(dpy, buf, size); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( extra < 4 ) { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _XEatData(dpy, extra); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glEmptyImage(gc, 3, width, height, depth, format, type, 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, dest); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Xfree(buf); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X_GLXSingle 0 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNOINLINE FASTCALL GLubyte * 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXSetupSingleRequest( struct glx_context * gc, GLint sop, GLint cmdlen ) 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXSingleReq * req; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display * const dpy = gc->currentDpy; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) __glXFlushRenderBuffer(gc, gc->pc); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXSingle, cmdlen, req); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = gc->majorOpcode; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->contextTag = gc->currentContextTag; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = sop; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLubyte *)(req) + sz_xGLXSingleReq; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNOINLINE FASTCALL GLubyte * 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXSetupVendorRequest( struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xGLXVendorPrivateReq * req; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display * const dpy = gc->currentDpy; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) __glXFlushRenderBuffer(gc, gc->pc); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LockDisplay(dpy); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetReqExtra(GLXVendorPrivate, cmdlen, req); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->reqType = gc->majorOpcode; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->glxCode = code; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->vendorCode = vop; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org req->contextTag = gc->currentContextTag; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLubyte *)(req) + sz_xGLXVendorPrivateReq; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define zero (__glXDefaultPixelStore+0) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define one (__glXDefaultPixelStore+8) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_1D (__glXDefaultPixelStore+4) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_1D_size 20 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_2D (__glXDefaultPixelStore+4) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_2D_size 20 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_3D (__glXDefaultPixelStore+0) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_3D_size 36 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_4D (__glXDefaultPixelStore+0) 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define default_pixel_store_4D_size 36 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for size in self.generic_sizes: 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.print_generic_function(size) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printBody(self, api): 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pixel_stubs = {} 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org generated_stubs = [] 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for func in api.functionIterateGlx(): 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.client_handcode: continue 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # If the function is a pixel function with a certain 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # GLX protocol signature, create a fake stub function 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # for it. For example, create a single stub function 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # that is used to implement both glTexImage1D and 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # glTexImage2D. 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.glx_rop != 0: 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_it = 0 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for image in func.get_images(): 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if image.img_pad_dimensions: 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_it = 1 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if do_it: 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [h, n] = hash_pixel_function(func) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pixel_stubs[ func.name ] = n 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if h not in generated_stubs: 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org generated_stubs.append(h) 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fake_func = glx_pixel_function_stub( func, n ) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printFunction(fake_func, fake_func.name) 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printFunction(func, func.name) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.glx_sop and func.glx_vendorpriv: 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printFunction(func, func.glx_vendorpriv_names[0]) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printGetProcAddress(api) 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printGetProcAddress(self, api): 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org procs = {} 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for func in api.functionIterateGlx(): 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for n in func.entry_points: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.has_different_protocol(n): 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org procs[n] = func.static_glx_name(n) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """ 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_SHARED_GLAPI 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct proc_pair 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glapi_proc proc; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} proc_pairs[%d] = {""" % len(procs) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org names = procs.keys() 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org names.sort() 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for i in xrange(len(names)): 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org comma = ',' if i < len(names) - 1 else '' 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' { "%s", (_glapi_proc) gl%s }%s' % (names[i], procs[names[i]], comma) 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """}; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__indirect_get_proc_compare(const void *key, const void *memb) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct proc_pair *pair = (const struct proc_pair *) memb; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return strcmp((const char *) key, pair->name); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_glapi_proc 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__indirect_get_proc_address(const char *name) 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct proc_pair *pair; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* skip "gl" */ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name += 2; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pair = (const struct proc_pair *) bsearch((const void *) name, 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const void *) proc_pairs, ARRAY_SIZE(proc_pairs), sizeof(proc_pairs[0]), 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __indirect_get_proc_compare); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (pair) ? pair->proc : NULL; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_SHARED_GLAPI */ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printFunction(self, func, name): 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org footer = '}\n' 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.glx_rop == ~0: 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'static %s' % (func.return_type) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string()) 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '{' 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.has_different_protocol(name): 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.return_type == "void": 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_string = '' 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_string = "return " 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func_name = func.static_glx_name(name) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv) 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string()) 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '{' 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' struct glx_context * const gc = __glXGetCurrentContext();' 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)' 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if (gc->isDirect) {' 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' const _glapi_proc *const disp_table = GET_DISPATCH();' 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' PFNGL%sPROC p =' % (name.upper()) 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (PFNGL%sPROC) disp_table[%d];' % (name.upper(), func.offset) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %sp(%s);' % (ret_string, func.get_called_parameter_string()) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' } else' 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif' 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' {' 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org footer = '}\n}\n' 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#define %s %d' % (func.opcode_name(), func.opcode_value()) 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string()) 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '{' 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.glx_rop != 0 or func.vectorequiv != None: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if len(func.images): 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printPixelFunction(func) 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printRenderFunction(func) 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif func.glx_sop != 0 or func.glx_vendorpriv != 0: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printSingleFunction(func, name) 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pass 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print "/* Missing GLX protocol for %s. */" % (name) 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print footer 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def print_generic_function(self, n): 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = (n + 3) & ~3 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """static FASTCALL NOINLINE void 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggeneric_%u_byte( GLint rop, const void * ptr ) 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context * const gc = __glXGetCurrentContext(); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint cmdlen = %u; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_header(gc->pc, rop, cmdlen); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy((void *)(gc->pc + 4), ptr, %u); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc->pc += cmdlen; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" % (n, size + 4, size) 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def common_emit_one_arg(self, p, pc, adjust, extra_offset): 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_array(): 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_ptr = p.name 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_ptr = "&" + p.name 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_padding: 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memset((void *)(%s + %u), 0, %s);' \ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org % (pc, p.offset + adjust, p.size_string() ) 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif not extra_offset: 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \ 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org % (pc, p.offset + adjust, src_ptr, p.size_string() ) 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(%s + %u + %s), (void *)(%s), %s);' \ 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org % (pc, p.offset + adjust, extra_offset, src_ptr, p.size_string() ) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def common_emit_args(self, f, pc, adjust, skip_vla): 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_offset = None 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for p in f.parameterIterateGlxSend( not skip_vla ): 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.name != f.img_reset: 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_emit_one_arg(p, pc, adjust, extra_offset) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_variable_length(): 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp = p.size_string() 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if extra_offset: 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_offset += " + %s" % (temp) 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_offset = temp 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def pixel_emit_args(self, f, pc, large): 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org """Emit the arguments for a pixel function. This differs from 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org common_emit_args in that pixel functions may require padding 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org be inserted (i.e., for the missing width field for 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexImage1D), and they may also require a 'NULL image' flag 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org be inserted before the image data.""" 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if large: 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adjust = 8 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adjust = 4 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for param in f.parameterIterateGlxSend(): 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not param.is_image(): 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_emit_one_arg(param, pc, adjust, None) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.pad_after(param): 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset + param.size()) + adjust) 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [dim, width, height, depth, extent] = param.get_dimensions() 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.glx_rop == ~0: 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dim_str = "dim" 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dim_str = str(dim) 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.is_padding: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memset((void *)(%s + %u), 0, %s);' \ 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org % (pc, (param.offset - 4) + adjust, param.size_string() ) 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.img_null_flag: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if large: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust) 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(%s + %u), (void *)((%s == NULL) ? one : zero), 4);' % (pc, (param.offset - 4) + adjust, param.name) 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixHeaderPtr = "%s + %u" % (pc, adjust) 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pcPtr = "%s + %u" % (pc, param.offset + adjust) 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not large: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.img_send_null: 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition = '(compsize > 0) && (%s != NULL)' % (param.name) 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition = 'compsize > 0' 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'if (%s) {' % (condition) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 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) 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '} else {' 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void) memcpy( %s, default_pixel_store_%uD, default_pixel_store_%uD_size );' % (pixHeaderPtr, dim, dim) 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '}' 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 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) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def large_emit_begin(self, f, op_name = None): 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not op_name: 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op_name = f.opcode_real_name() 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'const GLint op = %s;' % (op_name) 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'const GLuint cmdlenLarge = cmdlen + 4;' 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'GLubyte * const pc = __glXFlushRenderBuffer(gc, gc->pc);' 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(pc + 0), (void *)(&cmdlenLarge), 4);' 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '(void) memcpy((void *)(pc + 4), (void *)(&op), 4);' 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def common_func_print_just_start(self, f, name): 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' struct glx_context * const gc = __glXGetCurrentContext();' 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # The only reason that single and vendor private commands need 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # a variable called 'dpy' is becuase they use the SyncHandle 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # macro. For whatever brain-dead reason, that macro is hard- 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # coded to use a variable called 'dpy' instead of taking a 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # parameter. 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME Simplify the logic related to skip_condition and 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME condition_list in this function. Basically, remove 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME skip_condition, and just append the "dpy != NULL" type 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME condition to condition_list from the start. The only 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME reason it's done in this confusing way now is to 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # FIXME minimize the diffs in the generated code. 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not f.glx_rop: 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for p in f.parameterIterateOutputs(): 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"): 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' const __GLXattribute * const state = gc->client_state_private;' 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' Display * const dpy = gc->currentDpy;' 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org skip_condition = "dpy != NULL" 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif f.can_be_large: 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org skip_condition = "gc->currentDpy != NULL" 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org skip_condition = None 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.return_type != 'void': 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %s retval = (%s) 0;' % (f.return_type, f.return_type) 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name != None and name not in f.glx_vendorpriv_names: 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#ifndef USE_XCB' 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.emit_packet_size_calculation(f, 0) 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name != None and name not in f.glx_vendorpriv_names: 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif' 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition_list = [] 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for p in f.parameterIterateCounters(): 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition_list.append( "%s >= 0" % (p.name) ) 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # 'counter' parameters cannot be negative 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " if (%s < 0) {" % p.name 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " __glXSetError(gc, GL_INVALID_VALUE);" 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.return_type != 'void': 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " return 0;" 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " return;" 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " }" 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if skip_condition: 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition_list.append( skip_condition ) 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if len( condition_list ) > 0: 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if len( condition_list ) > 1: 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org skip_condition = "(%s)" % (string.join( condition_list, ") && (" )) 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org skip_condition = "%s" % (condition_list.pop(0)) 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if (__builtin_expect(%s, 1)) {' % (skip_condition) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printSingleFunction(self, f, name): 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_func_print_just_start(f, name) 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.debug: 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name not in f.glx_vendorpriv_names: 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # XCB specific: 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#ifdef USE_XCB' 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.debug: 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' printf("\\tUsing XCB.\\n");' 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' xcb_connection_t *c = XGetXCBConnection(dpy);' 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_name = 'xcb_glx%s' % convertStringForXCB(name) 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iparams=[] 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_iparams = [] 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = None 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for p in f.parameterIterator(): 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_output: 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = p 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_image(): 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP": 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_iparams.append("state->storePack.swapEndian") 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_iparams.append("0") 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # Hardcode this in. lsb_first param (apparently always GL_FALSE) 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # also present in GetPolygonStipple, but taken care of above. 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if xcb_name == "xcb_glx_read_pixels": 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extra_iparams.append("0") 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iparams.append(p.name) 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams + extra_iparams)) 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.needs_reply(): 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request) 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if output: 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if output.is_image(): 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [dim, w, h, d, junk] = output.get_dimensions() 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.dimensions_in_reply: 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = "reply->width" 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = "reply->height" 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d = "reply->depth" 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if dim < 2: 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = "1" 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if (%s == 0) { %s = 1; }' % (h, h) 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if dim < 3: 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d = "1" 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if (%s == 0) { %s = 1; }' % (d, d) 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' __glEmptyImage(gc, 3, %s, %s, %s, %s, %s, %s_data(reply), %s);' % (w, h, d, output.img_format, output.img_type, xcb_name, output.name) 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.reply_always_array: 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string()) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if (%s_data_length(reply) == 0)' % (xcb_name) 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name) 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' else' 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string()) 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.return_type != 'void': 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' retval = reply->ret_val;' 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' free(reply);' 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' ' + xcb_request + ';' 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#else' 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # End of XCB specific. 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.parameters != []: 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pc_decl = "GLubyte const * pc =" 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pc_decl = "(void)" 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name in f.glx_vendorpriv_names: 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name)) 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name()) 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_emit_args(f, "pc", 0, 0) 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org images = f.get_images() 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for img in images: 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if img.is_output: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o = f.command_fixed_length() - 4 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' *(int32_t *)(pc + %u) = 0;' % (o) 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if img.img_format != "GL_COLOR_INDEX" or img.img_type != "GL_BITMAP": 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o) 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.img_reset: 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset) 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return_name = '' 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.needs_reply(): 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.return_type != 'void': 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return_name = " retval" 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return_str = " retval = (%s)" % (f.return_type) 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return_str = " (void)" 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org got_reply = 0 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for p in f.parameterIterateOutputs(): 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_image(): 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [dim, w, h, d, junk] = p.get_dimensions() 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.dimensions_in_reply: 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " __glXReadPixelReply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, p.img_format, p.img_type, p.name) 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 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) 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org got_reply = 1 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.reply_always_array: 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aa = "GL_TRUE" 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aa = "GL_FALSE" 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # gl_parameter.size() returns the size 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # of the entire data item. If the 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # item is a fixed-size array, this is 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # the size of the whole array. This 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # is not what __glXReadReply wants. It 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # wants the size of a single data 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # element in the reply packet. 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # Dividing by the array size (1 for 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # non-arrays) gives us this. 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = p.size() / p.get_element_count() 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " %s __glXReadReply(dpy, %s, %s, %s);" % (return_str, s, p.name, aa) 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org got_reply = 1 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # If a reply wasn't read to fill an output parameter, 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # read a NULL reply to get the return value. 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not got_reply: 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " %s __glXReadReply(dpy, 0, NULL, GL_FALSE);" % (return_str) 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif self.debug: 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # Only emit the extra glFinish call for functions 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # that don't already require a reply from the server. 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' __indirect_glFinish();' 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.debug: 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' printf( "Exit %%s.\\n", "gl%s" );' % (name) 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' UnlockDisplay(dpy); SyncHandle();' 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name not in f.glx_vendorpriv_names: 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif /* USE_XCB */' 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' }' 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' return%s;' % (return_name) 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printPixelFunction(self, f): 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.pixel_stubs.has_key( f.name ): 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # Normally gl_function::get_parameter_string could be 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # used. However, this call needs to have the missing 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # dimensions (e.g., a fake height value for 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # glTexImage1D) added in. 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_string = "" 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for param in f.parameterIterateGlxSend(): 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.is_padding: 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_string += ", " + param.name 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if param.is_image(): 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [dim, junk, junk, junk, junk] = param.get_dimensions() 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.pad_after(param): 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_string += ", 1" 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' %s(%s, %u%s );' % (self.pixel_stubs[f.name] , f.opcode_name(), dim, p_string) 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.common_func_print_just_start(f, None): 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org trailer = " }" 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org trailer = None 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.can_be_large: 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' }' 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.glx_rop == ~0: 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = "opcode" 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = f.opcode_real_name() 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'emit_header(gc->pc, %s, cmdlen);' % (opcode) 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pixel_emit_args( f, "gc->pc", 0 ) 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'gc->pc += cmdlen;' 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'if (gc->pc > gc->limit) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.can_be_large: 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '}' 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'else {' 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.large_emit_begin(f, opcode) 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pixel_emit_args(f, "pc", 1) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '}' 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if trailer: print trailer 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printRenderFunction(self, f): 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # There is a class of GL functions that take a single pointer 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # as a parameter. This pointer points to a fixed-size chunk 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # of data, and the protocol for this functions is very 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # regular. Since they are so regular and there are so many 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # of them, special case them with generic functions. On 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # x86, this saves about 26KB in the libGL.so binary. 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.variable_length_parameter() == None and len(f.parameters) == 1: 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = f.parameters[0] 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if p.is_pointer(): 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cmdlen = f.command_fixed_length() 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if cmdlen in self.generic_sizes: 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name) 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.common_func_print_just_start(f, None): 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org trailer = " }" 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org trailer = None 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.debug: 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'printf( "Enter %%s...\\n", "gl%s" );' % (f.name) 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.can_be_large: 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'if (cmdlen <= gc->maxSmallRenderCommandSize) {' 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' if ( (gc->pc + cmdlen) > gc->bufEnd ) {' 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' (void) __glXFlushRenderBuffer(gc, gc->pc);' 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' }' 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'emit_header(gc->pc, %s, cmdlen);' % (f.opcode_real_name()) 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_emit_args(f, "gc->pc", 4, 0) 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'gc->pc += cmdlen;' 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }' 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if f.can_be_large: 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '}' 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'else {' 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.large_emit_begin(f) 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.common_emit_args(f, "pc", 8, 1) 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = f.variable_length_parameter() 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (p.offset + 8, p.name, p.size_string()) 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '}' 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.debug: 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '__indirect_glFinish();' 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'printf( "Exit %%s.\\n", "gl%s" );' % (f.name) 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if trailer: print trailer 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PrintGlxProtoInit_c(gl_XML.gl_print_base): 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self): 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_XML.gl_print_base.__init__(self) 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.name = "glX_proto_send.py (from Mesa)" 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.license = license.bsd_license_template % ( \ 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printRealHeader(self): 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """/** 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\file indirect_init.c 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize indirect rendering dispatch table. 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\author Kevin E. Martin <kevin@precisioninsight.com> 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\author Brian Paul <brian@precisioninsight.com> 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\author Ian Romanick <idr@us.ibm.com> 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "indirect_init.h" 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "indirect.h" 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glapi.h" 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No-op function used to initialize functions that have no GLX protocol 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * support. 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int NoOp(void) 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create and initialize a new GL dispatch table. The table is initialized 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with GLX indirect rendering protocol functions. 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _glapi_table * __glXNewIndirectAPI( void ) 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glapi_proc *table; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned entries; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int o; 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org entries = _glapi_get_dispatch_table_size(); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table = (_glapi_proc *) Xmalloc(entries * sizeof(_glapi_proc)); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* first, set all entries to point to no-op functions */ 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < entries; i++) { 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[i] = (_glapi_proc) NoOp; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* now, initialize the entries we understand */""" 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printRealFooter(self): 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """ 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct _glapi_table *) table; 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printBody(self, api): 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for [name, number] in api.categoryIterate(): 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if number != None: 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preamble = '\n /* %3u. %s */\n' % (int(number), name) 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preamble = '\n /* %s */\n' % (name) 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for func in api.functionIterateByCategory(name): 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.client_supported_for_indirect(): 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if preamble: 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print preamble 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preamble = None 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.is_abi(): 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' table[{offset}] = (_glapi_proc) __indirect_gl{name};'.format(name = func.name, offset = func.offset) 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' o = _glapi_get_proc_offset("gl{0}");'.format(func.name) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' assert(o > 0);' 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print ' table[o] = (_glapi_proc) __indirect_gl{0};'.format(func.name) 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PrintGlxProtoInit_h(gl_XML.gl_print_base): 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self): 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_XML.gl_print_base.__init__(self) 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.name = "glX_proto_send.py (from Mesa)" 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.license = license.bsd_license_template % ( \ 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"""Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org(C) Copyright IBM Corporation 2004""", "PRECISION INSIGHT, IBM") 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.header_tag = "_INDIRECT_H_" 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.last_category = "" 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printRealHeader(self): 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """/** 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\file 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prototypes for indirect rendering functions. 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\author Kevin E. Martin <kevin@precisioninsight.com> 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \\author Ian Romanick <idr@us.ibm.com> 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printFastcall() 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.printNoinline() 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print """ 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xfuncproto.h> 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h" 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern _X_HIDDEN NOINLINE CARD32 __glXReadReply( Display *dpy, size_t size, 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * dest, GLboolean reply_is_always_array ); 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern _X_HIDDEN NOINLINE void __glXReadPixelReply( Display *dpy, 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context * gc, unsigned max_dim, GLint width, GLint height, 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint depth, GLenum format, GLenum type, void * dest, 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean dimensions_in_reply ); 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern _X_HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupSingleRequest( 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context * gc, GLint sop, GLint cmdlen ); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern _X_HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct glx_context * gc, GLint code, GLint vop, GLint cmdlen ); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org""" 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def printBody(self, api): 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for func in api.functionIterateGlx(): 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params = func.get_parameter_string() 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'extern _X_HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params) 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for n in func.entry_points: 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.has_different_protocol(n): 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org asdf = func.static_glx_name(n) 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if asdf not in func.static_entry_points: 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'extern _X_HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params) 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # give it a easy-to-remember name 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if func.client_handcode: 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#define gl_dispatch_stub_%s gl%s' % (n, asdf) 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params) 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '' 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#ifdef GLX_SHARED_GLAPI' 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'extern _X_HIDDEN void (*__indirect_get_proc_address(const char *name))(void);' 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print '#endif' 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdef show_usage(): 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0] 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " -m output_mode Output mode can be one of 'proto', 'init_c' or 'init_h'." 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print " -d Enable extra debug information in the generated code." 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sys.exit(1) 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgif __name__ == '__main__': 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org file_name = "gl_API.xml" 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org try: 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d") 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org except Exception,e: 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org show_usage() 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug = 0 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = "proto" 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (arg,val) in args: 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if arg == "-f": 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org file_name = val 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif arg == "-m": 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = val 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif arg == "-d": 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug = 1 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if mode == "proto": 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printer = PrintGlxProtoStubs() 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif mode == "init_c": 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printer = PrintGlxProtoInit_c() 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif mode == "init_h": 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printer = PrintGlxProtoInit_h() 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org show_usage() 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printer.debug = debug 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printer.Print( api ) 1123