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