• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2# (C) Copyright IBM Corporation 2004, 2005
3# All Rights Reserved.
4#
5# Permission is hereby granted, free of charge, to any person obtaining a
6# copy of this software and associated documentation files (the "Software"),
7# to deal in the Software without restriction, including without limitation
8# on the rights to use, copy, modify, merge, publish, distribute, sub
9# license, and/or sell copies of the Software, and to permit persons to whom
10# the Software is furnished to do so, subject to the following conditions:
11#
12# The above copyright notice and this permission notice (including the next
13# paragraph) shall be included in all copies or substantial portions of the
14# Software.
15#
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22# IN THE SOFTWARE.
23#
24# Authors:
25#    Ian Romanick <idr@us.ibm.com>
26
27import argparse
28
29import license
30import gl_XML
31import glX_XML
32
33
34class PrintGlProcs(gl_XML.gl_print_base):
35    def __init__(self, es=False):
36        gl_XML.gl_print_base.__init__(self)
37
38        self.es = es
39        self.name = "gl_procs.py (from Mesa)"
40        self.license = license.bsd_license_template % ( \
41"""Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
42(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM")
43
44    def printRealHeader(self):
45        print("""
46/* This file is only included by glapi.c and is used for
47 * the GetProcAddress() function
48 */
49
50typedef struct {
51    GLint Name_offset;
52#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
53    _glapi_proc Address;
54#endif
55    GLuint Offset;
56} glprocs_table_t;
57
58#if   !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
59#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o }
60#elif  defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
61#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o }
62#elif  defined(NEED_FUNCTION_POINTER) &&  defined(GLX_INDIRECT_RENDERING)
63#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o }
64#elif !defined(NEED_FUNCTION_POINTER) &&  defined(GLX_INDIRECT_RENDERING)
65#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o }
66#endif
67
68""")
69        return
70
71    def printRealFooter(self):
72        print('')
73        print('#undef NAME_FUNC_OFFSET')
74        return
75
76    def printFunctionString(self, name):
77        print('    "gl%s\\0"' % (name))
78
79    def printBody(self, api):
80        print('')
81        print('static const char gl_string_table[] =')
82
83        base_offset = 0
84        table = []
85        for func in api.functionIterateByOffset():
86            name = func.dispatch_name()
87            self.printFunctionString(func.name)
88            table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset))
89
90            # The length of the function's name, plus 2 for "gl",
91            # plus 1 for the NUL.
92
93            base_offset += len(func.name) + 3
94
95
96        for func in api.functionIterateByOffset():
97            for n in func.entry_points:
98                if n != func.name:
99                    name = func.dispatch_name()
100                    self.printFunctionString( n )
101
102                    if func.has_different_protocol(n):
103                        alt_name = "gl" + func.static_glx_name(n)
104                        table.append((base_offset, "gl" + name, alt_name, alt_name, func.offset))
105                    else:
106                        table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset))
107
108                    base_offset += len(n) + 3
109
110
111        print('    ;')
112        print('')
113        print('')
114        print('#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)')
115        for func in api.functionIterateByOffset():
116            for n in func.entry_points:
117                if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)):
118                    print('%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string()))
119                    break
120
121        if self.es:
122            categories = {}
123            for func in api.functionIterateByOffset():
124                for n in func.entry_points:
125                    cat, num = api.get_category_for_name(n)
126                    if (cat.startswith("es") or cat.startswith("GL_OES")):
127                        if cat not in categories:
128                            categories[cat] = []
129                        proto = 'GLAPI %s GLAPIENTRY %s(%s);' \
130                                        % (func.return_type, "gl" + n, func.get_parameter_string(n))
131                        categories[cat].append(proto)
132            if categories:
133                print('')
134                print('/* OpenGL ES specific prototypes */')
135                print('')
136                keys = sorted(categories.keys())
137                for key in keys:
138                    print('/* category %s */' % key)
139                    print("\n".join(categories[key]))
140                print('')
141
142        print('#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */')
143
144        print('')
145        print('static const glprocs_table_t static_functions[] = {')
146
147        for info in table:
148            print('    NAME_FUNC_OFFSET(%5u, %s, %s, %s, %d),' % info)
149
150        print('    NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)')
151        print('};')
152        return
153
154
155def _parser():
156    """Parse arguments and return a namepsace."""
157
158    parser = argparse.ArgumentParser()
159    parser.add_argument('-f', '--filename',
160                        default='gl_API.xml',
161                        metavar="input_file_name",
162                        dest='file_name',
163                        help="Path to an XML description of OpenGL API.")
164    parser.add_argument('-c', '--es-version',
165                        dest='es',
166                        action="store_true",
167                        help="filter functions for es")
168    return parser.parse_args()
169
170
171def main():
172    """Main function."""
173    args = _parser()
174    api = gl_XML.parse_GL_API(args.file_name, glX_XML.glx_item_factory())
175    PrintGlProcs(args.es).Print(api)
176
177
178if __name__ == '__main__':
179    main()
180