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