// This file specifies which functions should be attached to GrGLInterface // for a given standard (OpenGL, OpenGL ES, etc). It allows specifing // how and when to attach them (e.g. only if an extension is present). // It is used for both the assemble and validate step. // // To regenerate the Assemble/Validate code after editing this file, execute: // // make -C tools/gpu/gl/interface generate // // Currently it assumes the minimum versions: // - GL: 2.0 // - GLES: 2.0 // - WebGL: [WIP] 1.0 // // http://web.eecs.umich.edu/~sugih/courses/eecs487/common/notes/APITables.xml // is a handy reference comparing GL and GLES API [ { "GL": [{"ext": ""}], "GLES": [{"ext": ""}], "WebGL": [{"ext": ""}], "functions": [ "ActiveTexture", "AttachShader", "BindAttribLocation", "BindBuffer", "BindTexture", "BlendColor", "BlendEquation", "BlendFunc", "BufferData", "BufferSubData", "Clear", "ClearColor", "ClearStencil", "ColorMask", "CompileShader", "CompressedTexImage2D", "CompressedTexSubImage2D", "CopyTexSubImage2D", "CreateProgram", "CreateShader", "CullFace", "DeleteBuffers", "DeleteProgram", "DeleteShader", "DeleteTextures", "DepthMask", "Disable", "DisableVertexAttribArray", "DrawArrays", "DrawElements", "Enable", "EnableVertexAttribArray", "Finish", "Flush", "FrontFace", "GenBuffers", "GenTextures", "GetBufferParameteriv", "GetError", "GetIntegerv", "GetProgramInfoLog", "GetProgramiv", "GetShaderInfoLog", "GetShaderiv", "GetString", "GetUniformLocation", "IsTexture", "LineWidth", "LinkProgram", "PixelStorei", "ReadPixels", "Scissor", "ShaderSource", "StencilFunc", "StencilFuncSeparate", "StencilMask", "StencilMaskSeparate", "StencilOp", "StencilOpSeparate", "TexImage2D", "TexParameterf", "TexParameterfv", "TexParameteri", "TexParameteriv", "TexSubImage2D", "Uniform1f", "Uniform1fv", "Uniform1i", "Uniform1iv", "Uniform2f", "Uniform2fv", "Uniform2i", "Uniform2iv", "Uniform3f", "Uniform3fv", "Uniform3i", "Uniform3iv", "Uniform4f", "Uniform4fv", "Uniform4i", "Uniform4iv", "UniformMatrix2fv", "UniformMatrix3fv", "UniformMatrix4fv", "UseProgram", "VertexAttrib1f", "VertexAttrib2fv", "VertexAttrib3fv", "VertexAttrib4fv", "VertexAttribPointer", "Viewport", ], }, { // GL exclusive core functions "GL": [{"ext": ""}], "GLES": null, "functions": [ "DrawBuffer", "PolygonMode", ], }, { "GL": [{"min_version": [3, 0], "ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "GetStringi", ] }, { "GL": [{"min_version": [4, 2], "ext": ""}], "GLES": [{"min_version": [3, 1], "ext": ""}], "WebGL": null, "functions": [ "MemoryBarrier", ], // TODO: Remove 'optional' once Chrome sets this function in the interface. "optional": [ "MemoryBarrier", ] }, { "GL": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_vertex_array_object"}, {/* else if */ "ext": "GL_APPLE_vertex_array_object"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_OES_vertex_array_object"}], "WebGL": [{"min_version": [2, 0], "ext": ""}, {/* else if */ "ext": "GL_OES_vertex_array_object"}, {/* else if */ "ext": "OES_vertex_array_object"}], // WebGL uses createVertexArray instead of genVertexArrays, but Emscripten // creates an alias called genVertexArray which papers over this difference. "functions": [ "BindVertexArray", "DeleteVertexArrays", "GenVertexArrays", ], }, { "GL": [{"min_version": [4, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_tessellation_shader"}], "GLES": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_OES_tessellation_shader"}], "WebGL": null, "functions": [ "PatchParameteri", ], }, { "GL": [{"min_version": [3, 0], "ext": ""}], "GLES": [{"min_version": [3, 0], "ext": "GL_EXT_blend_func_extended"}], "WebGL": null, "functions": [ "BindFragDataLocation", ], }, { "GL": [{"min_version": [3, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_blend_func_extended"}], "GLES": [{"min_version": [3, 0], "ext": "GL_EXT_blend_func_extended"}], "WebGL": null, "functions": [ "BindFragDataLocationIndexed", ], }, { "GL": [{"ext": "GL_KHR_blend_equation_advanced"}, {"ext": "GL_NV_blend_equation_advanced"}], "GLES": [{"ext": "GL_KHR_blend_equation_advanced"}, {"ext": "GL_NV_blend_equation_advanced"}], "WebGL": null, "functions": [ "BlendBarrier", ], }, { "GL": [{"min_version": [4, 4], "ext": ""}, {/* else if */ "ext": "GL_ARB_clear_texture"}], "GLES": [{"ext": "GL_EXT_clear_texture", "suffix": "EXT"}], "WebGL": null, "functions": [ "ClearTexImage", "ClearTexSubImage", ], // https://bugs.chromium.org/p/skia/issues/detail?id=8913 "optional": [ "ClearTexImage", "ClearTexSubImage", ] }, { "GL": [{"min_version": [3, 1], "ext": ""}, {/* else if */ "ext": "GL_ARB_draw_instanced"}, {/* else if */ "ext": "GL_EXT_draw_instanced"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_EXT_draw_instanced"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "DrawArraysInstanced", "DrawElementsInstanced", ] }, { "GL": [{"min_version": [4, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_base_instance"}], "GLES": [{"ext": "GL_EXT_base_instance"}, {/* else if */ "ext": "GL_ANGLE_base_vertex_base_instance"}], "WebGL": [{"ext": "GL_WEBGL_draw_instanced_base_vertex_base_instance"}], "functions": [ "DrawArraysInstancedBaseInstance", "DrawElementsInstancedBaseVertexBaseInstance" ] }, { // ES 3.0 has glDrawBuffers but not glDrawBuffer "GL": [{"ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "DrawBuffers", "ReadBuffer", ] }, { "GL": [{"min_version": [4, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_draw_indirect"}], "GLES": [{"min_version": [3, 1], "ext": ""}], "WebGL": null, "functions": [ "DrawArraysIndirect", "DrawElementsIndirect", ] }, { "GL": null, "GLES": [{"ext": "GL_ANGLE_base_vertex_base_instance"}], "WebGL": [{"ext": "GL_WEBGL_multi_draw_instanced_base_vertex_base_instance"}], "functions": [ "MultiDrawArraysInstancedBaseInstance", "MultiDrawElementsInstancedBaseVertexBaseInstance", ] }, { // glDrawRangeElements was added to ES in 3.0. "GL": [{"ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "DrawRangeElements", ] }, { "GL": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_texture_multisample"}], "GLES": [{"min_version": [3, 1], "ext": ""}], "WebGL": null, "functions": [ "GetMultisamplefv", ] }, // glGetTexLevelParameteriv was added to ES in 3.1. { "GL": [{"ext": ""}], "GLES": [{"min_version": [3, 1], "ext": ""}], "WebGL": null, "functions": [ "GetTexLevelParameteriv", ] }, { "GL": [{"min_version": [4, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_multi_draw_indirect"}], "GLES": [{"ext": "GL_EXT_multi_draw_indirect"}], "WebGL": null, "functions": [ "MultiDrawArraysIndirect", "MultiDrawElementsIndirect", ] }, { "GL": [{"min_version": [3, 1], "ext": ""}], "GLES": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_OES_texture_buffer"}, {/* else if */ "ext": "GL_EXT_texture_buffer"}], "WebGL": null, "functions": [ "TexBuffer", ] }, { "GL": [{"min_version": [4, 3], "ext": ""}], "GLES": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_OES_texture_buffer"}, {/* else if */ "ext": "GL_EXT_texture_buffer"}], "WebGL": null, "functions": [ "TexBufferRange", ] }, // GL_EXT_texture_storage is part of desktop 4.2 // There is a desktop ARB extension and an ES+desktop EXT extension { "GL": [{"min_version": [4, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_texture_storage"}, {/* else if */ "ext": "GL_EXT_texture_storage"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_EXT_texture_storage"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "TexStorage2D", ] }, // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extensions. { "GL": [{"min_version": [4, 5], "ext": ""}, {/* else if */ "ext": "GL_ARB_texture_barrier"}, {/* else if */ "ext": "GL_NV_texture_barrier"}], "GLES": [{"ext": "GL_NV_texture_barrier"}], "WebGL": null, "functions": [ "TextureBarrier", ] }, { "GL": null, // Not supported "GLES": [{"ext": "GL_EXT_discard_framebuffer"}], "WebGL": null, "functions": [ "DiscardFramebuffer", ] }, { "GL": null, // Not supported "GLES": [{"ext": "GL_QCOM_tiled_rendering"}], "WebGL": null, "functions": [ "StartTiling", "EndTiling", ], // https://github.com/flutter/flutter/issues/47164 // https://github.com/flutter/flutter/issues/47804 "optional": [ "StartTiling", "EndTiling", ] }, { "GL": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_instanced_arrays"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_EXT_instanced_arrays"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "VertexAttribDivisor", ] }, { "GL": [{"min_version": [3, 0], "ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "VertexAttribIPointer", ] }, // FrameBuffer Object (FBO) related calls { "GL": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_framebuffer_object"}, {/* else if */ "ext": "GL_EXT_framebuffer_object"}], "GLES": [{"ext": ""}], // These are all in ES 2.0 and above "WebGL": [{"ext": ""}], "functions": [ "BindFramebuffer", "BindRenderbuffer", "CheckFramebufferStatus", "DeleteFramebuffers", "DeleteRenderbuffers", "FramebufferRenderbuffer", "FramebufferTexture2D", "GenFramebuffers", "GenRenderbuffers", "GenerateMipmap", "GetFramebufferAttachmentParameteriv", "GetRenderbufferParameteriv", "RenderbufferStorage", ], }, { "GL": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_framebuffer_object"}, {/* else if */ "ext": "GL_EXT_framebuffer_blit"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_CHROMIUM_framebuffer_multisample"}, {/* else if */ "ext": "GL_ANGLE_framebuffer_blit"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "BlitFramebuffer", ], }, { "GL": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_framebuffer_object"}, {/* else if */ "ext": "GL_EXT_framebuffer_multisample"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_CHROMIUM_framebuffer_multisample"}, {/* else if */ "ext": "GL_ANGLE_framebuffer_multisample"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "RenderbufferStorageMultisample", ], }, { "GL": null, "GLES": [{"ext": "GL_CHROMIUM_map_sub"}], "WebGL": null, "functions": [ "MapBufferSubData", "MapTexSubImage2D", "UnmapBufferSubData", "UnmapTexSubImage2D" ], }, { "GL": null, "GLES": [{"ext": "GL_EXT_multisampled_render_to_texture"}, {"ext": "GL_IMG_multisampled_render_to_texture"}], "WebGL": null, "functions": [ "FramebufferTexture2DMultisample", ], }, { "GL": null, "GLES": [{"ext": "GL_EXT_multisampled_render_to_texture"}], "WebGL": null, "hardcode_functions" : [ { "ptr_name": "fRenderbufferStorageMultisampleES2EXT", "cast_name": "GrGLRenderbufferStorageMultisampleFn", "get_name": "glRenderbufferStorageMultisampleEXT", } ] }, { "GL": null, "GLES": [{"ext": "GL_IMG_multisampled_render_to_texture"}], "WebGL": null, "hardcode_functions" : [ { "ptr_name": "fRenderbufferStorageMultisampleES2EXT", "cast_name": "GrGLRenderbufferStorageMultisampleFn", "get_name": "glRenderbufferStorageMultisampleIMG", } ] }, { "GL": null, "GLES": [{"ext": "GL_APPLE_framebuffer_multisample"}], "WebGL": null, "functions" : ["ResolveMultisampleFramebuffer"], "hardcode_functions" : [ { "ptr_name": "fRenderbufferStorageMultisampleES2APPLE", "cast_name": "GrGLRenderbufferStorageMultisampleFn", "get_name": "glRenderbufferStorageMultisampleAPPLE", } ] }, // There are several APIs for buffer mapping: // ES2 + GL_OES_mapbuffer: MapBufferOES and UnmapBufferOES // ES2 + GL_EXT_map_buffer_range: Adds MapBufferRangeEXT and FlushMappedBufferRangeEXT // ES3: MapBufferRange, FlushMappedBufferRange, and UnmapBuffer are core (so no suffix). // // MapBuffer is not part of ES3, but implementations may still report the OES versions of // MapBuffer and UnmapBuffer, per the older GL_OES_mapbuffer extension. Some implementations // let us mix the newer MapBufferRange with the older UnmapBufferOES, but we've hit others that // don't permit it. Note that in GrGLBuffer, we choose which API to use based on version and // extensions. This code is written so that we never mix OES and non-OES functions. { "GL": [{"ext": ""}], "GLES": [{"ext": "GL_OES_mapbuffer"}], "WebGL": null, "functions": [ "MapBuffer", ], }, { "GL": [{"ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_OES_mapbuffer"}], "WebGL": null, // explicitly removed https://www.khronos.org/registry/webgl/specs/2.0/#5.14 "functions": [ "UnmapBuffer", ], }, { "GL": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_ARB_map_buffer_range"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_EXT_map_buffer_range"}], "WebGL": null, // explicitly removed https://www.khronos.org/registry/webgl/specs/2.0/#5.14 "functions": [ // These functions are added to the 3.0 version of both GLES and GL. "MapBufferRange", "FlushMappedBufferRange", ], }, { "GL": [{"ext": "GL_EXT_debug_marker"}], "GLES": [{"ext": "GL_EXT_debug_marker"}], "WebGL": null, "functions": [ "InsertEventMarker", "PushGroupMarker", "PopGroupMarker" ], }, { "GL": [{"ext": "GL_NV_framebuffer_mixed_samples"}], "GLES": [{"ext": "GL_CHROMIUM_framebuffer_mixed_samples"}, {"ext": "GL_NV_framebuffer_mixed_samples"}], "WebGL": null, "functions": [ "CoverageModulation", ], }, { "GL": [{"min_version": [4, 3], "ext": ""}, {/* else if */ "ext": "GL_KHR_debug", "suffix": ""}], "GLES": [{"ext": "GL_KHR_debug"}], "WebGL": null, // In OpenGL (but not ES), KHR_debug defines these methods to have no suffix. "functions": [ "DebugMessageControl", "DebugMessageInsert", "DebugMessageCallback", "GetDebugMessageLog", "PushDebugGroup", "PopDebugGroup", "ObjectLabel", ], }, { "GL": null, "GLES": [{"ext": "GL_CHROMIUM_bind_uniform_location"}], "WebGL": null, "functions": [ "BindUniformLocation", ], }, { "GL": [{"ext": "GL_EXT_window_rectangles"}], "GLES": [{"ext": "GL_EXT_window_rectangles"}], "WebGL": null, "functions": [ "WindowRectangles", ], }, { "GL": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_sync"}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_APPLE_sync"}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "ClientWaitSync", "DeleteSync", "FenceSync", "IsSync", "WaitSync" ], }, { // getInternalformativ was added in GL 4.2, ES 3.0, and with // extension ARB_internalformat_query "GL": [{"min_version": [4, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_internalformat_query"}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": null, "functions": [ "GetInternalformativ" ], }, // GetProgramBinary and ProgramBinary are available with an ES2 extension... { "GL": [{"min_version": [4, 1], "ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_OES_get_program_binary"}], "WebGL": null, // explicitly not supported in WebGL 2.0 "functions": [ "GetProgramBinary", "ProgramBinary", ], }, // ... but the related ProgramParameteri is only in ES3 { "GL": [{"min_version": [4, 1], "ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": null, // explicitly not supported in WebGL 2.0 "functions": [ "ProgramParameteri", ], }, { "GL": [{"min_version": [3, 2], "ext": ""}, {/* else if */ "ext": "GL_ARB_sampler_objects"}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "BindSampler", "DeleteSamplers", "GenSamplers", "SamplerParameteri", "SamplerParameteriv", ], }, { "GL": [{"ext": ""}], "GLES": null, // not in ES "WebGL": null, "functions": [ "GetQueryObjectiv", ], }, { "GL": [{"ext": ""}], "GLES": [{"min_version": [3, 0], "ext": ""}, {/* else if */ "ext": "GL_EXT_occlusion_query_boolean"}], "WebGL": null, // We only use these in our test tools "test_functions": [ "GenQueries", "DeleteQueries", "BeginQuery", "EndQuery", "GetQueryObjectuiv", "GetQueryiv", ] }, { "GL": [{"min_version": [3, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_timer_query"}, {/* else if */ "ext": "GL_EXT_timer_query"}], "GLES": null, "WebGL": null, "functions": [ "GetQueryObjecti64v", "GetQueryObjectui64v", ], }, { "GL": [{"min_version": [3, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_timer_query"}], "GLES": null, "WebGL": null, "functions": [ "QueryCounter", ], }, { "GL": [{"min_version": [4, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], "GLES": null, "WebGL": null, "functions": [ "InvalidateBufferData", "InvalidateBufferSubData", "InvalidateTexImage", "InvalidateTexSubImage", ], }, { // ES 3.0 adds the framebuffer functions but not the others. "GL": [{"min_version": [4, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], "GLES": [{"min_version": [3, 0], "ext": ""}], "WebGL": [{"min_version": [2, 0], "ext": ""}], "functions": [ "InvalidateFramebuffer", "InvalidateSubFramebuffer", ], }, { "GL": [{"min_version": [4, 3], "ext": ""}, {/* else if */ "ext": "GL_ARB_ES2_compatibility"}], "GLES": [{"ext": ""}], "WebGL": [{"ext": ""}], "functions": [ "GetShaderPrecisionFormat", ], }, { "GL": [{"ext": "GL_NV_fence"}], "GLES": [{"ext": "GL_NV_fence"}], "WebGL": null, "functions": [ "DeleteFences", "FinishFence", "GenFences", "SetFence", "TestFence", ], } ]