// 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 flags) {
  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 flags, 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 flags) {
  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  flags,
                                 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!s32(?)
  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 {
    _ = as!string(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(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 flags, 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
}

