1c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#!/usr/bin/env python
2c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
3c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# (C) Copyright IBM Corporation 2005
4c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# All Rights Reserved.
5c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#
6c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# Permission is hereby granted, free of charge, to any person obtaining a
7c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# copy of this software and associated documentation files (the "Software"),
8c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# to deal in the Software without restriction, including without limitation
9c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub
10c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# license, and/or sell copies of the Software, and to permit persons to whom
11c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# the Software is furnished to do so, subject to the following conditions:
12c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#
13c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# The above copyright notice and this permission notice (including the next
14c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# paragraph) shall be included in all copies or substantial portions of the
15c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# Software.
16c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#
17c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
20c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# IN THE SOFTWARE.
24c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#
25c212abf99af494f024b0b981a83350f7ac9821efIan Romanick# Authors:
26c212abf99af494f024b0b981a83350f7ac9821efIan Romanick#    Ian Romanick <idr@us.ibm.com>
27c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
28c212abf99af494f024b0b981a83350f7ac9821efIan Romanickimport gl_XML
29c212abf99af494f024b0b981a83350f7ac9821efIan Romanickimport license
30c212abf99af494f024b0b981a83350f7ac9821efIan Romanickimport sys, getopt, string
31c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
32c212abf99af494f024b0b981a83350f7ac9821efIan Romanickvtxfmt = [
33c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "ArrayElement", \
34c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Color3f", \
35c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Color3fv", \
36c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Color4f", \
37c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Color4fv", \
38c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EdgeFlag", \
39c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EdgeFlagv", \
40c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalCoord1f", \
41c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalCoord1fv", \
42c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalCoord2f", \
43c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalCoord2fv", \
44c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalPoint1", \
45c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalPoint2", \
46c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "FogCoordfEXT", \
47c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "FogCoordfvEXT", \
48c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Indexf", \
49c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Indexfv", \
50c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Materialfv", \
51c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord1fARB", \
52c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord1fvARB", \
53c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord2fARB", \
54c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord2fvARB", \
55c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord3fARB", \
56c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord3fvARB", \
57c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord4fARB", \
58c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "MultiTexCoord4fvARB", \
59c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Normal3f", \
60c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Normal3fv", \
61c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "SecondaryColor3fEXT", \
62c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "SecondaryColor3fvEXT", \
63c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord1f", \
64c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord1fv", \
65c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord2f", \
66c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord2fv", \
67c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord3f", \
68c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord3fv", \
69c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord4f", \
70c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "TexCoord4fv", \
71c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex2f", \
72c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex2fv", \
73c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex3f", \
74c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex3fv", \
75c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex4f", \
76c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Vertex4fv", \
77c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "CallList", \
78c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "CallLists", \
79c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Begin", \
80c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "End", \
81c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib1fNV", \
82c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib1fvNV", \
83c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib2fNV", \
84c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib2fvNV", \
85c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib3fNV", \
86c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib3fvNV", \
87c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib4fNV", \
88c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib4fvNV", \
89c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib1fARB", \
90c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib1fvARB", \
91c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib2fARB", \
92c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib2fvARB", \
93c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib3fARB", \
94c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib3fvARB", \
95c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib4fARB", \
96c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "VertexAttrib4fvARB", \
97c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "Rectf", \
98c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "DrawArrays", \
99c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "DrawElements", \
100c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "DrawRangeElements", \
101c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalMesh1", \
102c212abf99af494f024b0b981a83350f7ac9821efIan Romanick    "EvalMesh2", \
103c212abf99af494f024b0b981a83350f7ac9821efIan Romanick]
104c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
1051585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanickdef all_entrypoints_in_abi(f, abi, api):
1061585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick	for n in f.entry_points:
1071585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick		[category, num] = api.get_category_for_name( n )
1081585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick		if category not in abi:
1091585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick			return 0
1101585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1111585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick	return 1
1121585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1131585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1141585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanickdef any_entrypoints_in_abi(f, abi, api):
1151585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick	for n in f.entry_points:
1161585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick		[category, num] = api.get_category_for_name( n )
1171585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick		if category in abi:
1181585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick			return 1
1191585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1201585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick	return 0
1211585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1221585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
123c212abf99af494f024b0b981a83350f7ac9821efIan Romanickdef condition_for_function(f, abi, all_not_in_ABI):
124c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	"""Create a C-preprocessor condition for the function.
125c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
126c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	There are two modes of operation.  If all_not_in_ABI is set, a
127c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	condition is only created is all of the entry-point names for f are
128c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	not in the selected ABI.  If all_not_in_ABI is not set, a condition
129c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	is created if any entryp-point name is not in the selected ABI.
130c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	"""
131c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
132c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	condition = []
133c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	for n in f.entry_points:
134c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		[category, num] = api.get_category_for_name( n )
135c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		if category not in abi:
136c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			condition.append( 'defined(need_%s)' % (gl_XML.real_category_name( category )) )
137c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		elif all_not_in_ABI:
138c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			return []
139c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
140c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	return condition
141c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
142c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
143c212abf99af494f024b0b981a83350f7ac9821efIan Romanickclass PrintGlExtensionGlue(gl_XML.gl_print_base):
144c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def __init__(self):
145c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		gl_XML.gl_print_base.__init__(self)
146c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
147c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.name = "extension_helper.py (from Mesa)"
148c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.license = license.bsd_license_template % ("(C) Copyright IBM Corporation 2005", "IBM")
149c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		return
150c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
151c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
152c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def printRealHeader(self):
153c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '#include "utils.h"'
1542cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu		print '#include "main/dispatch.h"'
155c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print ''
156c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		return
157c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
158c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
159c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def printBody(self, api):
160c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		abi = [ "1.0", "1.1", "1.2", "GL_ARB_multitexture" ]
161c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
162c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		category_list = {}
163c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
164c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '#ifndef NULL'
165c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '# define NULL 0'
166c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '#endif'
167c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print ''
168c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
169c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		for f in api.functionIterateAll():
170c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			condition = condition_for_function(f, abi, 0)
171c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			if len(condition):
172c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '#if %s' % (string.join(condition, " || "))
17396bdd993ec2e02da676b2f7c6a15017e022e7185Ian Romanick				print 'static const char %s_names[] =' % (f.name)
174c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
175c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				parameter_signature = ''
176c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				for p in f.parameterIterator():
1770f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick					if p.is_padding:
1780f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick						continue
1790f73302d24f4201813da2939742c5bcb6964b3b1Ian Romanick
180c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					# FIXME: This is a *really* ugly hack. :(
181c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
182c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					tn = p.type_expr.get_base_type_node()
183c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					if p.is_pointer():
184c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						parameter_signature += 'p'
185c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					elif tn.integer:
186c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						parameter_signature += 'i'
187c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					elif tn.size == 4:
188c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						parameter_signature += 'f'
189c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					else:
190c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						parameter_signature += 'd'
191c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
192c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '    "%s\\0" /* Parameter signature */' % (parameter_signature)
193c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
194c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				for n in f.entry_points:
195c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					print '    "gl%s\\0"' % (n)
196c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
197c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					[category, num] = api.get_category_for_name( n )
198c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					if category not in abi:
199c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						c = gl_XML.real_category_name(category)
200c212abf99af494f024b0b981a83350f7ac9821efIan Romanick						if not category_list.has_key(c):
201c212abf99af494f024b0b981a83350f7ac9821efIan Romanick							category_list[ c ] = []
202c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
2031585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick						category_list[ c ].append( f )
204c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
205c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '    "";'
206c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '#endif'
207c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print ''
208c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
209c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		keys = category_list.keys()
210c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		keys.sort()
211c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
212c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		for category in keys:
213c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print '#if defined(need_%s)' % (category)
214c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print 'static const struct dri_extension_function %s_functions[] = {' % (category)
2151585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
2161585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick			for f in category_list[ category ]:
2178fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick				# A function either has an offset that is
2188fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick				# assigned by the ABI, or it has a remap
2198fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick				# index.
2201585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick				if any_entrypoints_in_abi(f, abi, api):
2211585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick					index_name = "-1"
2228fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick					offset = f.offset
2231585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick				else:
2241585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick					index_name = "%s_remap_index" % (f.name)
2258fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick					offset = -1
2261585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
2278fbe16d4dd0664f7766f5241c055efb582cc06e5Ian Romanick				print '    { %s_names, %s, %d },' % (f.name, index_name, offset)
2281585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
2291585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
2301585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick			print '    { NULL, 0, 0 }'
231c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print '};'
232c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print '#endif'
233c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print ''
234c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
235c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		return
236c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
237c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
238c212abf99af494f024b0b981a83350f7ac9821efIan Romanickclass PrintInitDispatch(gl_XML.gl_print_base):
239c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def __init__(self):
240c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		gl_XML.gl_print_base.__init__(self)
241c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
242c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.name = "extension_helper.py (from Mesa)"
243c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.license = license.bsd_license_template % ("(C) Copyright IBM Corporation 2005", "IBM")
244c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		return
245c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
246c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
247c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def do_function_body(self, api, abi, vtxfmt_only):
248c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		last_condition_string = None
249c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		for f in api.functionIterateByOffset():
250c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			if (f.name in vtxfmt) and not vtxfmt_only:
251c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				continue
252c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
253c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			if (f.name not in vtxfmt) and vtxfmt_only:
254c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				continue
255c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
256c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			condition = condition_for_function(f, abi, 1)
257c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			condition_string = string.join(condition, " || ")
258c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
259c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			if condition_string != last_condition_string:
260c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				if last_condition_string:
261c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					print '#endif /* %s */' % (last_condition_string)
262c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
263c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				if condition_string:
264c212abf99af494f024b0b981a83350f7ac9821efIan Romanick					print '#if %s' % (condition_string)
265c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
266c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			if vtxfmt_only:
267c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '   disp->%s = vfmt->%s;' % (f.name, f.name)
268c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			else:
269c212abf99af494f024b0b981a83350f7ac9821efIan Romanick				print '   disp->%s = _mesa_%s;' % (f.name, f.name)
270c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
271c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			last_condition_string = condition_string
272c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
273c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		if last_condition_string:
274c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			print '#endif /* %s */' % (last_condition_string)
275c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
276c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
277c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
278c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	def printBody(self, api):
279c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		abi = [ "1.0", "1.1", "1.2", "GL_ARB_multitexture" ]
280c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
281c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print 'void driver_init_exec_table(struct _glapi_table *disp)'
282c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '{'
283c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.do_function_body(api, abi, 0)
284c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '}'
285c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print ''
286c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print 'void driver_install_vtxfmt(struct _glapi_table *disp, const GLvertexformat *vfmt)'
287c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '{'
288c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		self.do_function_body(api, abi, 1)
289c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		print '}'
290c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
291c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		return
292c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
293c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
294c212abf99af494f024b0b981a83350f7ac9821efIan Romanickdef show_usage():
295c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
296c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	print "    -m output_mode   Output mode can be one of 'extensions' or 'exec_init'."
297c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	sys.exit(1)
298c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
299c212abf99af494f024b0b981a83350f7ac9821efIan Romanickif __name__ == '__main__':
300c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	file_name = "gl_API.xml"
301c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
302c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	try:
303c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
304c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	except Exception,e:
305c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		show_usage()
306c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
307c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	mode = "extensions"
308c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	for (arg,val) in args:
309c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		if arg == "-f":
310c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			file_name = val
311c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		if arg == '-m':
312c212abf99af494f024b0b981a83350f7ac9821efIan Romanick			mode = val
313c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
314c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
315c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	api = gl_XML.parse_GL_API( file_name )
316c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
317c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	if mode == "extensions":
318c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		printer = PrintGlExtensionGlue()
319c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	elif mode == "exec_init":
320c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		printer = PrintInitDispatch()
321c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	else:
322c212abf99af494f024b0b981a83350f7ac9821efIan Romanick		show_usage()
323c212abf99af494f024b0b981a83350f7ac9821efIan Romanick
324c212abf99af494f024b0b981a83350f7ac9821efIan Romanick	printer.Print( api )
325