• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (C) 2015 Intel Corporation
2#
3# Permission is hereby granted, free of charge, to any person obtaining a
4# copy of this software and associated documentation files (the "Software"),
5# to deal in the Software without restriction, including without limitation
6# the rights to use, copy, modify, merge, publish, distribute, sublicense,
7# and/or sell copies of the Software, and to permit persons to whom the
8# Software is furnished to do so, subject to the following conditions:
9#
10# The above copyright notice and this permission notice (including the next
11# paragraph) shall be included in all copies or substantial portions of the
12# Software.
13#
14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20# IN THE SOFTWARE.
21
22import argparse
23import gl_XML
24
25class exec_info():
26    """Information relating GL APIs to a function.
27
28    Each of the four attributes of this class, compatibility, core, es1, and
29    es2, specify the minimum API version where a function can possibly exist
30    in Mesa.  The version is specified as an integer of (real GL version *
31    10).  For example, glCreateProgram was added in OpenGL 2.0, so
32    compatibility=20 and core=31.
33
34    If the attribute is None, then it cannot be supported by that
35    API.  For example, glNewList was removed from core profiles, so
36    compatibility=10 and core=None.
37
38    Each of the attributes that is not None must have a valid value.  The
39    valid ranges are:
40
41        compatibility: [10, )
42        core: [31, )
43        es1: [10, 11]
44        es2: [20, )
45
46    These ranges are enforced by the constructor.
47    """
48    def __init__(self, compatibility=None, core=None, es1=None, es2=None):
49        if compatibility is not None:
50            assert isinstance(compatibility, int)
51            assert compatibility >= 10
52
53        if core is not None:
54            assert isinstance(core, int)
55            assert core >= 31
56
57        if es1 is not None:
58            assert isinstance(es1, int)
59            assert es1 == 10 or es1 == 11
60
61        if es2 is not None:
62            assert isinstance(es2, int)
63            assert es2 >= 20
64
65        self.compatibility = compatibility
66        self.core = core
67        self.es1 = es1
68        self.es2 = es2
69
70functions = {
71    # OpenGL 3.1 / GL_ARB_texture_buffer_object.
72    "TexBuffer": exec_info(compatibility=20, core=31, es2=31),
73
74    # OpenGL 3.2 / GL_OES_geometry_shader.
75    "FramebufferTexture": exec_info(compatibility=32, core=32, es2=31),
76
77    # OpenGL 4.0 / GL_ARB_shader_subroutines. Mesa only exposes this
78    # extension with core profile.
79    "GetSubroutineUniformLocation": exec_info(compatibility=31, core=31),
80    "GetSubroutineIndex": exec_info(compatibility=31, core=31),
81    "GetActiveSubroutineUniformiv": exec_info(compatibility=31, core=31),
82    "GetActiveSubroutineUniformName": exec_info(compatibility=31, core=31),
83    "GetActiveSubroutineName": exec_info(compatibility=31, core=31),
84    "UniformSubroutinesuiv": exec_info(compatibility=31, core=31),
85    "GetUniformSubroutineuiv": exec_info(compatibility=31, core=31),
86    "GetProgramStageiv": exec_info(compatibility=31, core=31),
87
88    # OpenGL 4.0 / GL_ARB_gpu_shader_fp64.  The extension spec says:
89    #
90    #     "OpenGL 3.2 and GLSL 1.50 are required."
91    "Uniform1d": exec_info(compatibility=32, core=32),
92    "Uniform2d": exec_info(compatibility=32, core=32),
93    "Uniform3d": exec_info(compatibility=32, core=32),
94    "Uniform4d": exec_info(compatibility=32, core=32),
95    "Uniform1dv": exec_info(compatibility=32, core=32),
96    "Uniform2dv": exec_info(compatibility=32, core=32),
97    "Uniform3dv": exec_info(compatibility=32, core=32),
98    "Uniform4dv": exec_info(compatibility=32, core=32),
99    "UniformMatrix2dv": exec_info(compatibility=32, core=32),
100    "UniformMatrix3dv": exec_info(compatibility=32, core=32),
101    "UniformMatrix4dv": exec_info(compatibility=32, core=32),
102    "UniformMatrix2x3dv": exec_info(compatibility=32,core=32),
103    "UniformMatrix2x4dv": exec_info(compatibility=32, core=32),
104    "UniformMatrix3x2dv": exec_info(compatibility=32, core=32),
105    "UniformMatrix3x4dv": exec_info(compatibility=32, core=32),
106    "UniformMatrix4x2dv": exec_info(compatibility=32, core=32),
107    "UniformMatrix4x3dv": exec_info(compatibility=32, core=32),
108    "GetUniformdv": exec_info(compatibility=32, core=32),
109
110    # OpenGL 4.1 / GL_ARB_vertex_attrib_64bit.  The extension spec says:
111    #
112    #     "OpenGL 3.0 and GLSL 1.30 are required.
113    #
114    #     ARB_gpu_shader_fp64 (or equivalent functionality) is required."
115    #
116    # For Mesa this effectively means OpenGL 3.2 is required.  It seems
117    # unlikely that Mesa will ever get support for any of the NV extensions
118    # that add "equivalent functionality."
119    "VertexAttribL1d": exec_info(compatibility=32, core=32),
120    "VertexAttribL2d": exec_info(compatibility=32, core=32),
121    "VertexAttribL3d": exec_info(compatibility=32, core=32),
122    "VertexAttribL4d": exec_info(compatibility=32, core=32),
123    "VertexAttribL1dv": exec_info(compatibility=32, core=32),
124    "VertexAttribL2dv": exec_info(compatibility=32, core=32),
125    "VertexAttribL3dv": exec_info(compatibility=32, core=32),
126    "VertexAttribL4dv": exec_info(compatibility=32, core=32),
127    "VertexAttribLPointer": exec_info(compatibility=32, core=32),
128    "GetVertexAttribLdv": exec_info(compatibility=32, core=32),
129
130    # OpenGL 4.1 / GL_ARB_viewport_array.  The extension spec says:
131    #
132    #     "OpenGL 3.2 or the EXT_geometry_shader4 or ARB_geometry_shader4
133    #     extensions are required."
134    #
135    # Mesa does not support either of the geometry shader extensions, so
136    # OpenGL 3.2 is required.
137    "ViewportArrayv": exec_info(compatibility=32, core=32, es2=31),
138    "ViewportIndexedf": exec_info(compatibility=32, core=32, es2=31),
139    "ViewportIndexedfv": exec_info(compatibility=32, core=32, es2=31),
140    "ScissorArrayv": exec_info(compatibility=32, core=32, es2=31),
141    "ScissorIndexed": exec_info(compatibility=32, core=32, es2=31),
142    "ScissorIndexedv": exec_info(compatibility=32, core=32, es2=31),
143    "DepthRangeArrayv": exec_info(compatibility=32, core=32),
144    "DepthRangeIndexed": exec_info(compatibility=32, core=32),
145    # GetFloati_v also GL_ARB_shader_atomic_counters
146    # GetDoublei_v also GL_ARB_shader_atomic_counters
147
148    # OpenGL 4.3 / GL_ARB_texture_buffer_range.
149    "TexBufferRange": exec_info(compatibility=20, core=31, es2=31),
150
151    # OpenGL 4.3 / GL_ARB_framebuffer_no_attachments.  Mesa can expose the
152    # extension with OpenGL 3.0.
153    "FramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
154    "GetFramebufferParameteriv": exec_info(compatibility=30, core=31, es2=31),
155
156    # OpenGL 4.3 / GL_MESA_framebuffer_flip_y.
157    "FramebufferParameteriMESA": exec_info(core=31, es2=30),
158    "GetFramebufferParameterivMESA": exec_info(core=31, es2=30),
159
160    # OpenGL 4.5 / GL_ARB_direct_state_access.   Mesa can expose the extension
161    # with core profile.
162    "CreateTransformFeedbacks": exec_info(compatibility=31, core=31),
163    "TransformFeedbackBufferBase": exec_info(compatibility=31, core=31),
164    "TransformFeedbackBufferRange": exec_info(compatibility=31, core=31),
165    "GetTransformFeedbackiv": exec_info(compatibility=31, core=31),
166    "GetTransformFeedbacki_v": exec_info(compatibility=31, core=31),
167    "GetTransformFeedbacki64_v": exec_info(compatibility=31, core=31),
168    "CreateBuffers": exec_info(compatibility=31, core=31),
169    "NamedBufferStorage": exec_info(compatibility=31, core=31),
170    "NamedBufferData": exec_info(compatibility=31, core=31),
171    "NamedBufferSubData": exec_info(compatibility=31, core=31),
172    "CopyNamedBufferSubData": exec_info(compatibility=31, core=31),
173    "ClearNamedBufferData": exec_info(compatibility=31, core=31),
174    "ClearNamedBufferSubData": exec_info(compatibility=31, core=31),
175    "MapNamedBuffer": exec_info(compatibility=31, core=31),
176    "MapNamedBufferRange": exec_info(compatibility=31, core=31),
177    "UnmapNamedBuffer": exec_info(compatibility=31, core=31),
178    "FlushMappedNamedBufferRange": exec_info(compatibility=31, core=31),
179    "GetNamedBufferParameteriv": exec_info(compatibility=31, core=31),
180    "GetNamedBufferParameteri64v": exec_info(compatibility=31, core=31),
181    "GetNamedBufferPointerv": exec_info(compatibility=31, core=31),
182    "GetNamedBufferSubData": exec_info(compatibility=31, core=31),
183    "CreateFramebuffers": exec_info(compatibility=31, core=31),
184    "NamedFramebufferRenderbuffer": exec_info(compatibility=31, core=31),
185    "NamedFramebufferParameteri": exec_info(compatibility=31, core=31),
186    "NamedFramebufferTexture": exec_info(compatibility=31, core=31),
187    "NamedFramebufferTextureLayer": exec_info(compatibility=31, core=31),
188    "NamedFramebufferDrawBuffer": exec_info(compatibility=31, core=31),
189    "NamedFramebufferDrawBuffers": exec_info(compatibility=31, core=31),
190    "NamedFramebufferReadBuffer": exec_info(compatibility=31, core=31),
191    "InvalidateNamedFramebufferData": exec_info(compatibility=31, core=31),
192    "InvalidateNamedFramebufferSubData": exec_info(compatibility=31, core=31),
193    "ClearNamedFramebufferiv": exec_info(compatibility=31, core=31),
194    "ClearNamedFramebufferuiv": exec_info(compatibility=31, core=31),
195    "ClearNamedFramebufferfv": exec_info(compatibility=31, core=31),
196    "ClearNamedFramebufferfi": exec_info(compatibility=31, core=31),
197    "BlitNamedFramebuffer": exec_info(compatibility=31, core=31),
198    "CheckNamedFramebufferStatus": exec_info(compatibility=31, core=31),
199    "GetNamedFramebufferParameteriv": exec_info(compatibility=31, core=31),
200    "GetNamedFramebufferAttachmentParameteriv": exec_info(compatibility=31, core=31),
201    "CreateRenderbuffers": exec_info(compatibility=31, core=31),
202    "NamedRenderbufferStorage": exec_info(compatibility=31, core=31),
203    "NamedRenderbufferStorageMultisample": exec_info(compatibility=31, core=31),
204    "GetNamedRenderbufferParameteriv": exec_info(compatibility=31, core=31),
205    "CreateTextures": exec_info(compatibility=31, core=31),
206    "TextureBuffer": exec_info(compatibility=31, core=31),
207    "TextureBufferRange": exec_info(compatibility=31, core=31),
208    "TextureStorage1D": exec_info(compatibility=31, core=31),
209    "TextureStorage2D": exec_info(compatibility=31, core=31),
210    "TextureStorage3D": exec_info(compatibility=31, core=31),
211    "TextureStorage2DMultisample": exec_info(compatibility=31, core=31),
212    "TextureStorage3DMultisample": exec_info(compatibility=31, core=31),
213    "TextureSubImage1D": exec_info(compatibility=31, core=31),
214    "TextureSubImage2D": exec_info(compatibility=31, core=31),
215    "TextureSubImage3D": exec_info(compatibility=31, core=31),
216    "CompressedTextureSubImage1D": exec_info(compatibility=31, core=31),
217    "CompressedTextureSubImage2D": exec_info(compatibility=31, core=31),
218    "CompressedTextureSubImage3D": exec_info(compatibility=31, core=31),
219    "CopyTextureSubImage1D": exec_info(compatibility=31, core=31),
220    "CopyTextureSubImage2D": exec_info(compatibility=31, core=31),
221    "CopyTextureSubImage3D": exec_info(compatibility=31, core=31),
222    "TextureParameterf": exec_info(compatibility=31, core=31),
223    "TextureParameterfv": exec_info(compatibility=31, core=31),
224    "TextureParameteri": exec_info(compatibility=31, core=31),
225    "TextureParameterIiv": exec_info(compatibility=31, core=31),
226    "TextureParameterIuiv": exec_info(compatibility=31, core=31),
227    "TextureParameteriv": exec_info(compatibility=31, core=31),
228    "GenerateTextureMipmap": exec_info(compatibility=31, core=31),
229    "BindTextureUnit": exec_info(compatibility=31, core=31),
230    "GetTextureImage": exec_info(compatibility=31, core=31),
231    "GetCompressedTextureImage": exec_info(compatibility=31, core=31),
232    "GetTextureLevelParameterfv": exec_info(compatibility=31, core=31),
233    "GetTextureLevelParameteriv": exec_info(compatibility=31, core=31),
234    "GetTextureParameterfv": exec_info(compatibility=31, core=31),
235    "GetTextureParameterIiv": exec_info(compatibility=31, core=31),
236    "GetTextureParameterIuiv": exec_info(compatibility=31, core=31),
237    "GetTextureParameteriv": exec_info(compatibility=31, core=31),
238    "CreateVertexArrays": exec_info(compatibility=31, core=31),
239    "DisableVertexArrayAttrib": exec_info(compatibility=31, core=31),
240    "EnableVertexArrayAttrib": exec_info(compatibility=31, core=31),
241    "VertexArrayElementBuffer": exec_info(compatibility=31, core=31),
242    "VertexArrayVertexBuffer": exec_info(compatibility=31, core=31),
243    "VertexArrayVertexBuffers": exec_info(compatibility=31, core=31),
244    "VertexArrayAttribFormat": exec_info(compatibility=31, core=31),
245    "VertexArrayAttribIFormat": exec_info(compatibility=31, core=31),
246    "VertexArrayAttribLFormat": exec_info(compatibility=31, core=31),
247    "VertexArrayAttribBinding": exec_info(compatibility=31, core=31),
248    "VertexArrayBindingDivisor": exec_info(compatibility=31, core=31),
249    "GetVertexArrayiv": exec_info(compatibility=31, core=31),
250    "GetVertexArrayIndexediv": exec_info(compatibility=31, core=31),
251    "GetVertexArrayIndexed64iv": exec_info(compatibility=31, core=31),
252    "CreateSamplers": exec_info(compatibility=31, core=31),
253    "CreateProgramPipelines": exec_info(compatibility=31, core=31),
254    "CreateQueries": exec_info(compatibility=31, core=31),
255    "GetQueryBufferObjectiv": exec_info(compatibility=31, core=31),
256    "GetQueryBufferObjectuiv": exec_info(compatibility=31, core=31),
257    "GetQueryBufferObjecti64v": exec_info(compatibility=31, core=31),
258    "GetQueryBufferObjectui64v": exec_info(compatibility=31, core=31),
259
260    # GL_ARB_gpu_shader_int64 - nominally requires OpenGL 4.0
261    "Uniform1i64ARB": exec_info(compatibility=40, core=31),
262    "Uniform2i64ARB": exec_info(compatibility=40, core=31),
263    "Uniform3i64ARB": exec_info(compatibility=40, core=31),
264    "Uniform4i64ARB": exec_info(compatibility=40, core=31),
265    "Uniform1i64vARB": exec_info(compatibility=40, core=31),
266    "Uniform2i64vARB": exec_info(compatibility=40, core=31),
267    "Uniform3i64vARB": exec_info(compatibility=40, core=31),
268    "Uniform4i64vARB": exec_info(compatibility=40, core=31),
269    "Uniform1ui64ARB": exec_info(compatibility=40, core=31),
270    "Uniform2ui64ARB": exec_info(compatibility=40, core=31),
271    "Uniform3ui64ARB": exec_info(compatibility=40, core=31),
272    "Uniform4ui64ARB": exec_info(compatibility=40, core=31),
273    "Uniform1ui64vARB": exec_info(compatibility=40, core=31),
274    "Uniform2ui64vARB": exec_info(compatibility=40, core=31),
275    "Uniform3ui64vARB": exec_info(compatibility=40, core=31),
276    "Uniform4ui64vARB": exec_info(compatibility=40, core=31),
277    "GetUniformi64vARB": exec_info(compatibility=40, core=31),
278    "GetUniformui64vARB": exec_info(compatibility=40, core=31),
279    "GetnUniformi64vARB": exec_info(compatibility=40, core=31),
280    "GetnUniformui64vARB": exec_info(compatibility=40, core=31),
281    "ProgramUniform1i64ARB": exec_info(compatibility=40, core=31),
282    "ProgramUniform2i64ARB": exec_info(compatibility=40, core=31),
283    "ProgramUniform3i64ARB": exec_info(compatibility=40, core=31),
284    "ProgramUniform4i64ARB": exec_info(compatibility=40, core=31),
285    "ProgramUniform1i64vARB": exec_info(compatibility=40, core=31),
286    "ProgramUniform2i64vARB": exec_info(compatibility=40, core=31),
287    "ProgramUniform3i64vARB": exec_info(compatibility=40, core=31),
288    "ProgramUniform4i64vARB": exec_info(compatibility=40, core=31),
289    "ProgramUniform1ui64ARB": exec_info(compatibility=40, core=31),
290    "ProgramUniform2ui64ARB": exec_info(compatibility=40, core=31),
291    "ProgramUniform3ui64ARB": exec_info(compatibility=40, core=31),
292    "ProgramUniform4ui64ARB": exec_info(compatibility=40, core=31),
293    "ProgramUniform1ui64vARB": exec_info(compatibility=40, core=31),
294    "ProgramUniform2ui64vARB": exec_info(compatibility=40, core=31),
295    "ProgramUniform3ui64vARB": exec_info(compatibility=40, core=31),
296    "ProgramUniform4ui64vARB": exec_info(compatibility=40, core=31),
297
298    # GL_ARB_bindless_texture
299    "GetVertexAttribLui64vARB": exec_info(compatibility=30, core=31),
300}
301
302def get_api_condition(f):
303    condition_parts = []
304    if f.name in functions:
305        ex = functions[f.name]
306        unconditional_count = 0
307
308        if ex.compatibility is not None:
309            condition_parts.append('ctx->API == API_OPENGL_COMPAT')
310            unconditional_count += 1
311
312        if ex.core is not None:
313            condition_parts.append('ctx->API == API_OPENGL_CORE')
314            unconditional_count += 1
315
316        if ex.es1 is not None:
317            condition_parts.append('ctx->API == API_OPENGLES')
318            unconditional_count += 1
319
320        if ex.es2 is not None:
321            if ex.es2 > 20:
322                condition_parts.append('(ctx->API == API_OPENGLES2 && ctx->Version >= {0})'.format(ex.es2))
323            else:
324                condition_parts.append('ctx->API == API_OPENGLES2')
325                unconditional_count += 1
326
327        # If the function is unconditionally available in all four
328        # APIs, then it is always available.  Replace the complex
329        # tautology condition with "true" and let GCC do the right
330        # thing.
331        if unconditional_count == 4:
332            condition_parts = ['true']
333    else:
334        if f.desktop:
335            if f.deprecated:
336                condition_parts.append('ctx->API == API_OPENGL_COMPAT')
337            else:
338                condition_parts.append('_mesa_is_desktop_gl(ctx)')
339        if 'es1' in f.api_map:
340            condition_parts.append('ctx->API == API_OPENGLES')
341        if 'es2' in f.api_map:
342            if f.api_map['es2'] > 2.0:
343                condition_parts.append('(ctx->API == API_OPENGLES2 && ctx->Version >= {0})'.format(int(f.api_map['es2'] * 10)))
344            else:
345                condition_parts.append('ctx->API == API_OPENGLES2')
346
347    if not condition_parts:
348        # This function does not exist in any API.
349        return None
350    return ' || '.join(condition_parts)
351
352def print_glapi_file(printer):
353    parser = argparse.ArgumentParser()
354    parser.add_argument('-f',
355                        dest='filename',
356                        default='gl_and_es_API.xml',
357                        help='an xml file describing an API')
358    args = parser.parse_args()
359    api = gl_XML.parse_GL_API(args.filename)
360    printer.Print(api)
361