// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glActiveShaderProgramEXT(PipelineId pipeline, ProgramId program) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_alpha_test.txt","GL_QCOM_alpha_test")
cmd void glAlphaFuncQCOM(GLenum func, GLclampf ref) {
  requiresExtension(GL_QCOM_alpha_test)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/conditional_render.txt","GL_NV_conditional_render")
cmd void glBeginConditionalRenderNV(GLuint id, GLenum mode) {
  requiresExtension(GL_NV_conditional_render)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glBeginPerfMonitorAMD(GLuint monitor) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glBeginPerfQueryINTEL(GLuint queryHandle) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glBeginQueryEXT(GLenum target, QueryId query) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glBindProgramPipelineEXT(PipelineId pipeline) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt","GL_OES_vertex_array_object")
cmd void glBindVertexArrayOES(VertexArrayId array) {
  requiresExtension(GL_OES_vertex_array_object)

  ctx := GetContext()
  if !(array in ctx.Instances.VertexArrays) {
    ctx.Instances.VertexArrays[array] = new!VertexArray()
  }
  ctx.BoundVertexArray = array
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/blend_equation_advanced.txt","GL_NV_blend_equation_advanced")
cmd void glBlendBarrierNV() {
  requiresExtension(GL_NV_blend_equation_advanced)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glBlendEquationSeparateiOES(GLuint buf, GLenum modeRGB, GLenum modeAlpha) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glBlendEquationiOES(GLuint buf, GLenum mode) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glBlendFuncSeparateiOES(GLuint buf,
                                 GLenum srcRGB,
                                 GLenum dstRGB,
                                 GLenum srcAlpha,
                                 GLenum dstAlpha) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glBlendFunciOES(GLuint buf, GLenum src, GLenum dst) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/blend_equation_advanced.txt","GL_NV_blend_equation_advanced")
cmd void glBlendParameteriNV(GLenum pname, GLint value) {
  requiresExtension(GL_NV_blend_equation_advanced)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_framebuffer_blit.txt","GL_ANGLE_framebuffer_blit")
cmd void glBlitFramebufferANGLE(GLint      srcX0,
                                GLint      srcY0,
                                GLint      srcX1,
                                GLint      srcY1,
                                GLint      dstX0,
                                GLint      dstY0,
                                GLint      dstX1,
                                GLint      dstY1,
                                GLbitfield mask,
                                GLenum     filter) {
  requiresExtension(GL_ANGLE_framebuffer_blit)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_framebuffer_blit.txt","GL_NV_framebuffer_blit")
cmd void glBlitFramebufferNV(GLint      srcX0,
                             GLint      srcY0,
                             GLint      srcX1,
                             GLint      srcY1,
                             GLint      dstX0,
                             GLint      dstY0,
                             GLint      dstX1,
                             GLint      dstY1,
                             GLbitfield mask,
                             GLenum     filter) {
  requiresExtension(GL_NV_framebuffer_blit)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_buffer_storage.txt","GL_EXT_buffer_storage")
cmd void glBufferStorageEXT(GLenum target, GLsizeiptr size, const void* data, GLbitfield flag) {
  requiresExtension(GL_EXT_buffer_storage)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd GLenum glClientWaitSyncAPPLE(GLsync sync, GLbitfield flag, GLuint64 timeout) {
  requiresExtension(GL_APPLE_sync)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glColorMaskiOES(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glCompressedTexImage3DOES(GLenum      target,
                                   GLint       level,
                                   GLenum      internalformat,
                                   GLsizei     width,
                                   GLsizei     height,
                                   GLsizei     depth,
                                   GLint       border,
                                   GLsizei     imageSize,
                                   const void* data) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glCompressedTexSubImage3DOES(GLenum      target,
                                      GLint       level,
                                      GLint       xoffset,
                                      GLint       yoffset,
                                      GLint       zoffset,
                                      GLsizei     width,
                                      GLsizei     height,
                                      GLsizei     depth,
                                      GLenum      format,
                                      GLsizei     imageSize,
                                      const void* data) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_copy_buffer.txt","GL_NV_copy_buffer")
cmd void glCopyBufferSubDataNV(GLenum     readTarget,
                               GLenum     writeTarget,
                               GLintptr   readOffset,
                               GLintptr   writeOffset,
                               GLsizeiptr size) {
  requiresExtension(GL_NV_copy_buffer)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_copy_image.txt","GL_OES_copy_image")
cmd void glCopyImageSubDataOES(GLuint  srcName,
                               GLenum  srcTarget,
                               GLint   srcLevel,
                               GLint   srcX,
                               GLint   srcY,
                               GLint   srcZ,
                               GLuint  dstName,
                               GLenum  dstTarget,
                               GLint   dstLevel,
                               GLint   dstX,
                               GLint   dstY,
                               GLint   dstZ,
                               GLsizei srcWidth,
                               GLsizei srcHeight,
                               GLsizei srcDepth) {
  requiresExtension(GL_OES_copy_image)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glCopyPathNV(GLuint resultPath, GLuint srcPath) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glCopyTexSubImage3DOES(GLenum  target,
                                GLint   level,
                                GLint   xoffset,
                                GLint   yoffset,
                                GLint   zoffset,
                                GLint   x,
                                GLint   y,
                                GLsizei width,
                                GLsizei height) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_copy_texture_levels.txt","GL_APPLE_copy_texture_levels")
cmd void glCopyTextureLevelsAPPLE(GLuint  destinationTexture,
                                  GLuint  sourceTexture,
                                  GLint   sourceBaseLevel,
                                  GLsizei sourceLevelCount) {
  requiresExtension(GL_APPLE_copy_texture_levels)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glCoverFillPathInstancedNV(GLsizei        numPaths,
                                    GLenum         pathNameType,
                                    const void*    paths,
                                    GLuint         pathBase,
                                    GLenum         coverMode,
                                    GLenum         transformType,
                                    const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glCoverFillPathNV(GLuint path, GLenum coverMode) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glCoverStrokePathInstancedNV(GLsizei        numPaths,
                                      GLenum         pathNameType,
                                      const void*    paths,
                                      GLuint         pathBase,
                                      GLenum         coverMode,
                                      GLenum         transformType,
                                      const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glCoverStrokePathNV(GLuint path, GLenum coverMode) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/EGL_NV_coverage_sample.txt","GL_NV_coverage_sample")
cmd void glCoverageMaskNV(GLboolean mask) {
  requiresExtension(GL_NV_coverage_sample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/EGL_NV_coverage_sample.txt","GL_NV_coverage_sample")
cmd void glCoverageOperationNV(GLenum operation) {
  requiresExtension(GL_NV_coverage_sample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glCreatePerfQueryINTEL(GLuint queryId, GLuint* queryHandle) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd GLuint glCreateShaderProgramvEXT(GLenum type, GLsizei count, const GLchar** strings) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd void glDeleteFencesNV(GLsizei n, const GLuint* fences) {
  requiresExtension(GL_NV_fence)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glDeletePathsNV(GLuint path, GLsizei range) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glDeletePerfQueryINTEL(GLuint queryHandle) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glDeleteProgramPipelinesEXT(GLsizei n, const PipelineId* pipelines) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glDeleteQueriesEXT(GLsizei count, const QueryId* queries) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

  q := queries[0:count]
  ctx := GetContext()
  for i in (0 .. count) {
    ctx.Instances.Queries[q[i]] = null
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd void glDeleteSyncAPPLE(GLsync sync) {
  requiresExtension(GL_APPLE_sync)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt","GL_OES_vertex_array_object")
cmd void glDeleteVertexArraysOES(GLsizei count, const VertexArrayId* arrays) {
  requiresExtension(GL_OES_vertex_array_object)

  ctx := GetContext()
  a := arrays[0:count]
  for i in (0 .. count) {
    ctx.Instances.VertexArrays[a[i]] = null
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glDepthRangeArrayfvNV(GLuint first, GLsizei count, const GLfloat* v) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glDepthRangeIndexedfNV(GLuint index, GLfloat n, GLfloat f) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_driver_control.txt","GL_QCOM_driver_control")
cmd void glDisableDriverControlQCOM(GLuint driverControl) {
  requiresExtension(GL_QCOM_driver_control)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glDisableiNV(GLenum target, GLuint index) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glDisableiOES(GLenum target, GLuint index) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_discard_framebuffer.txt","GL_EXT_discard_framebuffer")
cmd void glDiscardFramebufferEXT(GLenum        target,
                                 GLsizei       numAttachments,
                                 const GLenum* attachments) {
  requiresExtension(GL_EXT_discard_framebuffer)

}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_instanced_arrays.txt","GL_ANGLE_instanced_arrays")
cmd void glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
  requiresExtension(GL_ANGLE_instanced_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_base_instance.txt","GL_EXT_base_instance")
cmd void glDrawArraysInstancedBaseInstanceEXT(GLenum  mode,
                                              GLint   first,
                                              GLsizei count,
                                              GLsizei instancecount,
                                              GLuint  baseinstance) {
  requiresExtension(GL_EXT_base_instance)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/draw_instanced.txt","GL_EXT_draw_instanced")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_instanced_arrays.txt","GL_EXT_instanced_arrays")
cmd void glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) {
  requiresExtension(GL_EXT_draw_instanced)
  requiresExtension(GL_EXT_instanced_arrays)
  // TODO: Multiple extensions
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_draw_instanced.txt","GL_NV_draw_instanced")
cmd void glDrawArraysInstancedNV(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
  requiresExtension(GL_NV_draw_instanced)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_buffers.txt","GL_EXT_draw_buffers")
cmd void glDrawBuffersEXT(GLsizei n, const GLenum* bufs) {
  requiresExtension(GL_EXT_draw_buffers)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multiview_draw_buffers.txt","GL_EXT_multiview_draw_buffers")
cmd void glDrawBuffersIndexedEXT(GLint n, const GLenum* location, const GLint* indices) {
  requiresExtension(GL_EXT_multiview_draw_buffers)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_draw_buffers.txt","GL_NV_draw_buffers")
cmd void glDrawBuffersNV(GLsizei n, const GLenum* bufs) {
  requiresExtension(GL_NV_draw_buffers)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_elements_base_vertex.txt","GL_EXT_draw_elements_base_vertex")
cmd void glDrawElementsBaseVertexEXT(GLenum      mode,
                                     GLsizei     count,
                                     GLenum      type,
                                     const void* indices,
                                     GLint       basevertex) {
  requiresExtension(GL_EXT_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_elements_base_vertex.txt","GL_OES_draw_elements_base_vertex")
cmd void glDrawElementsBaseVertexOES(GLenum      mode,
                                     GLsizei     count,
                                     GLenum      type,
                                     const void* indices,
                                     GLint       basevertex) {
  requiresExtension(GL_OES_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_instanced_arrays.txt","GL_ANGLE_instanced_arrays")
cmd void glDrawElementsInstancedANGLE(GLenum      mode,
                                      GLsizei     count,
                                      GLenum      type,
                                      const void* indices,
                                      GLsizei     primcount) {
  requiresExtension(GL_ANGLE_instanced_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_base_instance.txt","GL_EXT_base_instance")
cmd void glDrawElementsInstancedBaseInstanceEXT(GLenum      mode,
                                                GLsizei     count,
                                                GLenum      type,
                                                const void* indices,
                                                GLsizei     instancecount,
                                                GLuint      baseinstance) {
  requiresExtension(GL_EXT_base_instance)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_elements_base_vertex.txt","GL_EXT_draw_elements_base_vertex")
cmd void glDrawElementsInstancedBaseVertexEXT(GLenum      mode,
                                              GLsizei     count,
                                              GLenum      type,
                                              const void* indices,
                                              GLsizei     instancecount,
                                              GLint       basevertex) {
  requiresExtension(GL_EXT_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_elements_base_vertex.txt","GL_OES_draw_elements_base_vertex")
cmd void glDrawElementsInstancedBaseVertexOES(GLenum      mode,
                                              GLsizei     count,
                                              GLenum      type,
                                              const void* indices,
                                              GLsizei     instancecount,
                                              GLint       basevertex) {
  requiresExtension(GL_OES_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_base_instance.txt","GL_EXT_base_instance")
cmd void glDrawElementsInstancedBaseVertexBaseInstanceEXT(GLenum      mode,
                                                          GLsizei     count,
                                                          GLenum      type,
                                                          const void* indices,
                                                          GLsizei     instancecount,
                                                          GLint       basevertex,
                                                          GLuint      baseinstance) {
  requiresExtension(GL_EXT_base_instance)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/draw_instanced.txt","GL_EXT_draw_instanced")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_instanced_arrays.txt","GL_EXT_instanced_arrays")
cmd void glDrawElementsInstancedEXT(GLenum      mode,
                                    GLsizei     count,
                                    GLenum      type,
                                    const void* indices,
                                    GLsizei     primcount) {
  requiresExtension(GL_EXT_draw_instanced)
  requiresExtension(GL_EXT_instanced_arrays)
  // TODO: Multiple extensions
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_draw_instanced.txt","GL_NV_draw_instanced")
cmd void glDrawElementsInstancedNV(GLenum      mode,
                                   GLsizei     count,
                                   GLenum      type,
                                   const void* indices,
                                   GLsizei     primcount) {
  requiresExtension(GL_NV_draw_instanced)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_elements_base_vertex.txt","GL_EXT_draw_elements_base_vertex")
cmd void glDrawRangeElementsBaseVertexEXT(GLenum      mode,
                                          GLuint      start,
                                          GLuint      end,
                                          GLsizei     count,
                                          GLenum      type,
                                          const void* indices,
                                          GLint       basevertex) {
  requiresExtension(GL_EXT_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_elements_base_vertex.txt","GL_OES_draw_elements_base_vertex")
cmd void glDrawRangeElementsBaseVertexOES(GLenum      mode,
                                          GLuint      start,
                                          GLuint      end,
                                          GLsizei     count,
                                          GLenum      type,
                                          const void* indices,
                                          GLint       basevertex) {
  requiresExtension(GL_OES_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_EGL_image.txt","GL_OES_EGL_image")
cmd void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) {
  requiresExtension(GL_OES_EGL_image)

}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_EGL_image.txt","GL_OES_EGL_image")
cmd void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) {
  requiresExtension(GL_OES_EGL_image)

}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_driver_control.txt","GL_QCOM_driver_control")
cmd void glEnableDriverControlQCOM(GLuint driverControl) {
  requiresExtension(GL_QCOM_driver_control)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glEnableiNV(GLenum target, GLuint index) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd void glEnableiOES(GLenum target, GLuint index) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/conditional_render.txt","GL_NV_conditional_render")
cmd void glEndConditionalRenderNV() {
  requiresExtension(GL_NV_conditional_render)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glEndPerfMonitorAMD(GLuint monitor) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glEndPerfQueryINTEL(GLuint queryHandle) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glEndQueryEXT(GLenum target) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_tiled_rendering.txt","GL_QCOM_tiled_rendering")
cmd void glEndTilingQCOM(GLbitfield preserve_mask) {
  requiresExtension(GL_QCOM_tiled_rendering)

}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetBufferPointervQCOM(GLenum target, void** params) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetBuffersQCOM(BufferId* buffers, GLint maxBuffers, GLint* numBuffers) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetFramebuffersQCOM(FramebufferId* framebuffers,
                                  GLint          maxFramebuffers,
                                  GLint*         numFramebuffers) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get2.txt","GL_QCOM_extended_get2")
cmd void glExtGetProgramBinarySourceQCOM(ProgramId program,
                                         GLenum    shadertype,
                                         GLchar*   source,
                                         GLint*    length) {
  requiresExtension(GL_QCOM_extended_get2)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get2.txt","GL_QCOM_extended_get2")
cmd void glExtGetProgramsQCOM(ProgramId* programs, GLint maxPrograms, GLint* numPrograms) {
  requiresExtension(GL_QCOM_extended_get2)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetRenderbuffersQCOM(RenderbufferId* renderbuffers,
                                   GLint           maxRenderbuffers,
                                   GLint*          numRenderbuffers) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get2.txt","GL_QCOM_extended_get2")
cmd void glExtGetShadersQCOM(ShaderId* shaders, GLint maxShaders, GLint* numShaders) {
  requiresExtension(GL_QCOM_extended_get2)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetTexLevelParameterivQCOM(TextureId texture,
                                         GLenum    face,
                                         GLint     level,
                                         GLenum    pname,
                                         GLint*    params) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetTexSubImageQCOM(GLenum  target,
                                 GLint   level,
                                 GLint   xoffset,
                                 GLint   yoffset,
                                 GLint   zoffset,
                                 GLsizei width,
                                 GLsizei height,
                                 GLsizei depth,
                                 GLenum  format,
                                 GLenum  type,
                                 void*   texels) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtGetTexturesQCOM(TextureId* textures, GLint maxTextures, GLint* numTextures) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get2.txt","GL_QCOM_extended_get2")
cmd GLboolean glExtIsProgramBinaryQCOM(ProgramId program) {
  requiresExtension(GL_QCOM_extended_get2)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_extended_get.txt","GL_QCOM_extended_get")
cmd void glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param) {
  requiresExtension(GL_QCOM_extended_get)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd GLsync glFenceSyncAPPLE(GLenum condition, GLbitfield flag) {
  requiresExtension(GL_APPLE_sync)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd void glFinishFenceNV(GLuint fence) {
  requiresExtension(GL_NV_fence)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_map_buffer_range.txt","GL_EXT_map_buffer_range")
cmd void glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length) {
  requiresExtension(GL_EXT_map_buffer_range)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multisampled_render_to_texture.txt","GL_EXT_multisampled_render_to_texture")
cmd void glFramebufferTexture2DMultisampleEXT(GLenum    target,
                                              GLenum    attachment,
                                              GLenum    textarget,
                                              TextureId texture,
                                              GLint     level,
                                              GLsizei   samples) {
  requiresExtension(GL_EXT_multisampled_render_to_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/IMG/IMG_multisampled_render_to_texture.txt","GL_IMG_multisampled_render_to_texture")
cmd void glFramebufferTexture2DMultisampleIMG(GLenum    target,
                                              GLenum    attachment,
                                              GLenum    textarget,
                                              TextureId texture,
                                              GLint     level,
                                              GLsizei   samples) {
  requiresExtension(GL_IMG_multisampled_render_to_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glFramebufferTexture3DOES(GLenum    target,
                                   GLenum    attachment,
                                   GLenum    textarget,
                                   TextureId texture,
                                   GLint     level,
                                   GLint     zoffset) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_geometry_shader.txt","GL_OES_geometry_shader")
cmd void glFramebufferTextureOES(GLenum target, GLenum attachment, TextureId texture, GLint level) {
  requiresExtension(GL_OES_geometry_shader)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OVR/multiview.txt","GL_OVR_multiview")
cmd void glFramebufferTextureMultiviewOVR(GLenum    target,
                                          GLenum    attachment,
                                          TextureId texture,
                                          GLint     level,
                                          GLint     baseViewIndex,
                                          GLsizei   numViews) {
  requiresExtension(GL_OVR_multiview)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd void glGenFencesNV(GLsizei n, GLuint* fences) {
  requiresExtension(GL_NV_fence)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLuint glGenPathsNV(GLsizei range) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glGenProgramPipelinesEXT(GLsizei n, PipelineId* pipelines) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glGenQueriesEXT(GLsizei count, QueryId* queries) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

  q := queries[0:count]
  ctx := GetContext()
  for i in (0 .. count) {
    id := as!QueryId(?)
    ctx.Instances.Queries[id] = new!Query()
    q[i] = id
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt","GL_OES_vertex_array_object")
cmd void glGenVertexArraysOES(GLsizei count, VertexArrayId* arrays) {
  requiresExtension(GL_OES_vertex_array_object)

  a := arrays[0:count]
  ctx := GetContext()
  for i in (0 .. count) {
    id := as!VertexArrayId(?)
    ctx.Instances.VertexArrays[id] = new!VertexArray()
    a[i] = id
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_mapbuffer.txt","GL_OES_mapbuffer")
cmd void glGetBufferPointervOES(GLenum target, GLenum pname, void** params) {
  requiresExtension(GL_OES_mapbuffer)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_driver_control.txt","GL_QCOM_driver_control")
cmd void glGetDriverControlStringQCOM(GLuint   driverControl,
                                      GLsizei  bufSize,
                                      GLsizei* length,
                                      GLchar*  driverControlString) {
  requiresExtension(GL_QCOM_driver_control)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_driver_control.txt","GL_QCOM_driver_control")
cmd void glGetDriverControlsQCOM(GLint* num, GLsizei size, GLuint* driverControls) {
  requiresExtension(GL_QCOM_driver_control)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd void glGetFenceivNV(GLuint fence, GLenum pname, GLint* params) {
  requiresExtension(GL_NV_fence)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetFirstPerfQueryIdINTEL(GLuint* queryId) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glGetFloati_vNV(GLenum target, GLuint index, GLfloat* data) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt","GL_EXT_robustness")
cmd GLenum glGetGraphicsResetStatusEXT() {
  requiresExtension(GL_EXT_robustness)

  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/KHR/robustness.txt","GL_KHR_robustness")
cmd GLenum glGetGraphicsResetStatusKHR() {
  requiresExtension(GL_KHR_robustness)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd GLuint64 glGetImageHandleNV(TextureId texture,
                                GLint     level,
                                GLboolean layered,
                                GLint     layer,
                                GLenum    format) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd void glGetInteger64vAPPLE(GLenum pname, GLint64* params) {
  requiresExtension(GL_APPLE_sync)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multiview_draw_buffers.txt","GL_EXT_multiview_draw_buffers")
cmd void glGetIntegeri_vEXT(GLenum target, GLuint index, GLint* data) {
  requiresExtension(GL_EXT_multiview_draw_buffers)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/internalformat_sample_query.txt","GL_NV_internalformat_sample_query")
cmd void glGetInternalformatSampleivNV(GLenum  target,
                                       GLenum  internalformat,
                                       GLsizei samples,
                                       GLenum  pname,
                                       GLsizei bufSize,
                                       GLint*  params) {
  requiresExtension(GL_NV_internalformat_sample_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetNextPerfQueryIdINTEL(GLuint queryId, GLuint* nextQueryId) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_label.txt","GL_EXT_debug_label")
cmd void glGetObjectLabelEXT(GLenum   type,
                             GLuint   object,
                             GLsizei  bufSize,
                             GLsizei* length,
                             GLchar*  label) {
  requiresExtension(GL_EXT_debug_label)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathCommandsNV(GLuint path, GLubyte* commands) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathCoordsNV(GLuint path, GLfloat* coords) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathDashArrayNV(GLuint path, GLfloat* dashArray) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLfloat glGetPathLengthNV(GLuint path, GLsizei startSegment, GLsizei numSegments) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathMetricRangeNV(GLbitfield metricQueryMask,
                                GLuint     firstPathName,
                                GLsizei    numPaths,
                                GLsizei    stride,
                                GLfloat*   metrics) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathMetricsNV(GLbitfield  metricQueryMask,
                            GLsizei     numPaths,
                            GLenum      pathNameType,
                            const void* paths,
                            GLuint      pathBase,
                            GLsizei     stride,
                            GLfloat*    metrics) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathParameterfvNV(GLuint path, GLenum pname, GLfloat* value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathParameterivNV(GLuint path, GLenum pname, GLint* value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetPathSpacingNV(GLenum      pathListMode,
                            GLsizei     numPaths,
                            GLenum      pathNameType,
                            const void* paths,
                            GLuint      pathBase,
                            GLfloat     advanceScale,
                            GLfloat     kerningScale,
                            GLenum      transformType,
                            GLfloat*    returnedSpacing) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetPerfCounterInfoINTEL(GLuint    queryId,
                                   GLuint    counterId,
                                   GLuint    counterNameLength,
                                   GLchar*   counterName,
                                   GLuint    counterDescLength,
                                   GLchar*   counterDesc,
                                   GLuint*   counterOffset,
                                   GLuint*   counterDataSize,
                                   GLuint*   counterTypeEnum,
                                   GLuint*   counterDataTypeEnum,
                                   GLuint64* rawCounterMaxValue) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorCounterDataAMD(GLuint  monitor,
                                        GLenum  pname,
                                        GLsizei dataSize,
                                        GLuint* data,
                                        GLint*  bytesWritten) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorCounterStringAMD(GLuint   group,
                                          GLuint   counter,
                                          GLsizei  bufSize,
                                          GLsizei* length,
                                          GLchar*  counterString) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorCountersAMD(GLuint  group,
                                     GLint*  numCounters,
                                     GLint*  maxActiveCounters,
                                     GLsizei counterSize,
                                     GLuint* counters) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorGroupStringAMD(GLuint   group,
                                        GLsizei  bufSize,
                                        GLsizei* length,
                                        GLchar*  groupString) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetPerfQueryDataINTEL(GLuint  queryHandle,
                                 GLuint  flag,
                                 GLsizei dataSize,
                                 GLvoid* data,
                                 GLuint* bytesWritten) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetPerfQueryIdByNameINTEL(GLchar* queryName, GLuint* queryId) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/INTEL/performance_query.txt","GL_INTEL_performance_query")
cmd void glGetPerfQueryInfoINTEL(GLuint  queryId,
                                 GLuint  queryNameLength,
                                 GLchar* queryName,
                                 GLuint* dataSize,
                                 GLuint* noCounters,
                                 GLuint* noInstances,
                                 GLuint* capsMask) {
  requiresExtension(GL_INTEL_performance_query)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_get_program_binary.txt","GL_OES_get_program_binary")
cmd void glGetProgramBinaryOES(ProgramId program,
                               GLsizei   buffer_size,
                               GLsizei*  bytes_written,
                               GLenum*   binary_format,
                               void*     binary) {
  requiresExtension(GL_OES_get_program_binary)

  l := as!GLsizei(?)
  bytes_written[0] = l
  binary_format[0] = ?
  write(binary[0:l])
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glGetProgramPipelineInfoLogEXT(PipelineId pipeline,
                                        GLsizei    bufSize,
                                        GLsizei*   length,
                                        GLchar*    infoLog) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glGetProgramPipelineivEXT(PipelineId pipeline, GLenum pname, GLint* params) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glGetProgramResourcefvNV(ProgramId     program,
                                  GLenum        programInterface,
                                  GLuint        index,
                                  GLsizei       propCount,
                                  const GLenum* props,
                                  GLsizei       bufSize,
                                  GLsizei*      length,
                                  GLfloat*      params) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
cmd void glGetQueryObjecti64vEXT(QueryId query, GLenum parameter, GLint64* value) {
  requiresExtension(GL_EXT_disjoint_timer_query)

  value[0] = ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
cmd void glGetQueryObjectivEXT(QueryId query, GLenum parameter, GLint* value) {
  requiresExtension(GL_EXT_disjoint_timer_query)

  value[0] = ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
cmd void glGetQueryObjectui64vEXT(QueryId query, GLenum parameter, GLuint64* value) {
  requiresExtension(GL_EXT_disjoint_timer_query)

  value[0] = ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glGetQueryObjectuivEXT(QueryId query, GLenum parameter, GLuint* value) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

  value[0] = ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd void glGetQueryivEXT(GLenum target, GLenum parameter, GLint* value) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

  value[0] = ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glGetSamplerParameterIivOES(SamplerId sampler, GLenum pname, GLint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glGetSamplerParameterIuivOES(SamplerId sampler, GLenum pname, GLuint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd void glGetSyncivAPPLE(GLsync   sync,
                          GLenum   pname,
                          GLsizei  bufSize,
                          GLsizei* length,
                          GLint*   values) {
  requiresExtension(GL_APPLE_sync)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glGetTexParameterIivOES(GLenum target, GLenum pname, GLint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glGetTexParameterIuivOES(GLenum target, GLenum pname, GLuint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd GLuint64 glGetTextureHandleNV(TextureId texture) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd GLuint64 glGetTextureSamplerHandleNV(TextureId texture, SamplerId sampler) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_translated_shader_source.txt","GL_ANGLE_translated_shader_source")
cmd void glGetTranslatedShaderSourceANGLE(ShaderId shader,
                                          GLsizei  bufsize,
                                          GLsizei* length,
                                          GLchar*  source) {
  requiresExtension(GL_ANGLE_translated_shader_source)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt","GL_EXT_robustness")
cmd void glGetnUniformfvEXT(ProgramId       program,
                            UniformLocation location,
                            GLsizei         bufSize,
                            GLfloat*        params) {
  requiresExtension(GL_EXT_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/KHR/robustness.txt","GL_KHR_robustness")
cmd void glGetnUniformfvKHR(ProgramId       program,
                            UniformLocation location,
                            GLsizei         bufSize,
                            GLfloat*        params) {
  requiresExtension(GL_KHR_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt","GL_EXT_robustness")
cmd void glGetnUniformivEXT(ProgramId       program,
                            UniformLocation location,
                            GLsizei         bufSize,
                            GLint*          params) {
  requiresExtension(GL_EXT_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/KHR/robustness.txt","GL_KHR_robustness")
cmd void glGetnUniformivKHR(ProgramId       program,
                            UniformLocation location,
                            GLsizei         bufSize,
                            GLint*          params) {
  requiresExtension(GL_KHR_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/KHR/robustness.txt","GL_KHR_robustness")
cmd void glGetnUniformuivKHR(ProgramId       program,
                             UniformLocation location,
                             GLsizei         bufSize,
                             GLuint*         params) {
  requiresExtension(GL_KHR_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt","GL_EXT_debug_marker")
cmd void glInsertEventMarkerEXT(GLsizei length, const GLchar* marker) {
  requiresExtension(GL_EXT_debug_marker)

  if length > 0 {
    read(marker[0:length])
  } else {
    // TODO: Remove the extra cast.
    _ = as!string(as!char*(marker))
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glInterpolatePathsNV(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_buffers_indexed.txt","GL_OES_draw_buffers_indexed")
cmd bool glIsEnablediOES(GLenum target, GLuint index) {
  requiresExtension(GL_OES_draw_buffers_indexed)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd bool glIsEnablediNV(GLenum target, GLuint index) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd bool glIsFenceNV(GLuint fence) {
  requiresExtension(GL_NV_fence)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd bool glIsImageHandleResidentNV(GLuint64 handle) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd bool glIsPathNV(GLuint path) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd bool glIsPointInFillPathNV(GLuint path, GLuint mask, GLfloat x, GLfloat y) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd bool glIsPointInStrokePathNV(GLuint path, GLfloat x, GLfloat y) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd bool glIsProgramPipelineEXT(PipelineId pipeline) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_occlusion_query_boolean.txt","GL_EXT_occlusion_query_boolean")
cmd bool glIsQueryEXT(QueryId query) {
  requiresExtension(GL_EXT_disjoint_timer_query)
  requiresExtension(GL_EXT_occlusion_query_boolean)
  // TODO: Multiple extensions

  ctx := GetContext()
  return query in ctx.Instances.Queries
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd bool glIsSyncAPPLE(GLsync sync) {
  requiresExtension(GL_APPLE_sync)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd bool glIsTextureHandleResidentNV(GLuint64 handle) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt","GL_OES_vertex_array_object")
cmd bool glIsVertexArrayOES(VertexArrayId array) {
  requiresExtension(GL_OES_vertex_array_object)

  ctx := GetContext()
  return array in ctx.Instances.VertexArrays
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_label.txt","GL_EXT_debug_label")
cmd void glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar* label) {
  requiresExtension(GL_EXT_debug_label)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glMakeImageHandleNonResidentNV(GLuint64 handle) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glMakeImageHandleResidentNV(GLuint64 handle, GLenum access) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glMakeTextureHandleNonResidentNV(GLuint64 handle) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glMakeTextureHandleResidentNV(GLuint64 handle) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_mapbuffer.txt","GL_OES_mapbuffer")
cmd void* glMapBufferOES(GLenum target, GLenum access) {
  requiresExtension(GL_OES_mapbuffer)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_map_buffer_range.txt","GL_EXT_map_buffer_range")
cmd void* glMapBufferRangeEXT(GLenum     target,
                              GLintptr   offset,
                              GLsizeiptr length,
                              GLbitfield access) {
  requiresExtension(GL_EXT_map_buffer_range)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixLoad3x2fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixLoad3x3fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixLoadTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixMult3x2fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixMult3x3fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glMatrixMultTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/multi_draw_arrays.txt","GL_EXT_multi_draw_arrays")
cmd void glMultiDrawArraysEXT(GLenum         mode,
                              const GLint*   first,
                              const GLsizei* count,
                              GLsizei        primcount) {
  requiresExtension(GL_EXT_multi_draw_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multi_draw_indirect.txt","GL_EXT_multi_draw_indirect")
cmd void glMultiDrawArraysIndirectEXT(GLenum      mode,
                                      const void* indirect,
                                      GLsizei     drawcount,
                                      GLsizei     stride) {
  requiresExtension(GL_EXT_multi_draw_indirect)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_elements_base_vertex.txt","GL_EXT_draw_elements_base_vertex")
cmd void glMultiDrawElementsBaseVertexEXT(GLenum             mode,
                                          const GLsizei*     count,
                                          GLenum             type,
                                          const void* const* indices,
                                          GLsizei            primcount,
                                          const GLint*       basevertex) {
  requiresExtension(GL_EXT_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_draw_elements_base_vertex.txt","GL_OES_draw_elements_base_vertex")
cmd void glMultiDrawElementsBaseVertexOES(GLenum             mode,
                                          const GLsizei*     count,
                                          GLenum             type,
                                          const void* const* indices,
                                          GLsizei            primcount,
                                          const GLint*       basevertex) {
  requiresExtension(GL_OES_draw_elements_base_vertex)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/multi_draw_arrays.txt","GL_EXT_multi_draw_arrays")
cmd void glMultiDrawElementsEXT(GLenum             mode,
                                const GLsizei*     count,
                                GLenum             type,
                                const void* const* indices,
                                GLsizei            primcount) {
  requiresExtension(GL_EXT_multi_draw_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multi_draw_indirect.txt","GL_EXT_multi_draw_indirect")
cmd void glMultiDrawElementsIndirectEXT(GLenum      mode,
                                        GLenum      type,
                                        const void* indirect,
                                        GLsizei     drawcount,
                                        GLsizei     stride) {
  requiresExtension(GL_EXT_multi_draw_indirect)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_tessellation_shader.txt","GL_OES_tessellation_shader")
cmd void glPatchParameteriOES(GLenum pname, GLint value) {
  requiresExtension(GL_OES_tessellation_shader)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathCommandsNV(GLuint         path,
                          GLsizei        numCommands,
                          const GLubyte* commands,
                          GLsizei        numCoords,
                          GLenum         coordType,
                          const void*    coords) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathCoordsNV(GLuint path, GLsizei numCoords, GLenum coordType, const void* coords) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathCoverDepthFuncNV(GLenum func) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathDashArrayNV(GLuint path, GLsizei dashCount, const GLfloat* dashArray) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLenum glPathGlyphIndexArrayNV(GLuint      firstPathName,
                                   GLenum      fontTarget,
                                   const void* fontName,
                                   GLbitfield  fontStyle,
                                   GLuint      firstGlyphIndex,
                                   GLsizei     numGlyphs,
                                   GLuint      pathParameterTemplate,
                                   GLfloat     emScale) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLenum glPathGlyphIndexRangeNV(GLenum      fontTarget,
                                   const void* fontName,
                                   GLbitfield  fontStyle,
                                   GLuint      pathParameterTemplate,
                                   GLfloat     emScale,
                                   GLuint      baseAndCount) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathGlyphRangeNV(GLuint      firstPathName,
                            GLenum      fontTarget,
                            const void* fontName,
                            GLbitfield  fontStyle,
                            GLuint      firstGlyph,
                            GLsizei     numGlyphs,
                            GLenum      handleMissingGlyphs,
                            GLuint      pathParameterTemplate,
                            GLfloat     emScale) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathGlyphsNV(GLuint      firstPathName,
                        GLenum      fontTarget,
                        const void* fontName,
                        GLbitfield  fontStyle,
                        GLsizei     numGlyphs,
                        GLenum      type,
                        const void* charcodes,
                        GLenum      handleMissingGlyphs,
                        GLuint      pathParameterTemplate,
                        GLfloat     emScale) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLenum glPathMemoryGlyphIndexArrayNV(GLuint      firstPathName,
                                         GLenum      fontTarget,
                                         GLsizeiptr  fontSize,
                                         const void* fontData,
                                         GLsizei     faceIndex,
                                         GLuint      firstGlyphIndex,
                                         GLsizei     numGlyphs,
                                         GLuint      pathParameterTemplate,
                                         GLfloat     emScale) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathParameterfNV(GLuint path, GLenum pname, GLfloat value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathParameterfvNV(GLuint path, GLenum pname, const GLfloat* value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathParameteriNV(GLuint path, GLenum pname, GLint value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathParameterivNV(GLuint path, GLenum pname, const GLint* value) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathStencilDepthOffsetNV(GLfloat factor, GLfloat units) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathStencilFuncNV(GLenum func, GLint ref, GLuint mask) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathStringNV(GLuint path, GLenum format, GLsizei length, const void* pathString) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathSubCommandsNV(GLuint         path,
                             GLsizei        commandStart,
                             GLsizei        commandsToDelete,
                             GLsizei        numCommands,
                             const GLubyte* commands,
                             GLsizei        numCoords,
                             GLenum         coordType,
                             const void*    coords) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glPathSubCoordsNV(GLuint      path,
                           GLsizei     coordStart,
                           GLsizei     numCoords,
                           GLenum      coordType,
                           const void* coords) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd GLboolean glPointAlongPathNV(GLuint   path,
                                 GLsizei  startSegment,
                                 GLsizei  numSegments,
                                 GLfloat  distance,
                                 GLfloat* x,
                                 GLfloat* y,
                                 GLfloat* tangentX,
                                 GLfloat* tangentY) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_polygon_mode.txt","GL_NV_polygon_mode")
cmd void glPolygonModeNV(GLenum face, GLenum mode) {
  requiresExtension(GL_NV_polygon_mode)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt","GL_EXT_debug_marker")
cmd void glPopGroupMarkerEXT() {
  requiresExtension(GL_EXT_debug_marker)
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_primitive_bounding_box.txt","GL_OES_primitive_bounding_box")
cmd void glPrimitiveBoundingBoxOES(GLfloat minX,
                                   GLfloat minY,
                                   GLfloat minZ,
                                   GLfloat minW,
                                   GLfloat maxX,
                                   GLfloat maxY,
                                   GLfloat maxZ,
                                   GLfloat maxW) {
  requiresExtension(GL_OES_primitive_bounding_box)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_get_program_binary.txt","GL_OES_get_program_binary")
cmd void glProgramBinaryOES(ProgramId   program,
                            GLenum      binary_format,
                            const void* binary,
                            GLint       binary_size) {
  requiresExtension(GL_OES_get_program_binary)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramParameteriEXT(ProgramId program, GLenum pname, GLint value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glProgramPathFragmentInputGenNV(ProgramId      program,
                                         GLint          location,
                                         GLenum         genMode,
                                         GLint          components,
                                         const GLfloat* coeffs) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1fEXT(ProgramId program, UniformLocation location, GLfloat v0) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1fvEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1iEXT(ProgramId program, UniformLocation location, GLint v0) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1ivEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLint*    value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1uiEXT(ProgramId program, UniformLocation location, GLuint v0) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform1uivEXT(ProgramId       program,
                                 UniformLocation location,
                                 GLsizei         count,
                                 const GLuint*   value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2fEXT(ProgramId       program,
                               UniformLocation location,
                               GLfloat         v0,
                               GLfloat         v1) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2fvEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2iEXT(ProgramId program, UniformLocation location, GLint v0, GLint v1) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2ivEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLint*    value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2uiEXT(ProgramId program, UniformLocation location, GLuint v0, GLuint v1) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform2uivEXT(ProgramId       program,
                                 UniformLocation location,
                                 GLsizei         count,
                                 const GLuint*   value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3fEXT(ProgramId       program,
                               UniformLocation location,
                               GLfloat         v0,
                               GLfloat         v1,
                               GLfloat         v2) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3fvEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3iEXT(ProgramId       program,
                               UniformLocation location,
                               GLint           v0,
                               GLint           v1,
                               GLint           v2) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3ivEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLint*    value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3uiEXT(ProgramId       program,
                                UniformLocation location,
                                GLuint          v0,
                                GLuint          v1,
                                GLuint          v2) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform3uivEXT(ProgramId       program,
                                 UniformLocation location,
                                 GLsizei         count,
                                 const GLuint*   value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4fEXT(ProgramId       program,
                               UniformLocation location,
                               GLfloat         v0,
                               GLfloat         v1,
                               GLfloat         v2,
                               GLfloat         v3) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4fvEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4iEXT(ProgramId       program,
                               UniformLocation location,
                               GLint           v0,
                               GLint           v1,
                               GLint           v2,
                               GLint           v3) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4ivEXT(ProgramId       program,
                                UniformLocation location,
                                GLsizei         count,
                                const GLint*    value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4uiEXT(ProgramId       program,
                                UniformLocation location,
                                GLuint          v0,
                                GLuint          v1,
                                GLuint          v2,
                                GLuint          v3) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniform4uivEXT(ProgramId       program,
                                 UniformLocation location,
                                 GLsizei         count,
                                 const GLuint*   value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glProgramUniformHandleui64NV(ProgramId program, UniformLocation location, GLuint64 value) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glProgramUniformHandleui64vNV(ProgramId       program,
                                       UniformLocation location,
                                       GLsizei         count,
                                       const GLuint64* values) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix2fvEXT(ProgramId       program,
                                      UniformLocation location,
                                      GLsizei         count,
                                      GLboolean       transpose,
                                      const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix2x3fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix2x4fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix3fvEXT(ProgramId       program,
                                      UniformLocation location,
                                      GLsizei         count,
                                      GLboolean       transpose,
                                      const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix3x2fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix3x4fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix4fvEXT(ProgramId       program,
                                      UniformLocation location,
                                      GLsizei         count,
                                      GLboolean       transpose,
                                      const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix4x2fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glProgramUniformMatrix4x3fvEXT(ProgramId       program,
                                        UniformLocation location,
                                        GLsizei         count,
                                        GLboolean       transpose,
                                        const GLfloat*  value) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt","GL_EXT_debug_marker")
cmd void glPushGroupMarkerEXT(GLsizei length, const GLchar* marker) {
  requiresExtension(GL_EXT_debug_marker)

  if length > 0 {
    read(marker[0:length])
  } else {
    _ = as!string(as!char*(marker))
  }
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt","GL_EXT_disjoint_timer_query")
cmd void glQueryCounterEXT(QueryId query, GLenum target) {
  requiresExtension(GL_EXT_disjoint_timer_query)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multiview_draw_buffers.txt","GL_EXT_multiview_draw_buffers")
cmd void glReadBufferIndexedEXT(GLenum src, GLint index) {
  requiresExtension(GL_EXT_multiview_draw_buffers)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_read_buffer.txt","GL_NV_read_buffer")
cmd void glReadBufferNV(GLenum mode) {
  requiresExtension(GL_NV_read_buffer)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt","GL_EXT_robustness")
cmd void glReadnPixelsEXT(GLint   x,
                          GLint   y,
                          GLsizei width,
                          GLsizei height,
                          GLenum  format,
                          GLenum  type,
                          GLsizei bufSize,
                          void*   data) {
  requiresExtension(GL_EXT_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/KHR/robustness.txt","GL_KHR_robustness")
cmd void glReadnPixelsKHR(GLint   x,
                          GLint   y,
                          GLsizei width,
                          GLsizei height,
                          GLenum  format,
                          GLenum  type,
                          GLsizei bufSize,
                          void*   data) {
  requiresExtension(GL_KHR_robustness)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_framebuffer_multisample.txt","GL_ANGLE_framebuffer_multisample")
cmd void glRenderbufferStorageMultisampleANGLE(GLenum  target,
                                               GLsizei samples,
                                               GLenum  internalformat,
                                               GLsizei width,
                                               GLsizei height) {
  requiresExtension(GL_ANGLE_framebuffer_multisample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_framebuffer_multisample.txt","GL_APPLE_framebuffer_multisample")
cmd void glRenderbufferStorageMultisampleAPPLE(GLenum  target,
                                               GLsizei samples,
                                               GLenum  internalformat,
                                               GLsizei width,
                                               GLsizei height) {
  requiresExtension(GL_APPLE_framebuffer_multisample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_multisampled_render_to_texture.txt","GL_EXT_multisampled_render_to_texture")
cmd void glRenderbufferStorageMultisampleEXT(GLenum  target,
                                             GLsizei samples,
                                             GLenum  internalformat,
                                             GLsizei width,
                                             GLsizei height) {
  requiresExtension(GL_EXT_multisampled_render_to_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/IMG/IMG_multisampled_render_to_texture.txt","GL_IMG_multisampled_render_to_texture")
cmd void glRenderbufferStorageMultisampleIMG(GLenum  target,
                                             GLsizei samples,
                                             GLenum  internalformat,
                                             GLsizei width,
                                             GLsizei height) {
  requiresExtension(GL_IMG_multisampled_render_to_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_framebuffer_multisample.txt","GL_NV_framebuffer_multisample")
cmd void glRenderbufferStorageMultisampleNV(GLenum  target,
                                            GLsizei samples,
                                            GLenum  internalformat,
                                            GLsizei width,
                                            GLsizei height) {
  requiresExtension(GL_NV_framebuffer_multisample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_framebuffer_multisample.txt","GL_APPLE_framebuffer_multisample")
cmd void glResolveMultisampleFramebufferAPPLE() {
  requiresExtension(GL_APPLE_framebuffer_multisample)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glSamplerParameterIivOES(SamplerId sampler, GLenum pname, const GLint* param) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glSamplerParameterIuivOES(SamplerId sampler, GLenum pname, const GLuint* param) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glScissorArrayvNV(GLuint first, GLsizei count, const GLint* v) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glScissorIndexedNV(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glScissorIndexedvNV(GLuint index, const GLint* v) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/AMD/performance_monitor.txt","GL_AMD_performance_monitor")
cmd void glSelectPerfMonitorCountersAMD(GLuint    monitor,
                                        GLboolean enable,
                                        GLuint    group,
                                        GLint     numCounters,
                                        GLuint*   counterList) {
  requiresExtension(GL_AMD_performance_monitor)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd void glSetFenceNV(GLuint fence, GLenum condition) {
  requiresExtension(GL_NV_fence)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/QCOM/QCOM_tiled_rendering.txt","GL_QCOM_tiled_rendering")
cmd void glStartTilingQCOM(GLuint     x,
                           GLuint     y,
                           GLuint     width,
                           GLuint     height,
                           GLbitfield preserveMask) {
  requiresExtension(GL_QCOM_tiled_rendering)

}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilFillPathInstancedNV(GLsizei        numPaths,
                                      GLenum         pathNameType,
                                      const void*    paths,
                                      GLuint         pathBase,
                                      GLenum         fillMode,
                                      GLuint         mask,
                                      GLenum         transformType,
                                      const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilFillPathNV(GLuint path, GLenum fillMode, GLuint mask) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilStrokePathInstancedNV(GLsizei        numPaths,
                                        GLenum         pathNameType,
                                        const void*    paths,
                                        GLuint         pathBase,
                                        GLint          reference,
                                        GLuint         mask,
                                        GLenum         transformType,
                                        const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilThenCoverFillPathInstancedNV(GLsizei        numPaths,
                                               GLenum         pathNameType,
                                               const void*    paths,
                                               GLuint         pathBase,
                                               GLenum         fillMode,
                                               GLuint         mask,
                                               GLenum         coverMode,
                                               GLenum         transformType,
                                               const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilThenCoverFillPathNV(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilThenCoverStrokePathInstancedNV(GLsizei        numPaths,
                                                 GLenum         pathNameType,
                                                 const void*    paths,
                                                 GLuint         pathBase,
                                                 GLint          reference,
                                                 GLuint         mask,
                                                 GLenum         coverMode,
                                                 GLenum         transformType,
                                                 const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glStencilThenCoverStrokePathNV(GLuint path,
                                        GLint  reference,
                                        GLuint mask,
                                        GLenum coverMode) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fence.txt","GL_NV_fence")
cmd GLboolean glTestFenceNV(GLuint fence) {
  requiresExtension(GL_NV_fence)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_buffer.txt","GL_OES_texture_buffer")
cmd void glTexBufferOES(GLenum target, GLenum internalformat, BufferId buffer) {
  requiresExtension(GL_OES_texture_buffer)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_buffer.txt","GL_OES_texture_buffer")
cmd void glTexBufferRangeOES(GLenum     target,
                             GLenum     internalformat,
                             BufferId   buffer,
                             GLintptr   offset,
                             GLsizeiptr size) {
  requiresExtension(GL_OES_texture_buffer)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glTexImage3DOES(GLenum      target,
                         GLint       level,
                         GLenum      internalformat,
                         GLsizei     width,
                         GLsizei     height,
                         GLsizei     depth,
                         GLint       border,
                         GLenum      format,
                         GLenum      type,
                         const void* pixels) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_sparse_texture.txt","GL_EXT_sparse_texture")
cmd void glTexPageCommitmentARB(GLenum    target,
                                GLint     level,
                                GLint     xoffset,
                                GLint     yoffset,
                                GLint     zoffset,
                                GLsizei   width,
                                GLsizei   height,
                                GLsizei   depth,
                                GLboolean commit) {
  requiresExtension(GL_EXT_sparse_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glTexParameterIivOES(GLenum target, GLenum pname, const GLint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_border_clamp.txt","GL_OES_texture_border_clamp")
cmd void glTexParameterIuivOES(GLenum target, GLenum pname, const GLuint* params) {
  requiresExtension(GL_OES_texture_border_clamp)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum format, GLsizei width) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTexStorage2DEXT(GLenum  target,
                           GLsizei levels,
                           GLenum  format,
                           GLsizei width,
                           GLsizei height) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTexStorage3DEXT(GLenum  target,
                           GLsizei levels,
                           GLenum  format,
                           GLsizei width,
                           GLsizei height,
                           GLsizei depth) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt","GL_OES_texture_3D")
cmd void glTexSubImage3DOES(GLenum      target,
                            GLint       level,
                            GLint       xoffset,
                            GLint       yoffset,
                            GLint       zoffset,
                            GLsizei     width,
                            GLsizei     height,
                            GLsizei     depth,
                            GLenum      format,
                            GLenum      type,
                            const void* pixels) {
  requiresExtension(GL_OES_texture_3D)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTextureStorage1DEXT(TextureId texture,
                               GLenum    target,
                               GLsizei   levels,
                               GLenum    format,
                               GLsizei   width) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTextureStorage2DEXT(TextureId texture,
                               GLenum    target,
                               GLsizei   levels,
                               GLenum    format,
                               GLsizei   width,
                               GLsizei   height) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt","GL_EXT_texture_storage")
cmd void glTextureStorage3DEXT(TextureId texture,
                               GLenum    target,
                               GLsizei   levels,
                               GLenum    format,
                               GLsizei   width,
                               GLsizei   height,
                               GLsizei   depth) {
  requiresExtension(GL_EXT_texture_storage)

}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_view.txt","GL_EXT_texture_view")
cmd void glTextureViewEXT(TextureId texture,
                          GLenum    target,
                          GLuint    origtexture,
                          GLenum    internalformat,
                          GLuint    minlevel,
                          GLuint    numlevels,
                          GLuint    minlayer,
                          GLuint    numlayers) {
  requiresExtension(GL_EXT_texture_view)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_texture_view.txt","GL_OES_texture_view")
cmd void glTextureViewOES(TextureId texture,
                          GLenum    target,
                          GLuint    origtexture,
                          GLenum    internalformat,
                          GLuint    minlevel,
                          GLuint    numlevels,
                          GLuint    minlayer,
                          GLuint    numlayers) {
  requiresExtension(GL_OES_texture_view)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glTransformPathNV(GLuint         resultPath,
                           GLuint         srcPath,
                           GLenum         transformType,
                           const GLfloat* transformValues) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glUniformHandleui64NV(UniformLocation location, GLuint64 value) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/bindless_texture.txt","GL_NV_bindless_texture")
cmd void glUniformHandleui64vNV(UniformLocation location, GLsizei count, const GLuint64* value) {
  requiresExtension(GL_NV_bindless_texture)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix2x3fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix2x4fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix3x2fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix3x4fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix4x2fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_non_square_matrices.txt","GL_NV_non_square_matrices")
cmd void glUniformMatrix4x3fvNV(UniformLocation location,
                                GLsizei         count,
                                GLboolean       transpose,
                                const GLfloat*  value) {
  requiresExtension(GL_NV_non_square_matrices)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/OES/OES_mapbuffer.txt","GL_OES_mapbuffer")
cmd GLboolean glUnmapBufferOES(GLenum target) {
  requiresExtension(GL_OES_mapbuffer)
  // TODO
  return ?
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glUseProgramStagesEXT(PipelineId pipeline, GLbitfield stages, ProgramId program) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_separate_shader_objects.txt","GL_EXT_separate_shader_objects")
cmd void glValidateProgramPipelineEXT(PipelineId pipeline) {
  requiresExtension(GL_EXT_separate_shader_objects)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_instanced_arrays.txt","GL_ANGLE_instanced_arrays")
cmd void glVertexAttribDivisorANGLE(AttributeLocation index, GLuint divisor) {
  requiresExtension(GL_ANGLE_instanced_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/EXT_instanced_arrays.txt","GL_EXT_instanced_arrays")
cmd void glVertexAttribDivisorEXT(AttributeLocation index, GLuint divisor) {
  requiresExtension(GL_EXT_instanced_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_instanced_arrays.txt","GL_NV_instanced_arrays")
cmd void glVertexAttribDivisorNV(AttributeLocation index, GLuint divisor) {
  requiresExtension(GL_NV_instanced_arrays)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glViewportArrayvNV(GLuint first, GLsizei count, const GLfloat* v) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glViewportIndexedfNV(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/NV_viewport_array.txt","GL_NV_viewport_array")
cmd void glViewportIndexedfvNV(GLuint index, const GLfloat* v) {
  requiresExtension(GL_NV_viewport_array)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/APPLE/APPLE_sync.txt","GL_APPLE_sync")
cmd void glWaitSyncAPPLE(GLsync sync, GLbitfield flag, GLuint64 timeout) {
  requiresExtension(GL_APPLE_sync)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/path_rendering.txt","GL_NV_path_rendering")
cmd void glWeightPathsNV(GLuint         resultPath,
                         GLsizei        numPaths,
                         const GLuint*  paths,
                         const GLfloat* weights) {
  requiresExtension(GL_NV_path_rendering)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/framebuffer_mixed_samples.txt","GL_NV_framebuffer_mixed_samples")
cmd void glCoverageModulationNV(GLenum components) {
  requiresExtension(GL_NV_framebuffer_mixed_samples)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/framebuffer_mixed_samples.txt","GL_NV_framebuffer_mixed_samples")
cmd void glCoverageModulationTableNV(GLsizei n, const GLfloat* v) {
  requiresExtension(GL_NV_framebuffer_mixed_samples)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/fragment_coverage_to_color.txt","GL_NV_fragment_coverage_to_color")
cmd void glFragmentCoverageColorNV(GLuint color) {
  requiresExtension(GL_NV_fragment_coverage_to_color)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/sample_locations.txt","GL_NV_sample_locations")
cmd void glFramebufferSampleLocationsfvNV(GLenum         target,
                                          GLuint         start,
                                          GLsizei        count,
                                          const GLfloat* v) {
  requiresExtension(GL_NV_sample_locations)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/framebuffer_mixed_samples.txt","GL_NV_framebuffer_mixed_samples")
cmd void glGetCoverageModulationTableNV(GLsizei bufsize, GLfloat* v) {
  requiresExtension(GL_NV_framebuffer_mixed_samples)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/sample_locations.txt","GL_NV_sample_locations")
cmd void glNamedFramebufferSampleLocationsfvNV(FramebufferId  framebuffer,
                                               GLuint         start,
                                               GLsizei        count,
                                               const GLfloat* v) {
  requiresExtension(GL_NV_sample_locations)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/EXT/raster_multisample.txt","GL_EXT_raster_multisample")
@Doc("https://www.khronos.org/registry/gles/extensions/EXT/texture_filter_minmax.txt","GL_EXT_texture_filter_minmax")
@Doc("https://www.khronos.org/registry/gles/extensions/NV/framebuffer_mixed_samples.txt","GL_NV_framebuffer_mixed_samples")
cmd void glRasterSamplesEXT(GLuint samples, GLboolean fixedsamplelocations) {
  requiresExtension(GL_EXT_raster_multisample)
  requiresExtension(GL_EXT_texture_filter_minmax)
  requiresExtension(GL_NV_framebuffer_mixed_samples)
  // TODO: Multiple extensions
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/sample_locations.txt","GL_NV_sample_locations")
cmd void glResolveDepthValuesNV() {
  requiresExtension(GL_NV_sample_locations)
  // TODO
}

@Doc("https://www.khronos.org/registry/gles/extensions/NV/conservative_raster.txt","GL_NV_conservative_raster")
cmd void glSubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits) {
  requiresExtension(GL_NV_conservative_raster)
  // TODO
}

