Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | #!/usr/bin/env python |
2 | |||
3 | # Copyright (C) 2012 Intel Corporation |
||
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 | # the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
9 | # and/or sell copies of the Software, and to permit persons to whom the |
||
10 | # 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 NONINFRINGEMENT. IN NO EVENT SHALL |
||
19 | # THE AUTHORS OR COPYRIGHT HOLDERS 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 | # This script generates the file api_exec.c, which contains |
||
25 | # _mesa_initialize_exec_table(). It is responsible for populating all |
||
26 | # entries in the "exec" dispatch table that aren't dynamic. |
||
27 | |||
28 | import collections |
||
29 | import license |
||
30 | import gl_XML |
||
31 | import sys, getopt |
||
32 | |||
33 | |||
34 | exec_flavor_map = { |
||
35 | 'dynamic': None, |
||
36 | 'mesa': '_mesa_', |
||
37 | 'skip': None, |
||
38 | } |
||
39 | |||
40 | |||
41 | header = """/** |
||
42 | * \\file api_exec.c |
||
43 | * Initialize dispatch table. |
||
44 | */ |
||
45 | |||
46 | |||
47 | #include "main/accum.h" |
||
48 | #include "main/api_loopback.h" |
||
49 | #include "main/api_exec.h" |
||
50 | #include "main/arbprogram.h" |
||
51 | #include "main/atifragshader.h" |
||
52 | #include "main/attrib.h" |
||
53 | #include "main/blend.h" |
||
54 | #include "main/blit.h" |
||
55 | #include "main/bufferobj.h" |
||
56 | #include "main/arrayobj.h" |
||
57 | #include "main/buffers.h" |
||
58 | #include "main/clear.h" |
||
59 | #include "main/clip.h" |
||
60 | #include "main/colortab.h" |
||
61 | #include "main/compute.h" |
||
62 | #include "main/condrender.h" |
||
63 | #include "main/context.h" |
||
64 | #include "main/convolve.h" |
||
65 | #include "main/copyimage.h" |
||
66 | #include "main/depth.h" |
||
67 | #include "main/dlist.h" |
||
68 | #include "main/drawpix.h" |
||
69 | #include "main/drawtex.h" |
||
70 | #include "main/rastpos.h" |
||
71 | #include "main/enable.h" |
||
72 | #include "main/errors.h" |
||
73 | #include "main/es1_conversion.h" |
||
74 | #include "main/eval.h" |
||
75 | #include "main/get.h" |
||
76 | #include "main/feedback.h" |
||
77 | #include "main/fog.h" |
||
78 | #include "main/fbobject.h" |
||
79 | #include "main/framebuffer.h" |
||
80 | #include "main/genmipmap.h" |
||
81 | #include "main/hint.h" |
||
82 | #include "main/histogram.h" |
||
83 | #include "main/imports.h" |
||
84 | #include "main/light.h" |
||
85 | #include "main/lines.h" |
||
86 | #include "main/matrix.h" |
||
87 | #include "main/multisample.h" |
||
88 | #include "main/objectlabel.h" |
||
89 | #include "main/performance_monitor.h" |
||
90 | #include "main/pipelineobj.h" |
||
91 | #include "main/pixel.h" |
||
92 | #include "main/pixelstore.h" |
||
93 | #include "main/points.h" |
||
94 | #include "main/polygon.h" |
||
95 | #include "main/program_resource.h" |
||
96 | #include "main/querymatrix.h" |
||
97 | #include "main/queryobj.h" |
||
98 | #include "main/readpix.h" |
||
99 | #include "main/samplerobj.h" |
||
100 | #include "main/scissor.h" |
||
101 | #include "main/stencil.h" |
||
102 | #include "main/texenv.h" |
||
103 | #include "main/texgetimage.h" |
||
104 | #include "main/teximage.h" |
||
105 | #include "main/texgen.h" |
||
106 | #include "main/texobj.h" |
||
107 | #include "main/texparam.h" |
||
108 | #include "main/texstate.h" |
||
109 | #include "main/texstorage.h" |
||
110 | #include "main/texturebarrier.h" |
||
111 | #include "main/textureview.h" |
||
112 | #include "main/transformfeedback.h" |
||
113 | #include "main/mtypes.h" |
||
114 | #include "main/varray.h" |
||
115 | #include "main/viewport.h" |
||
116 | #include "main/shaderapi.h" |
||
117 | #include "main/shaderimage.h" |
||
118 | #include "main/uniforms.h" |
||
119 | #include "main/syncobj.h" |
||
120 | #include "main/formatquery.h" |
||
121 | #include "main/dispatch.h" |
||
122 | #include "main/vdpau.h" |
||
123 | #include "vbo/vbo.h" |
||
124 | |||
125 | |||
126 | /** |
||
127 | * Initialize a context's exec table with pointers to Mesa's supported |
||
128 | * GL functions. |
||
129 | * |
||
130 | * This function depends on ctx->Version. |
||
131 | * |
||
132 | * \param ctx GL context to which \c exec belongs. |
||
133 | */ |
||
134 | void |
||
135 | _mesa_initialize_exec_table(struct gl_context *ctx) |
||
136 | { |
||
137 | struct _glapi_table *exec; |
||
138 | |||
139 | exec = ctx->Exec; |
||
140 | assert(exec != NULL); |
||
141 | |||
142 | assert(ctx->Version > 0); |
||
143 | |||
144 | vbo_initialize_exec_dispatch(ctx, exec); |
||
145 | """ |
||
146 | |||
147 | |||
148 | footer = """ |
||
149 | } |
||
150 | """ |
||
151 | |||
152 | |||
153 | class PrintCode(gl_XML.gl_print_base): |
||
154 | |||
155 | def __init__(self): |
||
156 | gl_XML.gl_print_base.__init__(self) |
||
157 | |||
158 | self.name = 'gl_genexec.py' |
||
159 | self.license = license.bsd_license_template % ( |
||
160 | 'Copyright (C) 2012 Intel Corporation', |
||
161 | 'Intel Corporation') |
||
162 | |||
163 | def printRealHeader(self): |
||
164 | print header |
||
165 | |||
166 | def printRealFooter(self): |
||
167 | print footer |
||
168 | |||
169 | def printBody(self, api): |
||
170 | # Collect SET_* calls by the condition under which they should |
||
171 | # be called. |
||
172 | settings_by_condition = collections.defaultdict(lambda: []) |
||
173 | for f in api.functionIterateAll(): |
||
174 | if f.exec_flavor not in exec_flavor_map: |
||
175 | raise Exception( |
||
176 | 'Unrecognized exec flavor {0!r}'.format(f.exec_flavor)) |
||
177 | condition_parts = [] |
||
178 | if f.desktop: |
||
179 | if f.deprecated: |
||
180 | condition_parts.append('ctx->API == API_OPENGL_COMPAT') |
||
181 | else: |
||
182 | condition_parts.append('_mesa_is_desktop_gl(ctx)') |
||
183 | if 'es1' in f.api_map: |
||
184 | condition_parts.append('ctx->API == API_OPENGLES') |
||
185 | if 'es2' in f.api_map: |
||
186 | if f.api_map['es2'] > 2.0: |
||
187 | condition_parts.append('(ctx->API == API_OPENGLES2 && ctx->Version >= {0})'.format(int(f.api_map['es2'] * 10))) |
||
188 | else: |
||
189 | condition_parts.append('ctx->API == API_OPENGLES2') |
||
190 | if not condition_parts: |
||
191 | # This function does not exist in any API. |
||
192 | continue |
||
193 | condition = ' || '.join(condition_parts) |
||
194 | prefix = exec_flavor_map[f.exec_flavor] |
||
195 | if prefix is None: |
||
196 | # This function is not implemented, or is dispatched |
||
197 | # dynamically. |
||
198 | continue |
||
199 | settings_by_condition[condition].append( |
||
200 | 'SET_{0}(exec, {1}{0});'.format(f.name, prefix, f.name)) |
||
201 | # Print out an if statement for each unique condition, with |
||
202 | # the SET_* calls nested inside it. |
||
203 | for condition in sorted(settings_by_condition.keys()): |
||
204 | print ' if ({0}) {{'.format(condition) |
||
205 | for setting in sorted(settings_by_condition[condition]): |
||
206 | print ' {0}'.format(setting) |
||
207 | print ' }' |
||
208 | |||
209 | |||
210 | def show_usage(): |
||
211 | print "Usage: %s [-f input_file_name]" % sys.argv[0] |
||
212 | sys.exit(1) |
||
213 | |||
214 | |||
215 | if __name__ == '__main__': |
||
216 | file_name = "gl_and_es_API.xml" |
||
217 | |||
218 | try: |
||
219 | (args, trail) = getopt.getopt(sys.argv[1:], "m:f:") |
||
220 | except Exception,e: |
||
221 | show_usage() |
||
222 | |||
223 | for (arg,val) in args: |
||
224 | if arg == "-f": |
||
225 | file_name = val |
||
226 | |||
227 | printer = PrintCode() |
||
228 | |||
229 | api = gl_XML.parse_GL_API(file_name) |
||
230 | printer.Print(api) |