~ubuntu-branches/ubuntu/natty/mesa/natty-proposed

« back to all changes in this revision

Viewing changes to src/mapi/glapi/gen/gl_table.py

  • Committer: Bazaar Package Importer
  • Author(s): Robert Hooker, Robert Hooker, Christopher James Halse Rogers
  • Date: 2010-09-14 08:55:40 UTC
  • mfrom: (1.2.28 upstream)
  • Revision ID: james.westby@ubuntu.com-20100914085540-m4fpl0hdjlfd4jgz
Tags: 7.9~git20100909-0ubuntu1
[ Robert Hooker ]
* New upstream git snapshot up to commit 94118fe2d4b1e5 (LP: #631413)
* New features include ATI HD5xxx series support in r600, and a vastly
  improved glsl compiler.
* Remove pre-generated .pc's, use the ones generated at build time
  instead.
* Remove all references to mesa-utils now that its no longer shipped
  with the mesa source.
* Disable the experimental ARB_fragment_shader option by default on
  i915, it exposes incomplete functionality that breaks KDE compositing
  among other things. It can be enabled via driconf still. (LP: #628930).

[ Christopher James Halse Rogers ]
* debian/patches/04_osmesa_version.diff:
  - Refresh for new upstream
* Bugs fixed in this release:
  - Fixes severe rendering corruption in Unity on radeon (LP: #628727,
    LP: #596292, LP: #599741, LP: #630315, LP: #613694, LP: #599741).
  - Also fixes rendering in gnome-shell (LP: #578619).
  - Flickering in OpenGL apps on radeon (LP: #626943, LP: #610541).
  - Provides preliminary support for new intel chips (LP: #601052).
* debian/rules:
  - Update configure flags to match upstream reshuffling.
  - Explicitly remove gallium DRI drivers that we don't want to ship.
* Update debian/gbp.conf for this Maverick-specific packaging
* libegl1-mesa-dri-x11,kms: There are no longer separate kms or x11 drivers
  for EGL, libegl1-mesa-drivers now contains a single driver that provides
  both backends.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python2
 
2
 
 
3
# (C) Copyright IBM Corporation 2004
 
4
# All Rights Reserved.
 
5
#
 
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:
 
12
#
 
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
 
15
# Software.
 
16
#
 
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
 
23
# IN THE SOFTWARE.
 
24
#
 
25
# Authors:
 
26
#    Ian Romanick <idr@us.ibm.com>
 
27
 
 
28
import gl_XML
 
29
import license
 
30
import sys, getopt
 
31
 
 
32
class PrintGlTable(gl_XML.gl_print_base):
 
33
        def __init__(self, es=False):
 
34
                gl_XML.gl_print_base.__init__(self)
 
35
 
 
36
                self.es = es
 
37
                self.header_tag = '_GLAPI_TABLE_H_'
 
38
                self.name = "gl_table.py (from Mesa)"
 
39
                self.license = license.bsd_license_template % ( \
 
40
"""Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
 
41
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
 
42
                return
 
43
 
 
44
 
 
45
        def printBody(self, api):
 
46
                for f in api.functionIterateByOffset():
 
47
                        arg_string = f.get_parameter_string()
 
48
                        print '   %s (GLAPIENTRYP %s)(%s); /* %d */' % (f.return_type, f.name, arg_string, f.offset)
 
49
 
 
50
 
 
51
        def printRealHeader(self):
 
52
                print '#ifndef GLAPIENTRYP'
 
53
                print '# ifndef GLAPIENTRY'
 
54
                print '#  define GLAPIENTRY'
 
55
                print '# endif'
 
56
                print ''
 
57
                print '# define GLAPIENTRYP GLAPIENTRY *'
 
58
                print '#endif'
 
59
                print ''
 
60
                print ''
 
61
                print 'struct _glapi_table'
 
62
                print '{'
 
63
                return
 
64
 
 
65
 
 
66
        def printRealFooter(self):
 
67
                print '};'
 
68
                return
 
69
 
 
70
 
 
71
class PrintRemapTable(gl_XML.gl_print_base):
 
72
        def __init__(self, es=False):
 
73
                gl_XML.gl_print_base.__init__(self)
 
74
 
 
75
                self.es = es
 
76
                self.header_tag = '_GLAPI_DISPATCH_H_'
 
77
                self.name = "gl_table.py (from Mesa)"
 
78
                self.license = license.bsd_license_template % ("(C) Copyright IBM Corporation 2005", "IBM")
 
79
                return
 
80
 
 
81
 
 
82
        def printRealHeader(self):
 
83
                print """
 
84
/* this file should not be included directly in mesa */
 
85
 
 
86
/**
 
87
 * \\file glapidispatch.h
 
88
 * Macros for handling GL dispatch tables.
 
89
 *
 
90
 * For each known GL function, there are 3 macros in this file.  The first
 
91
 * macro is named CALL_FuncName and is used to call that GL function using
 
92
 * the specified dispatch table.  The other 2 macros, called GET_FuncName
 
93
 * can SET_FuncName, are used to get and set the dispatch pointer for the
 
94
 * named function in the specified dispatch table.
 
95
 */
 
96
"""
 
97
                
 
98
                return
 
99
 
 
100
        def printBody(self, api):
 
101
                print '#define CALL_by_offset(disp, cast, offset, parameters) \\'
 
102
                print '    (*(cast (GET_by_offset(disp, offset)))) parameters'
 
103
                print '#define GET_by_offset(disp, offset) \\'
 
104
                print '    (offset >= 0) ? (((_glapi_proc *)(disp))[offset]) : NULL'
 
105
                print '#define SET_by_offset(disp, offset, fn) \\'
 
106
                print '    do { \\'
 
107
                print '        if ( (offset) < 0 ) { \\'
 
108
                print '            /* fprintf( stderr, "[%s:%u] SET_by_offset(%p, %d, %s)!\\n", */ \\'
 
109
                print '            /*         __func__, __LINE__, disp, offset, # fn); */ \\'
 
110
                print '            /* abort(); */ \\'
 
111
                print '        } \\'
 
112
                print '        else { \\'
 
113
                print '            ( (_glapi_proc *) (disp) )[offset] = (_glapi_proc) fn; \\'
 
114
                print '        } \\'
 
115
                print '    } while(0)'
 
116
                print ''
 
117
 
 
118
                functions = []
 
119
                abi_functions = []
 
120
                alias_functions = []
 
121
                count = 0
 
122
                for f in api.functionIterateByOffset():
 
123
                        if not f.is_abi():
 
124
                                functions.append( [f, count] )
 
125
                                count += 1
 
126
                        else:
 
127
                                abi_functions.append( f )
 
128
 
 
129
                        if self.es:
 
130
                                # remember functions with aliases
 
131
                                if len(f.entry_points) > 1:
 
132
                                        alias_functions.append(f)
 
133
 
 
134
 
 
135
                for f in abi_functions:
 
136
                        print '#define CALL_%s(disp, parameters) (*((disp)->%s)) parameters' % (f.name, f.name)
 
137
                        print '#define GET_%s(disp) ((disp)->%s)' % (f.name, f.name)
 
138
                        print '#define SET_%s(disp, fn) ((disp)->%s = fn)' % (f.name, f.name)
 
139
 
 
140
 
 
141
                print ''
 
142
                print '#if !defined(_GLAPI_USE_REMAP_TABLE)'
 
143
                print ''
 
144
 
 
145
                for [f, index] in functions:
 
146
                        print '#define CALL_%s(disp, parameters) (*((disp)->%s)) parameters' % (f.name, f.name)
 
147
                        print '#define GET_%s(disp) ((disp)->%s)' % (f.name, f.name)
 
148
                        print '#define SET_%s(disp, fn) ((disp)->%s = fn)' % (f.name, f.name)
 
149
 
 
150
                print ''
 
151
                print '#else'
 
152
                print ''
 
153
                print '#define driDispatchRemapTable_size %u' % (count)
 
154
                print 'extern int driDispatchRemapTable[ driDispatchRemapTable_size ];'
 
155
                print ''
 
156
 
 
157
                for [f, index] in functions:
 
158
                        print '#define %s_remap_index %u' % (f.name, index)
 
159
 
 
160
                print ''
 
161
 
 
162
                for [f, index] in functions:
 
163
                        arg_string = gl_XML.create_parameter_string( f.parameters, 0 )
 
164
                        cast = '%s (GLAPIENTRYP)(%s)' % (f.return_type, arg_string)
 
165
 
 
166
                        print '#define CALL_%s(disp, parameters) CALL_by_offset(disp, (%s), driDispatchRemapTable[%s_remap_index], parameters)' % (f.name, cast, f.name)
 
167
                        print '#define GET_%s(disp) GET_by_offset(disp, driDispatchRemapTable[%s_remap_index])' % (f.name, f.name)
 
168
                        print '#define SET_%s(disp, fn) SET_by_offset(disp, driDispatchRemapTable[%s_remap_index], fn)' % (f.name, f.name)
 
169
 
 
170
 
 
171
                print ''
 
172
                print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */'
 
173
 
 
174
                if alias_functions:
 
175
                        print ''
 
176
                        print '/* define aliases for compatibility */'
 
177
                        for f in alias_functions:
 
178
                                for name in f.entry_points:
 
179
                                        if name != f.name:
 
180
                                                print '#define CALL_%s(disp, parameters) CALL_%s(disp, parameters)' % (name, f.name)
 
181
                                                print '#define GET_%s(disp) GET_%s(disp)' % (name, f.name)
 
182
                                                print '#define SET_%s(disp, fn) SET_%s(disp, fn)' % (name, f.name)
 
183
                        print ''
 
184
 
 
185
                        print '#if defined(_GLAPI_USE_REMAP_TABLE)'
 
186
                        for f in alias_functions:
 
187
                                for name in f.entry_points:
 
188
                                        if name != f.name:
 
189
                                                print '#define %s_remap_index %s_remap_index' % (name, f.name)
 
190
                        print '#endif /* defined(_GLAPI_USE_REMAP_TABLE) */'
 
191
                        print ''
 
192
 
 
193
                return
 
194
 
 
195
 
 
196
def show_usage():
 
197
        print "Usage: %s [-f input_file_name] [-m mode] [-c]" % sys.argv[0]
 
198
        print "    -m mode   Mode can be 'table' or 'remap_table'."
 
199
        print "    -c        Enable compatibility with OpenGL ES."
 
200
        sys.exit(1)
 
201
 
 
202
if __name__ == '__main__':
 
203
        file_name = "gl_API.xml"
 
204
    
 
205
        try:
 
206
                (args, trail) = getopt.getopt(sys.argv[1:], "f:m:c")
 
207
        except Exception,e:
 
208
                show_usage()
 
209
 
 
210
        mode = "table"
 
211
        es = False
 
212
        for (arg,val) in args:
 
213
                if arg == "-f":
 
214
                        file_name = val
 
215
                elif arg == "-m":
 
216
                        mode = val
 
217
                elif arg == "-c":
 
218
                        es = True
 
219
 
 
220
        if mode == "table":
 
221
                printer = PrintGlTable(es)
 
222
        elif mode == "remap_table":
 
223
                printer = PrintRemapTable(es)
 
224
        else:
 
225
                show_usage()
 
226
 
 
227
        api = gl_XML.parse_GL_API( file_name )
 
228
 
 
229
        printer.Print( api )