3
# (C) Copyright IBM Corporation 2004, 2005
6
# Permission is hereby granted, free of charge, to any person obtaining a
7
# copy of this software and associated documentation files (the "Software"),
8
# to deal in the Software without restriction, including without limitation
9
# on the rights to use, copy, modify, merge, publish, distribute, sub
10
# license, and/or sell copies of the Software, and to permit persons to whom
11
# the Software is furnished to do so, subject to the following conditions:
13
# The above copyright notice and this permission notice (including the next
14
# paragraph) shall be included in all copies or substantial portions of the
17
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
20
# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
26
# Ian Romanick <idr@us.ibm.com>
32
class PrintGlOffsets(gl_XML.gl_print_base):
34
gl_XML.gl_print_base.__init__(self)
36
self.name = "gl_apitemp.py (from Mesa)"
37
self.license = license.bsd_license_template % ( \
38
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
39
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
41
self.undef_list.append( "KEYWORD1" )
42
self.undef_list.append( "KEYWORD2" )
43
self.undef_list.append( "NAME" )
44
self.undef_list.append( "DISPATCH" )
45
self.undef_list.append( "RETURN_DISPATCH" )
46
self.undef_list.append( "DISPATCH_TABLE_NAME" )
47
self.undef_list.append( "UNUSED_TABLE_NAME" )
48
self.undef_list.append( "TABLE_ENTRY" )
51
def printFunction(self, f, name):
57
for p in f.parameterIterator():
59
cast = "(const void *) "
63
t_string = t_string + comma + p.format_string()
64
p_string = p_string + comma + p.name
65
o_string = o_string + comma + cast + p.name
69
if f.return_type != 'void':
70
dispatch = "RETURN_DISPATCH"
74
print 'KEYWORD1 %s KEYWORD2 NAME(%s)(%s)' \
75
% (f.return_type, name, f.get_parameter_string(name))
78
print ' %s(%s, (), (F, "gl%s();\\n"));' \
79
% (dispatch, f.name, name)
81
print ' %s(%s, (%s), (F, "gl%s(%s);\\n", %s));' \
82
% (dispatch, f.name, p_string, name, t_string, o_string)
87
def printRealHeader(self):
90
* This file is a template which generates the OpenGL API entry point
91
* functions. It should be included by a .c file which first defines
92
* the following macros:
93
* KEYWORD1 - usually nothing, but might be __declspec(dllexport) on Win32
94
* KEYWORD2 - usually nothing, but might be __stdcall on Win32
95
* NAME(n) - builds the final function name (usually add "gl" prefix)
96
* DISPATCH(func, args, msg) - code to do dispatch of named function.
97
* msg is a printf-style debug message.
98
* RETURN_DISPATCH(func, args, msg) - code to do dispatch with a return value
100
* Here is an example which generates the usual OpenGL functions:
103
* #define NAME(func) gl##func
104
* #define DISPATCH(func, args, msg) \\
105
* struct _glapi_table *dispatch = CurrentDispatch; \\
106
* (*dispatch->func) args
107
* #define RETURN DISPATCH(func, args, msg) \\
108
* struct _glapi_table *dispatch = CurrentDispatch; \\
109
* return (*dispatch->func) args
124
#error DISPATCH must be defined
127
#ifndef RETURN_DISPATCH
128
#error RETURN_DISPATCH must be defined
136
def printInitDispatch(self, api):
138
#endif /* defined( NAME ) */
141
* This is how a dispatch table can be initialized with all the functions
142
* we generated above.
144
#ifdef DISPATCH_TABLE_NAME
147
#error TABLE_ENTRY must be defined
150
static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
151
for f in api.functionIterateByOffset():
152
print ' TABLE_ENTRY(%s),' % (f.name)
154
print ' /* A whole bunch of no-op functions. These might be called'
155
print ' * when someone tries to call a dynamically-registered'
156
print ' * extension function without a current rendering context.'
158
for i in range(1, 100):
159
print ' TABLE_ENTRY(Unused),'
162
print '#endif /* DISPATCH_TABLE_NAME */'
167
def printAliasedTable(self, api):
170
* This is just used to silence compiler warnings.
171
* We list the functions which are not otherwise used.
173
#ifdef UNUSED_TABLE_NAME
174
static _glapi_proc UNUSED_TABLE_NAME[] = {"""
176
for f in api.functionIterateByOffset():
177
for n in f.entry_points:
179
print ' TABLE_ENTRY(%s),' % (n)
182
print '#endif /*UNUSED_TABLE_NAME*/'
187
def printBody(self, api):
188
for func in api.functionIterateByOffset():
189
for n in func.entry_points:
190
self.printFunction( func, n )
192
self.printInitDispatch(api)
193
self.printAliasedTable(api)
198
print "Usage: %s [-f input_file_name]" % sys.argv[0]
201
if __name__ == '__main__':
202
file_name = "gl_API.xml"
205
(args, trail) = getopt.getopt(sys.argv[1:], "f:")
209
for (arg,val) in args:
213
api = gl_XML.parse_GL_API( file_name )
215
printer = PrintGlOffsets()