Browse Source

Merge branch 'master' into compatibility

Vladimír Vondruš 12 years ago
parent
commit
5e00d7329d
  1. 5
      CMakeLists.txt
  2. 8
      doc/building.dox
  3. 31
      doc/cmake.dox
  4. 4
      doc/opengl-mapping.dox
  5. 4
      doc/opengl-support.dox
  6. 47
      doc/platform.dox
  7. 42
      modules/FindMagnum.cmake
  8. 1
      package/archlinux/PKGBUILD
  9. 1
      package/archlinux/PKGBUILD-clang
  10. 1
      package/archlinux/PKGBUILD-clang-libc++
  11. 1
      package/archlinux/PKGBUILD-es2desktop
  12. 1
      package/archlinux/PKGBUILD-es3desktop
  13. 1
      package/archlinux/PKGBUILD-gcc47
  14. 1
      package/archlinux/PKGBUILD-mingw-w64
  15. 1
      package/archlinux/PKGBUILD-release
  16. 1
      package/archlinux/magnum-git/PKGBUILD
  17. 1
      package/ci/jenkins.xml
  18. 1
      package/debian/rules
  19. 37
      src/Magnum/AbstractFramebuffer.cpp
  20. 11
      src/Magnum/AbstractFramebuffer.h
  21. 35
      src/Magnum/AbstractTexture.cpp
  22. 6
      src/Magnum/CMakeLists.txt
  23. 14
      src/Magnum/Context.cpp
  24. 28
      src/Magnum/Context.h
  25. 39
      src/Magnum/DebugMessage.cpp
  26. 72
      src/Magnum/DebugMessage.h
  27. 2
      src/Magnum/DebugTools/Test/ForceRendererTest.cpp
  28. 2
      src/Magnum/DefaultFramebuffer.cpp
  29. 12
      src/Magnum/DefaultFramebuffer.h
  30. 14
      src/Magnum/Framebuffer.cpp
  31. 22
      src/Magnum/Framebuffer.h
  32. 2
      src/Magnum/Implementation/DebugState.cpp
  33. 3
      src/Magnum/Implementation/DebugState.h
  34. 15
      src/Magnum/Implementation/FramebufferState.cpp
  35. 5
      src/Magnum/Implementation/FramebufferState.h
  36. 2
      src/Magnum/OpenGL.h
  37. 4
      src/Magnum/Platform/AbstractXApplication.cpp
  38. 3
      src/Magnum/Platform/AbstractXApplication.h
  39. 4
      src/Magnum/Platform/AndroidApplication.cpp
  40. 2
      src/Magnum/Platform/AndroidApplication.h
  41. 124
      src/Magnum/Platform/CMakeLists.txt
  42. 64
      src/Magnum/Platform/Context.h
  43. 4
      src/Magnum/Platform/GlutApplication.cpp
  44. 2
      src/Magnum/Platform/GlutApplication.h
  45. 100
      src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp
  46. 70
      src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h
  47. 2
      src/Magnum/Platform/NaClApplication.cpp
  48. 2
      src/Magnum/Platform/NaClApplication.h
  49. 1
      src/Magnum/Platform/Platform.h
  50. 4
      src/Magnum/Platform/Sdl2Application.cpp
  51. 2
      src/Magnum/Platform/Sdl2Application.h
  52. 4
      src/Magnum/Platform/WindowlessCglApplication.cpp
  53. 2
      src/Magnum/Platform/WindowlessCglApplication.h
  54. 4
      src/Magnum/Platform/WindowlessGlxApplication.cpp
  55. 3
      src/Magnum/Platform/WindowlessGlxApplication.h
  56. 4
      src/Magnum/Platform/WindowlessNaClApplication.cpp
  57. 2
      src/Magnum/Platform/WindowlessNaClApplication.h
  58. 4
      src/Magnum/Platform/WindowlessWglApplication.cpp
  59. 10
      src/Magnum/Platform/WindowlessWglApplication.h
  60. 3
      src/Magnum/Query.h
  61. 2
      src/Magnum/Renderbuffer.cpp
  62. 6
      src/Magnum/Renderbuffer.h
  63. 7
      src/Magnum/Renderer.h
  64. 2
      src/Magnum/SceneGraph/AbstractCamera.h
  65. 2
      src/Magnum/SceneGraph/AbstractFeature.h
  66. 2
      src/Magnum/SceneGraph/AbstractObject.h
  67. 2
      src/Magnum/SceneGraph/AbstractTransformation.h
  68. 2
      src/Magnum/SceneGraph/Animable.h
  69. 2
      src/Magnum/SceneGraph/AnimableGroup.h
  70. 2
      src/Magnum/SceneGraph/Camera2D.h
  71. 2
      src/Magnum/SceneGraph/Camera3D.h
  72. 2
      src/Magnum/SceneGraph/Drawable.h
  73. 2
      src/Magnum/SceneGraph/DualComplexTransformation.h
  74. 2
      src/Magnum/SceneGraph/DualQuaternionTransformation.h
  75. 2
      src/Magnum/SceneGraph/FeatureGroup.h
  76. 2
      src/Magnum/SceneGraph/MatrixTransformation2D.h
  77. 2
      src/Magnum/SceneGraph/MatrixTransformation3D.h
  78. 2
      src/Magnum/SceneGraph/RigidMatrixTransformation2D.h
  79. 2
      src/Magnum/SceneGraph/RigidMatrixTransformation3D.h
  80. 2
      src/Magnum/SceneGraph/TranslationTransformation.h
  81. 5
      src/Magnum/SceneGraph/instantiation.cpp
  82. 6
      src/Magnum/Shader.cpp
  83. 10
      src/Magnum/Shaders/MeshVisualizer.frag
  84. 3
      src/Magnum/Test/AbstractOpenGLTester.h
  85. 16
      src/Magnum/Test/DebugGLTest.cpp
  86. 71
      src/Magnum/Test/FramebufferGLTest.cpp
  87. 16
      src/Magnum/Test/MeshGLTest.cpp
  88. 11
      src/Magnum/Text/GlyphCache.cpp
  89. 8
      src/Magnum/TextureArray.h
  90. 115
      src/Magnum/TextureFormat.h
  91. 9
      src/MagnumExternal/OpenGL/GL/CMakeLists.txt
  92. 17
      src/MagnumExternal/OpenGL/GL/README.md
  93. 29
      src/MagnumExternal/OpenGL/GL/extensions.txt
  94. 812
      src/MagnumExternal/OpenGL/GL/flextGL.cpp
  95. 20
      src/MagnumExternal/OpenGL/GL/flextGL.cpp.template
  96. 3213
      src/MagnumExternal/OpenGL/GL/flextGL.h
  97. 96
      src/MagnumExternal/OpenGL/GL/flextGL.h.template
  98. 825
      src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp
  99. 21
      src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template
  100. 2739
      src/MagnumExternal/OpenGL/GL/gl_magnum.c
  101. Some files were not shown because too many files have changed in this diff Show More

5
CMakeLists.txt

@ -61,16 +61,19 @@ elseif(CORRADE_TARGET_ANDROID)
# OS X-specific application libraries
elseif(CORRADE_TARGET_APPLE)
cmake_dependent_option(WITH_WINDOWLESSCGLAPPLICATION "Build WindowlessCglApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON)
cmake_dependent_option(WITH_CGLCONTEXT "Build CglContext library" OFF "NOT TARGET_GLES" OFF)
# X11, GLX and EGL-specific application libraries
# X11 + GLX/EGL-specific application libraries
elseif(CORRADE_TARGET_UNIX)
option(WITH_GLXAPPLICATION "Build GlxApplication library" OFF)
cmake_dependent_option(WITH_WINDOWLESSGLXAPPLICATION "Build WindowlessGlxApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON)
cmake_dependent_option(WITH_XEGLAPPLICATION "Build XEglApplication library" OFF "TARGET_GLES" OFF)
cmake_dependent_option(WITH_GLXCONTEXT "Build GlxContext library" OFF "NOT TARGET_GLES" OFF)
# Windows-specific application libraries
elseif(CORRADE_TARGET_WINDOWS)
cmake_dependent_option(WITH_WINDOWLESSWGLAPPLICATION "Build WindowlessWglApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON)
cmake_dependent_option(WITH_WGLCONTEXT "Build WglContext library" OFF "NOT TARGET_GLES" OFF)
endif()
# Platform-independent (almost) application libraries

8
doc/building.dox

@ -205,6 +205,14 @@ platform best:
- `WITH_WINDOWLESSNACLAPPLICATION` - @ref Platform::WindowlessNaClApplication "WindowlessNaClApplication"
- `WITH_WINDOWLESSWGLAPPLICATION` - @ref Platform::WindowlessWglApplication "WindowlessWglApplication"
None of the context libraries is built by default. You need them only if you
choose to not use any application library (see @ref platform-custom for more
information):
- `WITH_CGLCONTEXT` -- CGL context
- `WITH_GLXCONTEXT` -- GLX context
- `WITH_WGLCONTEXT` -- WGL context
There are also a few command-line utilities. They are currently available only
on Linux, Mac OS X and Windows, also disabled by default:

31
doc/cmake.dox

@ -79,16 +79,16 @@ components. The base library depends on %Corrade and OpenGL libraries (or
OpenGL ES libraries). Additional dependencies are specified by the components.
The optional components are:
- `%Audio` -- Audio library
- `%DebugTools` -- DebugTools library (depends on `%MeshTools`,
- `%Audio` -- @ref Audio library
- `%DebugTools` -- @ref DebugTools library (depends on `%MeshTools`,
`%Primitives`, `%SceneGraph`, `%Shaders` and `%Shapes` components)
- `%MeshTools` -- MeshTools library
- `%Primitives` -- Primitives library
- `%SceneGraph` -- SceneGraph library
- `%Shaders` -- Shaders library
- `%Shapes` -- Shapes library (depends on `%SceneGraph` component)
- `%Text` -- Text library (depends on `%TextureTools` component)
- `%TextureTools` -- TextureTools library
- `%MeshTools` -- @ref MeshTools library
- `%Primitives` -- @ref Primitives library
- `%SceneGraph` -- @ref SceneGraph library
- `%Shaders` -- @ref Shaders library
- `%Shapes` -- @ref Shapes library (depends on `%SceneGraph` component)
- `%Text` -- @ref Text library (depends on `%TextureTools` component)
- `%TextureTools` -- @ref TextureTools library
Platform namespace is split into more components:
@ -102,6 +102,14 @@ Platform namespace is split into more components:
- `%WindowlessNaClApplication` -- @ref Platform::WindowlessNaClApplication "WindowlessNaClApplication"
- `%WindowlessWglApplication` -- @ref Platform::WindowlessWglApplication "WindowlessWglApplication"
For manual context creation (without application wrappers) there are also
platform-specific context libraries (see @ref platform-custom for more
information):
- `CglContext` -- CGL context
- `GlxContext` -- GLX context
- `WglContext` -- WGL context
The library also contains a set of plugins for importing essential file
formats. Additional plugins are provided in separate plugin repository, see
@ref cmake-plugins for more information. If you are going to use dynamic
@ -143,7 +151,10 @@ If exactly one `*Application` or exactly one `Windowless*Application` component
is requested and found, its libraries and include dirs are available in
convenience aliases `MAGNUM_APPLICATION_LIBRARIES` /
`MAGNUM_WINDOWLESSAPPLICATION_LIBRARIES` and `MAGNUM_APPLICATION_INCLUDE_DIRS`
/ `MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS` to simplify porting.
/ `MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS` to simplify porting. Similarly,
if exactly one `*Context` component is requested and found, its libraries and
include dirs are available in convenience aliases `MAGNUM_CONTEXT_LIBRARIES`
and `MAGNUM_CONTEXT_INCLUDE_DIRS`.
The package is found if either debug or release version of each requested
library (or plugin) is found. If both debug and release libraries (or plugins)

4
doc/opengl-mapping.dox

@ -93,7 +93,7 @@ OpenGL function | Matching API
@fn_gl{CreateShaderProgram} | |
@fn_gl{CullFace} | @ref Renderer::setFaceCullingMode()
@fn_gl{DebugMessageCallback} | @ref DebugMessage::setCallback()
@fn_gl{DebugMessageControl} | |
@fn_gl{DebugMessageControl} | @ref DebugMessage::setEnabled()
@fn_gl{DebugMessageInsert}, \n @fn_gl_extension2{InsertEventMarker,EXT,debug_marker}, \n @fn_gl_extension{StringMarker,GREMEDY,string_marker} | @ref DebugMessage::insert()
@fn_gl{DepthFunc} | @ref Renderer::setDepthFunction()
@fn_gl{DepthMask} | @ref Renderer::setDepthMask()
@ -184,7 +184,7 @@ OpenGL function | Matching API
@fn_gl{InvalidateBufferData} | @ref Buffer::invalidateData()
@fn_gl{InvalidateBufferSubData} | @ref Buffer::invalidateSubData()
@fn_gl{InvalidateFramebuffer}, \n @fn_gles_extension{DiscardFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate()
@fn_gl{InvalidateSubFramebuffer}, \n @fn_gles_extension{DiscardSubFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate()
@fn_gl{InvalidateSubFramebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate()
@fn_gl{InvalidateTexImage} | @ref Texture::invalidateImage(), \n @ref TextureArray::invalidateImage(), \n @ref CubeMapTexture::invalidateImage(), \n @ref CubeMapTextureArray::invalidateImage(), \n @ref RectangleTexture::invalidateImage(), \n @ref MultisampleTexture::invalidateImage()
@fn_gl{InvalidateTexSubImage} | @ref Texture::invalidateSubImage(), \n @ref TextureArray::invalidateSubImage(), \n @ref CubeMapTexture::invalidateSubImage(), \n @ref CubeMapTextureArray::invalidateSubImage(), \n @ref RectangleTexture::invalidateSubImage(), \n @ref MultisampleTexture::invalidateSubImage()
@fn_gl{IsBuffer}, \n @fn_gl{IsFramebuffer}, \n @fn_gl{IsProgram}, \n @fn_gl{IsProgramPipeline}, \n @fn_gl{IsQuery}, \n @fn_gl{IsRenderbuffer}, \n @fn_gl{IsSampler}, \n @fn_gl{IsShader}, \n @fn_gl{IsSync}, \n @fn_gl{IsTexture}, \n @fn_gl{IsTransformFeedback}, \n @fn_gl{IsVertexArray} | not needed, objects are strongly typed

4
doc/opengl-support.dox

@ -108,7 +108,7 @@ following:
%Extension | Status
-------------------------------------------- | ------
@extension{ARB,instanced_arrays} | done
@extension{ARB,blend_func_extended} | missing limit query
@extension{ARB,blend_func_extended} | done
@extension{ARB,explicit_attrib_location} | done (shading language only)
@extension{ARB,occlusion_query2} | done
@extension{ARB,sampler_objects} | |
@ -173,7 +173,7 @@ following:
@extension{ARB,clear_buffer_object} | |
@extension{ARB,compute_shader} | |
@extension{ARB,copy_image} | |
@extension{KHR,debug} (also in ES) | missing log control and retrieval, sync, pipeline, transform feedback and sampler label and debug groups
@extension{KHR,debug} (also in ES) | missing log retrieval, sync, pipeline, transform feedback and sampler label and debug groups
@extension{ARB,explicit_uniform_location} | done
@extension{ARB,fragment_layer_viewport} | done (shading language only)
@extension{ARB,framebuffer_no_attachments} | |

47
doc/platform.dox

@ -189,7 +189,7 @@ compilation of the executable and linking `${MAGNUM_LIBRARIES}` and
`${MAGNUM_SDL2APPLICATION_LIBRARIES}` to it.
Again, to simplify porting, you can also use generic `${MAGNUM_APPLICATION_INCLUDE_DIRS}`
and `${MAGNUM_WAPPLICATION_LIBRARIES}` aliases (or `${MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS}`,
and `${MAGNUM_APPLICATION_LIBRARIES}` aliases (or `${MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS}`,
`${MAGNUM_WINDOWLESSAPPLICATION_LIBRARIES}` for windowless applications), but
only if only one application (windowless application) component is requested to
avoid ambiguity. Changing the build script to use different toolkit is then
@ -263,30 +263,59 @@ MyApplication::MyApplication(int& argc, char** argv): Platform::Application(argc
@section platform-custom Using custom platform toolkits
In case you want to use some not-yet-supported toolkit or you don't want to use
the wrappers in @ref Platform namespace, you can initialize %Magnum manually.
All you need is to create OpenGL context and then create instance of
@ref Context class, which will take care of proper initialization and feature
detection. The instance must be alive for whole application lifetime. Example
`main()` function with manual initialization:
the application wrappers in @ref Platform namespace, you can initialize %Magnum
manually. First create OpenGL context and then create instance of
@ref Platform::Context class, which will take care of proper initialization and
feature detection. The instance must be alive for whole application lifetime.
Example `main()` function with manual initialization:
@code
int main(int argc, char** argv) {
// Create OpenGL context ...
{
// Initialize Magnum
Context context;
Platform::Context context;
// open window, enter main loop...
// Open window, enter main loop ...
// Magnum context gets destroyed
}
// delete OpenGL context ...
// Delete OpenGL context ...
return 0;
}
@endcode
On majority of platforms the @ref Platform::Context class does GL function
pointer loading using platform-specific APIs. In that case you also need to
find particular `*Context` library, add its include dir and then link to it.
These platform-specific libraries are available:
- `CglContext` -- CGL context (Mac OS X)
- `GlxContext` -- GLX context (X11-based Unix)
- `WglContext` -- WGL context (Windows)
Systems not listed here (such as Emscripten or NaCl) don't need any `Context`
library, because dynamic function pointer loading is not available on these.
For example, when you create the OpenGL context using GLX, you need to find
`GlxContext` component, include `${MAGNUM_GLCCONTEXT_INCLUDE_DIRS}` and link to
`${MAGNUM_GLXCONTEXT_LIBRARIES}`. Similarly to application libraries, you can
also use generic `${MAGNUM_CONTEXT_INCLUDE_DIRS}` and `${MAGNUM_CONTEXT_LIBRARIES}`,
providing you requested only one `*Context` component in the `find_package()`
call. Complete example:
@code
find_package(Magnum REQUIRED GlxContext)
include_directories(${MAGNUM_INCLUDE_DIRS} ${MAGNUM_CONTEXT_INCLUDE_DIRS})
add_executable(myapplication MyCustomApplication.cpp)
target_link_libraries(myapplication
${MAGNUM_LIBRARIES}
${MAGNUM_CONTEXT_LIBRARIES})
@endcode
- Next page: @ref types
*/
}}

42
modules/FindMagnum.cmake

@ -60,6 +60,9 @@
# WindowlessGlxApplication - Windowless GLX application
# WindowlessNaClApplication - Windowless NaCl application
# WindowlessWglApplication - Windowless WGL application
# CglContext - CGL context
# GlxContext - GLX context
# WglContext - WGL context
# Example usage with specifying additional components is:
# find_package(Magnum [REQUIRED|COMPONENTS]
# MeshTools Primitives GlutApplication)
@ -71,7 +74,10 @@
# component is requested and found, its libraries and include dirs are
# available in convenience aliases MAGNUM_APPLICATION_LIBRARIES /
# MAGNUM_WINDOWLESSAPPLICATION_LIBRARIES and MAGNUM_APPLICATION_INCLUDE_DIRS
# / MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS to simplify porting.
# / MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS to simplify porting. Similarly,
# if exactly one *Context component is requested and found, its libraries and
# include dirs are available in convenience aliases MAGNUM_CONTEXT_LIBRARIES
# and MAGNUM_CONTEXT_INCLUDE_DIRS.
#
# The package is found if either debug or release version of each requested
# library (or plugin) is found. If both debug and release libraries (or
@ -409,6 +415,24 @@ foreach(component ${Magnum_FIND_COMPONENTS})
${_MAGNUM_${_COMPONENT}_LIBRARIES}
${_WINDOWCONTEXT_MAGNUM_LIBRARIES_DEPENDENCY})
# Context libraries
elseif(${component} MATCHES .+Context)
set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/Platform)
set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES Context.h)
# GLX context dependencies
if(${component} STREQUAL GlxContext)
find_package(X11)
if(X11_FOUND)
set(_MAGNUM_${_COMPONENT}_LIBRARIES ${X11_LIBRARIES})
else()
unset(MAGNUM_${_COMPONENT}_LIBRARY)
endif()
endif()
# No additional dependencies for CGL context
# No additional dependencies for WGL context
# Audio library
elseif(${component} STREQUAL Audio)
find_package(OpenAL)
@ -456,8 +480,8 @@ foreach(component ${Magnum_FIND_COMPONENTS})
MAGNUM_${_COMPONENT}_LIBRARY
_MAGNUM_${_COMPONENT}_INCLUDE_DIR)
# Global aliases for Windowless*Application and *Application components.
# If already set, unset them to avoid ambiguity.
# Global aliases for Windowless*Application and *Application
# components. If already set, unset them to avoid ambiguity.
if(${component} MATCHES Windowless.+Application)
if(NOT DEFINED MAGNUM_WINDOWLESSAPPLICATION_LIBRARIES AND NOT DEFINED MAGNUM_WINDOWLESSAPPLICATION_INCLUDE_DIRS)
set(MAGNUM_WINDOWLESSAPPLICATION_LIBRARIES ${MAGNUM_${_COMPONENT}_LIBRARIES})
@ -475,6 +499,18 @@ foreach(component ${Magnum_FIND_COMPONENTS})
unset(MAGNUM_APPLICATION_INCLUDE_DIRS)
endif()
endif()
# Global aliases for *Context components. If already set, unset them to
# avoid ambiguity.
if(${component} MATCHES .+Context)
if(NOT DEFINED MAGNUM_CONTEXT_LIBRARIES AND NOT DEFINED MAGNUM_CONTEXT_INCLUDE_DIRS)
set(MAGNUM_CONTEXT_LIBRARIES ${MAGNUM_${_COMPONENT}_LIBRARIES})
set(MAGNUM_CONTEXT_INCLUDE_DIRS ${MAGNUM_${_COMPONENT}_INCLUDE_DIRS})
else()
unset(MAGNUM_CONTEXT_LIBRARIES)
unset(MAGNUM_CONTEXT_INCLUDE_DIRS)
endif()
endif()
else()
set(Magnum_${component}_FOUND FALSE)
endif()

1
package/archlinux/PKGBUILD

@ -27,6 +27,7 @@ build() {
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/PKGBUILD-clang

@ -31,6 +31,7 @@ build() {
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/PKGBUILD-clang-libc++

@ -33,6 +33,7 @@ build() {
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/PKGBUILD-es2desktop

@ -25,6 +25,7 @@ build() {
-DWITH_SDL2APPLICATION=ON \
-DWITH_GLXAPPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_OBJIMPORTER=ON \
-DWITH_TGAIMAGECONVERTER=ON \

1
package/archlinux/PKGBUILD-es3desktop

@ -25,6 +25,7 @@ build() {
-DWITH_SDL2APPLICATION=ON \
-DWITH_GLXAPPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_OBJIMPORTER=ON \
-DWITH_TGAIMAGECONVERTER=ON \

1
package/archlinux/PKGBUILD-gcc47

@ -31,6 +31,7 @@ build() {
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/PKGBUILD-mingw-w64

@ -22,6 +22,7 @@ build() {
-DWITH_GLUTAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSWGLAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/PKGBUILD-release

@ -23,6 +23,7 @@ build() {
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/archlinux/magnum-git/PKGBUILD

@ -43,6 +43,7 @@ build() {
-DWITH_SDL2APPLICATION=ON \
-DWITH_GLXAPPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

1
package/ci/jenkins.xml

@ -143,6 +143,7 @@ cmake .. \
-DWITH_GLXAPPLICATION=ON \
-DWITH_SDL2APPLICATION=ON \
-DWITH_XEGLAPPLICATION=${es_flag} \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=${desktop_flag} \
-DWITH_OBJIMPORTER=ON \

1
package/debian/rules vendored

@ -9,6 +9,7 @@ override_dh_auto_configure:
-DWITH_GLUTAPPLICATION=ON \
-DWITH_GLXAPPLICATION=ON \
-DWITH_WINDOWLESSGLXAPPLICATION=ON \
-DWITH_GLXCONTEXT=ON \
-DWITH_MAGNUMFONT=ON \
-DWITH_MAGNUMFONTCONVERTER=ON \
-DWITH_OBJIMPORTER=ON \

37
src/Magnum/AbstractFramebuffer.cpp

@ -132,19 +132,27 @@ FramebufferTarget AbstractFramebuffer::bindInternal() {
void AbstractFramebuffer::blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter) {
source.bindInternal(FramebufferTarget::Read);
destination.bindInternal(FramebufferTarget::Draw);
/** @todo Re-enable when extension loader is available for ES, add also ANGLE version */
#ifndef MAGNUM_TARGET_GLES2
glBlitFramebuffer(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
#else
static_cast<void>(sourceRectangle);
static_cast<void>(destinationRectangle);
static_cast<void>(mask);
static_cast<void>(filter);
//glBlitFramebufferNV(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
CORRADE_INTERNAL_ASSERT(false);
Context::current()->state().framebuffer->blitImplementation(sourceRectangle, destinationRectangle, mask, filter);
#endif
}
#ifdef MAGNUM_TARGET_GLES2
void AbstractFramebuffer::blitImplementationANGLE(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter) {
/** @todo Re-enable when extension loader is available for ES */
CORRADE_INTERNAL_ASSERT(false);
//glBlitFramebufferANGLE(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
}
void AbstractFramebuffer::blitImplementationNV(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter) {
/** @todo Re-enable when extension loader is available for ES */
CORRADE_INTERNAL_ASSERT(false);
//glBlitFramebufferNV(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
}
#endif
AbstractFramebuffer& AbstractFramebuffer::setViewport(const Range2Di& rectangle) {
_viewport = rectangle;
@ -196,11 +204,7 @@ void AbstractFramebuffer::read(const Vector2i& offset, const Vector2i& size, Ima
#ifndef MAGNUM_TARGET_GLES2
void AbstractFramebuffer::read(const Vector2i& offset, const Vector2i& size, BufferImage2D& image, BufferUsage usage) {
#ifndef MAGNUM_TARGET_GLES2
bindInternal(FramebufferTarget::Read);
#else
bindInternal(readTarget);
#endif
/* If the buffer doesn't have sufficient size, resize it */
/** @todo Explicitly reset also when buffer usage changes */
if(image.size() != size)
@ -225,20 +229,13 @@ void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, c
#endif
}
#ifndef MAGNUM_TARGET_GLES2
void AbstractFramebuffer::invalidateImplementationNoOp(GLsizei, const GLenum*, const Range2Di&) {}
void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, const GLenum* const attachments, const Range2Di& rectangle) {
/** @todo Re-enable when extension loader is available for ES */
#ifndef MAGNUM_TARGET_GLES2
glInvalidateSubFramebuffer(GLenum(bindInternal()), count, attachments, rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY());
#else
static_cast<void>(count);
static_cast<void>(attachments);
static_cast<void>(rectangle);
CORRADE_INTERNAL_ASSERT(false);
//glDiscardSubFramebufferEXT(GLenum(bindInternal()), count, attachments, rectangle.left(), rectangle.bottom(), rectangle.width(), rectangle.height());
#endif
}
#endif
GLenum AbstractFramebuffer::checkStatusImplementationDefault(const FramebufferTarget target) {
bindInternal(target);

11
src/Magnum/AbstractFramebuffer.h

@ -200,8 +200,8 @@ class MAGNUM_EXPORT AbstractFramebuffer {
* @brief Max supported dual-source draw buffer count
*
* The result is cached, repeated queries don't result in repeated
* OpenGL calls. If extension @extension{ARB,blend_func_extended} is
* not available, returns `0`.
* OpenGL calls. If extension @extension{ARB,blend_func_extended} (part
* of OpenGL 3.3) is not available, returns `0`.
* @see @ref DefaultFramebuffer::mapForDraw(), @ref Framebuffer::mapForDraw(),
* @fn_gl{Get} with @def_gl{MAX_DUAL_SOURCE_DRAW_BUFFERS}
* @requires_gl Multiple blending inputs are not available in
@ -342,6 +342,11 @@ class MAGNUM_EXPORT AbstractFramebuffer {
Range2Di _viewport;
private:
#ifdef MAGNUM_TARGET_GLES2
static void MAGNUM_LOCAL blitImplementationANGLE(const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter);
static void MAGNUM_LOCAL blitImplementationNV(const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter);
#endif
GLenum MAGNUM_LOCAL checkStatusImplementationDefault(FramebufferTarget target);
#ifndef MAGNUM_TARGET_GLES
GLenum MAGNUM_LOCAL checkStatusImplementationDSA(FramebufferTarget target);
@ -368,8 +373,10 @@ class MAGNUM_EXPORT AbstractFramebuffer {
void MAGNUM_LOCAL invalidateImplementationNoOp(GLsizei, const GLenum*);
void MAGNUM_LOCAL invalidateImplementationDefault(GLsizei count, const GLenum* attachments);
#ifndef MAGNUM_TARGET_GLES2
void MAGNUM_LOCAL invalidateImplementationNoOp(GLsizei, const GLenum*, const Range2Di&);
void MAGNUM_LOCAL invalidateImplementationDefault(GLsizei count, const GLenum* attachments, const Range2Di& rectangle);
#endif
};
inline AbstractFramebuffer::AbstractFramebuffer() = default;

35
src/Magnum/AbstractTexture.cpp

@ -378,8 +378,8 @@ void AbstractTexture::bindInternal() {
ColorFormat AbstractTexture::imageFormatForInternalFormat(const TextureFormat internalFormat) {
switch(internalFormat) {
case TextureFormat::Red:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::R8:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::R8Snorm:
#endif
#ifndef MAGNUM_TARGET_GLES
@ -408,8 +408,8 @@ ColorFormat AbstractTexture::imageFormatForInternalFormat(const TextureFormat in
#endif
case TextureFormat::RG:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::RG8:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::RG8Snorm:
#endif
#ifndef MAGNUM_TARGET_GLES
@ -456,7 +456,9 @@ ColorFormat AbstractTexture::imageFormatForInternalFormat(const TextureFormat in
case TextureFormat::RGB5:
#endif
case TextureFormat::RGB565:
#ifndef MAGNUM_TARGET_GLES3
case TextureFormat::RGB10:
#endif
#ifndef MAGNUM_TARGET_GLES
case TextureFormat::RGB12:
#endif
@ -567,10 +569,8 @@ ColorType AbstractTexture::imageTypeForInternalFormat(const TextureFormat intern
case TextureFormat::RG:
case TextureFormat::RGB:
case TextureFormat::RGBA:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::R8:
case TextureFormat::RG8:
#endif
case TextureFormat::RGB8:
case TextureFormat::RGBA8:
#ifndef MAGNUM_TARGET_GLES2
@ -699,7 +699,9 @@ ColorType AbstractTexture::imageTypeForInternalFormat(const TextureFormat intern
case TextureFormat::RGB565:
return ColorType::UnsignedShort565;
#ifndef MAGNUM_TARGET_GLES3
case TextureFormat::RGB10:
#endif
case TextureFormat::RGB10A2:
#ifndef MAGNUM_TARGET_GLES2
case TextureFormat::RGB10A2UI:
@ -841,17 +843,7 @@ void AbstractTexture::storageImplementationFallback(const GLenum target, const G
void AbstractTexture::storageImplementationDefault(GLenum target, GLsizei levels, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size) {
bindInternal();
/** @todo Re-enable when extension loader is available for ES */
#ifndef MAGNUM_TARGET_GLES2
glTexStorage1D(target, levels, GLenum(internalFormat), size[0]);
#else
static_cast<void>(target);
static_cast<void>(levels);
static_cast<void>(internalFormat);
static_cast<void>(size);
CORRADE_INTERNAL_ASSERT(false);
//glTexStorage2DEXT(target, levels, GLenum(internalFormat), size.x(), size.y());
#endif
}
void AbstractTexture::storageImplementationDSA(GLenum target, GLsizei levels, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size) {
@ -1017,19 +1009,8 @@ void AbstractTexture::getImageImplementationDSA(const GLenum target, const GLint
}
void AbstractTexture::getImageImplementationRobustness(const GLenum target, const GLint level, const ColorFormat format, const ColorType type, const std::size_t dataSize, GLvoid* const data) {
/** @todo Re-enable when extension loader is available for ES */
#ifndef MAGNUM_TARGET_GLES
bindInternal();
glGetnTexImageARB(target, level, GLenum(format), GLenum(type), dataSize, data);
#else
static_cast<void>(target);
static_cast<void>(level);
static_cast<void>(format);
static_cast<void>(type);
static_cast<void>(dataSize);
static_cast<void>(data);
CORRADE_INTERNAL_ASSERT(false);
#endif
}
#endif
@ -1322,10 +1303,6 @@ void AbstractTexture::DataHelper<1>::setWrapping(AbstractTexture& texture, const
#endif
void AbstractTexture::DataHelper<2>::setWrapping(AbstractTexture& texture, const Array2D<Sampler::Wrapping>& wrapping) {
#ifndef MAGNUM_TARGET_GLES
CORRADE_ASSERT(texture._target != GL_TEXTURE_RECTANGLE || ((wrapping.x() == Sampler::Wrapping::ClampToEdge || wrapping.x() == Sampler::Wrapping::ClampToBorder) && (wrapping.y() == Sampler::Wrapping::ClampToEdge || wrapping.y() == Sampler::Wrapping::ClampToBorder)), "Texture2D::setWrapping(): rectangle texture must be clamped to border or to edge", );
#endif
const Implementation::TextureState& state = *Context::current()->state().texture;
(texture.*state.parameteriImplementation)(GL_TEXTURE_WRAP_S, GLint(wrapping.x()));

6
src/Magnum/CMakeLists.txt

@ -150,7 +150,7 @@ if(NOT TARGET_GLES)
CubeMapTextureArray.cpp
MultisampleTexture.cpp
RectangleTexture.cpp
$<TARGET_OBJECTS:MagnumGLLoadGenObjects>)
$<TARGET_OBJECTS:MagnumFlextGLObjects>)
endif()
# Non-ES2 stuff
@ -182,10 +182,10 @@ if(NOT BUILD_STATIC OR BUILD_STATIC_PIC)
# Set shared library flags for the objects, as they will be part of shared lib
# TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property
set_target_properties(MagnumMathObjects PROPERTIES COMPILE_FLAGS "-DMagnumMathObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
set_target_properties(Magnum PROPERTIES COMPILE_FLAGS "-DGLLoadGen_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
set_target_properties(Magnum PROPERTIES COMPILE_FLAGS "-DFlextGL_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
else()
set_target_properties(MagnumMathObjects PROPERTIES COMPILE_FLAGS "-DMagnumMathObjects_EXPORTS")
set_target_properties(Magnum PROPERTIES COMPILE_FLAGS "-DGLLoadGen_EXPORTS")
set_target_properties(Magnum PROPERTIES COMPILE_FLAGS "-DFlextGL_EXPORTS")
endif()
set(Magnum_LIBS

14
src/Magnum/Context.cpp

@ -294,17 +294,9 @@ const std::vector<Extension>& Extension::extensions(Version version) {
Context* Context::_current = nullptr;
Context::Context() {
#ifndef MAGNUM_TARGET_GLES
/* Init glLoadGen. Ignore functions that failed to load (described by
`ogl_LOAD_SUCCEEDED + n` return code), as we requested the latest OpenGL
with many vendor extensions and there won't ever be a driver supporting
everything possible. */
if(ogl_LoadFunctions() == ogl_LOAD_FAILED) {
Error() << "ExtensionWrangler: cannot initialize glLoadGen";
std::exit(64);
}
#endif
Context::Context(void functionLoader()) {
/* Load GL function pointers */
if(functionLoader) functionLoader();
/* Get version */
#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2)

28
src/Magnum/Context.h

@ -46,9 +46,8 @@
namespace Magnum {
namespace Implementation {
struct State;
}
namespace Implementation { struct State; }
namespace Platform { class Context; }
/**
@brief Run-time information about OpenGL extension
@ -92,11 +91,15 @@ class MAGNUM_EXPORT Extension {
Provides access to version and extension information. Instance available
through @ref Context::current() is automatically created during construction of
*Application classes in @ref Platform namespace. You can safely assume that the
instance is available during whole lifetime of *Application object. See
@ref platform documentation for more information about engine setup.
`*Application` classes in @ref Platform namespace. You can safely assume that
the instance is available during whole lifetime of `*Application` object. It's
also possible to create the context without using any `*Application` class
using @ref Platform::Context subclass, see @ref platform documentation for more
information.
*/
class MAGNUM_EXPORT Context {
friend class Platform::Context;
public:
/**
* @brief %Context flag
@ -203,17 +206,6 @@ class MAGNUM_EXPORT Context {
*/
typedef Containers::EnumSet<DetectedDriver, UnsignedShort> DetectedDrivers;
/**
* @brief Constructor
*
* Does initial setup, detects available features and enables them
* throughout the engine.
* @see @fn_gl{Get} with @def_gl{MAJOR_VERSION}, @def_gl{MINOR_VERSION},
* @def_gl{CONTEXT_FLAGS}, @def_gl{NUM_EXTENSIONS},
* @fn_gl{GetString} with @def_gl{EXTENSIONS}
*/
explicit Context();
/** @brief Copying is not allowed */
Context(const Context&) = delete;
@ -482,6 +474,8 @@ class MAGNUM_EXPORT Context {
private:
static Context* _current;
explicit Context(void functionLoader());
MAGNUM_LOCAL void setupDriverWorkarounds();
Version _version;

39
src/Magnum/DebugMessage.cpp

@ -98,10 +98,6 @@ Int DebugMessage::maxMessageLength() {
return value;
}
void DebugMessage::insert(const Source source, const Type type, const UnsignedInt id, const Severity severity, const std::string& string) {
Context::current()->state().debug->messageInsertImplementation(source, type, id, severity, string);
}
void DebugMessage::setCallback(const Callback callback, const void* userParam) {
Context::current()->state().debug->messageCallbackImplementation(callback, userParam);
}
@ -110,9 +106,13 @@ void DebugMessage::setDefaultCallback() {
setCallback(defaultCallback, nullptr);
}
void DebugMessage::insertImplementationNoOp(Source, Type, UnsignedInt, Severity, const std::string&) {}
void DebugMessage::insertInternal(const Source source, const Type type, const UnsignedInt id, const Severity severity, const Containers::ArrayReference<const char> string) {
Context::current()->state().debug->messageInsertImplementation(source, type, id, severity, string);
}
void DebugMessage::insertImplementationNoOp(Source, Type, UnsignedInt, Severity, const Containers::ArrayReference<const char>) {}
void DebugMessage::insertImplementationKhr(const Source source, const Type type, const UnsignedInt id, const Severity severity, const std::string& string) {
void DebugMessage::insertImplementationKhr(const Source source, const Type type, const UnsignedInt id, const Severity severity, const Containers::ArrayReference<const char> string) {
/** @todo Re-enable when extension wrangler is available for ES */
#ifndef MAGNUM_TARGET_GLES
glDebugMessageInsert(GLenum(source), GLenum(type), id, GLenum(severity), string.size(), string.data());
@ -127,7 +127,7 @@ void DebugMessage::insertImplementationKhr(const Source source, const Type type,
#endif
}
void DebugMessage::insertImplementationExt(Source, Type, UnsignedInt, Severity, const std::string& string) {
void DebugMessage::insertImplementationExt(Source, Type, UnsignedInt, Severity, const Containers::ArrayReference<const char> string) {
/** @todo Re-enable when extension wrangler is available for ES */
#ifndef MAGNUM_TARGET_GLES
glInsertEventMarkerEXT(string.size(), string.data());
@ -138,11 +138,32 @@ void DebugMessage::insertImplementationExt(Source, Type, UnsignedInt, Severity,
}
#ifndef MAGNUM_TARGET_GLES
void DebugMessage::insertImplementationGremedy(Source, Type, UnsignedInt, Severity, const std::string& string) {
glStringMarkerGREMEDY(string.length(), string.data());
void DebugMessage::insertImplementationGremedy(Source, Type, UnsignedInt, Severity, const Containers::ArrayReference<const char> string) {
glStringMarkerGREMEDY(string.size(), string.data());
}
#endif
void DebugMessage::setEnabledInternal(const GLenum source, const GLenum type, const GLenum severity, const std::initializer_list<UnsignedInt> ids, const bool enabled) {
Context::current()->state().debug->messageControlImplementation(source, type, severity, ids, enabled);
}
void DebugMessage::controlImplementationNoOp(GLenum, GLenum, GLenum, std::initializer_list<UnsignedInt>, bool) {}
void DebugMessage::controlImplementationKhr(const GLenum source, const GLenum type, const GLenum severity, const std::initializer_list<UnsignedInt> ids, const bool enabled) {
/** @todo Re-enable when extension wrangler is available for ES */
#ifndef MAGNUM_TARGET_GLES
glDebugMessageControl(source, type, severity, ids.size(), ids.begin(), enabled);
#else
static_cast<void>(source);
static_cast<void>(type);
static_cast<void>(severity);
static_cast<void>(ids);
static_cast<void>(enabled);
CORRADE_INTERNAL_ASSERT(false);
//glDebugMessageControlKHR(source, type, severity, ids.size(), ids.begin(), enabled);
#endif
}
void DebugMessage::callbackImplementationNoOp(Callback, const void*) {}
void DebugMessage::callbackImplementationKhr(const Callback callback, const void* userParam) {

72
src/Magnum/DebugMessage.h

@ -30,6 +30,7 @@
*/
#include <string>
#include <Corrade/Containers/Array.h>
#include "Magnum/Magnum.h"
#include "Magnum/OpenGL.h"
@ -272,7 +273,63 @@ class MAGNUM_EXPORT DebugMessage {
* @fn_gl_extension2{InsertEventMarker,EXT,debug_marker} or
* @fn_gl_extension{StringMarker,GREMEDY,string_marker}
*/
static void insert(Source source, Type type, UnsignedInt id, Severity severity, const std::string& string);
static void insert(Source source, Type type, UnsignedInt id, Severity severity, const std::string& string) {
insertInternal(source, type, id, severity, {string.data(), string.size()});
}
/** @overload */
template<std::size_t size> static void insert(Source source, Type type, UnsignedInt id, Severity severity, const char(&string)[size]) {
insertInternal(source, type, id, severity, {string, size - 1});
}
/**
* @brief Enable or disable particular message type
*
* @see @ref Renderer::Feature::DebugOutput, @fn_gl{DebugMessageControl}
*/
static void setEnabled(Source source, Type type, std::initializer_list<UnsignedInt> ids, bool enabled) {
setEnabledInternal(GLenum(source), GLenum(type), GL_DONT_CARE, ids, enabled);
}
/** @overload */
static void setEnabled(Source source, Type type, Severity severity, bool enabled) {
setEnabledInternal(GLenum(source), GLenum(type), GLenum(severity), {}, enabled);
}
/** @overload */
static void setEnabled(Source source, Type type, bool enabled) {
setEnabledInternal(GLenum(source), GLenum(type), GL_DONT_CARE, {}, enabled);
}
/** @overload */
static void setEnabled(Source source, Severity severity, bool enabled) {
setEnabledInternal(GLenum(source), GL_DONT_CARE, GLenum(severity), {}, enabled);
}
/** @overload */
static void setEnabled(Source source, bool enabled) {
setEnabledInternal(GLenum(source), GL_DONT_CARE, GL_DONT_CARE, {}, enabled);
}
/** @overload */
static void setEnabled(Type type, Severity severity, bool enabled) {
setEnabledInternal(GL_DONT_CARE, GLenum(type), GLenum(severity), {}, enabled);
}
/** @overload */
static void setEnabled(Type type, bool enabled) {
setEnabledInternal(GL_DONT_CARE, GLenum(type), GL_DONT_CARE, {}, enabled);
}
/** @overload */
static void setEnabled(Severity severity, bool enabled) {
setEnabledInternal(GL_DONT_CARE, GL_DONT_CARE, GLenum(severity), {}, enabled);
}
/** @overload */
static void setEnabled(bool enabled) {
setEnabledInternal(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, {}, enabled);
}
/**
* @brief Set debug message callback
@ -306,13 +363,18 @@ class MAGNUM_EXPORT DebugMessage {
DebugMessage() = delete;
private:
static MAGNUM_LOCAL void insertImplementationNoOp(Source, Type, UnsignedInt, Severity, const std::string&);
static MAGNUM_LOCAL void insertImplementationKhr(Source source, Type type, UnsignedInt id, Severity severity, const std::string& string);
static MAGNUM_LOCAL void insertImplementationExt(Source, Type, UnsignedInt, Severity, const std::string& string);
static void insertInternal(Source source, Type type, UnsignedInt id, Severity severity, Containers::ArrayReference<const char> string);
static MAGNUM_LOCAL void insertImplementationNoOp(Source, Type, UnsignedInt, Severity, Containers::ArrayReference<const char>);
static MAGNUM_LOCAL void insertImplementationKhr(Source source, Type type, UnsignedInt id, Severity severity, Containers::ArrayReference<const char> string);
static MAGNUM_LOCAL void insertImplementationExt(Source, Type, UnsignedInt, Severity, Containers::ArrayReference<const char> string);
#ifndef MAGNUM_TARGET_GLES
static MAGNUM_LOCAL void insertImplementationGremedy(Source, Type, UnsignedInt, Severity, const std::string& string);
static MAGNUM_LOCAL void insertImplementationGremedy(Source, Type, UnsignedInt, Severity, Containers::ArrayReference<const char> string);
#endif
static void setEnabledInternal(GLenum source, GLenum type, GLenum severity, std::initializer_list<UnsignedInt> ids, bool enabled);
static MAGNUM_LOCAL void controlImplementationNoOp(GLenum, GLenum, GLenum, std::initializer_list<UnsignedInt>, bool);
static MAGNUM_LOCAL void controlImplementationKhr(GLenum source, GLenum type, GLenum severity, std::initializer_list<UnsignedInt> ids, bool enabled);
static MAGNUM_LOCAL void callbackImplementationNoOp(Callback, const void*);
static MAGNUM_LOCAL void callbackImplementationKhr(Callback callback, const void* userParam);
};

2
src/Magnum/DebugTools/Test/ForceRendererTest.cpp

@ -103,7 +103,7 @@ void ForceRendererTest::arbitrary3D() {
CORRADE_COMPARE(Vector3::dot(m.right(), m.up()), 0.0f);
CORRADE_COMPARE(Vector3::dot(m.right(), m.backward()), 0.0f);
/** @todo This shouldn't be too different */
CORRADE_VERIFY(Math::abs(Vector3::dot(m.up(), m.backward())) < Math::TypeTraits<Float>::epsilon());
CORRADE_VERIFY(Math::abs(Vector3::dot(m.up(), m.backward())) < Math::TypeTraits<Float>::epsilon());
}
}}}}

2
src/Magnum/DefaultFramebuffer.cpp

@ -80,6 +80,7 @@ void DefaultFramebuffer::invalidate(std::initializer_list<InvalidationAttachment
(this->*Context::current()->state().framebuffer->invalidateImplementation)(attachments.size(), _attachments);
}
#ifndef MAGNUM_TARGET_GLES2
void DefaultFramebuffer::invalidate(std::initializer_list<InvalidationAttachment> attachments, const Range2Di& rectangle) {
/** @todo C++14: use VLA to avoid heap allocation */
Containers::Array<GLenum> _attachments(attachments.size());
@ -88,6 +89,7 @@ void DefaultFramebuffer::invalidate(std::initializer_list<InvalidationAttachment
(this->*Context::current()->state().framebuffer->invalidateSubImplementation)(attachments.size(), _attachments, rectangle);
}
#endif
void DefaultFramebuffer::initializeContextBasedFunctionality(Context& context) {
Implementation::FramebufferState* state = context.state().framebuffer;

12
src/Magnum/DefaultFramebuffer.h

@ -404,12 +404,11 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer {
* @param rectangle %Rectangle to invalidate
*
* If extension @extension{ARB,invalidate_subdata} (part of OpenGL
* 4.3), extension @es_extension{EXT,discard_framebuffer} in OpenGL ES
* 2.0 or OpenGL ES 3.0 is not available, this function does nothing.
* 4.3) or OpenGL ES 3.0 is not available, this function does nothing.
* The framebuffer is bound to some target before the operation, if not
* already.
* @see @fn_gl{InvalidateSubFramebuffer} or @fn_gles_extension{DiscardSubFramebuffer,EXT,discard_framebuffer}
* on OpenGL ES 2.0
* @see @ref invalidate(std::initializer_list<InvalidationAttachment>),
* @fn_gl{InvalidateSubFramebuffer}
*/
void invalidate(std::initializer_list<InvalidationAttachment> attachments, const Range2Di& rectangle);
@ -431,6 +430,11 @@ extern DefaultFramebuffer MAGNUM_EXPORT defaultFramebuffer;
/** @debugoperatorclassenum{Magnum::DefaultFramebuffer,Magnum::DefaultFramebuffer::Status} */
Debug MAGNUM_EXPORT operator<<(Debug debug, DefaultFramebuffer::Status value);
#ifdef MAGNUM_TARGET_GLES2
/* No-op implementation on ES2 */
inline void DefaultFramebuffer::invalidate(std::initializer_list<InvalidationAttachment>, const Range2Di&) {}
#endif
}
#endif

14
src/Magnum/Framebuffer.cpp

@ -157,6 +157,7 @@ void Framebuffer::invalidate(std::initializer_list<InvalidationAttachment> attac
(this->*Context::current()->state().framebuffer->invalidateImplementation)(attachments.size(), _attachments);
}
#ifndef MAGNUM_TARGET_GLES2
void Framebuffer::invalidate(std::initializer_list<InvalidationAttachment> attachments, const Range2Di& rectangle) {
/** @todo C++14: use VLA to avoid heap allocation */
Containers::Array<GLenum> _attachments(attachments.size());
@ -165,6 +166,7 @@ void Framebuffer::invalidate(std::initializer_list<InvalidationAttachment> attac
(this->*Context::current()->state().framebuffer->invalidateSubImplementation)(attachments.size(), _attachments, rectangle);
}
#endif
Framebuffer& Framebuffer::attachRenderbuffer(const BufferAttachment attachment, Renderbuffer& renderbuffer) {
(this->*Context::current()->state().framebuffer->renderbufferImplementation)(attachment, renderbuffer);
@ -184,13 +186,13 @@ Framebuffer& Framebuffer::attachTexture(const BufferAttachment attachment, Textu
}
#ifndef MAGNUM_TARGET_GLES
Framebuffer& Framebuffer::attachTexture(const BufferAttachment attachment, RectangleTexture& texture, const Int level) {
(this->*Context::current()->state().framebuffer->texture2DImplementation)(attachment, GL_TEXTURE_RECTANGLE, texture.id(), level);
Framebuffer& Framebuffer::attachTexture(const BufferAttachment attachment, RectangleTexture& texture) {
(this->*Context::current()->state().framebuffer->texture2DImplementation)(attachment, GL_TEXTURE_RECTANGLE, texture.id(), 0);
return *this;
}
Framebuffer& Framebuffer::attachTexture(const BufferAttachment attachment, MultisampleTexture2D& texture, const Int level) {
(this->*Context::current()->state().framebuffer->texture2DImplementation)(attachment, GL_TEXTURE_2D_MULTISAMPLE, texture.id(), level);
Framebuffer& Framebuffer::attachTexture(const BufferAttachment attachment, MultisampleTexture2D& texture) {
(this->*Context::current()->state().framebuffer->texture2DImplementation)(attachment, GL_TEXTURE_2D_MULTISAMPLE, texture.id(), 0);
return *this;
}
#endif
@ -225,8 +227,8 @@ Framebuffer& Framebuffer::attachTextureLayer(Framebuffer::BufferAttachment attac
return *this;
}
Framebuffer& Framebuffer::attachTextureLayer(Framebuffer::BufferAttachment attachment, MultisampleTexture2DArray& texture, Int level, Int layer) {
(this->*Context::current()->state().framebuffer->textureLayerImplementation)(attachment, texture.id(), level, layer);
Framebuffer& Framebuffer::attachTextureLayer(Framebuffer::BufferAttachment attachment, MultisampleTexture2DArray& texture, Int layer) {
(this->*Context::current()->state().framebuffer->textureLayerImplementation)(attachment, texture.id(), 0, layer);
return *this;
}
#endif

22
src/Magnum/Framebuffer.h

@ -309,8 +309,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
* @brief Max supported color attachment count
*
* The result is cached, repeated queries don't result in repeated
* OpenGL calls. If ES extension @extension{NV,fbo_color_attachments}
* is not available, returns `0`.
* OpenGL calls. If neither OpenGL ES 3.0 nor ES extension
* @extension{NV,fbo_color_attachments} is available, returns `0`.
* @see @ref mapForDraw(), @fn_gl{Get} with @def_gl{MAX_COLOR_ATTACHMENTS}
*/
static Int maxColorAttachments();
@ -474,12 +474,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
* @param rectangle %Rectangle to invalidate
*
* If extension @extension{ARB,invalidate_subdata} (part of OpenGL
* 4.3), extension @es_extension{EXT,discard_framebuffer} in OpenGL ES
* 2.0 or OpenGL ES 3.0 is not available, this function does nothing.
* 4.3) or OpenGL ES 3.0 is not available, this function does nothing.
* The framebuffer is bound to some target before the operation, if not
* already.
* @see @fn_gl{InvalidateFramebuffer} or @fn_gles_extension{DiscardFramebuffer,EXT,discard_framebuffer}
* on OpenGL ES 2.0
* @see @ref invalidate(std::initializer_list<InvalidationAttachment>),
* @fn_gl{InvalidateFramebuffer}
*/
void invalidate(std::initializer_list<InvalidationAttachment> attachments, const Range2Di& rectangle);
@ -539,13 +538,13 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
* @requires_gl31 %Extension @extension{ARB,texture_rectangle}
* @requires_gl Rectangle textures are not available in OpenGL ES.
*/
Framebuffer& attachTexture(BufferAttachment attachment, RectangleTexture& texture, Int level);
Framebuffer& attachTexture(BufferAttachment attachment, RectangleTexture& texture);
/** @overload
* @requires_gl32 %Extension @extension{ARB,texture_multisample}
* @requires_gl Multisample textures are not available in OpenGL ES.
*/
Framebuffer& attachTexture(BufferAttachment attachment, MultisampleTexture2D& texture, Int level);
Framebuffer& attachTexture(BufferAttachment attachment, MultisampleTexture2D& texture);
#endif
/**
@ -611,7 +610,7 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
* @requires_gl32 %Extension @extension{ARB,texture_multisample}
* @requires_gl Multisample textures are not available in OpenGL ES.
*/
Framebuffer& attachTextureLayer(BufferAttachment attachment, MultisampleTexture2DArray& texture, Int level, Int layer);
Framebuffer& attachTextureLayer(BufferAttachment attachment, MultisampleTexture2DArray& texture, Int layer);
#endif
#ifdef MAGNUM_BUILD_DEPRECATED
@ -688,6 +687,11 @@ inline Framebuffer& Framebuffer::operator=(Framebuffer&& other) noexcept {
return *this;
}
#ifdef MAGNUM_TARGET_GLES2
/* No-op implementation on ES2 */
inline void Framebuffer::invalidate(std::initializer_list<InvalidationAttachment>, const Range2Di&) {}
#endif
}
#endif

2
src/Magnum/Implementation/DebugState.cpp

@ -38,6 +38,7 @@ DebugState::DebugState(Context& context, std::vector<std::string>& extensions):
getLabelImplementation = &AbstractObject::getLabelImplementationKhr;
labelImplementation = &AbstractObject::labelImplementationKhr;
messageInsertImplementation = &DebugMessage::insertImplementationKhr;
messageControlImplementation = &DebugMessage::controlImplementationKhr;
messageCallbackImplementation = &DebugMessage::callbackImplementationKhr;
} else {
@ -63,6 +64,7 @@ DebugState::DebugState(Context& context, std::vector<std::string>& extensions):
#endif
} else messageInsertImplementation = &DebugMessage::insertImplementationNoOp;
messageControlImplementation = &DebugMessage::controlImplementationNoOp;
messageCallbackImplementation = &DebugMessage::callbackImplementationNoOp;
}
}

3
src/Magnum/Implementation/DebugState.h

@ -38,7 +38,8 @@ struct DebugState {
std::string(*getLabelImplementation)(GLenum, GLuint);
void(*labelImplementation)(GLenum, GLuint, Containers::ArrayReference<const char>);
void(*messageInsertImplementation)(DebugMessage::Source, DebugMessage::Type, UnsignedInt, DebugMessage::Severity, const std::string&);
void(*messageInsertImplementation)(DebugMessage::Source, DebugMessage::Type, UnsignedInt, DebugMessage::Severity, Containers::ArrayReference<const char>);
void(*messageControlImplementation)(GLenum, GLenum, GLenum, std::initializer_list<UnsignedInt>, bool);
void(*messageCallbackImplementation)(DebugMessage::Callback, const void*);
GLint maxLabelLength, maxLoggedMessages, maxMessageLength;

15
src/Magnum/Implementation/FramebufferState.cpp

@ -157,10 +157,8 @@ FramebufferState::FramebufferState(Context& context, std::vector<std::string>& e
extensions.push_back(Extensions::GL::EXT::discard_framebuffer::string());
invalidateImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
} else {
invalidateImplementation = &AbstractFramebuffer::invalidateImplementationNoOp;
invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationNoOp;
}
/* Always available on ES3 */
@ -168,6 +166,19 @@ FramebufferState::FramebufferState(Context& context, std::vector<std::string>& e
invalidateImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
#endif
/* Blit implementation on ES2 */
#ifdef MAGNUM_TARGET_GLES2
if(context.isExtensionSupported<Extensions::GL::ANGLE::framebuffer_blit>()) {
extensions.push_back(Extensions::GL::ANGLE::framebuffer_blit::string());
blitImplementation = &AbstractFramebuffer::blitImplementationANGLE;
} else if(context.isExtensionSupported<Extensions::GL::NV::framebuffer_blit>()) {
extensions.push_back(Extensions::GL::NV::framebuffer_blit::string());
blitImplementation = &AbstractFramebuffer::blitImplementationNV;
} else blitImplementation = nullptr;
#endif
}
void FramebufferState::reset() {

5
src/Magnum/Implementation/FramebufferState.h

@ -47,12 +47,17 @@ struct FramebufferState {
void reset();
#ifdef MAGNUM_TARGET_GLES2
void(*blitImplementation)(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter);
#endif
GLenum(AbstractFramebuffer::*checkStatusImplementation)(FramebufferTarget);
void(AbstractFramebuffer::*drawBuffersImplementation)(GLsizei, const GLenum*);
void(AbstractFramebuffer::*drawBufferImplementation)(GLenum);
void(AbstractFramebuffer::*readBufferImplementation)(GLenum);
void(AbstractFramebuffer::*invalidateImplementation)(GLsizei, const GLenum*);
#ifndef MAGNUM_TARGET_GLES2
void(AbstractFramebuffer::*invalidateSubImplementation)(GLsizei, const GLenum*, const Range2Di&);
#endif
void(Framebuffer::*renderbufferImplementation)(Framebuffer::BufferAttachment, Renderbuffer&);
#ifndef MAGNUM_TARGET_GLES

2
src/Magnum/OpenGL.h

@ -37,7 +37,7 @@
/* Desktop OpenGL */
#ifndef MAGNUM_TARGET_GLES
#include "MagnumExternal/OpenGL/GL/gl_magnum.h"
#include "MagnumExternal/OpenGL/GL/flextGL.h"
/* NaCl has its own gl2.h, the official one causes linker issues. Additionaly
to NaCl's gl2ext.h we are including our own to prevent undeclared symbol

4
src/Magnum/Platform/AbstractXApplication.cpp

@ -27,7 +27,7 @@
#include <Corrade/Utility/utilities.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
#include "Magnum/Version.h"
#include "Implementation/AbstractContextHandler.h"
@ -102,7 +102,7 @@ bool AbstractXApplication::tryCreateContext(const Configuration& configuration)
/* Set OpenGL context as current */
contextHandler->makeCurrent();
c = new Context;
c = new Platform::Context;
return true;
}

3
src/Magnum/Platform/AbstractXApplication.h

@ -41,6 +41,7 @@
#include "Magnum/Magnum.h"
#include "Magnum/Math/Vector2.h"
#include "Magnum/Platform/Platform.h"
#ifdef CORRADE_GCC45_COMPATIBILITY
#include "Magnum/Version.h"
@ -191,7 +192,7 @@ class AbstractXApplication {
Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler;
Context* c;
Platform::Context* c;
/** @todo Get this from the created window */
Vector2i viewportSize;

4
src/Magnum/Platform/AndroidApplication.cpp

@ -28,7 +28,7 @@
#include <Corrade/Utility/AndroidStreamBuffer.h>
#include <Corrade/Utility/Debug.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
#include "Implementation/Egl.h"
@ -144,7 +144,7 @@ bool AndroidApplication::tryCreateContext(const Configuration& configuration) {
/* Make the context current */
CORRADE_INTERNAL_ASSERT_OUTPUT(eglMakeCurrent(_display, _surface, _surface, _context));
_c.reset(new Context);
_c.reset(new Platform::Context);
return true;
}

2
src/Magnum/Platform/AndroidApplication.h

@ -308,7 +308,7 @@ class AndroidApplication {
EGLSurface _surface;
EGLContext _context;
std::unique_ptr<Context> _c;
std::unique_ptr<Platform::Context> _c;
std::unique_ptr<LogOutput> _logOutput;
CORRADE_ENUMSET_FRIEND_OPERATORS(Flags)

124
src/Magnum/Platform/CMakeLists.txt

@ -25,6 +25,7 @@
# Headers
set(MagnumPlatform_HEADERS
Context.h
Platform.h
Screen.h
ScreenedApplication.h
@ -35,6 +36,20 @@ set(MagnumPlatform_FILES )
install(FILES ${MagnumPlatform_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform)
# Decide about platform-specific context for cross-platform toolkits
if((WITH_GLUTAPPLICATION OR WITH_SDL2APPLICATION) AND NOT MAGNUM_TARGET_GLES)
if(CORRADE_TARGET_APPLE)
set(NEED_CGLCONTEXT 1)
set(MagnumSomeContext_OBJECTS $<TARGET_OBJECTS:MagnumCglContextObjects>)
elseif(CORRADE_TARGET_WINDOWS)
set(NEED_WGLCONTEXT 1)
set(MagnumSomeContext_OBJECTS $<TARGET_OBJECTS:MagnumWglContextObjects>)
elseif(CORRADE_TARGET_UNIX)
set(NEED_GLXCONTEXT 1)
set(MagnumSomeContext_OBJECTS $<TARGET_OBJECTS:MagnumGlxContextObjects>)
endif()
endif()
# Android application
if(WITH_ANDROIDAPPLICATION)
if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL Android)
@ -71,7 +86,9 @@ if(WITH_GLUTAPPLICATION)
message(FATAL_ERROR "GLUT library, required by GlutApplication, was not found. Set WITH_GLUTAPPLICATION to OFF to skip building it.")
endif()
set(MagnumGlutApplication_SRCS GlutApplication.cpp)
set(MagnumGlutApplication_SRCS
GlutApplication.cpp
${MagnumSomeContext_OBJECTS})
set(MagnumGlutApplication_HEADERS GlutApplication.h)
add_library(MagnumGlutApplication STATIC
@ -94,7 +111,9 @@ if(WITH_SDL2APPLICATION)
include_directories(${SDL2_INCLUDE_DIR})
set(MagnumSdl2Application_SRCS Sdl2Application.cpp)
set(MagnumSdl2Application_SRCS
Sdl2Application.cpp
${MagnumSomeContext_OBJECTS})
set(MagnumSdl2Application_HEADERS Sdl2Application.h)
add_library(MagnumSdl2Application STATIC
@ -170,12 +189,18 @@ endif()
# GLX application
if(WITH_GLXAPPLICATION)
set(NEED_ABSTRACTXAPPLICATION 1)
set(NEED_GLXCONTEXT 1)
set(NEED_GLXCONTEXTHANDLER 1)
if(NOT MAGNUM_TARGET_GLES)
set(NEED_GLXCONTEXT 1)
endif()
set(MagnumGlxApplication_SRCS
GlxApplication.cpp
$<TARGET_OBJECTS:MagnumAbstractXApplication>
$<TARGET_OBJECTS:MagnumGlxContextHandler>
GlxApplication.cpp)
$<TARGET_OBJECTS:MagnumGlxContextHandler>)
if(NOT MAGNUM_TARGET_GLES)
list(APPEND MagnumWindowlessGlxApplication_SRCS $<TARGET_OBJECTS:MagnumGlxContextObjects>)
endif()
set(MagnumGlxApplication_HEADERS GlxApplication.h)
add_library(MagnumGlxApplication STATIC
@ -192,12 +217,12 @@ endif()
# X/EGL application
if(WITH_XEGLAPPLICATION)
set(NEED_ABSTRACTXAPPLICATION 1)
set(NEED_EGLCONTEXT 1)
set(NEED_EGLCONTEXTHANDLER 1)
set(MagnumXEglApplication_SRCS
XEglApplication.cpp
$<TARGET_OBJECTS:MagnumAbstractXApplication>
$<TARGET_OBJECTS:MagnumEglContextHandler>
XEglApplication.cpp)
$<TARGET_OBJECTS:MagnumEglContextHandler>)
set(MagnumXEglApplication_HEADERS XEglApplication.h)
add_library(MagnumXEglApplication STATIC
@ -220,7 +245,14 @@ endif()
# Windowless GLX application
if(WITH_WINDOWLESSGLXAPPLICATION)
if(NOT MAGNUM_TARGET_GLES)
set(NEED_GLXCONTEXT 1)
endif()
set(MagnumWindowlessGlxApplication_SRCS WindowlessGlxApplication.cpp)
if(NOT MAGNUM_TARGET_GLES)
list(APPEND MagnumWindowlessGlxApplication_SRCS $<TARGET_OBJECTS:MagnumGlxContextObjects>)
endif()
set(MagnumWindowlessGlxApplication_HEADERS WindowlessGlxApplication.h)
add_library(MagnumWindowlessGlxApplication STATIC
@ -240,7 +272,11 @@ endif()
# Windowless WGL application
if(WITH_WINDOWLESSWGLAPPLICATION)
set(MagnumWindowlessWglApplication_SRCS WindowlessWglApplication.cpp)
set(NEED_WGLCONTEXT 1)
set(MagnumWindowlessWglApplication_SRCS
WindowlessWglApplication.cpp
$<TARGET_OBJECTS:MagnumWglContextObjects>)
set(MagnumWindowlessWglApplication_HEADERS WindowlessWglApplication.h)
add_library(MagnumWindowlessWglApplication STATIC
@ -259,7 +295,11 @@ endif()
# Windowless CGL application
if(WITH_WINDOWLESSCGLAPPLICATION)
set(MagnumWindowlessCglApplication_SRCS WindowlessCglApplication.cpp)
set(NEED_CGLCONTEXT 1)
set(MagnumWindowlessCglApplication_SRCS
WindowlessCglApplication.cpp
$<TARGET_OBJECTS:MagnumCglContextObjects>)
set(MagnumWindowlessCglApplication_HEADERS WindowlessCglApplication.h)
add_library(MagnumWindowlessCglApplication STATIC
@ -287,8 +327,8 @@ if(NEED_ABSTRACTXAPPLICATION)
install(FILES ${MagnumAbstractXApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform)
endif()
# GLX context
if(NEED_GLXCONTEXT)
# GLX context handler
if(NEED_GLXCONTEXTHANDLER)
set(MagnumGlxContextHandler_SRCS
Implementation/GlxContextHandler.cpp)
set(MagnumGlxContextHandler_PRIVATE_HEADERS
@ -302,8 +342,8 @@ if(NEED_GLXCONTEXT)
set_target_properties(MagnumGlxContextHandler PROPERTIES COMPILE_FLAGS "-Wno-old-style-cast")
endif()
# EGL context
if(NEED_EGLCONTEXT)
# EGL context handler
if(NEED_EGLCONTEXTHANDLER)
find_package(EGL)
if(NOT EGL_FOUND)
message(FATAL_ERROR "EGL library, required by some window contexts, was not found. Set WITH_*EGL*APPLICATION to OFF to skip building them.")
@ -324,6 +364,62 @@ if(NEED_EGLCONTEXT)
set_target_properties(MagnumEglContextHandler PROPERTIES COMPILE_FLAGS "-Wno-old-style-cast")
endif()
# Platform-specific sources for context library
if(NOT MAGNUM_TARGET_GLES)
set(MagnumContext_SRCS
Implementation/OpenGLFunctionLoader.cpp
../../MagnumExternal/OpenGL/GL/flextGLPlatform.cpp)
endif()
# CGL context
if(NEED_CGLCONTEXT OR WITH_CGLCONTEXT)
add_library(MagnumCglContextObjects OBJECT ${MagnumContext_SRCS})
# Also create proper static library, if requested
if(WITH_CGLCONTEXT)
# CMake-generated XCode projects had some problems when library
# consisted only of $<TARGET_OBJECTS> entries, thus compiling the
# sources again in this case
add_library(MagnumCglContext STATIC ${MagnumContext_SRCS})
set_target_properties(MagnumCglContext PROPERTIES DEBUG_POSTFIX "-d")
install(TARGETS MagnumCglContext
RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}
LIBRARY DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR})
endif()
endif()
# GLX context
if(NEED_GLXCONTEXT OR WITH_GLXCONTEXT)
add_library(MagnumGlxContextObjects OBJECT ${MagnumContext_SRCS})
set_target_properties(MagnumGlxContextObjects PROPERTIES COMPILE_DEFINITIONS "MAGNUM_PLATFORM_USE_GLX")
# Also create proper static library, if requested
if(WITH_GLXCONTEXT)
add_library(MagnumGlxContext STATIC $<TARGET_OBJECTS:MagnumGlxContextObjects>)
set_target_properties(MagnumGlxContext PROPERTIES DEBUG_POSTFIX "-d")
install(TARGETS MagnumGlxContext
RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}
LIBRARY DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR})
endif()
endif()
# WGL context
if(NEED_WGLCONTEXT OR WITH_WGLCONTEXT)
add_library(MagnumWglContextObjects OBJECT ${MagnumContext_SRCS})
# Also create proper static library, if requested
if(WITH_GLXCONTEXT)
add_library(MagnumWglContext STATIC $<TARGET_OBJECTS:MagnumWglContextObjects>)
set_target_properties(MagnumWglContext PROPERTIES DEBUG_POSTFIX "-d")
install(TARGETS MagnumWglContext
RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}
LIBRARY DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR})
endif()
endif()
# Magnum Info
if(WITH_MAGNUMINFO)
add_executable(magnum-info magnum-info.cpp)

64
src/Magnum/Platform/Context.h

@ -0,0 +1,64 @@
#ifndef Magnum_Platform_Context_h
#define Magnum_Platform_Context_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014
Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include <Corrade/Utility/Debug.h>
#include "Magnum/Context.h"
#include "Magnum/OpenGL.h"
namespace Magnum { namespace Platform {
/**
@brief Platform-specific context
In most cases not needed to be used directly as the initialization is done
automatically in `*Application` classes. See @ref platform for more
information.
*/
class Context: public Magnum::Context {
public:
/**
* @brief Constructor
*
* Does initial setup, loads OpenGL function pointers using
* platform-specific API, detects available features and enables them
* throughout the engine.
* @see @fn_gl{Get} with @def_gl{MAJOR_VERSION}, @def_gl{MINOR_VERSION},
* @def_gl{CONTEXT_FLAGS}, @def_gl{NUM_EXTENSIONS},
* @fn_gl{GetString} with @def_gl{EXTENSIONS}
*/
explicit Context():
#ifndef MAGNUM_TARGET_GLES
Magnum::Context{flextGLInit} {}
#else
Magnum::Context{nullptr} {}
#endif
};
}}
#endif

4
src/Magnum/Platform/GlutApplication.cpp

@ -27,8 +27,8 @@
#include <tuple>
#include "Magnum/Context.h"
#include "Magnum/Version.h"
#include "Magnum/Platform/Context.h"
#include "Magnum/Platform/ScreenedApplication.hpp"
namespace Magnum { namespace Platform {
@ -112,7 +112,7 @@ bool GlutApplication::tryCreateContext(const Configuration& configuration) {
glutMotionFunc(staticMouseMoveEvent);
glutDisplayFunc(staticDrawEvent);
c = new Context;
c = new Platform::Context;
return true;
}

2
src/Magnum/Platform/GlutApplication.h

@ -277,7 +277,7 @@ class GlutApplication {
static GlutApplication* instance;
Context* c;
Platform::Context* c;
};
/**

100
src/Magnum/Platform/Implementation/OpenGLFunctionLoader.cpp

@ -0,0 +1,100 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014
Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "OpenGLFunctionLoader.h"
#include <Corrade/Utility/Assert.h>
/* CGL-specific includes */
#if defined(CORRADE_TARGET_APPLE)
#include <dlfcn.h>
/* WGL-specific stuff */
#elif defined(CORRADE_TARGET_WINDOWS)
#ifdef _MSC_VER
#pragma warning(disable: 4055)
#pragma warning(disable: 4054)
#endif
/* GLX-specific includes */
#elif defined(CORRADE_TARGET_UNIX) && defined(MAGNUM_PLATFORM_USE_GLX)
#include <GL/glx.h>
/* Otherwise unsupported */
#else
#error Unsupported platform
#endif
namespace Magnum { namespace Platform { namespace Implementation {
/* CGL-specific implementation */
#ifdef CORRADE_TARGET_APPLE
OpenGLFunctionLoader::OpenGLFunctionLoader() {
CORRADE_INTERNAL_ASSERT_OUTPUT(library = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY));
}
OpenGLFunctionLoader::~OpenGLFunctionLoader() {
dlclose(library);
}
auto OpenGLFunctionLoader::load(const char* const name) -> FunctionPointer {
return reinterpret_cast<FunctionPointer>(dlsym(library, name));
}
/* WGL-specific implementation */
#elif defined(CORRADE_TARGET_WINDOWS)
OpenGLFunctionLoader::OpenGLFunctionLoader() {
library = GetModuleHandleA("OpenGL32.dll");
}
/** @todo closing the library is not needed? */
OpenGLFunctionLoader::~OpenGLFunctionLoader() = default;
auto OpenGLFunctionLoader::load(const char* const name) -> FunctionPointer {
/** @todo Is this shit real?! OH MY GOD. */
const PROC address = wglGetProcAddress(reinterpret_cast<LPCSTR>(name));
const auto integerAddress = reinterpret_cast<std::ptrdiff_t>(address);
if(address && integerAddress != 1 && integerAddress != 2 &&
integerAddress != 3 && integerAddress != -1) return address;
return GetProcAddress(library, reinterpret_cast<LPCSTR>(name));
}
/* GLX-specific implementation */
#elif defined(CORRADE_TARGET_UNIX) && defined(MAGNUM_PLATFORM_USE_GLX)
OpenGLFunctionLoader::OpenGLFunctionLoader() = default;
OpenGLFunctionLoader::~OpenGLFunctionLoader() = default;
auto OpenGLFunctionLoader::load(const char* const name) -> FunctionPointer {
return glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(name));
}
/* Otherwise unsupported */
#else
#error Unsupported platform
#endif
}}}

70
src/Magnum/Platform/Implementation/OpenGLFunctionLoader.h

@ -0,0 +1,70 @@
#ifndef Magnum_Platform_Implementation_OpenGLFunctionLoader_h
#define Magnum_Platform_Implementation_OpenGLFunctionLoader_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014
Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "Magnum/Magnum.h"
#ifdef CORRADE_TARGET_WINDOWS
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
namespace Magnum { namespace Platform { namespace Implementation {
class OpenGLFunctionLoader {
public:
#ifndef CORRADE_TARGET_WINDOWS
using FunctionPointer = void(*)();
#else
using FunctionPointer = PROC;
#endif
explicit OpenGLFunctionLoader();
~OpenGLFunctionLoader();
FunctionPointer load(const char* name);
private:
/* CGL-specific handles */
#ifdef CORRADE_TARGET_APPLE
void* library;
/* WGL-specific handles */
#elif defined(CORRADE_TARGET_WINDOWS)
HMODULE library;
/* GLX-specific handles (nothing needed) */
#elif defined(CORRADE_TARGET_UNIX) && defined(MAGNUM_PLATFORM_USE_GLX)
/* Otherwise unsupported */
#else
#error Unsupported platform
#endif
};
}}}
#endif

2
src/Magnum/Platform/NaClApplication.cpp

@ -126,7 +126,7 @@ bool NaClApplication::tryCreateContext(const Configuration& configuration) {
RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE|PP_INPUTEVENT_CLASS_WHEEL);
RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD);
c = new Context;
c = new Platform::Context;
return true;
}

2
src/Magnum/Platform/NaClApplication.h

@ -388,7 +388,7 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient, public
pp::Graphics3D* graphics;
pp::Fullscreen* fullscreen;
Context* c;
Platform::Context* c;
Vector2i viewportSize;
Flags flags;

1
src/Magnum/Platform/Platform.h

@ -33,6 +33,7 @@ namespace Magnum { namespace Platform {
template<class> class BasicScreen;
template<class> class BasicScreenedApplication;
class Context;
}}

4
src/Magnum/Platform/Sdl2Application.cpp

@ -31,7 +31,7 @@
#include <emscripten/emscripten.h>
#endif
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
#include "Magnum/Version.h"
#include "Magnum/Platform/ScreenedApplication.hpp"
@ -214,7 +214,7 @@ bool Sdl2Application::tryCreateContext(const Configuration& configuration) {
context = SDL_SetVideoMode(configuration.size().x(), configuration.size().y(), 24, SDL_OPENGL|SDL_HWSURFACE|SDL_DOUBLEBUF);
#endif
c = new Context;
c = new Platform::Context;
return true;
}

2
src/Magnum/Platform/Sdl2Application.h

@ -415,7 +415,7 @@ class Sdl2Application {
SDL_Surface* context;
#endif
Context* c;
Platform::Context* c;
Flags flags;
};

4
src/Magnum/Platform/WindowlessCglApplication.cpp

@ -30,7 +30,7 @@
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/Debug.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
namespace Magnum { namespace Platform {
@ -117,7 +117,7 @@ bool WindowlessCglApplication::tryCreateContext(const Configuration&) {
}
cglError = CGLSetCurrentContext(context);
c = new Context;
c = new Platform::Context;
return true;
}

2
src/Magnum/Platform/WindowlessCglApplication.h

@ -151,7 +151,7 @@ class WindowlessCglApplication {
CGLContextObj context;
CGLPixelFormatObj pixelFormat;
Context* c;
Platform::Context* c;
};
/**

4
src/Magnum/Platform/WindowlessGlxApplication.cpp

@ -28,7 +28,7 @@
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/Debug.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
#define None 0L // redef Xlib nonsense
@ -120,7 +120,7 @@ bool WindowlessGlxApplication::tryCreateContext(const Configuration&) {
return false;
}
c = new Context;
c = new Platform::Context;
return true;
}

3
src/Magnum/Platform/WindowlessGlxApplication.h

@ -40,6 +40,7 @@
#undef Status
#include "Magnum/Magnum.h"
#include "Magnum/Platform/Context.h"
namespace Magnum { namespace Platform {
@ -161,7 +162,7 @@ class WindowlessGlxApplication {
GLXContext context;
GLXPbuffer pbuffer;
Context* c;
Platform::Context* c;
};
/**

4
src/Magnum/Platform/WindowlessNaClApplication.cpp

@ -30,7 +30,7 @@
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/NaClStreamBuffer.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
namespace Magnum { namespace Platform {
@ -108,7 +108,7 @@ bool WindowlessNaClApplication::tryCreateContext(const Configuration&) {
glSetCurrentContextPPAPI(graphics->pp_resource());
c = new Context;
c = new Platform::Context;
return true;
}

2
src/Magnum/Platform/WindowlessNaClApplication.h

@ -176,7 +176,7 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien
bool Init(std::uint32_t, const char*, const char*) override;
pp::Graphics3D* graphics;
Context* c;
Platform::Context* c;
ConsoleDebugOutput* debugOutput;
};

4
src/Magnum/Platform/WindowlessWglApplication.cpp

@ -29,7 +29,7 @@
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/Debug.h>
#include "Magnum/Context.h"
#include "Magnum/Platform/Context.h"
namespace Magnum { namespace Platform {
@ -118,7 +118,7 @@ bool WindowlessWglApplication::tryCreateContext(const Configuration&) {
return false;
}
_c = new Context;
_c = new Platform::Context;
return true;
}

10
src/Magnum/Platform/WindowlessWglApplication.h

@ -29,9 +29,15 @@
* @brief Class @ref Magnum::Platform::WindowlessWglApplication, macro @ref MAGNUM_WINDOWLESSWGLAPPLICATION_MAIN()
*/
#include "Magnum/OpenGL.h"
#ifndef DOXYGEN_GENERATING_OUTPUT
#define WIN32_LEAN_AND_MEAN 1
#define VC_EXTRALEAN
#endif
#include <windows.h>
#include "Magnum/Magnum.h"
#include "Magnum/OpenGL.h"
#include "Magnum/Platform/Context.h"
namespace Magnum { namespace Platform {
@ -154,7 +160,7 @@ class WindowlessWglApplication {
HDC _deviceContext;
HGLRC _renderingContext;
Context* _c;
Platform::Context* _c;
};
/**

3
src/Magnum/Query.h

@ -145,6 +145,9 @@ class MAGNUM_EXPORT AbstractQuery: public AbstractObject {
*/
~AbstractQuery();
#ifdef DOXYGEN_GENERATING_OUTPUT
private:
#endif
void begin(GLenum target);
private:

2
src/Magnum/Renderbuffer.cpp

@ -124,11 +124,13 @@ void Renderbuffer::storageMultisampleImplementationDefault(const GLsizei samples
#else
void Renderbuffer::storageMultisampleImplementationANGLE(GLsizei, RenderbufferFormat, const Vector2i&) {
CORRADE_INTERNAL_ASSERT(false);
bind();
//glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, samples, internalFormat, size.x(), size.y());
}
void Renderbuffer::storageMultisampleImplementationNV(GLsizei, RenderbufferFormat, const Vector2i&) {
CORRADE_INTERNAL_ASSERT(false);
bind();
//glRenderbufferStorageMultisampleNV(GL_RENDERBUFFER, samples, internalFormat, size.x(), size.y());
}
#endif

6
src/Magnum/Renderbuffer.h

@ -79,9 +79,9 @@ class MAGNUM_EXPORT Renderbuffer: public AbstractObject {
* @brief Max supported sample count
*
* The result is cached, repeated queries don't result in repeated
* OpenGL calls. If ES extension @es_extension{ANGLE,framebuffer_multisample}
* or @es_extension{NV,framebuffer_multisample} is not available,
* returns `0`.
* OpenGL calls. If neither OpenGL ES 3.0 nor ES extension
* @es_extension{ANGLE,framebuffer_multisample} /
* @es_extension{NV,framebuffer_multisample} is available, returns `0`.
* @see @ref setStorageMultisample(), @fn_gl{Get} with @def_gl{MAX_SAMPLES}
*/
static Int maxSamples();

7
src/Magnum/Renderer.h

@ -86,7 +86,8 @@ class MAGNUM_EXPORT Renderer {
/**
* Debug output
* @see @ref DebugMessage, @ref Feature::DebugOutputSynchronous
* @see @ref DebugMessage, @ref DebugMessage::setEnabled(),
* @ref Feature::DebugOutputSynchronous
* @requires_gl43 %Extension @extension{KHR,debug}
* @requires_es_extension %Extension @es_extension{KHR,debug}
*/
@ -451,8 +452,8 @@ class MAGNUM_EXPORT Renderer {
*
* Initial value is `1.0f`.
* @see @ref Feature::ProgramPointSize, @fn_gl{PointSize}
* @requires_gl In OpenGL ES use `gl_PointSize` builtin vertex shader
* variable.
* @requires_gl Use `gl_PointSize` builtin vertex shader variable in
* OpenGL ES instead.
*/
static void setPointSize(Float size);
#endif

2
src/Magnum/SceneGraph/AbstractCamera.h

@ -216,7 +216,7 @@ typedef AbstractBasicCamera3D<Float> AbstractCamera3D;
typedef AbstractCamera<3, Float> AbstractCamera3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractCamera<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractCamera<3, Float>;
#endif

2
src/Magnum/SceneGraph/AbstractFeature.h

@ -353,7 +353,7 @@ typedef AbstractBasicFeature3D<Float> AbstractFeature3D;
typedef AbstractFeature<3, Float> AbstractFeature3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeature<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeature<3, Float>;
#endif

2
src/Magnum/SceneGraph/AbstractObject.h

@ -323,7 +323,7 @@ typedef AbstractBasicObject3D<Float> AbstractObject3D;
typedef AbstractObject<3, Float> AbstractObject3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractObject<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractObject<3, Float>;
#endif

2
src/Magnum/SceneGraph/AbstractTransformation.h

@ -152,7 +152,7 @@ typedef AbstractBasicTransformation3D<Float> AbstractTransformation3D;
typedef AbstractTransformation<3, Float> AbstractTransformation3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractTransformation<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractTransformation<3, Float>;
#endif

2
src/Magnum/SceneGraph/Animable.h

@ -390,7 +390,7 @@ typedef BasicAnimable3D<Float> Animable3D;
typedef Animable<3, Float> Animable3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Animable<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT Animable<3, Float>;
#endif

2
src/Magnum/SceneGraph/AnimableGroup.h

@ -126,7 +126,7 @@ typedef BasicAnimableGroup3D<Float> AnimableGroup3D;
typedef AnimableGroup<3, Float> AnimableGroup3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AnimableGroup<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AnimableGroup<3, Float>;
#endif

2
src/Magnum/SceneGraph/Camera2D.h

@ -107,7 +107,7 @@ template<class T> class BasicCamera2D: public AbstractCamera<2, T> {
*/
typedef BasicCamera2D<Float> Camera2D;
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT BasicCamera2D<Float>;
#endif

2
src/Magnum/SceneGraph/Camera3D.h

@ -143,7 +143,7 @@ template<class T> class BasicCamera3D: public AbstractCamera<3, T> {
*/
typedef BasicCamera3D<Float> Camera3D;
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT BasicCamera3D<Float>;
#endif

2
src/Magnum/SceneGraph/Drawable.h

@ -291,7 +291,7 @@ typedef BasicDrawableGroup3D<Float> DrawableGroup3D;
typedef DrawableGroup<3, Float> DrawableGroup3D;
#endif
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Drawable<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT Drawable<3, Float>;
#endif

2
src/Magnum/SceneGraph/DualComplexTransformation.h

@ -187,7 +187,7 @@ template<class T> struct Transformation<BasicDualComplexTransformation<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicDualComplexTransformation<Float>>;
#endif

2
src/Magnum/SceneGraph/DualQuaternionTransformation.h

@ -204,7 +204,7 @@ template<class T> struct Transformation<BasicDualQuaternionTransformation<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicDualQuaternionTransformation<Float>>;
#endif

2
src/Magnum/SceneGraph/FeatureGroup.h

@ -194,7 +194,7 @@ template<UnsignedInt dimensions, class Feature, class T> FeatureGroup<dimensions
return *this;
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeatureGroup<2, Float>;
extern template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeatureGroup<3, Float>;
#endif

2
src/Magnum/SceneGraph/MatrixTransformation2D.h

@ -172,7 +172,7 @@ template<class T> struct Transformation<BasicMatrixTransformation2D<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicMatrixTransformation2D<Float>>;
#endif

2
src/Magnum/SceneGraph/MatrixTransformation3D.h

@ -219,7 +219,7 @@ template<class T> struct Transformation<BasicMatrixTransformation3D<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicMatrixTransformation3D<Float>>;
#endif

2
src/Magnum/SceneGraph/RigidMatrixTransformation2D.h

@ -210,7 +210,7 @@ template<class T> struct Transformation<BasicRigidMatrixTransformation2D<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicRigidMatrixTransformation2D<Float>>;
#endif

2
src/Magnum/SceneGraph/RigidMatrixTransformation3D.h

@ -263,7 +263,7 @@ template<class T> struct Transformation<BasicRigidMatrixTransformation3D<T>> {
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<BasicRigidMatrixTransformation3D<Float>>;
#endif

2
src/Magnum/SceneGraph/TranslationTransformation.h

@ -214,7 +214,7 @@ template<UnsignedInt dimensions, class T, class TranslationType> struct Transfor
}
#ifdef CORRADE_TARGET_WINDOWS
#if defined(CORRADE_TARGET_WINDOWS) && !defined(__MINGW32__)
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<TranslationTransformation<2, Float>>;
extern template class MAGNUM_SCENEGRAPH_EXPORT Object<TranslationTransformation<3, Float>>;
#endif

5
src/Magnum/SceneGraph/instantiation.cpp

@ -40,8 +40,9 @@
namespace Magnum { namespace SceneGraph {
/* On Windows the instantiations are already marked with extern template */
#ifndef CORRADE_TARGET_WINDOWS
/* On non-MinGW Windows the instantiations are already marked with extern
template */
#if !defined(CORRADE_TARGET_WINDOWS) || defined(__MINGW32__)
#define MAGNUM_SCENEGRAPH_EXPORT_HPP MAGNUM_SCENEGRAPH_EXPORT
#else
#define MAGNUM_SCENEGRAPH_EXPORT_HPP

6
src/Magnum/Shader.cpp

@ -442,8 +442,7 @@ Int Shader::maxUniformBlocks(const Type type) {
GL_MAX_VERTEX_UNIFORM_BLOCKS,
GL_MAX_FRAGMENT_UNIFORM_BLOCKS,
#ifndef MAGNUM_TARGET_GLES
/** @todo Fix this when glLoadGen has `GL_MAX_GEOMETRY_UNIFORM_BLOCKS` enum */
0x8A2C, //GL_MAX_GEOMETRY_UNIFORM_BLOCKS,
GL_MAX_GEOMETRY_UNIFORM_BLOCKS,
GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS,
GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS,
GL_MAX_COMPUTE_UNIFORM_BLOCKS
@ -525,8 +524,7 @@ Int Shader::maxCombinedUniformComponents(const Type type) {
GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS,
GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS,
#ifndef MAGNUM_TARGET_GLES
/** @todo Fix this when glLoadGen has `GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS` enum */
0x8A32, //GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,
GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,
GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS,
GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS,
GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS

10
src/Magnum/Shaders/MeshVisualizer.frag

@ -36,6 +36,10 @@
#define layout(arg)
#endif
#if defined(WIREFRAME_RENDERING) && defined(GL_ES) && __VERSION__ < 300
#extension GL_OES_standard_derivatives : enable
#endif
#ifndef GL_ES
layout(location = 2) uniform vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
#else
@ -64,12 +68,6 @@ in lowp vec3 barycentric;
out lowp vec4 fragmentColor;
#endif
/* This is needed also on desktop ES 3.0 emulation on NVidia 330.20 even though
fwidth() is part of GLSL ES 3.0 */
#if defined(WIREFRAME_RENDERING) && defined(GL_ES)
#extension GL_OES_standard_derivatives : enable
#endif
void main() {
#ifdef WIREFRAME_RENDERING
#ifndef NO_GEOMETRY_SHADER

3
src/Magnum/Test/AbstractOpenGLTester.h

@ -57,6 +57,9 @@ AbstractOpenGLTester::AbstractOpenGLTester(): Platform::WindowlessApplication({z
Renderer::enable(Renderer::Feature::DebugOutput);
Renderer::enable(Renderer::Feature::DebugOutputSynchronous);
DebugMessage::setDefaultCallback();
/* Disable "Buffer detailed info" message on NV (too spammy) */
DebugMessage::setEnabled(DebugMessage::Source::Api, DebugMessage::Type::Other, {131185}, false);
}
}

16
src/Magnum/Test/DebugGLTest.cpp

@ -44,6 +44,8 @@ class DebugGLTest: public AbstractOpenGLTester {
void insertMessage();
void insertMessageFallback();
void setMessageEnabled();
void deprecated();
};
@ -52,6 +54,8 @@ DebugGLTest::DebugGLTest() {
&DebugGLTest::insertMessage,
&DebugGLTest::insertMessageFallback,
&DebugGLTest::setMessageEnabled,
#ifdef MAGNUM_BUILD_DEPRECATED
&DebugGLTest::deprecated
#endif
@ -109,6 +113,18 @@ void DebugGLTest::insertMessageFallback() {
MAGNUM_VERIFY_NO_ERROR();
}
void DebugGLTest::setMessageEnabled() {
if(!Context::current()->isExtensionSupported<Extensions::GL::KHR::debug>())
CORRADE_SKIP(Extensions::GL::KHR::debug::string() + std::string(" is not supported"));
/* Try at least some combinations */
DebugMessage::setEnabled(DebugMessage::Source::Application, true);
DebugMessage::setEnabled(DebugMessage::Source::Application, DebugMessage::Type::UndefinedBehavior, {3168, 35487, 234487}, false);
DebugMessage::setEnabled(true);
MAGNUM_VERIFY_NO_ERROR();
}
#ifdef MAGNUM_BUILD_DEPRECATED
void DebugGLTest::deprecated() {
#if defined(__GNUC__) && !defined(CORRADE_GCC45_COMPATIBILITY)

71
src/Magnum/Test/FramebufferGLTest.cpp

@ -43,6 +43,7 @@
#ifndef MAGNUM_TARGET_GLES
#include "Magnum/CubeMapTextureArray.h"
#include "Magnum/MultisampleTexture.h"
#include "Magnum/RectangleTexture.h"
#endif
@ -92,6 +93,11 @@ class FramebufferGLTest: public AbstractOpenGLTester {
void readBuffer();
#endif
void blit();
#ifdef MAGNUM_TARGET_GLES2
private:
TextureFormat rgbaFormatES2, depthStencilFormatES2;
#endif
};
FramebufferGLTest::FramebufferGLTest() {
@ -135,6 +141,16 @@ FramebufferGLTest::FramebufferGLTest() {
&FramebufferGLTest::readBuffer,
#endif
&FramebufferGLTest::blit});
#ifdef MAGNUM_TARGET_GLES2
if(Context::current()->isExtensionSupported<Extensions::GL::EXT::texture_storage>()) {
rgbaFormatES2 = TextureFormat::RGBA8;
depthStencilFormatES2 = TextureFormat::Depth24Stencil8;
} else {
rgbaFormatES2 = TextureFormat::RGBA;
depthStencilFormatES2 = TextureFormat::DepthStencil;
}
#endif
}
void FramebufferGLTest::construct() {
@ -346,7 +362,7 @@ void FramebufferGLTest::attachTexture2D() {
#ifndef MAGNUM_TARGET_GLES2
color.setStorage(1, TextureFormat::RGBA8, Vector2i(128));
#else
color.setStorage(1, TextureFormat::RGBA, Vector2i(128));
color.setStorage(1, rgbaFormatES2, Vector2i(128));
#endif
MAGNUM_VERIFY_NO_ERROR();
@ -363,12 +379,13 @@ void FramebufferGLTest::attachTexture2D() {
Debug() << "Using" << Extensions::GL::OES::packed_depth_stencil::string();
#endif
/** @todo Is there any better way to select proper sized/unsized format on ES2? */
Texture2D depthStencil;
#ifndef MAGNUM_TARGET_GLES2
depthStencil.setStorage(1, TextureFormat::Depth24Stencil8, Vector2i(128));
framebuffer.attachTexture(Framebuffer::BufferAttachment::DepthStencil, depthStencil, 0);
#else
depthStencil.setStorage(1, TextureFormat::DepthStencil, Vector2i(128));
depthStencil.setStorage(1, depthStencilFormatES2, Vector2i(128));
framebuffer.attachTexture(Framebuffer::BufferAttachment::Depth, depthStencil, 0)
.attachTexture(Framebuffer::BufferAttachment::Stencil, depthStencil, 0);
#endif
@ -401,7 +418,7 @@ void FramebufferGLTest::attachTexture3D() {
#ifndef MAGNUM_TARGET_GLES2
color.setStorage(1, TextureFormat::RGBA8, Vector3i(128));
#else
color.setStorage(1, TextureFormat::RGBA4, Vector3i(128));
color.setStorage(1, rgbaFormatES2, Vector3i(128));
#endif
Framebuffer framebuffer({{}, Vector2i(128)});
@ -457,11 +474,43 @@ void FramebufferGLTest::attachTexture2DArray() {
#ifndef MAGNUM_TARGET_GLES
void FramebufferGLTest::attachTexture2DMultisample() {
CORRADE_SKIP("Multisample textures are not implemented yet.");
if(!Context::current()->isExtensionSupported<Extensions::GL::ARB::framebuffer_object>())
CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available."));
if(!Context::current()->isExtensionSupported<Extensions::GL::ARB::texture_multisample>())
CORRADE_SKIP(Extensions::GL::ARB::texture_multisample::string() + std::string(" is not available."));
MultisampleTexture2D color;
color.setStorage(4, TextureFormat::RGBA8, {128, 128});
MultisampleTexture2D depthStencil;
depthStencil.setStorage(4, TextureFormat::Depth24Stencil8, {128, 128});
Framebuffer framebuffer({{}, Vector2i(128)});
framebuffer.attachTexture(Framebuffer::ColorAttachment(0), color)
.attachTexture(Framebuffer::BufferAttachment::DepthStencil, depthStencil);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_COMPARE(framebuffer.checkStatus(FramebufferTarget::ReadDraw), Framebuffer::Status::Complete);
}
void FramebufferGLTest::attachTexture2DMultisampleArray() {
CORRADE_SKIP("Multisample textures are not implemented yet.");
if(!Context::current()->isExtensionSupported<Extensions::GL::ARB::framebuffer_object>())
CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available."));
if(!Context::current()->isExtensionSupported<Extensions::GL::ARB::texture_multisample>())
CORRADE_SKIP(Extensions::GL::ARB::texture_multisample::string() + std::string(" is not available."));
MultisampleTexture2DArray color;
color.setStorage(4, TextureFormat::RGBA8, {128, 128, 8});
MultisampleTexture2DArray depthStencil;
depthStencil.setStorage(4, TextureFormat::Depth24Stencil8, {128, 128, 8});
Framebuffer framebuffer({{}, Vector2i(128)});
framebuffer.attachTextureLayer(Framebuffer::ColorAttachment(0), color, 3)
.attachTextureLayer(Framebuffer::BufferAttachment::DepthStencil, depthStencil, 3);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_COMPARE(framebuffer.checkStatus(FramebufferTarget::ReadDraw), Framebuffer::Status::Complete);
}
void FramebufferGLTest::attachRectangleTexture() {
@ -477,8 +526,8 @@ void FramebufferGLTest::attachRectangleTexture() {
depthStencil.setStorage(TextureFormat::Depth24Stencil8, Vector2i(128));
Framebuffer framebuffer({{}, Vector2i(128)});
framebuffer.attachTexture(Framebuffer::ColorAttachment(0), color, 0)
.attachTexture(Framebuffer::BufferAttachment::DepthStencil, depthStencil, 0);
framebuffer.attachTexture(Framebuffer::ColorAttachment(0), color)
.attachTexture(Framebuffer::BufferAttachment::DepthStencil, depthStencil);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_COMPARE(framebuffer.checkStatus(FramebufferTarget::ReadDraw), Framebuffer::Status::Complete);
@ -497,7 +546,7 @@ void FramebufferGLTest::attachCubeMapTexture() {
#ifndef MAGNUM_TARGET_GLES2
color.setStorage(1, TextureFormat::RGBA8, Vector2i(128));
#else
color.setStorage(1, TextureFormat::RGBA, Vector2i(128));
color.setStorage(1, rgbaFormatES2, Vector2i(128));
#endif
framebuffer.attachCubeMapTexture(Framebuffer::ColorAttachment(0), color, CubeMapTexture::Coordinate::NegativeZ, 0);
@ -515,7 +564,7 @@ void FramebufferGLTest::attachCubeMapTexture() {
depthStencil.setStorage(1, TextureFormat::Depth24Stencil8, Vector2i(128));
framebuffer.attachCubeMapTexture(Framebuffer::BufferAttachment::DepthStencil, depthStencil, CubeMapTexture::Coordinate::NegativeZ, 0);
#else
depthStencil.setStorage(1, TextureFormat::DepthStencil, Vector2i(128));
depthStencil.setStorage(1, depthStencilFormatES2, Vector2i(128));
framebuffer.attachCubeMapTexture(Framebuffer::BufferAttachment::Depth, depthStencil, CubeMapTexture::Coordinate::NegativeZ, 0)
.attachCubeMapTexture(Framebuffer::BufferAttachment::Stencil, depthStencil, CubeMapTexture::Coordinate::NegativeZ, 0);
#endif
@ -569,14 +618,14 @@ void FramebufferGLTest::multipleColorOutputs() {
#ifndef MAGNUM_TARGET_GLES2
color1.setStorage(1, TextureFormat::RGBA8, Vector2i(128));
#else
color1.setStorage(1, TextureFormat::RGBA, Vector2i(128));
color1.setStorage(1, rgbaFormatES2, Vector2i(128));
#endif
Texture2D color2;
#ifndef MAGNUM_TARGET_GLES2
color2.setStorage(1, TextureFormat::RGBA8, Vector2i(128));
#else
color2.setStorage(1, TextureFormat::RGBA, Vector2i(128));
color2.setStorage(1, rgbaFormatES2, Vector2i(128));
#endif
Renderbuffer depth;

16
src/Magnum/Test/MeshGLTest.cpp

@ -735,7 +735,13 @@ void MeshGLTest::addVertexBufferMatrixNxNd() {
RenderbufferFormat::RGBA16, mesh).get<Math::Vector3<UnsignedShort>>(ColorFormat::RGB, ColorType::UnsignedShort);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 2576));
{
CORRADE_EXPECT_FAIL("Somehow only first two values are extracted");
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 2576));
}
/* This is wrong, but check if it's still the right wrong */
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 0));
}
#endif
@ -792,7 +798,13 @@ void MeshGLTest::addVertexBufferMatrixMxNd() {
RenderbufferFormat::RGBA16, mesh).get<Math::Vector3<UnsignedShort>>(ColorFormat::RGB, ColorType::UnsignedShort);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 2576));
{
CORRADE_EXPECT_FAIL("Somehow only first two values are extracted");
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 2576));
}
/* This is wrong, but check if it's still the right wrong */
CORRADE_COMPARE(value, Math::Vector3<UnsignedShort>(315, 65201, 0));
}
#endif

11
src/Magnum/Text/GlyphCache.cpp

@ -58,12 +58,15 @@ void GlyphCache::initialize(const Vector2i& size) {
MAGNUM_ASSERT_EXTENSION_SUPPORTED(Extensions::GL::ARB::texture_rg);
#endif
#if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_GLES3)
/** @todo Is there any better way to select proper sized/unsized format on ES2? */
#ifndef MAGNUM_TARGET_GLES2
const TextureFormat internalFormat = TextureFormat::R8;
#else
const TextureFormat internalFormat =
Context::current()->isExtensionSupported<Extensions::GL::EXT::texture_rg>() ?
TextureFormat::Red : TextureFormat::Luminance;
TextureFormat internalFormat;
if(Context::current()->isExtensionSupported<Extensions::GL::EXT::texture_rg>()) {
internalFormat = Context::current()->isExtensionSupported<Extensions::GL::EXT::texture_storage>() ?
TextureFormat::R8 : TextureFormat::Red;
} else internalFormat = TextureFormat::Luminance;
#endif
initialize(internalFormat, size);

8
src/Magnum/TextureArray.h

@ -400,13 +400,19 @@ template<UnsignedInt dimensions> class TextureArray: public AbstractTexture {
/**
@brief One-dimensional texture array
@requires_gl30 %Extension @extension{EXT,texture_array}
@requires_gl Only @ref Magnum::Texture2DArray "Texture2DArray" is available in
OpenGL ES.
*/
typedef TextureArray<1> Texture1DArray;
#endif
/** @brief Two-dimensional texture array */
/**
@brief Two-dimensional texture array
@requires_gl30 %Extension @extension{EXT,texture_array}
@requires_gles30 %Array textures are not available in OpenGL ES 2.0.
*/
typedef TextureArray<2> Texture2DArray;
}

115
src/Magnum/TextureFormat.h

@ -49,7 +49,8 @@ enum class TextureFormat: GLenum {
/**
* Red component, normalized unsigned, size implementation-dependent. Not
* allowed in unemulated @ref Texture::setStorage() "*Texture::setStorage()"
* calls.
* calls, in that case use @ref TextureFormat::R8 "TextureFormat::R8"
* instead.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 %Extension @es_extension{EXT,texture_rg} in OpenGL ES
* 2.0
@ -62,20 +63,25 @@ enum class TextureFormat: GLenum {
Red = GL_RED_EXT,
#endif
#ifndef MAGNUM_TARGET_GLES2
/**
* Red component, normalized unsigned byte.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 Use @ref Magnum::TextureFormat::Red "TextureFormat::Red"
* in OpenGL ES 2.0 instead.
* @requires_gles30 %Extension @es_extension{EXT,texture_rg} and
* @es_extension{EXT,texture_storage} in OpenGL ES 2.0. For texture
* storage only, for image specification use
* @ref Magnum::TextureFormat::Red "TextureFormat::Red" instead.
*/
#ifndef MAGNUM_TARGET_GLES2
R8 = GL_R8,
#else
R8 = GL_R8_EXT,
#endif
/**
* Red and green component, normalized unsigned, size
* implementation-dependent. Not allowed in unemulated
* @ref Texture::setStorage() "*Texture::setStorage()" calls.
* @ref Texture::setStorage() "*Texture::setStorage()" calls, in that case
* use @ref TextureFormat::RG8 "TextureFormat::RG8" instead.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 %Extension @es_extension{EXT,texture_rg} in OpenGL ES
* 2.0
@ -88,19 +94,24 @@ enum class TextureFormat: GLenum {
RG = GL_RG_EXT,
#endif
#ifndef MAGNUM_TARGET_GLES2
/**
* Red and green component, each normalized unsigned byte.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 Use @ref Magnum::TextureFormat::RG "TextureFormat::RG"
* in OpenGL ES 2.0 instead.
* @requires_gles30 %Extension @es_extension{EXT,texture_rg} and
* @es_extension{EXT,texture_storage} in OpenGL ES 2.0. For texture
* storage only, for image specification use
* @ref Magnum::TextureFormat::RG "TextureFormat::RG" instead.
*/
#ifndef MAGNUM_TARGET_GLES2
RG8 = GL_RG8,
#else
RG8 = GL_RG8_EXT,
#endif
/**
* RGB, normalized unsigned, size implementation-dependent. Not allowed in
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls.
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls, in
* that case use @ref TextureFormat::RGB8 "TextureFormat::RGB8" instead.
* @deprecated_gl Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::TextureFormat::RGB8 "TextureFormat::RGB8".
*/
@ -109,7 +120,8 @@ enum class TextureFormat: GLenum {
/**
* RGB, each component normalized unsigned byte.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* in OpenGL ES 2.0
* (for image specification) or @es_extension{EXT,texture_storage}
* (for texture storage) in OpenGL ES 2.0
*/
#ifndef MAGNUM_TARGET_GLES2
RGB8 = GL_RGB8,
@ -119,7 +131,8 @@ enum class TextureFormat: GLenum {
/**
* RGBA, normalized unsigned, size implementation-dependent. Not allowed in
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls.
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls, in
* that case use @ref TextureFormat::RGBA8 "TextureFormat::RGBA8" instead.
* @deprecated_gl Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::TextureFormat::RGBA8 "TextureFormat::RGBA8".
*/
@ -128,7 +141,8 @@ enum class TextureFormat: GLenum {
/**
* RGBA, each component normalized unsigned byte.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* in OpenGL ES 2.0
* (for image specification) or @es_extension{EXT,texture_storage}
* (for texture storage) in OpenGL ES 2.0
*/
#ifndef MAGNUM_TARGET_GLES2
RGBA8 = GL_RGBA8,
@ -491,7 +505,8 @@ enum class TextureFormat: GLenum {
#if defined(MAGNUM_TARGET_GLES2) || defined(DOXYGEN_GENERATING_OUTPUT)
/**
* Luminance, normalized unsigned, single value used for all RGB channels.
* Size implementation-dependent.
* Size implementation-dependent. Not allowed in unemulated
* @ref Texture::setStorage() "*Texture::setStorage()" calls.
* @requires_gles20 Not available in ES 3.0 or desktop OpenGL. Use
* @ref Magnum::TextureFormat::R8 "TextureFormat::R8" instead.
* @deprecated_gl Included for compatibility reasons only, use
@ -502,7 +517,8 @@ enum class TextureFormat: GLenum {
/**
* Floating-point luminance and alpha channel. First value is used for all
* RGB channels, second value is used for alpha channel. Size
* implementation-dependent.
* implementation-dependent. Not allowed in unemulated
* @ref Texture::setStorage() "*Texture::setStorage()" calls.
* @requires_gles20 Not available in ES 3.0 or desktop OpenGL. Use
* @ref Magnum::TextureFormat::RG8 "TextureFormat::RG8" instead.
* @deprecated_gl Included for compatibility reasons only, use
@ -536,20 +552,27 @@ enum class TextureFormat: GLenum {
/**
* RGB, normalized unsigned, red and blue component 5bit, green 6bit.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* in OpenGL ES 2.0
* (for image specification) or @es_extension{EXT,texture_storage}
* (for texture storage) in OpenGL ES 2.0
*/
RGB565 = GL_RGB565,
#ifndef MAGNUM_TARGET_GLES3
/**
* RGB, each component normalized unsigned 10bit.
* @requires_es_extension %Extension @es_extension{OES,required_internalformat}
* and @es_extension{EXT,texture_type_2_10_10_10_REV}
* @requires_es_extension %Extension @es_extension{EXT,texture_type_2_10_10_10_REV}
* and either @es_extension{OES,required_internalformat} (for image
* specification) or @es_extension{EXT,texture_storage} (for texture
* storage) in OpenGL ES 2.0. Included for compatibility reasons only,
* use @ref Magnum::TextureFormat::RGB10A2 "TextureFormat::RGB10A2" in
* OpenGL ES 3.0 instead.
*/
#ifndef MAGNUM_TARGET_GLES
RGB10 = GL_RGB10,
#else
RGB10 = GL_RGB10_EXT,
#endif
#endif
#ifndef MAGNUM_TARGET_GLES
/**
@ -578,7 +601,9 @@ enum class TextureFormat: GLenum {
#endif
/**
* sRGB, normalized unsigned, size implementation-dependent.
* sRGB, normalized unsigned, size implementation-dependent. Not allowed in
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls, in
* that case use @ref TextureFormat::SRGB8 "TextureFormat::SRGB8" instead.
* @requires_es_extension %Extension @es_extension{EXT,sRGB}
* @deprecated_gl Prefer to use the exactly specified version of this
* format, i.e. @ref Magnum::TextureFormat::SRGB8 "TextureFormat::SRGB8".
@ -610,21 +635,25 @@ enum class TextureFormat: GLenum {
/**
* RGBA, normalized unsigned, each component 4bit.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* in OpenGL ES 2.0
* (for image specification) or @es_extension{EXT,texture_storage}
* (for texture storage) in OpenGL ES 2.0
*/
RGBA4 = GL_RGBA4,
/**
* RGBA, normalized unsigned, each RGB component 5bit, alpha 1bit.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* in OpenGL ES 2.0
* (for image specification) or @es_extension{EXT,texture_storage}
* (for texture storage) in OpenGL ES 2.0
*/
RGB5A1 = GL_RGB5_A1,
/**
* RGBA, normalized unsigned, each RGB component 10bit, alpha 2bit.
* @requires_gles30 %Extension @es_extension{OES,required_internalformat}
* and @es_extension{EXT,texture_type_2_10_10_10_REV} in OpenGL ES 2.0
* @requires_gles30 %Extension @es_extension{EXT,texture_type_2_10_10_10_REV}
* and either @es_extension{OES,required_internalformat} (for image
* specification) or @es_extension{EXT,texture_storage} (for texture
* storage) in OpenGL ES 2.0
*/
#ifndef MAGNUM_TARGET_GLES2
RGB10A2 = GL_RGB10_A2,
@ -651,7 +680,9 @@ enum class TextureFormat: GLenum {
#endif
/**
* sRGBA, normalized unsigned, size implementation-dependent.
* sRGBA, normalized unsigned, size implementation-dependent. Not allowed in
* unemulated @ref Texture::setStorage() "*Texture::setStorage()" calls, in
* that case use @ref TextureFormat::SRGB8Alpha8 "TextureFormat::SRGB8Alpha8" instead.
* @requires_es_extension %Extension @es_extension{EXT,sRGB}
* @deprecated_gl Prefer to use the exactly specified version of this
* format, i.e. @ref Magnum::TextureFormat::SRGB8Alpha8 "TextureFormat::SRGB8Alpha8".
@ -770,20 +801,23 @@ enum class TextureFormat: GLenum {
/**
* Depth component, size implementation-dependent. Not supported in 3D
* textures, not allowed in unemulated @ref Texture::setStorage()
* "*Texture::setStorage()" calls.
* textures. Not allowed in unemulated @ref Texture::setStorage()
* "*Texture::setStorage()" calls, in that case use e.g.
* @ref TextureFormat::DepthComponent24 "TextureFormat::DepthComponent24" instead.
* @requires_gles30 %Extension @es_extension{OES,depth_texture} or
* @es_extension{ANGLE,depth_texture} in OpenGL ES 2.0
* @deprecated_gl Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::TextureFormat::DepthComponent16 "TextureFormat::DepthComponent16".
* format, e.g. @ref Magnum::TextureFormat::DepthComponent24 "TextureFormat::DepthComponent24".
*/
DepthComponent = GL_DEPTH_COMPONENT,
/**
* Depth component, 16bit. Not supported in 3D textures.
* @requires_gles30 %Extension (@es_extension{OES,required_internalformat}
* and @es_extension{OES,depth_texture}) or (@es_extension{EXT,texture_storage}
* and @es_extension{ANGLE,depth_texture}) in OpenGL ES 2.0
* @requires_gles30 %Extension @es_extension{OES,depth_texture} or
* @es_extension{ANGLE,depth_texture} and either
* @es_extension{OES,required_internalformat} (for image
* specification) or @es_extension{EXT,texture_storage} (for texture
* storage) in OpenGL ES 2.0
*/
DepthComponent16 = GL_DEPTH_COMPONENT16,
@ -801,9 +835,11 @@ enum class TextureFormat: GLenum {
/**
* Depth component, 32bit. Not supported in 3D textures.
* @requires_es_extension %Extension (@es_extension{OES,required_internalformat},
* @es_extension{OES,depth_texture} and @es_extension{OES,depth32}) or
* (@es_extension{EXT,texture_storage} and @es_extension{ANGLE,depth_texture})
* @requires_es_extension %Extension @es_extension{OES,depth_texture} or
* @es_extension{ANGLE,depth_texture} and @es_extension{OES,depth32}
* and @es_extension{OES,required_internalformat} (for image
* specification) or @es_extension{EXT,texture_storage} (for texture
* storage) in OpenGL ES 2.0
*/
#ifndef MAGNUM_TARGET_GLES
DepthComponent32 = GL_DEPTH_COMPONENT32,
@ -832,8 +868,10 @@ enum class TextureFormat: GLenum {
/**
* Depth and stencil component, size implementation-dependent. Not
* supported in 3D textures, not allowed in unemulated
* @ref Texture::setStorage() "*Texture::setStorage()" calls.
* supported in 3D textures. Not allowed in unemulated
* @ref Texture::setStorage() "*Texture::setStorage()" calls, in that case
* use e.g. @ref TextureFormat::Depth24Stencil8 "TextureFormat::Depth24Stencil8"
* instead.
* @see @ref Texture::setDepthStencilMode() "*Texture::setDepthStencilMode()"
* @requires_gles30 %Extension @es_extension{OES,packed_depth_stencil} or
* @es_extension{ANGLE,depth_texture} in OpenGL ES 2.0
@ -850,10 +888,11 @@ enum class TextureFormat: GLenum {
* 24bit depth and 8bit stencil component. Not supported in 3D textures.
* @see @ref Texture::setDepthStencilMode() "*Texture::setDepthStencilMode()"
* @requires_gl30 %Extension @extension{ARB,framebuffer_object}
* @requires_gles30 %Extension @es_extension{OES,packed_depth_stencil} and
* (@es_extension{OES,required_internalformat} or
* (@es_extension{EXT,texture_storage} and @es_extension{ANGLE,depth_texture}))
* in OpenGL ES 2.0
* @requires_gles30 %Extension @es_extension{OES,packed_depth_stencil} or
* @es_extension{ANGLE,depth_texture} and either
* @es_extension{OES,required_internalformat} (for image
* specification) or @es_extension{EXT,texture_storage} (for texture
* storage) in OpenGL ES 2.0
*/
#ifdef MAGNUM_TARGET_GLES2
Depth24Stencil8 = GL_DEPTH24_STENCIL8_OES

9
src/MagnumExternal/OpenGL/GL/CMakeLists.txt vendored

@ -23,12 +23,13 @@
# DEALINGS IN THE SOFTWARE.
#
add_library(MagnumGLLoadGenObjects OBJECT gl_magnum.c)
# flextGLPlatform.cpp is compiled as part of Magnum*Context libraries in Platform
add_library(MagnumFlextGLObjects OBJECT flextGL.cpp)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
set_target_properties(MagnumGLLoadGenObjects PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -fvisibility=hidden -DGLLoadGen_EXPORTS")
set_target_properties(MagnumFlextGLObjects PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -fvisibility=hidden -DFlextGL_EXPORTS")
else()
set_target_properties(MagnumGLLoadGenObjects PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -DGLLoadGen_EXPORTS")
set_target_properties(MagnumFlextGLObjects PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -DFlextGL_EXPORTS")
endif()
install(FILES gl_magnum.h DESTINATION ${MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR}/OpenGL/GL)
install(FILES flextGL.h DESTINATION ${MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR}/OpenGL/GL)

17
src/MagnumExternal/OpenGL/GL/README.md vendored

@ -1,12 +1,11 @@
OpenGL header and extension loader is generated using glLoadGen, originally
from [BitBucket](https://bitbucket.org/alfonse/glloadgen), with Magnum-related
changes at [](https://github.com/mosra/glloadgen.git).
OpenGL header and extension loader is generated using flextGL, get it at
[](https://github.com/ginkgo/flextGL).
See `extensions.txt` for a list of requested non-core extensions. Copy the file
into glLoadGen directory and generate the files using Lua:
See [](extensions.txt) for requested version and a list of non-core extensions.
Call `flextGLgen.py` in this directory with the following arguments:
lua LoadGen.lua -style=pointer_c -indent=space -spec=gl -version=4.4 -profile=core -extfile=extensions.txt magnum
.../flextGLgen.py -D . -t . extensions.txt
Then copy generated `gl_magnum.c` and `gl_magnum.h` to this directory. You may
want to remove trailing spaces to make the diff cleaner. Be sure to check the
diff for suspicious changes.
It will generate `flextGL.h`, `flextGL.cpp` and `flextGLPlatform.cpp` files. As
usual, be sure to check the diff for suspicious changes and whitespace-at-EOL
(although there shouldn't be any).

29
src/MagnumExternal/OpenGL/GL/extensions.txt vendored

@ -1,15 +1,16 @@
// The following output is taken from `magnum-info` with removed `GL_`
// suffixes. Only vendor extensions are needed, everything else is pulled in
// with OpenGL 4.4.
# The following output is taken from `magnum-info` with removed `GL_` prefixes.
# Only vendor extensions are needed, everything else is pulled in with GL 4.4.
AMD_vertex_shader_layer
AMD_shader_trinary_minmax
ARB_robustness
ATI_texture_mirror_once
EXT_texture_filter_anisotropic
EXT_texture_mirror_clamp
EXT_direct_state_access
EXT_texture_sRGB_decode
EXT_debug_label
EXT_debug_marker
GREMEDY_string_marker
version 4.4 core
extension AMD_vertex_shader_layer optional
extension AMD_shader_trinary_minmax optional
extension ARB_robustness optional
extension ATI_texture_mirror_once optional
extension EXT_texture_filter_anisotropic optional
extension EXT_texture_mirror_clamp optional
extension EXT_direct_state_access optional
extension EXT_texture_sRGB_decode optional
extension EXT_debug_label optional
extension EXT_debug_marker optional
extension GREMEDY_string_marker optional

812
src/MagnumExternal/OpenGL/GL/flextGL.cpp vendored

@ -0,0 +1,812 @@
#include "flextGL.h"
#ifdef __cplusplus
extern "C" {
#endif
/* GL_VERSION_1_2 */
FLEXTGL_EXPORT void(APIENTRY *flextglDrawRangeElements)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
/* GL_VERSION_1_3 */
FLEXTGL_EXPORT void(APIENTRY *flextglActiveTexture)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSampleCoverage)(GLfloat, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage1D)(GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage1D)(GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetCompressedTexImage)(GLenum, GLint, void *) = nullptr;
/* GL_VERSION_1_4 */
FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArrays)(GLenum, const GLint *, const GLsizei *, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElements)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPointParameterf)(GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPointParameterfv)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPointParameteri)(GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPointParameteriv)(GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquation)(GLenum) = nullptr;
/* GL_VERSION_1_5 */
FLEXTGL_EXPORT void(APIENTRY *flextglGenQueries)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueries)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQuery)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBeginQuery)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEndQuery)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryiv)(GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuiv)(GLuint, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffer)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteBuffers)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenBuffers)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsBuffer)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBufferData)(GLenum, GLsizeiptr, const void *, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferSubData)(GLenum, GLintptr, GLsizeiptr, void *) = nullptr;
FLEXTGL_EXPORT void *(APIENTRY *flextglMapBuffer)(GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBuffer)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteriv)(GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointerv)(GLenum, GLenum, void **) = nullptr;
/* GL_VERSION_2_0 */
FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparate)(GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffers)(GLsizei, const GLenum *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilMaskSeparate)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglAttachShader)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindAttribLocation)(GLuint, GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompileShader)(GLuint) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateProgram)(void) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShader)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgram)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteShader)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDetachShader)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexAttribArray)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexAttribArray)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetAttribLocation)(GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderSource)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetUniformLocation)(GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformfv)(GLuint, GLint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformiv)(GLuint, GLint, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribdv)(GLuint, GLenum, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribfv)(GLuint, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribPointerv)(GLuint, GLenum, void **) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgram)(GLuint) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsShader)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglLinkProgram)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglShaderSource)(GLuint, GLsizei, const GLchar *const*, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUseProgram)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1f)(GLint, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2f)(GLint, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3f)(GLint, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1i)(GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2i)(GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3i)(GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4i)(GLint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1fv)(GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2fv)(GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3fv)(GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4fv)(GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1iv)(GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2iv)(GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3iv)(GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4iv)(GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgram)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1d)(GLuint, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1f)(GLuint, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1fv)(GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1s)(GLuint, GLshort) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1sv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2d)(GLuint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2f)(GLuint, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2fv)(GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2s)(GLuint, GLshort, GLshort) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2sv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3d)(GLuint, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3fv)(GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3s)(GLuint, GLshort, GLshort, GLshort) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3sv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nbv)(GLuint, const GLbyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Niv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nsv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nub)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nubv)(GLuint, const GLubyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nuiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4Nusv)(GLuint, const GLushort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4bv)(GLuint, const GLbyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4d)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4fv)(GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4iv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4s)(GLuint, GLshort, GLshort, GLshort, GLshort) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4sv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4ubv)(GLuint, const GLubyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4uiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4usv)(GLuint, const GLushort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *) = nullptr;
/* GL_VERSION_2_1 */
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
/* GL_VERSION_3_0 */
FLEXTGL_EXPORT void(APIENTRY *flextglColorMaski)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleani_v)(GLenum, GLuint, GLboolean *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegeri_v)(GLenum, GLuint, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnablei)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisablei)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnabledi)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBeginTransformFeedback)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEndTransformFeedback)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferRange)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferBase)(GLenum, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTransformFeedbackVaryings)(GLuint, GLsizei, const GLchar *const*, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTransformFeedbackVarying)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClampColor)(GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBeginConditionalRender)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEndConditionalRender)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIPointer)(GLuint, GLint, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIuiv)(GLuint, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI1i)(GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI2i)(GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI3i)(GLuint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4i)(GLuint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI1ui)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI2ui)(GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI3ui)(GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4ui)(GLuint, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI1iv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI2iv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI3iv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4iv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI1uiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI2uiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI3uiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4uiv)(GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4bv)(GLuint, const GLbyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4sv)(GLuint, const GLshort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4ubv)(GLuint, const GLubyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4usv)(GLuint, const GLushort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformuiv)(GLuint, GLint, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindFragDataLocation)(GLuint, GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetFragDataLocation)(GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1ui)(GLint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2ui)(GLint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3ui)(GLint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4ui)(GLint, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1uiv)(GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2uiv)(GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3uiv)(GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4uiv)(GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIiv)(GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuiv)(GLenum, GLenum, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIiv)(GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIuiv)(GLenum, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferiv)(GLenum, GLint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferuiv)(GLenum, GLint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfv)(GLenum, GLint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfi)(GLenum, GLint, GLfloat, GLint) = nullptr;
FLEXTGL_EXPORT const GLubyte *(APIENTRY *flextglGetStringi)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsRenderbuffer)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindRenderbuffer)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteRenderbuffers)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenRenderbuffers)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetRenderbufferParameteriv)(GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsFramebuffer)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindFramebuffer)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteFramebuffers)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenFramebuffers)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckFramebufferStatus)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture1D)(GLenum, GLenum, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture3D)(GLenum, GLenum, GLenum, GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMipmap)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebuffer)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTextureLayer)(GLenum, GLenum, GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRange)(GLenum, GLintptr, GLsizeiptr, GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRange)(GLenum, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexArray)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteVertexArrays)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenVertexArrays)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsVertexArray)(GLuint) = nullptr;
/* GL_VERSION_3_1 */
FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstanced)(GLenum, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstanced)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexBuffer)(GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPrimitiveRestartIndex)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformIndices)(GLuint, GLsizei, const GLchar *const*, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformsiv)(GLuint, GLsizei, const GLuint *, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformName)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetUniformBlockIndex)(GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockiv)(GLuint, GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockName)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformBlockBinding)(GLuint, GLuint, GLuint) = nullptr;
/* GL_VERSION_3_2 */
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsBaseVertex)(GLenum, GLsizei, GLenum, const void *, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawRangeElementsBaseVertex)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedBaseVertex)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsBaseVertex)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProvokingVertex)(GLenum) = nullptr;
FLEXTGL_EXPORT GLsync(APIENTRY *flextglFenceSync)(GLenum, GLbitfield) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSync)(GLsync) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSync)(GLsync) = nullptr;
FLEXTGL_EXPORT GLenum(APIENTRY *flextglClientWaitSync)(GLsync, GLbitfield, GLuint64) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglWaitSync)(GLsync, GLbitfield, GLuint64) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64v)(GLenum, GLint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetSynciv)(GLsync, GLenum, GLsizei, GLsizei *, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64i_v)(GLenum, GLuint, GLint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteri64v)(GLenum, GLenum, GLint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture)(GLenum, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexImage2DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultisamplefv)(GLenum, GLuint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSampleMaski)(GLuint, GLbitfield) = nullptr;
/* GL_VERSION_3_3 */
FLEXTGL_EXPORT void(APIENTRY *flextglBindFragDataLocationIndexed)(GLuint, GLuint, GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetFragDataIndex)(GLuint, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenSamplers)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSamplers)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSampler)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindSampler)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteri)(GLuint, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteriv)(GLuint, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterf)(GLuint, GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterfv)(GLuint, GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIiv)(GLuint, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIuiv)(GLuint, GLenum, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameteriv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterfv)(GLuint, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIuiv)(GLuint, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglQueryCounter)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjecti64v)(GLuint, GLenum, GLint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectui64v)(GLuint, GLenum, GLuint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisor)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP1ui)(GLuint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP1uiv)(GLuint, GLenum, GLboolean, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP2ui)(GLuint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP2uiv)(GLuint, GLenum, GLboolean, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP3ui)(GLuint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP3uiv)(GLuint, GLenum, GLboolean, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP4ui)(GLuint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribP4uiv)(GLuint, GLenum, GLboolean, const GLuint *) = nullptr;
/* GL_VERSION_4_0 */
FLEXTGL_EXPORT void(APIENTRY *flextglMinSampleShading)(GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationi)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparatei)(GLuint, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunci)(GLuint, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparatei)(GLuint, GLenum, GLenum, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysIndirect)(GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsIndirect)(GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1d)(GLint, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2d)(GLint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3d)(GLint, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4d)(GLint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform1dv)(GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform2dv)(GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform3dv)(GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniform4dv)(GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x3dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x4dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x2dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x4dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x2dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x3dv)(GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformdv)(GLuint, GLint, GLdouble *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetSubroutineUniformLocation)(GLuint, GLenum, const GLchar *) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetSubroutineIndex)(GLuint, GLenum, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveSubroutineUniformiv)(GLuint, GLenum, GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveSubroutineUniformName)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveSubroutineName)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUniformSubroutinesuiv)(GLenum, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformSubroutineuiv)(GLenum, GLint, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramStageiv)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPatchParameteri)(GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPatchParameterfv)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindTransformFeedback)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteTransformFeedbacks)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenTransformFeedbacks)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsTransformFeedback)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPauseTransformFeedback)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglResumeTransformFeedback)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawTransformFeedback)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawTransformFeedbackStream)(GLenum, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBeginQueryIndexed)(GLenum, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEndQueryIndexed)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryIndexediv)(GLenum, GLuint, GLenum, GLint *) = nullptr;
/* GL_VERSION_4_1 */
FLEXTGL_EXPORT void(APIENTRY *flextglReleaseShaderCompiler)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglShaderBinary)(GLsizei, const GLuint *, GLenum, const void *, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangef)(GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearDepthf)(GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramBinary)(GLuint, GLsizei, GLsizei *, GLenum *, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramBinary)(GLuint, GLenum, const void *, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteri)(GLuint, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStages)(GLuint, GLbitfield, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgram)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramv)(GLenum, GLsizei, const GLchar *const*) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipeline)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelines)(GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelines)(GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipeline)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineiv)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1i)(GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1f)(GLuint, GLint, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1d)(GLuint, GLint, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1dv)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ui)(GLuint, GLint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2i)(GLuint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2f)(GLuint, GLint, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2d)(GLuint, GLint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2dv)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ui)(GLuint, GLint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3i)(GLuint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3f)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3d)(GLuint, GLint, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3dv)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ui)(GLuint, GLint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4i)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4f)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4d)(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4dv)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ui)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3dv)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipeline)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL1d)(GLuint, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL2d)(GLuint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL3d)(GLuint, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL4d)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL1dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL2dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL3dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribL4dv)(GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribLPointer)(GLuint, GLint, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribLdv)(GLuint, GLenum, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglViewportArrayv)(GLuint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglViewportIndexedf)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglViewportIndexedfv)(GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglScissorArrayv)(GLuint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglScissorIndexed)(GLuint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglScissorIndexedv)(GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangeArrayv)(GLuint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangeIndexed)(GLuint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFloati_v)(GLenum, GLuint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetDoublei_v)(GLenum, GLuint, GLdouble *) = nullptr;
/* GL_VERSION_4_2 */
FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedBaseInstance)(GLenum, GLint, GLsizei, GLsizei, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedBaseInstance)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedBaseVertexBaseInstance)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetInternalformativ)(GLenum, GLenum, GLenum, GLsizei, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAtomicCounterBufferiv)(GLuint, GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindImageTexture)(GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMemoryBarrier)(GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage1D)(GLenum, GLsizei, GLenum, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawTransformFeedbackInstanced)(GLenum, GLuint, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawTransformFeedbackStreamInstanced)(GLenum, GLuint, GLuint, GLsizei) = nullptr;
/* GL_VERSION_4_3 */
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferData)(GLenum, GLenum, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferSubData)(GLenum, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDispatchCompute)(GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDispatchComputeIndirect)(GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyImageSubData)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferParameteri)(GLenum, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferParameteriv)(GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetInternalformati64v)(GLenum, GLenum, GLenum, GLsizei, GLint64 *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateTexSubImage)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateTexImage)(GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateBufferSubData)(GLuint, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateBufferData)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateFramebuffer)(GLenum, GLsizei, const GLenum *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateSubFramebuffer)(GLenum, GLsizei, const GLenum *, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArraysIndirect)(GLenum, const void *, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsIndirect)(GLenum, GLenum, const void *, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInterfaceiv)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetProgramResourceIndex)(GLuint, GLenum, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceName)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceiv)(GLuint, GLenum, GLuint, GLsizei, const GLenum *, GLsizei, GLsizei *, GLint *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetProgramResourceLocation)(GLuint, GLenum, const GLchar *) = nullptr;
FLEXTGL_EXPORT GLint(APIENTRY *flextglGetProgramResourceLocationIndex)(GLuint, GLenum, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglShaderStorageBlockBinding)(GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexBufferRange)(GLenum, GLenum, GLuint, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureView)(GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribFormat)(GLuint, GLint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIFormat)(GLuint, GLint, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribLFormat)(GLuint, GLint, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribBinding)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexBindingDivisor)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageControl)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageInsert)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageCallback)(GLDEBUGPROC, const void *) = nullptr;
FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetDebugMessageLog)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPushDebugGroup)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPopDebugGroup)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglObjectLabel)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabel)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglObjectPtrLabel)(const void *, GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectPtrLabel)(const void *, GLsizei, GLsizei *, GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetPointerv)(GLenum, void **) = nullptr;
/* GL_VERSION_4_4 */
FLEXTGL_EXPORT void(APIENTRY *flextglBufferStorage)(GLenum, GLsizeiptr, const void *, GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearTexImage)(GLuint, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearTexSubImage)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffersBase)(GLenum, GLuint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffersRange)(GLenum, GLuint, GLsizei, const GLuint *, const GLintptr *, const GLsizeiptr *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindTextures)(GLuint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindSamplers)(GLuint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindImageTextures)(GLuint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexBuffers)(GLuint, GLsizei, const GLuint *, const GLintptr *, const GLsizei *) = nullptr;
/* GL_ARB_robustness */
FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusARB)(void) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnTexImageARB)(GLenum, GLint, GLenum, GLenum, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsARB)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnCompressedTexImageARB)(GLenum, GLint, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvARB)(GLuint, GLint, GLsizei, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivARB)(GLuint, GLint, GLsizei, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformuivARB)(GLuint, GLint, GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformdvARB)(GLuint, GLint, GLsizei, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnMapdvARB)(GLenum, GLenum, GLsizei, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnMapfvARB)(GLenum, GLenum, GLsizei, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnMapivARB)(GLenum, GLenum, GLsizei, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnPixelMapfvARB)(GLenum, GLsizei, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnPixelMapuivARB)(GLenum, GLsizei, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnPixelMapusvARB)(GLenum, GLsizei, GLushort *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnPolygonStippleARB)(GLsizei, GLubyte *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnColorTableARB)(GLenum, GLenum, GLenum, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnConvolutionFilterARB)(GLenum, GLenum, GLenum, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnSeparableFilterARB)(GLenum, GLenum, GLenum, GLsizei, void *, GLsizei, void *, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnHistogramARB)(GLenum, GLboolean, GLenum, GLenum, GLsizei, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetnMinmaxARB)(GLenum, GLboolean, GLenum, GLenum, GLsizei, void *) = nullptr;
/* GL_EXT_direct_state_access */
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixLoadfEXT)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixLoaddEXT)(GLenum, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixMultfEXT)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixMultdEXT)(GLenum, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixLoadIdentityEXT)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixRotatefEXT)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixRotatedEXT)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixScalefEXT)(GLenum, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixScaledEXT)(GLenum, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixTranslatefEXT)(GLenum, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixTranslatedEXT)(GLenum, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixFrustumEXT)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixOrthoEXT)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixPopEXT)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixPushEXT)(GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClientAttribDefaultEXT)(GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPushClientAttribDefaultEXT)(GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameterfEXT)(GLuint, GLenum, GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameterfvEXT)(GLuint, GLenum, GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameteriEXT)(GLuint, GLenum, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameterivEXT)(GLuint, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureImage1DEXT)(GLuint, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureImage2DEXT)(GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureSubImage1DEXT)(GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureSubImage2DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTextureImage1DEXT)(GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTextureImage2DEXT)(GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTextureSubImage1DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTextureSubImage2DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureImageEXT)(GLuint, GLenum, GLint, GLenum, GLenum, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureParameterfvEXT)(GLuint, GLenum, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureParameterivEXT)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureLevelParameterfvEXT)(GLuint, GLenum, GLint, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureLevelParameterivEXT)(GLuint, GLenum, GLint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureImage3DEXT)(GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureSubImage3DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTextureSubImage3DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglBindMultiTextureEXT)(GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexCoordPointerEXT)(GLenum, GLint, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexEnvfEXT)(GLenum, GLenum, GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexEnvfvEXT)(GLenum, GLenum, GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexEnviEXT)(GLenum, GLenum, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexEnvivEXT)(GLenum, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGendEXT)(GLenum, GLenum, GLenum, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGendvEXT)(GLenum, GLenum, GLenum, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGenfEXT)(GLenum, GLenum, GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGenfvEXT)(GLenum, GLenum, GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGeniEXT)(GLenum, GLenum, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexGenivEXT)(GLenum, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexEnvfvEXT)(GLenum, GLenum, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexEnvivEXT)(GLenum, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexGendvEXT)(GLenum, GLenum, GLenum, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexGenfvEXT)(GLenum, GLenum, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexGenivEXT)(GLenum, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameteriEXT)(GLenum, GLenum, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameterivEXT)(GLenum, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameterfEXT)(GLenum, GLenum, GLenum, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameterfvEXT)(GLenum, GLenum, GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexImage1DEXT)(GLenum, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexImage2DEXT)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexSubImage1DEXT)(GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexSubImage2DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyMultiTexImage1DEXT)(GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyMultiTexImage2DEXT)(GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyMultiTexSubImage1DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyMultiTexSubImage2DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexImageEXT)(GLenum, GLenum, GLint, GLenum, GLenum, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexParameterfvEXT)(GLenum, GLenum, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexParameterivEXT)(GLenum, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexLevelParameterfvEXT)(GLenum, GLenum, GLint, GLenum, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexLevelParameterivEXT)(GLenum, GLenum, GLint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexImage3DEXT)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexSubImage3DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyMultiTexSubImage3DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableClientStateIndexedEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableClientStateIndexedEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFloatIndexedvEXT)(GLenum, GLuint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetDoubleIndexedvEXT)(GLenum, GLuint, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetPointerIndexedvEXT)(GLenum, GLuint, void **) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableIndexedEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableIndexedEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnabledIndexedEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegerIndexedvEXT)(GLenum, GLuint, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleanIndexedvEXT)(GLenum, GLuint, GLboolean *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureImage3DEXT)(GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureImage2DEXT)(GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureImage1DEXT)(GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureSubImage3DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureSubImage2DEXT)(GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTextureSubImage1DEXT)(GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetCompressedTextureImageEXT)(GLuint, GLenum, GLint, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexImage3DEXT)(GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexImage2DEXT)(GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexImage1DEXT)(GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexSubImage3DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexSubImage2DEXT)(GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglCompressedMultiTexSubImage1DEXT)(GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetCompressedMultiTexImageEXT)(GLenum, GLenum, GLint, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixLoadTransposefEXT)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixLoadTransposedEXT)(GLenum, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixMultTransposefEXT)(GLenum, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMatrixMultTransposedEXT)(GLenum, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedBufferDataEXT)(GLuint, GLsizeiptr, const void *, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedBufferSubDataEXT)(GLuint, GLintptr, GLsizeiptr, const void *) = nullptr;
FLEXTGL_EXPORT void *(APIENTRY *flextglMapNamedBufferEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapNamedBufferEXT)(GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedBufferParameterivEXT)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedBufferPointervEXT)(GLuint, GLenum, void **) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedBufferSubDataEXT)(GLuint, GLintptr, GLsizeiptr, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureBufferEXT)(GLuint, GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexBufferEXT)(GLenum, GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameterIivEXT)(GLuint, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureParameterIuivEXT)(GLuint, GLenum, GLenum, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureParameterIivEXT)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTextureParameterIuivEXT)(GLuint, GLenum, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameterIivEXT)(GLenum, GLenum, GLenum, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexParameterIuivEXT)(GLenum, GLenum, GLenum, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexParameterIivEXT)(GLenum, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetMultiTexParameterIuivEXT)(GLenum, GLenum, GLenum, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiEXT)(GLuint, GLint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiEXT)(GLuint, GLint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameters4fvEXT)(GLuint, GLenum, GLuint, GLsizei, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameterI4iEXT)(GLuint, GLenum, GLuint, GLint, GLint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameterI4ivEXT)(GLuint, GLenum, GLuint, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParametersI4ivEXT)(GLuint, GLenum, GLuint, GLsizei, const GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameterI4uiEXT)(GLuint, GLenum, GLuint, GLuint, GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameterI4uivEXT)(GLuint, GLenum, GLuint, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParametersI4uivEXT)(GLuint, GLenum, GLuint, GLsizei, const GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramLocalParameterIivEXT)(GLuint, GLenum, GLuint, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramLocalParameterIuivEXT)(GLuint, GLenum, GLuint, GLuint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableClientStateiEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableClientStateiEXT)(GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFloati_vEXT)(GLenum, GLuint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetDoublei_vEXT)(GLenum, GLuint, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetPointeri_vEXT)(GLenum, GLuint, void **) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramStringEXT)(GLuint, GLenum, GLenum, GLsizei, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameter4dEXT)(GLuint, GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameter4dvEXT)(GLuint, GLenum, GLuint, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameter4fEXT)(GLuint, GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedProgramLocalParameter4fvEXT)(GLuint, GLenum, GLuint, const GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramLocalParameterdvEXT)(GLuint, GLenum, GLuint, GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramLocalParameterfvEXT)(GLuint, GLenum, GLuint, GLfloat *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramivEXT)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedProgramStringEXT)(GLuint, GLenum, GLenum, void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedRenderbufferStorageEXT)(GLuint, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedRenderbufferParameterivEXT)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedRenderbufferStorageMultisampleEXT)(GLuint, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedRenderbufferStorageMultisampleCoverageEXT)(GLuint, GLsizei, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckNamedFramebufferStatusEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTexture1DEXT)(GLuint, GLenum, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTexture2DEXT)(GLuint, GLenum, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTexture3DEXT)(GLuint, GLenum, GLenum, GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferRenderbufferEXT)(GLuint, GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedFramebufferAttachmentParameterivEXT)(GLuint, GLenum, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenerateTextureMipmapEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMultiTexMipmapEXT)(GLenum, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferDrawBufferEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferDrawBuffersEXT)(GLuint, GLsizei, const GLenum *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferReadBufferEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferParameterivEXT)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedCopyBufferSubDataEXT)(GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTextureEXT)(GLuint, GLenum, GLuint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTextureLayerEXT)(GLuint, GLenum, GLuint, GLint, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferTextureFaceEXT)(GLuint, GLenum, GLuint, GLint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureRenderbufferEXT)(GLuint, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglMultiTexRenderbufferEXT)(GLenum, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexOffsetEXT)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayColorOffsetEXT)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayEdgeFlagOffsetEXT)(GLuint, GLuint, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayIndexOffsetEXT)(GLuint, GLuint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayNormalOffsetEXT)(GLuint, GLuint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayTexCoordOffsetEXT)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayMultiTexCoordOffsetEXT)(GLuint, GLuint, GLenum, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayFogCoordOffsetEXT)(GLuint, GLuint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArraySecondaryColorOffsetEXT)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribOffsetEXT)(GLuint, GLuint, GLuint, GLint, GLenum, GLboolean, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribIOffsetEXT)(GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexArrayEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexArrayEXT)(GLuint, GLenum) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexArrayAttribEXT)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexArrayAttribEXT)(GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexArrayIntegervEXT)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexArrayPointervEXT)(GLuint, GLenum, void **) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexArrayIntegeri_vEXT)(GLuint, GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexArrayPointeri_vEXT)(GLuint, GLuint, GLenum, void **) = nullptr;
FLEXTGL_EXPORT void *(APIENTRY *flextglMapNamedBufferRangeEXT)(GLuint, GLintptr, GLsizeiptr, GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedNamedBufferRangeEXT)(GLuint, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedBufferStorageEXT)(GLuint, GLsizeiptr, const void *, GLbitfield) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearNamedBufferDataEXT)(GLuint, GLenum, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglClearNamedBufferSubDataEXT)(GLuint, GLenum, GLsizeiptr, GLsizeiptr, GLenum, GLenum, const void *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglNamedFramebufferParameteriEXT)(GLuint, GLenum, GLint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetNamedFramebufferParameterivEXT)(GLuint, GLenum, GLint *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1dEXT)(GLuint, GLint, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2dEXT)(GLuint, GLint, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3dEXT)(GLuint, GLint, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4dEXT)(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1dvEXT)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2dvEXT)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3dvEXT)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4dvEXT)(GLuint, GLint, GLsizei, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3dvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureBufferRangeEXT)(GLuint, GLenum, GLenum, GLuint, GLintptr, GLsizeiptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage1DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage2DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage3DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage2DMultisampleEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage3DMultisampleEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayBindVertexBufferEXT)(GLuint, GLuint, GLuint, GLintptr, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribFormatEXT)(GLuint, GLuint, GLint, GLenum, GLboolean, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribIFormatEXT)(GLuint, GLuint, GLint, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribLFormatEXT)(GLuint, GLuint, GLint, GLenum, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribBindingEXT)(GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexBindingDivisorEXT)(GLuint, GLuint, GLuint) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribLOffsetEXT)(GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglTexturePageCommitmentEXT)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglVertexArrayVertexAttribDivisorEXT)(GLuint, GLuint, GLuint) = nullptr;
/* GL_EXT_debug_label */
FLEXTGL_EXPORT void(APIENTRY *flextglLabelObjectEXT)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelEXT)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr;
/* GL_EXT_debug_marker */
FLEXTGL_EXPORT void(APIENTRY *flextglInsertEventMarkerEXT)(GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPushGroupMarkerEXT)(GLsizei, const GLchar *) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglPopGroupMarkerEXT)(void) = nullptr;
/* GL_GREMEDY_string_marker */
FLEXTGL_EXPORT void(APIENTRY *flextglStringMarkerGREMEDY)(GLsizei, const void *) = nullptr;
#ifdef __cplusplus
}
#endif

20
src/MagnumExternal/OpenGL/GL/flextGL.cpp.template vendored

@ -0,0 +1,20 @@
@require(passthru, functions, enums, options, version, extensions)
#include "flextGL.h"
#ifdef __cplusplus
extern "C" {
#endif
@for category,funcs in functions:
@if len(funcs) > 0 and category not in ['VERSION_1_0', 'VERSION_1_1','VERSION_1_0_DEPRECATED', 'VERSION_1_1_DEPRECATED' ]:
/* GL_@category */
@for f in funcs:
FLEXTGL_EXPORT @f.returntype\
(APIENTRY *flextgl@f.name)(@f.param_type_list_string()) = nullptr;
@end
@end
@end
#ifdef __cplusplus
}
#endif

3213
src/MagnumExternal/OpenGL/GL/flextGL.h vendored

File diff suppressed because it is too large Load Diff

96
src/MagnumExternal/OpenGL/GL/flextGL.h.template vendored

@ -0,0 +1,96 @@
@require(passthru, functions, enums, options, version, extensions)
#ifndef _flextgl_h_
#define _flextgl_h_
/* Defensive include guards */
#if defined(__glew_h__) || defined(__GLEW_H__)
#error Attempt to include auto-generated header after including glew.h
#endif
#if defined(__gl_h_) || defined(__GL_H__)
#error Attempt to include auto-generated header after including gl.h
#endif
#if defined(__glext_h_) || defined(__GLEXT_H_)
#error Attempt to include auto-generated header after including glext.h
#endif
#if defined(__gltypes_h_)
#error Attempt to include auto-generated header after gltypes.h
#endif
#if defined(__gl_ATI_h_)
#error Attempt to include auto-generated header after including glATI.h
#endif
#define __glew_h__
#define __GLEW_H__
#define __gl_h_
#define __GL_H__
#define __glext_h_
#define __GLEXT_H_
#define __gltypes_h_
#define __gl_ATI_h_
#ifdef __cplusplus
extern "C" {
#endif
void flextGLInit();
/* Function declaration macros */
#ifdef _WIN32
#ifdef FlextGL_EXPORTS
#define FLEXTGL_EXPORT __declspec(dllexport)
#else
#define FLEXTGL_EXPORT __declspec(dllimport)
#endif
#else
#define FLEXTGL_EXPORT __attribute__ ((visibility ("default")))
#endif
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
#define WIN32_LEAN_AND_MEAN 1
#ifndef WINAPI
#define WINAPI __stdcall
#endif
#define APIENTRY WINAPI
#endif
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef GLAPI
#define GLAPI extern
#endif
/* Data types */
@passthru
/* Enums */
@enums
/* Function prototypes */
@for cat,funcs in functions:
/* GL_@cat */
@if cat in ['VERSION_1_0', 'VERSION_1_1','VERSION_1_0_DEPRECATED', 'VERSION_1_1_DEPRECATED']:
@for f in funcs:
GLAPI FLEXTGL_EXPORT @f.returntype APIENTRY gl@f.name\
(@f.param_type_list_string());
@end
@else:
@for f in funcs:
GLAPI FLEXTGL_EXPORT @f.returntype\
(APIENTRY *flextgl@f.name)(@f.param_type_list_string());
#define gl@f.name flextgl@f.name
@end
@end
@end
#ifdef __cplusplus
}
#endif
#endif

825
src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp vendored

@ -0,0 +1,825 @@
#include "flextGL.h"
#include <cstdio>
#include <cstdlib>
#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h"
void flextGLInit() {
Magnum::Platform::Implementation::OpenGLFunctionLoader loader;
/* GL_VERSION_1_2 */
flextglDrawRangeElements = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *)>(loader.load("glDrawRangeElements"));
flextglTexImage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTexImage3D"));
flextglTexSubImage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTexSubImage3D"));
flextglCopyTexSubImage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyTexSubImage3D"));
/* GL_VERSION_1_3 */
flextglActiveTexture = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glActiveTexture"));
flextglSampleCoverage = reinterpret_cast<void(APIENTRY*)(GLfloat, GLboolean)>(loader.load("glSampleCoverage"));
flextglCompressedTexImage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTexImage3D"));
flextglCompressedTexImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTexImage2D"));
flextglCompressedTexImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTexImage1D"));
flextglCompressedTexSubImage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTexSubImage3D"));
flextglCompressedTexSubImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTexSubImage2D"));
flextglCompressedTexSubImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTexSubImage1D"));
flextglGetCompressedTexImage = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, void *)>(loader.load("glGetCompressedTexImage"));
/* GL_VERSION_1_4 */
flextglBlendFuncSeparate = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLenum)>(loader.load("glBlendFuncSeparate"));
flextglMultiDrawArrays = reinterpret_cast<void(APIENTRY*)(GLenum, const GLint *, const GLsizei *, GLsizei)>(loader.load("glMultiDrawArrays"));
flextglMultiDrawElements = reinterpret_cast<void(APIENTRY*)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei)>(loader.load("glMultiDrawElements"));
flextglPointParameterf = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat)>(loader.load("glPointParameterf"));
flextglPointParameterfv = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glPointParameterfv"));
flextglPointParameteri = reinterpret_cast<void(APIENTRY*)(GLenum, GLint)>(loader.load("glPointParameteri"));
flextglPointParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, const GLint *)>(loader.load("glPointParameteriv"));
flextglBlendColor = reinterpret_cast<void(APIENTRY*)(GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glBlendColor"));
flextglBlendEquation = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glBlendEquation"));
/* GL_VERSION_1_5 */
flextglGenQueries = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenQueries"));
flextglDeleteQueries = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteQueries"));
flextglIsQuery = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsQuery"));
flextglBeginQuery = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBeginQuery"));
flextglEndQuery = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glEndQuery"));
flextglGetQueryiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetQueryiv"));
flextglGetQueryObjectiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetQueryObjectiv"));
flextglGetQueryObjectuiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint *)>(loader.load("glGetQueryObjectuiv"));
flextglBindBuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBindBuffer"));
flextglDeleteBuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteBuffers"));
flextglGenBuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenBuffers"));
flextglIsBuffer = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsBuffer"));
flextglBufferData = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizeiptr, const void *, GLenum)>(loader.load("glBufferData"));
flextglBufferSubData = reinterpret_cast<void(APIENTRY*)(GLenum, GLintptr, GLsizeiptr, const void *)>(loader.load("glBufferSubData"));
flextglGetBufferSubData = reinterpret_cast<void(APIENTRY*)(GLenum, GLintptr, GLsizeiptr, void *)>(loader.load("glGetBufferSubData"));
flextglMapBuffer = reinterpret_cast<void *(APIENTRY*)(GLenum, GLenum)>(loader.load("glMapBuffer"));
flextglUnmapBuffer = reinterpret_cast<GLboolean(APIENTRY*)(GLenum)>(loader.load("glUnmapBuffer"));
flextglGetBufferParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetBufferParameteriv"));
flextglGetBufferPointerv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, void **)>(loader.load("glGetBufferPointerv"));
/* GL_VERSION_2_0 */
flextglBlendEquationSeparate = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glBlendEquationSeparate"));
flextglDrawBuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLenum *)>(loader.load("glDrawBuffers"));
flextglStencilOpSeparate = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLenum)>(loader.load("glStencilOpSeparate"));
flextglStencilFuncSeparate = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLuint)>(loader.load("glStencilFuncSeparate"));
flextglStencilMaskSeparate = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glStencilMaskSeparate"));
flextglAttachShader = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glAttachShader"));
flextglBindAttribLocation = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, const GLchar *)>(loader.load("glBindAttribLocation"));
flextglCompileShader = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glCompileShader"));
flextglCreateProgram = reinterpret_cast<GLuint(APIENTRY*)(void)>(loader.load("glCreateProgram"));
flextglCreateShader = reinterpret_cast<GLuint(APIENTRY*)(GLenum)>(loader.load("glCreateShader"));
flextglDeleteProgram = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glDeleteProgram"));
flextglDeleteShader = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glDeleteShader"));
flextglDetachShader = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glDetachShader"));
flextglDisableVertexAttribArray = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glDisableVertexAttribArray"));
flextglEnableVertexAttribArray = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glEnableVertexAttribArray"));
flextglGetActiveAttrib = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *)>(loader.load("glGetActiveAttrib"));
flextglGetActiveUniform = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *)>(loader.load("glGetActiveUniform"));
flextglGetAttachedShaders = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLuint *)>(loader.load("glGetAttachedShaders"));
flextglGetAttribLocation = reinterpret_cast<GLint(APIENTRY*)(GLuint, const GLchar *)>(loader.load("glGetAttribLocation"));
flextglGetProgramiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetProgramiv"));
flextglGetProgramInfoLog = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetProgramInfoLog"));
flextglGetShaderiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetShaderiv"));
flextglGetShaderInfoLog = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetShaderInfoLog"));
flextglGetShaderSource = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetShaderSource"));
flextglGetUniformLocation = reinterpret_cast<GLint(APIENTRY*)(GLuint, const GLchar *)>(loader.load("glGetUniformLocation"));
flextglGetUniformfv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat *)>(loader.load("glGetUniformfv"));
flextglGetUniformiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint *)>(loader.load("glGetUniformiv"));
flextglGetVertexAttribdv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLdouble *)>(loader.load("glGetVertexAttribdv"));
flextglGetVertexAttribfv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLfloat *)>(loader.load("glGetVertexAttribfv"));
flextglGetVertexAttribiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetVertexAttribiv"));
flextglGetVertexAttribPointerv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, void **)>(loader.load("glGetVertexAttribPointerv"));
flextglIsProgram = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsProgram"));
flextglIsShader = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsShader"));
flextglLinkProgram = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glLinkProgram"));
flextglShaderSource = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLchar *const*, const GLint *)>(loader.load("glShaderSource"));
flextglUseProgram = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glUseProgram"));
flextglUniform1f = reinterpret_cast<void(APIENTRY*)(GLint, GLfloat)>(loader.load("glUniform1f"));
flextglUniform2f = reinterpret_cast<void(APIENTRY*)(GLint, GLfloat, GLfloat)>(loader.load("glUniform2f"));
flextglUniform3f = reinterpret_cast<void(APIENTRY*)(GLint, GLfloat, GLfloat, GLfloat)>(loader.load("glUniform3f"));
flextglUniform4f = reinterpret_cast<void(APIENTRY*)(GLint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glUniform4f"));
flextglUniform1i = reinterpret_cast<void(APIENTRY*)(GLint, GLint)>(loader.load("glUniform1i"));
flextglUniform2i = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLint)>(loader.load("glUniform2i"));
flextglUniform3i = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLint, GLint)>(loader.load("glUniform3i"));
flextglUniform4i = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLint, GLint, GLint)>(loader.load("glUniform4i"));
flextglUniform1fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLfloat *)>(loader.load("glUniform1fv"));
flextglUniform2fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLfloat *)>(loader.load("glUniform2fv"));
flextglUniform3fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLfloat *)>(loader.load("glUniform3fv"));
flextglUniform4fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLfloat *)>(loader.load("glUniform4fv"));
flextglUniform1iv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLint *)>(loader.load("glUniform1iv"));
flextglUniform2iv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLint *)>(loader.load("glUniform2iv"));
flextglUniform3iv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLint *)>(loader.load("glUniform3iv"));
flextglUniform4iv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLint *)>(loader.load("glUniform4iv"));
flextglUniformMatrix2fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix2fv"));
flextglUniformMatrix3fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix3fv"));
flextglUniformMatrix4fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix4fv"));
flextglValidateProgram = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glValidateProgram"));
flextglVertexAttrib1d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble)>(loader.load("glVertexAttrib1d"));
flextglVertexAttrib1dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttrib1dv"));
flextglVertexAttrib1f = reinterpret_cast<void(APIENTRY*)(GLuint, GLfloat)>(loader.load("glVertexAttrib1f"));
flextglVertexAttrib1fv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLfloat *)>(loader.load("glVertexAttrib1fv"));
flextglVertexAttrib1s = reinterpret_cast<void(APIENTRY*)(GLuint, GLshort)>(loader.load("glVertexAttrib1s"));
flextglVertexAttrib1sv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttrib1sv"));
flextglVertexAttrib2d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble)>(loader.load("glVertexAttrib2d"));
flextglVertexAttrib2dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttrib2dv"));
flextglVertexAttrib2f = reinterpret_cast<void(APIENTRY*)(GLuint, GLfloat, GLfloat)>(loader.load("glVertexAttrib2f"));
flextglVertexAttrib2fv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLfloat *)>(loader.load("glVertexAttrib2fv"));
flextglVertexAttrib2s = reinterpret_cast<void(APIENTRY*)(GLuint, GLshort, GLshort)>(loader.load("glVertexAttrib2s"));
flextglVertexAttrib2sv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttrib2sv"));
flextglVertexAttrib3d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble, GLdouble)>(loader.load("glVertexAttrib3d"));
flextglVertexAttrib3dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttrib3dv"));
flextglVertexAttrib3f = reinterpret_cast<void(APIENTRY*)(GLuint, GLfloat, GLfloat, GLfloat)>(loader.load("glVertexAttrib3f"));
flextglVertexAttrib3fv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLfloat *)>(loader.load("glVertexAttrib3fv"));
flextglVertexAttrib3s = reinterpret_cast<void(APIENTRY*)(GLuint, GLshort, GLshort, GLshort)>(loader.load("glVertexAttrib3s"));
flextglVertexAttrib3sv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttrib3sv"));
flextglVertexAttrib4Nbv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLbyte *)>(loader.load("glVertexAttrib4Nbv"));
flextglVertexAttrib4Niv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttrib4Niv"));
flextglVertexAttrib4Nsv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttrib4Nsv"));
flextglVertexAttrib4Nub = reinterpret_cast<void(APIENTRY*)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)>(loader.load("glVertexAttrib4Nub"));
flextglVertexAttrib4Nubv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLubyte *)>(loader.load("glVertexAttrib4Nubv"));
flextglVertexAttrib4Nuiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttrib4Nuiv"));
flextglVertexAttrib4Nusv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLushort *)>(loader.load("glVertexAttrib4Nusv"));
flextglVertexAttrib4bv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLbyte *)>(loader.load("glVertexAttrib4bv"));
flextglVertexAttrib4d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glVertexAttrib4d"));
flextglVertexAttrib4dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttrib4dv"));
flextglVertexAttrib4f = reinterpret_cast<void(APIENTRY*)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glVertexAttrib4f"));
flextglVertexAttrib4fv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLfloat *)>(loader.load("glVertexAttrib4fv"));
flextglVertexAttrib4iv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttrib4iv"));
flextglVertexAttrib4s = reinterpret_cast<void(APIENTRY*)(GLuint, GLshort, GLshort, GLshort, GLshort)>(loader.load("glVertexAttrib4s"));
flextglVertexAttrib4sv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttrib4sv"));
flextglVertexAttrib4ubv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLubyte *)>(loader.load("glVertexAttrib4ubv"));
flextglVertexAttrib4uiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttrib4uiv"));
flextglVertexAttrib4usv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLushort *)>(loader.load("glVertexAttrib4usv"));
flextglVertexAttribPointer = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *)>(loader.load("glVertexAttribPointer"));
/* GL_VERSION_2_1 */
flextglUniformMatrix2x3fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix2x3fv"));
flextglUniformMatrix3x2fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix3x2fv"));
flextglUniformMatrix2x4fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix2x4fv"));
flextglUniformMatrix4x2fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix4x2fv"));
flextglUniformMatrix3x4fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix3x4fv"));
flextglUniformMatrix4x3fv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glUniformMatrix4x3fv"));
/* GL_VERSION_3_0 */
flextglColorMaski = reinterpret_cast<void(APIENTRY*)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean)>(loader.load("glColorMaski"));
flextglGetBooleani_v = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLboolean *)>(loader.load("glGetBooleani_v"));
flextglGetIntegeri_v = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLint *)>(loader.load("glGetIntegeri_v"));
flextglEnablei = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glEnablei"));
flextglDisablei = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glDisablei"));
flextglIsEnabledi = reinterpret_cast<GLboolean(APIENTRY*)(GLenum, GLuint)>(loader.load("glIsEnabledi"));
flextglBeginTransformFeedback = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glBeginTransformFeedback"));
flextglEndTransformFeedback = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glEndTransformFeedback"));
flextglBindBufferRange = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr)>(loader.load("glBindBufferRange"));
flextglBindBufferBase = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint)>(loader.load("glBindBufferBase"));
flextglTransformFeedbackVaryings = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLchar *const*, GLenum)>(loader.load("glTransformFeedbackVaryings"));
flextglGetTransformFeedbackVarying = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *)>(loader.load("glGetTransformFeedbackVarying"));
flextglClampColor = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glClampColor"));
flextglBeginConditionalRender = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glBeginConditionalRender"));
flextglEndConditionalRender = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glEndConditionalRender"));
flextglVertexAttribIPointer = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLsizei, const void *)>(loader.load("glVertexAttribIPointer"));
flextglGetVertexAttribIiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetVertexAttribIiv"));
flextglGetVertexAttribIuiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint *)>(loader.load("glGetVertexAttribIuiv"));
flextglVertexAttribI1i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint)>(loader.load("glVertexAttribI1i"));
flextglVertexAttribI2i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint)>(loader.load("glVertexAttribI2i"));
flextglVertexAttribI3i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint)>(loader.load("glVertexAttribI3i"));
flextglVertexAttribI4i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint)>(loader.load("glVertexAttribI4i"));
flextglVertexAttribI1ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glVertexAttribI1ui"));
flextglVertexAttribI2ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glVertexAttribI2ui"));
flextglVertexAttribI3ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLuint)>(loader.load("glVertexAttribI3ui"));
flextglVertexAttribI4ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLuint, GLuint)>(loader.load("glVertexAttribI4ui"));
flextglVertexAttribI1iv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttribI1iv"));
flextglVertexAttribI2iv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttribI2iv"));
flextglVertexAttribI3iv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttribI3iv"));
flextglVertexAttribI4iv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glVertexAttribI4iv"));
flextglVertexAttribI1uiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttribI1uiv"));
flextglVertexAttribI2uiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttribI2uiv"));
flextglVertexAttribI3uiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttribI3uiv"));
flextglVertexAttribI4uiv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLuint *)>(loader.load("glVertexAttribI4uiv"));
flextglVertexAttribI4bv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLbyte *)>(loader.load("glVertexAttribI4bv"));
flextglVertexAttribI4sv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLshort *)>(loader.load("glVertexAttribI4sv"));
flextglVertexAttribI4ubv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLubyte *)>(loader.load("glVertexAttribI4ubv"));
flextglVertexAttribI4usv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLushort *)>(loader.load("glVertexAttribI4usv"));
flextglGetUniformuiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint *)>(loader.load("glGetUniformuiv"));
flextglBindFragDataLocation = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, const GLchar *)>(loader.load("glBindFragDataLocation"));
flextglGetFragDataLocation = reinterpret_cast<GLint(APIENTRY*)(GLuint, const GLchar *)>(loader.load("glGetFragDataLocation"));
flextglUniform1ui = reinterpret_cast<void(APIENTRY*)(GLint, GLuint)>(loader.load("glUniform1ui"));
flextglUniform2ui = reinterpret_cast<void(APIENTRY*)(GLint, GLuint, GLuint)>(loader.load("glUniform2ui"));
flextglUniform3ui = reinterpret_cast<void(APIENTRY*)(GLint, GLuint, GLuint, GLuint)>(loader.load("glUniform3ui"));
flextglUniform4ui = reinterpret_cast<void(APIENTRY*)(GLint, GLuint, GLuint, GLuint, GLuint)>(loader.load("glUniform4ui"));
flextglUniform1uiv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLuint *)>(loader.load("glUniform1uiv"));
flextglUniform2uiv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLuint *)>(loader.load("glUniform2uiv"));
flextglUniform3uiv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLuint *)>(loader.load("glUniform3uiv"));
flextglUniform4uiv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLuint *)>(loader.load("glUniform4uiv"));
flextglTexParameterIiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const GLint *)>(loader.load("glTexParameterIiv"));
flextglTexParameterIuiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const GLuint *)>(loader.load("glTexParameterIuiv"));
flextglGetTexParameterIiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetTexParameterIiv"));
flextglGetTexParameterIuiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint *)>(loader.load("glGetTexParameterIuiv"));
flextglClearBufferiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, const GLint *)>(loader.load("glClearBufferiv"));
flextglClearBufferuiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, const GLuint *)>(loader.load("glClearBufferuiv"));
flextglClearBufferfv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, const GLfloat *)>(loader.load("glClearBufferfv"));
flextglClearBufferfi = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLfloat, GLint)>(loader.load("glClearBufferfi"));
flextglGetStringi = reinterpret_cast<const GLubyte *(APIENTRY*)(GLenum, GLuint)>(loader.load("glGetStringi"));
flextglIsRenderbuffer = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsRenderbuffer"));
flextglBindRenderbuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBindRenderbuffer"));
flextglDeleteRenderbuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteRenderbuffers"));
flextglGenRenderbuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenRenderbuffers"));
flextglRenderbufferStorage = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLsizei, GLsizei)>(loader.load("glRenderbufferStorage"));
flextglGetRenderbufferParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetRenderbufferParameteriv"));
flextglIsFramebuffer = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsFramebuffer"));
flextglBindFramebuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBindFramebuffer"));
flextglDeleteFramebuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteFramebuffers"));
flextglGenFramebuffers = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenFramebuffers"));
flextglCheckFramebufferStatus = reinterpret_cast<GLenum(APIENTRY*)(GLenum)>(loader.load("glCheckFramebufferStatus"));
flextglFramebufferTexture1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint, GLint)>(loader.load("glFramebufferTexture1D"));
flextglFramebufferTexture2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint, GLint)>(loader.load("glFramebufferTexture2D"));
flextglFramebufferTexture3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint, GLint, GLint)>(loader.load("glFramebufferTexture3D"));
flextglFramebufferRenderbuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint)>(loader.load("glFramebufferRenderbuffer"));
flextglGetFramebufferAttachmentParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint *)>(loader.load("glGetFramebufferAttachmentParameteriv"));
flextglGenerateMipmap = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glGenerateMipmap"));
flextglBlitFramebuffer = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)>(loader.load("glBlitFramebuffer"));
flextglRenderbufferStorageMultisample = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)>(loader.load("glRenderbufferStorageMultisample"));
flextglFramebufferTextureLayer = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint, GLint, GLint)>(loader.load("glFramebufferTextureLayer"));
flextglMapBufferRange = reinterpret_cast<void *(APIENTRY*)(GLenum, GLintptr, GLsizeiptr, GLbitfield)>(loader.load("glMapBufferRange"));
flextglFlushMappedBufferRange = reinterpret_cast<void(APIENTRY*)(GLenum, GLintptr, GLsizeiptr)>(loader.load("glFlushMappedBufferRange"));
flextglBindVertexArray = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glBindVertexArray"));
flextglDeleteVertexArrays = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteVertexArrays"));
flextglGenVertexArrays = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenVertexArrays"));
flextglIsVertexArray = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsVertexArray"));
/* GL_VERSION_3_1 */
flextglDrawArraysInstanced = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLsizei, GLsizei)>(loader.load("glDrawArraysInstanced"));
flextglDrawElementsInstanced = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *, GLsizei)>(loader.load("glDrawElementsInstanced"));
flextglTexBuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint)>(loader.load("glTexBuffer"));
flextglPrimitiveRestartIndex = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glPrimitiveRestartIndex"));
flextglCopyBufferSubData = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr)>(loader.load("glCopyBufferSubData"));
flextglGetUniformIndices = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLchar *const*, GLuint *)>(loader.load("glGetUniformIndices"));
flextglGetActiveUniformsiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLuint *, GLenum, GLint *)>(loader.load("glGetActiveUniformsiv"));
flextglGetActiveUniformName = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetActiveUniformName"));
flextglGetUniformBlockIndex = reinterpret_cast<GLuint(APIENTRY*)(GLuint, const GLchar *)>(loader.load("glGetUniformBlockIndex"));
flextglGetActiveUniformBlockiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLint *)>(loader.load("glGetActiveUniformBlockiv"));
flextglGetActiveUniformBlockName = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetActiveUniformBlockName"));
flextglUniformBlockBinding = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glUniformBlockBinding"));
/* GL_VERSION_3_2 */
flextglDrawElementsBaseVertex = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *, GLint)>(loader.load("glDrawElementsBaseVertex"));
flextglDrawRangeElementsBaseVertex = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *, GLint)>(loader.load("glDrawRangeElementsBaseVertex"));
flextglDrawElementsInstancedBaseVertex = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint)>(loader.load("glDrawElementsInstancedBaseVertex"));
flextglMultiDrawElementsBaseVertex = reinterpret_cast<void(APIENTRY*)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei, const GLint *)>(loader.load("glMultiDrawElementsBaseVertex"));
flextglProvokingVertex = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glProvokingVertex"));
flextglFenceSync = reinterpret_cast<GLsync(APIENTRY*)(GLenum, GLbitfield)>(loader.load("glFenceSync"));
flextglIsSync = reinterpret_cast<GLboolean(APIENTRY*)(GLsync)>(loader.load("glIsSync"));
flextglDeleteSync = reinterpret_cast<void(APIENTRY*)(GLsync)>(loader.load("glDeleteSync"));
flextglClientWaitSync = reinterpret_cast<GLenum(APIENTRY*)(GLsync, GLbitfield, GLuint64)>(loader.load("glClientWaitSync"));
flextglWaitSync = reinterpret_cast<void(APIENTRY*)(GLsync, GLbitfield, GLuint64)>(loader.load("glWaitSync"));
flextglGetInteger64v = reinterpret_cast<void(APIENTRY*)(GLenum, GLint64 *)>(loader.load("glGetInteger64v"));
flextglGetSynciv = reinterpret_cast<void(APIENTRY*)(GLsync, GLenum, GLsizei, GLsizei *, GLint *)>(loader.load("glGetSynciv"));
flextglGetInteger64i_v = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLint64 *)>(loader.load("glGetInteger64i_v"));
flextglGetBufferParameteri64v = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint64 *)>(loader.load("glGetBufferParameteri64v"));
flextglFramebufferTexture = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint, GLint)>(loader.load("glFramebufferTexture"));
flextglTexImage2DMultisample = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean)>(loader.load("glTexImage2DMultisample"));
flextglTexImage3DMultisample = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean)>(loader.load("glTexImage3DMultisample"));
flextglGetMultisamplefv = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLfloat *)>(loader.load("glGetMultisamplefv"));
flextglSampleMaski = reinterpret_cast<void(APIENTRY*)(GLuint, GLbitfield)>(loader.load("glSampleMaski"));
/* GL_VERSION_3_3 */
flextglBindFragDataLocationIndexed = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, const GLchar *)>(loader.load("glBindFragDataLocationIndexed"));
flextglGetFragDataIndex = reinterpret_cast<GLint(APIENTRY*)(GLuint, const GLchar *)>(loader.load("glGetFragDataIndex"));
flextglGenSamplers = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenSamplers"));
flextglDeleteSamplers = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteSamplers"));
flextglIsSampler = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsSampler"));
flextglBindSampler = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glBindSampler"));
flextglSamplerParameteri = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint)>(loader.load("glSamplerParameteri"));
flextglSamplerParameteriv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, const GLint *)>(loader.load("glSamplerParameteriv"));
flextglSamplerParameterf = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLfloat)>(loader.load("glSamplerParameterf"));
flextglSamplerParameterfv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, const GLfloat *)>(loader.load("glSamplerParameterfv"));
flextglSamplerParameterIiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, const GLint *)>(loader.load("glSamplerParameterIiv"));
flextglSamplerParameterIuiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, const GLuint *)>(loader.load("glSamplerParameterIuiv"));
flextglGetSamplerParameteriv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetSamplerParameteriv"));
flextglGetSamplerParameterIiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetSamplerParameterIiv"));
flextglGetSamplerParameterfv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLfloat *)>(loader.load("glGetSamplerParameterfv"));
flextglGetSamplerParameterIuiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint *)>(loader.load("glGetSamplerParameterIuiv"));
flextglQueryCounter = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glQueryCounter"));
flextglGetQueryObjecti64v = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint64 *)>(loader.load("glGetQueryObjecti64v"));
flextglGetQueryObjectui64v = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint64 *)>(loader.load("glGetQueryObjectui64v"));
flextglVertexAttribDivisor = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glVertexAttribDivisor"));
flextglVertexAttribP1ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, GLuint)>(loader.load("glVertexAttribP1ui"));
flextglVertexAttribP1uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, const GLuint *)>(loader.load("glVertexAttribP1uiv"));
flextglVertexAttribP2ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, GLuint)>(loader.load("glVertexAttribP2ui"));
flextglVertexAttribP2uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, const GLuint *)>(loader.load("glVertexAttribP2uiv"));
flextglVertexAttribP3ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, GLuint)>(loader.load("glVertexAttribP3ui"));
flextglVertexAttribP3uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, const GLuint *)>(loader.load("glVertexAttribP3uiv"));
flextglVertexAttribP4ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, GLuint)>(loader.load("glVertexAttribP4ui"));
flextglVertexAttribP4uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLboolean, const GLuint *)>(loader.load("glVertexAttribP4uiv"));
/* GL_VERSION_4_0 */
flextglMinSampleShading = reinterpret_cast<void(APIENTRY*)(GLfloat)>(loader.load("glMinSampleShading"));
flextglBlendEquationi = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glBlendEquationi"));
flextglBlendEquationSeparatei = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum)>(loader.load("glBlendEquationSeparatei"));
flextglBlendFunci = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum)>(loader.load("glBlendFunci"));
flextglBlendFuncSeparatei = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLenum, GLenum)>(loader.load("glBlendFuncSeparatei"));
flextglDrawArraysIndirect = reinterpret_cast<void(APIENTRY*)(GLenum, const void *)>(loader.load("glDrawArraysIndirect"));
flextglDrawElementsIndirect = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const void *)>(loader.load("glDrawElementsIndirect"));
flextglUniform1d = reinterpret_cast<void(APIENTRY*)(GLint, GLdouble)>(loader.load("glUniform1d"));
flextglUniform2d = reinterpret_cast<void(APIENTRY*)(GLint, GLdouble, GLdouble)>(loader.load("glUniform2d"));
flextglUniform3d = reinterpret_cast<void(APIENTRY*)(GLint, GLdouble, GLdouble, GLdouble)>(loader.load("glUniform3d"));
flextglUniform4d = reinterpret_cast<void(APIENTRY*)(GLint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glUniform4d"));
flextglUniform1dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLdouble *)>(loader.load("glUniform1dv"));
flextglUniform2dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLdouble *)>(loader.load("glUniform2dv"));
flextglUniform3dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLdouble *)>(loader.load("glUniform3dv"));
flextglUniform4dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, const GLdouble *)>(loader.load("glUniform4dv"));
flextglUniformMatrix2dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix2dv"));
flextglUniformMatrix3dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix3dv"));
flextglUniformMatrix4dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix4dv"));
flextglUniformMatrix2x3dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix2x3dv"));
flextglUniformMatrix2x4dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix2x4dv"));
flextglUniformMatrix3x2dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix3x2dv"));
flextglUniformMatrix3x4dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix3x4dv"));
flextglUniformMatrix4x2dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix4x2dv"));
flextglUniformMatrix4x3dv = reinterpret_cast<void(APIENTRY*)(GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glUniformMatrix4x3dv"));
flextglGetUniformdv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble *)>(loader.load("glGetUniformdv"));
flextglGetSubroutineUniformLocation = reinterpret_cast<GLint(APIENTRY*)(GLuint, GLenum, const GLchar *)>(loader.load("glGetSubroutineUniformLocation"));
flextglGetSubroutineIndex = reinterpret_cast<GLuint(APIENTRY*)(GLuint, GLenum, const GLchar *)>(loader.load("glGetSubroutineIndex"));
flextglGetActiveSubroutineUniformiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLenum, GLint *)>(loader.load("glGetActiveSubroutineUniformiv"));
flextglGetActiveSubroutineUniformName = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetActiveSubroutineUniformName"));
flextglGetActiveSubroutineName = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetActiveSubroutineName"));
flextglUniformSubroutinesuiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, const GLuint *)>(loader.load("glUniformSubroutinesuiv"));
flextglGetUniformSubroutineuiv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLuint *)>(loader.load("glGetUniformSubroutineuiv"));
flextglGetProgramStageiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetProgramStageiv"));
flextglPatchParameteri = reinterpret_cast<void(APIENTRY*)(GLenum, GLint)>(loader.load("glPatchParameteri"));
flextglPatchParameterfv = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glPatchParameterfv"));
flextglBindTransformFeedback = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBindTransformFeedback"));
flextglDeleteTransformFeedbacks = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteTransformFeedbacks"));
flextglGenTransformFeedbacks = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenTransformFeedbacks"));
flextglIsTransformFeedback = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsTransformFeedback"));
flextglPauseTransformFeedback = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glPauseTransformFeedback"));
flextglResumeTransformFeedback = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glResumeTransformFeedback"));
flextglDrawTransformFeedback = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glDrawTransformFeedback"));
flextglDrawTransformFeedbackStream = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint)>(loader.load("glDrawTransformFeedbackStream"));
flextglBeginQueryIndexed = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint)>(loader.load("glBeginQueryIndexed"));
flextglEndQueryIndexed = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glEndQueryIndexed"));
flextglGetQueryIndexediv = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLenum, GLint *)>(loader.load("glGetQueryIndexediv"));
/* GL_VERSION_4_1 */
flextglReleaseShaderCompiler = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glReleaseShaderCompiler"));
flextglShaderBinary = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *, GLenum, const void *, GLsizei)>(loader.load("glShaderBinary"));
flextglGetShaderPrecisionFormat = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *, GLint *)>(loader.load("glGetShaderPrecisionFormat"));
flextglDepthRangef = reinterpret_cast<void(APIENTRY*)(GLfloat, GLfloat)>(loader.load("glDepthRangef"));
flextglClearDepthf = reinterpret_cast<void(APIENTRY*)(GLfloat)>(loader.load("glClearDepthf"));
flextglGetProgramBinary = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLenum *, void *)>(loader.load("glGetProgramBinary"));
flextglProgramBinary = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, const void *, GLsizei)>(loader.load("glProgramBinary"));
flextglProgramParameteri = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint)>(loader.load("glProgramParameteri"));
flextglUseProgramStages = reinterpret_cast<void(APIENTRY*)(GLuint, GLbitfield, GLuint)>(loader.load("glUseProgramStages"));
flextglActiveShaderProgram = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glActiveShaderProgram"));
flextglCreateShaderProgramv = reinterpret_cast<GLuint(APIENTRY*)(GLenum, GLsizei, const GLchar *const*)>(loader.load("glCreateShaderProgramv"));
flextglBindProgramPipeline = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glBindProgramPipeline"));
flextglDeleteProgramPipelines = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteProgramPipelines"));
flextglGenProgramPipelines = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenProgramPipelines"));
flextglIsProgramPipeline = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsProgramPipeline"));
flextglGetProgramPipelineiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetProgramPipelineiv"));
flextglProgramUniform1i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint)>(loader.load("glProgramUniform1i"));
flextglProgramUniform1iv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform1iv"));
flextglProgramUniform1f = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat)>(loader.load("glProgramUniform1f"));
flextglProgramUniform1fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform1fv"));
flextglProgramUniform1d = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble)>(loader.load("glProgramUniform1d"));
flextglProgramUniform1dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform1dv"));
flextglProgramUniform1ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint)>(loader.load("glProgramUniform1ui"));
flextglProgramUniform1uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform1uiv"));
flextglProgramUniform2i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint)>(loader.load("glProgramUniform2i"));
flextglProgramUniform2iv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform2iv"));
flextglProgramUniform2f = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat)>(loader.load("glProgramUniform2f"));
flextglProgramUniform2fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform2fv"));
flextglProgramUniform2d = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble)>(loader.load("glProgramUniform2d"));
flextglProgramUniform2dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform2dv"));
flextglProgramUniform2ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint)>(loader.load("glProgramUniform2ui"));
flextglProgramUniform2uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform2uiv"));
flextglProgramUniform3i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint)>(loader.load("glProgramUniform3i"));
flextglProgramUniform3iv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform3iv"));
flextglProgramUniform3f = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat, GLfloat)>(loader.load("glProgramUniform3f"));
flextglProgramUniform3fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform3fv"));
flextglProgramUniform3d = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble, GLdouble)>(loader.load("glProgramUniform3d"));
flextglProgramUniform3dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform3dv"));
flextglProgramUniform3ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint, GLuint)>(loader.load("glProgramUniform3ui"));
flextglProgramUniform3uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform3uiv"));
flextglProgramUniform4i = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint, GLint)>(loader.load("glProgramUniform4i"));
flextglProgramUniform4iv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform4iv"));
flextglProgramUniform4f = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glProgramUniform4f"));
flextglProgramUniform4fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform4fv"));
flextglProgramUniform4d = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glProgramUniform4d"));
flextglProgramUniform4dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform4dv"));
flextglProgramUniform4ui = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint)>(loader.load("glProgramUniform4ui"));
flextglProgramUniform4uiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform4uiv"));
flextglProgramUniformMatrix2fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2fv"));
flextglProgramUniformMatrix3fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3fv"));
flextglProgramUniformMatrix4fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4fv"));
flextglProgramUniformMatrix2dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2dv"));
flextglProgramUniformMatrix3dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3dv"));
flextglProgramUniformMatrix4dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4dv"));
flextglProgramUniformMatrix2x3fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2x3fv"));
flextglProgramUniformMatrix3x2fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3x2fv"));
flextglProgramUniformMatrix2x4fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2x4fv"));
flextglProgramUniformMatrix4x2fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4x2fv"));
flextglProgramUniformMatrix3x4fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3x4fv"));
flextglProgramUniformMatrix4x3fv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4x3fv"));
flextglProgramUniformMatrix2x3dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2x3dv"));
flextglProgramUniformMatrix3x2dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3x2dv"));
flextglProgramUniformMatrix2x4dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2x4dv"));
flextglProgramUniformMatrix4x2dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4x2dv"));
flextglProgramUniformMatrix3x4dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3x4dv"));
flextglProgramUniformMatrix4x3dv = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4x3dv"));
flextglValidateProgramPipeline = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glValidateProgramPipeline"));
flextglGetProgramPipelineInfoLog = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetProgramPipelineInfoLog"));
flextglVertexAttribL1d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble)>(loader.load("glVertexAttribL1d"));
flextglVertexAttribL2d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble)>(loader.load("glVertexAttribL2d"));
flextglVertexAttribL3d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble, GLdouble)>(loader.load("glVertexAttribL3d"));
flextglVertexAttribL4d = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glVertexAttribL4d"));
flextglVertexAttribL1dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttribL1dv"));
flextglVertexAttribL2dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttribL2dv"));
flextglVertexAttribL3dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttribL3dv"));
flextglVertexAttribL4dv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLdouble *)>(loader.load("glVertexAttribL4dv"));
flextglVertexAttribLPointer = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLsizei, const void *)>(loader.load("glVertexAttribLPointer"));
flextglGetVertexAttribLdv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLdouble *)>(loader.load("glGetVertexAttribLdv"));
flextglViewportArrayv = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLfloat *)>(loader.load("glViewportArrayv"));
flextglViewportIndexedf = reinterpret_cast<void(APIENTRY*)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glViewportIndexedf"));
flextglViewportIndexedfv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLfloat *)>(loader.load("glViewportIndexedfv"));
flextglScissorArrayv = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLint *)>(loader.load("glScissorArrayv"));
flextglScissorIndexed = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glScissorIndexed"));
flextglScissorIndexedv = reinterpret_cast<void(APIENTRY*)(GLuint, const GLint *)>(loader.load("glScissorIndexedv"));
flextglDepthRangeArrayv = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLdouble *)>(loader.load("glDepthRangeArrayv"));
flextglDepthRangeIndexed = reinterpret_cast<void(APIENTRY*)(GLuint, GLdouble, GLdouble)>(loader.load("glDepthRangeIndexed"));
flextglGetFloati_v = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLfloat *)>(loader.load("glGetFloati_v"));
flextglGetDoublei_v = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLdouble *)>(loader.load("glGetDoublei_v"));
/* GL_VERSION_4_2 */
flextglDrawArraysInstancedBaseInstance = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLsizei, GLsizei, GLuint)>(loader.load("glDrawArraysInstancedBaseInstance"));
flextglDrawElementsInstancedBaseInstance = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLuint)>(loader.load("glDrawElementsInstancedBaseInstance"));
flextglDrawElementsInstancedBaseVertexBaseInstance = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint, GLuint)>(loader.load("glDrawElementsInstancedBaseVertexBaseInstance"));
flextglGetInternalformativ = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, GLint *)>(loader.load("glGetInternalformativ"));
flextglGetActiveAtomicCounterBufferiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLint *)>(loader.load("glGetActiveAtomicCounterBufferiv"));
flextglBindImageTexture = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum)>(loader.load("glBindImageTexture"));
flextglMemoryBarrier = reinterpret_cast<void(APIENTRY*)(GLbitfield)>(loader.load("glMemoryBarrier"));
flextglTexStorage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei)>(loader.load("glTexStorage1D"));
flextglTexStorage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)>(loader.load("glTexStorage2D"));
flextglTexStorage3D = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei)>(loader.load("glTexStorage3D"));
flextglDrawTransformFeedbackInstanced = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei)>(loader.load("glDrawTransformFeedbackInstanced"));
flextglDrawTransformFeedbackStreamInstanced = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLuint, GLsizei)>(loader.load("glDrawTransformFeedbackStreamInstanced"));
/* GL_VERSION_4_3 */
flextglClearBufferData = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLenum, const void *)>(loader.load("glClearBufferData"));
flextglClearBufferSubData = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void *)>(loader.load("glClearBufferSubData"));
flextglDispatchCompute = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glDispatchCompute"));
flextglDispatchComputeIndirect = reinterpret_cast<void(APIENTRY*)(GLintptr)>(loader.load("glDispatchComputeIndirect"));
flextglCopyImageSubData = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei)>(loader.load("glCopyImageSubData"));
flextglFramebufferParameteri = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint)>(loader.load("glFramebufferParameteri"));
flextglGetFramebufferParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetFramebufferParameteriv"));
flextglGetInternalformati64v = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, GLint64 *)>(loader.load("glGetInternalformati64v"));
flextglInvalidateTexSubImage = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei)>(loader.load("glInvalidateTexSubImage"));
flextglInvalidateTexImage = reinterpret_cast<void(APIENTRY*)(GLuint, GLint)>(loader.load("glInvalidateTexImage"));
flextglInvalidateBufferSubData = reinterpret_cast<void(APIENTRY*)(GLuint, GLintptr, GLsizeiptr)>(loader.load("glInvalidateBufferSubData"));
flextglInvalidateBufferData = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glInvalidateBufferData"));
flextglInvalidateFramebuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, const GLenum *)>(loader.load("glInvalidateFramebuffer"));
flextglInvalidateSubFramebuffer = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, const GLenum *, GLint, GLint, GLsizei, GLsizei)>(loader.load("glInvalidateSubFramebuffer"));
flextglMultiDrawArraysIndirect = reinterpret_cast<void(APIENTRY*)(GLenum, const void *, GLsizei, GLsizei)>(loader.load("glMultiDrawArraysIndirect"));
flextglMultiDrawElementsIndirect = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const void *, GLsizei, GLsizei)>(loader.load("glMultiDrawElementsIndirect"));
flextglGetProgramInterfaceiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetProgramInterfaceiv"));
flextglGetProgramResourceIndex = reinterpret_cast<GLuint(APIENTRY*)(GLuint, GLenum, const GLchar *)>(loader.load("glGetProgramResourceIndex"));
flextglGetProgramResourceName = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetProgramResourceName"));
flextglGetProgramResourceiv = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, const GLenum *, GLsizei, GLsizei *, GLint *)>(loader.load("glGetProgramResourceiv"));
flextglGetProgramResourceLocation = reinterpret_cast<GLint(APIENTRY*)(GLuint, GLenum, const GLchar *)>(loader.load("glGetProgramResourceLocation"));
flextglGetProgramResourceLocationIndex = reinterpret_cast<GLint(APIENTRY*)(GLuint, GLenum, const GLchar *)>(loader.load("glGetProgramResourceLocationIndex"));
flextglShaderStorageBlockBinding = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glShaderStorageBlockBinding"));
flextglTexBufferRange = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint, GLintptr, GLsizeiptr)>(loader.load("glTexBufferRange"));
flextglTexStorage2DMultisample = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean)>(loader.load("glTexStorage2DMultisample"));
flextglTexStorage3DMultisample = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean)>(loader.load("glTexStorage3DMultisample"));
flextglTextureView = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint)>(loader.load("glTextureView"));
flextglBindVertexBuffer = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLintptr, GLsizei)>(loader.load("glBindVertexBuffer"));
flextglVertexAttribFormat = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLboolean, GLuint)>(loader.load("glVertexAttribFormat"));
flextglVertexAttribIFormat = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLuint)>(loader.load("glVertexAttribIFormat"));
flextglVertexAttribLFormat = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLuint)>(loader.load("glVertexAttribLFormat"));
flextglVertexAttribBinding = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glVertexAttribBinding"));
flextglVertexBindingDivisor = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glVertexBindingDivisor"));
flextglDebugMessageControl = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean)>(loader.load("glDebugMessageControl"));
flextglDebugMessageInsert = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *)>(loader.load("glDebugMessageInsert"));
flextglDebugMessageCallback = reinterpret_cast<void(APIENTRY*)(GLDEBUGPROC, const void *)>(loader.load("glDebugMessageCallback"));
flextglGetDebugMessageLog = reinterpret_cast<GLuint(APIENTRY*)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *)>(loader.load("glGetDebugMessageLog"));
flextglPushDebugGroup = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, const GLchar *)>(loader.load("glPushDebugGroup"));
flextglPopDebugGroup = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glPopDebugGroup"));
flextglObjectLabel = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, const GLchar *)>(loader.load("glObjectLabel"));
flextglGetObjectLabel = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetObjectLabel"));
flextglObjectPtrLabel = reinterpret_cast<void(APIENTRY*)(const void *, GLsizei, const GLchar *)>(loader.load("glObjectPtrLabel"));
flextglGetObjectPtrLabel = reinterpret_cast<void(APIENTRY*)(const void *, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetObjectPtrLabel"));
flextglGetPointerv = reinterpret_cast<void(APIENTRY*)(GLenum, void **)>(loader.load("glGetPointerv"));
/* GL_VERSION_4_4 */
flextglBufferStorage = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizeiptr, const void *, GLbitfield)>(loader.load("glBufferStorage"));
flextglClearTexImage = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLenum, GLenum, const void *)>(loader.load("glClearTexImage"));
flextglClearTexSubImage = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glClearTexSubImage"));
flextglBindBuffersBase = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, const GLuint *)>(loader.load("glBindBuffersBase"));
flextglBindBuffersRange = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, const GLuint *, const GLintptr *, const GLsizeiptr *)>(loader.load("glBindBuffersRange"));
flextglBindTextures = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLuint *)>(loader.load("glBindTextures"));
flextglBindSamplers = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLuint *)>(loader.load("glBindSamplers"));
flextglBindImageTextures = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLuint *)>(loader.load("glBindImageTextures"));
flextglBindVertexBuffers = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLuint *, const GLintptr *, const GLsizei *)>(loader.load("glBindVertexBuffers"));
/* GL_AMD_vertex_shader_layer */
/* GL_AMD_shader_trinary_minmax */
/* GL_ARB_robustness */
flextglGetGraphicsResetStatusARB = reinterpret_cast<GLenum(APIENTRY*)(void)>(loader.load("glGetGraphicsResetStatusARB"));
flextglGetnTexImageARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLenum, GLsizei, void *)>(loader.load("glGetnTexImageARB"));
flextglReadnPixelsARB = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *)>(loader.load("glReadnPixelsARB"));
flextglGetnCompressedTexImageARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLsizei, void *)>(loader.load("glGetnCompressedTexImageARB"));
flextglGetnUniformfvARB = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLfloat *)>(loader.load("glGetnUniformfvARB"));
flextglGetnUniformivARB = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLint *)>(loader.load("glGetnUniformivARB"));
flextglGetnUniformuivARB = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLuint *)>(loader.load("glGetnUniformuivARB"));
flextglGetnUniformdvARB = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLdouble *)>(loader.load("glGetnUniformdvARB"));
flextglGetnMapdvARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLsizei, GLdouble *)>(loader.load("glGetnMapdvARB"));
flextglGetnMapfvARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLsizei, GLfloat *)>(loader.load("glGetnMapfvARB"));
flextglGetnMapivARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLsizei, GLint *)>(loader.load("glGetnMapivARB"));
flextglGetnPixelMapfvARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLfloat *)>(loader.load("glGetnPixelMapfvARB"));
flextglGetnPixelMapuivARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLuint *)>(loader.load("glGetnPixelMapuivARB"));
flextglGetnPixelMapusvARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLushort *)>(loader.load("glGetnPixelMapusvARB"));
flextglGetnPolygonStippleARB = reinterpret_cast<void(APIENTRY*)(GLsizei, GLubyte *)>(loader.load("glGetnPolygonStippleARB"));
flextglGetnColorTableARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, void *)>(loader.load("glGetnColorTableARB"));
flextglGetnConvolutionFilterARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, void *)>(loader.load("glGetnConvolutionFilterARB"));
flextglGetnSeparableFilterARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLsizei, void *, GLsizei, void *, void *)>(loader.load("glGetnSeparableFilterARB"));
flextglGetnHistogramARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLboolean, GLenum, GLenum, GLsizei, void *)>(loader.load("glGetnHistogramARB"));
flextglGetnMinmaxARB = reinterpret_cast<void(APIENTRY*)(GLenum, GLboolean, GLenum, GLenum, GLsizei, void *)>(loader.load("glGetnMinmaxARB"));
/* GL_ATI_texture_mirror_once */
/* GL_EXT_texture_filter_anisotropic */
/* GL_EXT_texture_mirror_clamp */
/* GL_EXT_direct_state_access */
flextglMatrixLoadfEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glMatrixLoadfEXT"));
flextglMatrixLoaddEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLdouble *)>(loader.load("glMatrixLoaddEXT"));
flextglMatrixMultfEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glMatrixMultfEXT"));
flextglMatrixMultdEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLdouble *)>(loader.load("glMatrixMultdEXT"));
flextglMatrixLoadIdentityEXT = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glMatrixLoadIdentityEXT"));
flextglMatrixRotatefEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glMatrixRotatefEXT"));
flextglMatrixRotatedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glMatrixRotatedEXT"));
flextglMatrixScalefEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat, GLfloat, GLfloat)>(loader.load("glMatrixScalefEXT"));
flextglMatrixScaledEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble, GLdouble, GLdouble)>(loader.load("glMatrixScaledEXT"));
flextglMatrixTranslatefEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat, GLfloat, GLfloat)>(loader.load("glMatrixTranslatefEXT"));
flextglMatrixTranslatedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble, GLdouble, GLdouble)>(loader.load("glMatrixTranslatedEXT"));
flextglMatrixFrustumEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glMatrixFrustumEXT"));
flextglMatrixOrthoEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glMatrixOrthoEXT"));
flextglMatrixPopEXT = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glMatrixPopEXT"));
flextglMatrixPushEXT = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glMatrixPushEXT"));
flextglClientAttribDefaultEXT = reinterpret_cast<void(APIENTRY*)(GLbitfield)>(loader.load("glClientAttribDefaultEXT"));
flextglPushClientAttribDefaultEXT = reinterpret_cast<void(APIENTRY*)(GLbitfield)>(loader.load("glPushClientAttribDefaultEXT"));
flextglTextureParameterfEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLfloat)>(loader.load("glTextureParameterfEXT"));
flextglTextureParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, const GLfloat *)>(loader.load("glTextureParameterfvEXT"));
flextglTextureParameteriEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint)>(loader.load("glTextureParameteriEXT"));
flextglTextureParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, const GLint *)>(loader.load("glTextureParameterivEXT"));
flextglTextureImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTextureImage1DEXT"));
flextglTextureImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTextureImage2DEXT"));
flextglTextureSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTextureSubImage1DEXT"));
flextglTextureSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTextureSubImage2DEXT"));
flextglCopyTextureImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint)>(loader.load("glCopyTextureImage1DEXT"));
flextglCopyTextureImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)>(loader.load("glCopyTextureImage2DEXT"));
flextglCopyTextureSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei)>(loader.load("glCopyTextureSubImage1DEXT"));
flextglCopyTextureSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyTextureSubImage2DEXT"));
flextglGetTextureImageEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLenum, void *)>(loader.load("glGetTextureImageEXT"));
flextglGetTextureParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLfloat *)>(loader.load("glGetTextureParameterfvEXT"));
flextglGetTextureParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetTextureParameterivEXT"));
flextglGetTextureLevelParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLfloat *)>(loader.load("glGetTextureLevelParameterfvEXT"));
flextglGetTextureLevelParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLint *)>(loader.load("glGetTextureLevelParameterivEXT"));
flextglTextureImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTextureImage3DEXT"));
flextglTextureSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTextureSubImage3DEXT"));
flextglCopyTextureSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyTextureSubImage3DEXT"));
flextglBindMultiTextureEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint)>(loader.load("glBindMultiTextureEXT"));
flextglMultiTexCoordPointerEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLsizei, const void *)>(loader.load("glMultiTexCoordPointerEXT"));
flextglMultiTexEnvfEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat)>(loader.load("glMultiTexEnvfEXT"));
flextglMultiTexEnvfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLfloat *)>(loader.load("glMultiTexEnvfvEXT"));
flextglMultiTexEnviEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint)>(loader.load("glMultiTexEnviEXT"));
flextglMultiTexEnvivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLint *)>(loader.load("glMultiTexEnvivEXT"));
flextglMultiTexGendEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLdouble)>(loader.load("glMultiTexGendEXT"));
flextglMultiTexGendvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLdouble *)>(loader.load("glMultiTexGendvEXT"));
flextglMultiTexGenfEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat)>(loader.load("glMultiTexGenfEXT"));
flextglMultiTexGenfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLfloat *)>(loader.load("glMultiTexGenfvEXT"));
flextglMultiTexGeniEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint)>(loader.load("glMultiTexGeniEXT"));
flextglMultiTexGenivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLint *)>(loader.load("glMultiTexGenivEXT"));
flextglGetMultiTexEnvfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat *)>(loader.load("glGetMultiTexEnvfvEXT"));
flextglGetMultiTexEnvivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint *)>(loader.load("glGetMultiTexEnvivEXT"));
flextglGetMultiTexGendvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLdouble *)>(loader.load("glGetMultiTexGendvEXT"));
flextglGetMultiTexGenfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat *)>(loader.load("glGetMultiTexGenfvEXT"));
flextglGetMultiTexGenivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint *)>(loader.load("glGetMultiTexGenivEXT"));
flextglMultiTexParameteriEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint)>(loader.load("glMultiTexParameteriEXT"));
flextglMultiTexParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLint *)>(loader.load("glMultiTexParameterivEXT"));
flextglMultiTexParameterfEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat)>(loader.load("glMultiTexParameterfEXT"));
flextglMultiTexParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLfloat *)>(loader.load("glMultiTexParameterfvEXT"));
flextglMultiTexImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glMultiTexImage1DEXT"));
flextglMultiTexImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glMultiTexImage2DEXT"));
flextglMultiTexSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *)>(loader.load("glMultiTexSubImage1DEXT"));
flextglMultiTexSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glMultiTexSubImage2DEXT"));
flextglCopyMultiTexImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint)>(loader.load("glCopyMultiTexImage1DEXT"));
flextglCopyMultiTexImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)>(loader.load("glCopyMultiTexImage2DEXT"));
flextglCopyMultiTexSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei)>(loader.load("glCopyMultiTexSubImage1DEXT"));
flextglCopyMultiTexSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyMultiTexSubImage2DEXT"));
flextglGetMultiTexImageEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLenum, void *)>(loader.load("glGetMultiTexImageEXT"));
flextglGetMultiTexParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLfloat *)>(loader.load("glGetMultiTexParameterfvEXT"));
flextglGetMultiTexParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint *)>(loader.load("glGetMultiTexParameterivEXT"));
flextglGetMultiTexLevelParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLfloat *)>(loader.load("glGetMultiTexLevelParameterfvEXT"));
flextglGetMultiTexLevelParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLint *)>(loader.load("glGetMultiTexLevelParameterivEXT"));
flextglMultiTexImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glMultiTexImage3DEXT"));
flextglMultiTexSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glMultiTexSubImage3DEXT"));
flextglCopyMultiTexSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyMultiTexSubImage3DEXT"));
flextglEnableClientStateIndexedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glEnableClientStateIndexedEXT"));
flextglDisableClientStateIndexedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glDisableClientStateIndexedEXT"));
flextglGetFloatIndexedvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLfloat *)>(loader.load("glGetFloatIndexedvEXT"));
flextglGetDoubleIndexedvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLdouble *)>(loader.load("glGetDoubleIndexedvEXT"));
flextglGetPointerIndexedvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, void **)>(loader.load("glGetPointerIndexedvEXT"));
flextglEnableIndexedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glEnableIndexedEXT"));
flextglDisableIndexedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glDisableIndexedEXT"));
flextglIsEnabledIndexedEXT = reinterpret_cast<GLboolean(APIENTRY*)(GLenum, GLuint)>(loader.load("glIsEnabledIndexedEXT"));
flextglGetIntegerIndexedvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLint *)>(loader.load("glGetIntegerIndexedvEXT"));
flextglGetBooleanIndexedvEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLboolean *)>(loader.load("glGetBooleanIndexedvEXT"));
flextglCompressedTextureImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTextureImage3DEXT"));
flextglCompressedTextureImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTextureImage2DEXT"));
flextglCompressedTextureImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedTextureImage1DEXT"));
flextglCompressedTextureSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTextureSubImage3DEXT"));
flextglCompressedTextureSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTextureSubImage2DEXT"));
flextglCompressedTextureSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedTextureSubImage1DEXT"));
flextglGetCompressedTextureImageEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint, void *)>(loader.load("glGetCompressedTextureImageEXT"));
flextglCompressedMultiTexImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedMultiTexImage3DEXT"));
flextglCompressedMultiTexImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedMultiTexImage2DEXT"));
flextglCompressedMultiTexImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void *)>(loader.load("glCompressedMultiTexImage1DEXT"));
flextglCompressedMultiTexSubImage3DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedMultiTexSubImage3DEXT"));
flextglCompressedMultiTexSubImage2DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedMultiTexSubImage2DEXT"));
flextglCompressedMultiTexSubImage1DEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void *)>(loader.load("glCompressedMultiTexSubImage1DEXT"));
flextglGetCompressedMultiTexImageEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint, void *)>(loader.load("glGetCompressedMultiTexImageEXT"));
flextglMatrixLoadTransposefEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glMatrixLoadTransposefEXT"));
flextglMatrixLoadTransposedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLdouble *)>(loader.load("glMatrixLoadTransposedEXT"));
flextglMatrixMultTransposefEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLfloat *)>(loader.load("glMatrixMultTransposefEXT"));
flextglMatrixMultTransposedEXT = reinterpret_cast<void(APIENTRY*)(GLenum, const GLdouble *)>(loader.load("glMatrixMultTransposedEXT"));
flextglNamedBufferDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizeiptr, const void *, GLenum)>(loader.load("glNamedBufferDataEXT"));
flextglNamedBufferSubDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLintptr, GLsizeiptr, const void *)>(loader.load("glNamedBufferSubDataEXT"));
flextglMapNamedBufferEXT = reinterpret_cast<void *(APIENTRY*)(GLuint, GLenum)>(loader.load("glMapNamedBufferEXT"));
flextglUnmapNamedBufferEXT = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glUnmapNamedBufferEXT"));
flextglGetNamedBufferParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetNamedBufferParameterivEXT"));
flextglGetNamedBufferPointervEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, void **)>(loader.load("glGetNamedBufferPointervEXT"));
flextglGetNamedBufferSubDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLintptr, GLsizeiptr, void *)>(loader.load("glGetNamedBufferSubDataEXT"));
flextglProgramUniform1fEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat)>(loader.load("glProgramUniform1fEXT"));
flextglProgramUniform2fEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat)>(loader.load("glProgramUniform2fEXT"));
flextglProgramUniform3fEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat, GLfloat)>(loader.load("glProgramUniform3fEXT"));
flextglProgramUniform4fEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glProgramUniform4fEXT"));
flextglProgramUniform1iEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint)>(loader.load("glProgramUniform1iEXT"));
flextglProgramUniform2iEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint)>(loader.load("glProgramUniform2iEXT"));
flextglProgramUniform3iEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint)>(loader.load("glProgramUniform3iEXT"));
flextglProgramUniform4iEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint, GLint)>(loader.load("glProgramUniform4iEXT"));
flextglProgramUniform1fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform1fvEXT"));
flextglProgramUniform2fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform2fvEXT"));
flextglProgramUniform3fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform3fvEXT"));
flextglProgramUniform4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLfloat *)>(loader.load("glProgramUniform4fvEXT"));
flextglProgramUniform1ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform1ivEXT"));
flextglProgramUniform2ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform2ivEXT"));
flextglProgramUniform3ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform3ivEXT"));
flextglProgramUniform4ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLint *)>(loader.load("glProgramUniform4ivEXT"));
flextglProgramUniformMatrix2fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2fvEXT"));
flextglProgramUniformMatrix3fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3fvEXT"));
flextglProgramUniformMatrix4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4fvEXT"));
flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2x3fvEXT"));
flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3x2fvEXT"));
flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix2x4fvEXT"));
flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4x2fvEXT"));
flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix3x4fvEXT"));
flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *)>(loader.load("glProgramUniformMatrix4x3fvEXT"));
flextglTextureBufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint)>(loader.load("glTextureBufferEXT"));
flextglMultiTexBufferEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint)>(loader.load("glMultiTexBufferEXT"));
flextglTextureParameterIivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, const GLint *)>(loader.load("glTextureParameterIivEXT"));
flextglTextureParameterIuivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, const GLuint *)>(loader.load("glTextureParameterIuivEXT"));
flextglGetTextureParameterIivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetTextureParameterIivEXT"));
flextglGetTextureParameterIuivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint *)>(loader.load("glGetTextureParameterIuivEXT"));
flextglMultiTexParameterIivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLint *)>(loader.load("glMultiTexParameterIivEXT"));
flextglMultiTexParameterIuivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, const GLuint *)>(loader.load("glMultiTexParameterIuivEXT"));
flextglGetMultiTexParameterIivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLint *)>(loader.load("glGetMultiTexParameterIivEXT"));
flextglGetMultiTexParameterIuivEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum, GLuint *)>(loader.load("glGetMultiTexParameterIuivEXT"));
flextglProgramUniform1uiEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint)>(loader.load("glProgramUniform1uiEXT"));
flextglProgramUniform2uiEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint)>(loader.load("glProgramUniform2uiEXT"));
flextglProgramUniform3uiEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint, GLuint)>(loader.load("glProgramUniform3uiEXT"));
flextglProgramUniform4uiEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint)>(loader.load("glProgramUniform4uiEXT"));
flextglProgramUniform1uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform1uivEXT"));
flextglProgramUniform2uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform2uivEXT"));
flextglProgramUniform3uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform3uivEXT"));
flextglProgramUniform4uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLuint *)>(loader.load("glProgramUniform4uivEXT"));
flextglNamedProgramLocalParameters4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, const GLfloat *)>(loader.load("glNamedProgramLocalParameters4fvEXT"));
flextglNamedProgramLocalParameterI4iEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLint, GLint, GLint, GLint)>(loader.load("glNamedProgramLocalParameterI4iEXT"));
flextglNamedProgramLocalParameterI4ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, const GLint *)>(loader.load("glNamedProgramLocalParameterI4ivEXT"));
flextglNamedProgramLocalParametersI4ivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, const GLint *)>(loader.load("glNamedProgramLocalParametersI4ivEXT"));
flextglNamedProgramLocalParameterI4uiEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLuint, GLuint, GLuint, GLuint)>(loader.load("glNamedProgramLocalParameterI4uiEXT"));
flextglNamedProgramLocalParameterI4uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, const GLuint *)>(loader.load("glNamedProgramLocalParameterI4uivEXT"));
flextglNamedProgramLocalParametersI4uivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLsizei, const GLuint *)>(loader.load("glNamedProgramLocalParametersI4uivEXT"));
flextglGetNamedProgramLocalParameterIivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLint *)>(loader.load("glGetNamedProgramLocalParameterIivEXT"));
flextglGetNamedProgramLocalParameterIuivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLuint *)>(loader.load("glGetNamedProgramLocalParameterIuivEXT"));
flextglEnableClientStateiEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glEnableClientStateiEXT"));
flextglDisableClientStateiEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glDisableClientStateiEXT"));
flextglGetFloati_vEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLfloat *)>(loader.load("glGetFloati_vEXT"));
flextglGetDoublei_vEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLdouble *)>(loader.load("glGetDoublei_vEXT"));
flextglGetPointeri_vEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, void **)>(loader.load("glGetPointeri_vEXT"));
flextglNamedProgramStringEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLsizei, const void *)>(loader.load("glNamedProgramStringEXT"));
flextglNamedProgramLocalParameter4dEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glNamedProgramLocalParameter4dEXT"));
flextglNamedProgramLocalParameter4dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, const GLdouble *)>(loader.load("glNamedProgramLocalParameter4dvEXT"));
flextglNamedProgramLocalParameter4fEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glNamedProgramLocalParameter4fEXT"));
flextglNamedProgramLocalParameter4fvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, const GLfloat *)>(loader.load("glNamedProgramLocalParameter4fvEXT"));
flextglGetNamedProgramLocalParameterdvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLdouble *)>(loader.load("glGetNamedProgramLocalParameterdvEXT"));
flextglGetNamedProgramLocalParameterfvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLfloat *)>(loader.load("glGetNamedProgramLocalParameterfvEXT"));
flextglGetNamedProgramivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetNamedProgramivEXT"));
flextglGetNamedProgramStringEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, void *)>(loader.load("glGetNamedProgramStringEXT"));
flextglNamedRenderbufferStorageEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLsizei)>(loader.load("glNamedRenderbufferStorageEXT"));
flextglGetNamedRenderbufferParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetNamedRenderbufferParameterivEXT"));
flextglNamedRenderbufferStorageMultisampleEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLenum, GLsizei, GLsizei)>(loader.load("glNamedRenderbufferStorageMultisampleEXT"));
flextglNamedRenderbufferStorageMultisampleCoverageEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, GLsizei, GLenum, GLsizei, GLsizei)>(loader.load("glNamedRenderbufferStorageMultisampleCoverageEXT"));
flextglCheckNamedFramebufferStatusEXT = reinterpret_cast<GLenum(APIENTRY*)(GLuint, GLenum)>(loader.load("glCheckNamedFramebufferStatusEXT"));
flextglNamedFramebufferTexture1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint, GLint)>(loader.load("glNamedFramebufferTexture1DEXT"));
flextglNamedFramebufferTexture2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint, GLint)>(loader.load("glNamedFramebufferTexture2DEXT"));
flextglNamedFramebufferTexture3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint, GLint, GLint)>(loader.load("glNamedFramebufferTexture3DEXT"));
flextglNamedFramebufferRenderbufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint)>(loader.load("glNamedFramebufferRenderbufferEXT"));
flextglGetNamedFramebufferAttachmentParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLint *)>(loader.load("glGetNamedFramebufferAttachmentParameterivEXT"));
flextglGenerateTextureMipmapEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glGenerateTextureMipmapEXT"));
flextglGenerateMultiTexMipmapEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glGenerateMultiTexMipmapEXT"));
flextglFramebufferDrawBufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glFramebufferDrawBufferEXT"));
flextglFramebufferDrawBuffersEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizei, const GLenum *)>(loader.load("glFramebufferDrawBuffersEXT"));
flextglFramebufferReadBufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glFramebufferReadBufferEXT"));
flextglGetFramebufferParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetFramebufferParameterivEXT"));
flextglNamedCopyBufferSubDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr)>(loader.load("glNamedCopyBufferSubDataEXT"));
flextglNamedFramebufferTextureEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLint)>(loader.load("glNamedFramebufferTextureEXT"));
flextglNamedFramebufferTextureLayerEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLint, GLint)>(loader.load("glNamedFramebufferTextureLayerEXT"));
flextglNamedFramebufferTextureFaceEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint, GLint, GLenum)>(loader.load("glNamedFramebufferTextureFaceEXT"));
flextglTextureRenderbufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLuint)>(loader.load("glTextureRenderbufferEXT"));
flextglMultiTexRenderbufferEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLuint)>(loader.load("glMultiTexRenderbufferEXT"));
flextglVertexArrayVertexOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayVertexOffsetEXT"));
flextglVertexArrayColorOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayColorOffsetEXT"));
flextglVertexArrayEdgeFlagOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLsizei, GLintptr)>(loader.load("glVertexArrayEdgeFlagOffsetEXT"));
flextglVertexArrayIndexOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayIndexOffsetEXT"));
flextglVertexArrayNormalOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayNormalOffsetEXT"));
flextglVertexArrayTexCoordOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayTexCoordOffsetEXT"));
flextglVertexArrayMultiTexCoordOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayMultiTexCoordOffsetEXT"));
flextglVertexArrayFogCoordOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayFogCoordOffsetEXT"));
flextglVertexArraySecondaryColorOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArraySecondaryColorOffsetEXT"));
flextglVertexArrayVertexAttribOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLint, GLenum, GLboolean, GLsizei, GLintptr)>(loader.load("glVertexArrayVertexAttribOffsetEXT"));
flextglVertexArrayVertexAttribIOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayVertexAttribIOffsetEXT"));
flextglEnableVertexArrayEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glEnableVertexArrayEXT"));
flextglDisableVertexArrayEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum)>(loader.load("glDisableVertexArrayEXT"));
flextglEnableVertexArrayAttribEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glEnableVertexArrayAttribEXT"));
flextglDisableVertexArrayAttribEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint)>(loader.load("glDisableVertexArrayAttribEXT"));
flextglGetVertexArrayIntegervEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetVertexArrayIntegervEXT"));
flextglGetVertexArrayPointervEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, void **)>(loader.load("glGetVertexArrayPointervEXT"));
flextglGetVertexArrayIntegeri_vEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, GLint *)>(loader.load("glGetVertexArrayIntegeri_vEXT"));
flextglGetVertexArrayPointeri_vEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLenum, void **)>(loader.load("glGetVertexArrayPointeri_vEXT"));
flextglMapNamedBufferRangeEXT = reinterpret_cast<void *(APIENTRY*)(GLuint, GLintptr, GLsizeiptr, GLbitfield)>(loader.load("glMapNamedBufferRangeEXT"));
flextglFlushMappedNamedBufferRangeEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLintptr, GLsizeiptr)>(loader.load("glFlushMappedNamedBufferRangeEXT"));
flextglNamedBufferStorageEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLsizeiptr, const void *, GLbitfield)>(loader.load("glNamedBufferStorageEXT"));
flextglClearNamedBufferDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLenum, const void *)>(loader.load("glClearNamedBufferDataEXT"));
flextglClearNamedBufferSubDataEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizeiptr, GLsizeiptr, GLenum, GLenum, const void *)>(loader.load("glClearNamedBufferSubDataEXT"));
flextglNamedFramebufferParameteriEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint)>(loader.load("glNamedFramebufferParameteriEXT"));
flextglGetNamedFramebufferParameterivEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLint *)>(loader.load("glGetNamedFramebufferParameterivEXT"));
flextglProgramUniform1dEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble)>(loader.load("glProgramUniform1dEXT"));
flextglProgramUniform2dEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble)>(loader.load("glProgramUniform2dEXT"));
flextglProgramUniform3dEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble, GLdouble)>(loader.load("glProgramUniform3dEXT"));
flextglProgramUniform4dEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble)>(loader.load("glProgramUniform4dEXT"));
flextglProgramUniform1dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform1dvEXT"));
flextglProgramUniform2dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform2dvEXT"));
flextglProgramUniform3dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform3dvEXT"));
flextglProgramUniform4dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, const GLdouble *)>(loader.load("glProgramUniform4dvEXT"));
flextglProgramUniformMatrix2dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2dvEXT"));
flextglProgramUniformMatrix3dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3dvEXT"));
flextglProgramUniformMatrix4dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4dvEXT"));
flextglProgramUniformMatrix2x3dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2x3dvEXT"));
flextglProgramUniformMatrix2x4dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix2x4dvEXT"));
flextglProgramUniformMatrix3x2dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3x2dvEXT"));
flextglProgramUniformMatrix3x4dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix3x4dvEXT"));
flextglProgramUniformMatrix4x2dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4x2dvEXT"));
flextglProgramUniformMatrix4x3dvEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLsizei, GLboolean, const GLdouble *)>(loader.load("glProgramUniformMatrix4x3dvEXT"));
flextglTextureBufferRangeEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLenum, GLuint, GLintptr, GLsizeiptr)>(loader.load("glTextureBufferRangeEXT"));
flextglTextureStorage1DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLenum, GLsizei)>(loader.load("glTextureStorage1DEXT"));
flextglTextureStorage2DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei)>(loader.load("glTextureStorage2DEXT"));
flextglTextureStorage3DEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei)>(loader.load("glTextureStorage3DEXT"));
flextglTextureStorage2DMultisampleEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean)>(loader.load("glTextureStorage2DMultisampleEXT"));
flextglTextureStorage3DMultisampleEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean)>(loader.load("glTextureStorage3DMultisampleEXT"));
flextglVertexArrayBindVertexBufferEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLintptr, GLsizei)>(loader.load("glVertexArrayBindVertexBufferEXT"));
flextglVertexArrayVertexAttribFormatEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLboolean, GLuint)>(loader.load("glVertexArrayVertexAttribFormatEXT"));
flextglVertexArrayVertexAttribIFormatEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLuint)>(loader.load("glVertexArrayVertexAttribIFormatEXT"));
flextglVertexArrayVertexAttribLFormatEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLint, GLenum, GLuint)>(loader.load("glVertexArrayVertexAttribLFormatEXT"));
flextglVertexArrayVertexAttribBindingEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glVertexArrayVertexAttribBindingEXT"));
flextglVertexArrayVertexBindingDivisorEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glVertexArrayVertexBindingDivisorEXT"));
flextglVertexArrayVertexAttribLOffsetEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr)>(loader.load("glVertexArrayVertexAttribLOffsetEXT"));
flextglTexturePageCommitmentEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean)>(loader.load("glTexturePageCommitmentEXT"));
flextglVertexArrayVertexAttribDivisorEXT = reinterpret_cast<void(APIENTRY*)(GLuint, GLuint, GLuint)>(loader.load("glVertexArrayVertexAttribDivisorEXT"));
/* GL_EXT_texture_sRGB_decode */
/* GL_EXT_debug_label */
flextglLabelObjectEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, const GLchar *)>(loader.load("glLabelObjectEXT"));
flextglGetObjectLabelEXT = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *)>(loader.load("glGetObjectLabelEXT"));
/* GL_EXT_debug_marker */
flextglInsertEventMarkerEXT = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLchar *)>(loader.load("glInsertEventMarkerEXT"));
flextglPushGroupMarkerEXT = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLchar *)>(loader.load("glPushGroupMarkerEXT"));
flextglPopGroupMarkerEXT = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glPopGroupMarkerEXT"));
/* GL_GREMEDY_string_marker */
flextglStringMarkerGREMEDY = reinterpret_cast<void(APIENTRY*)(GLsizei, const void *)>(loader.load("glStringMarkerGREMEDY"));
}

21
src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template vendored

@ -0,0 +1,21 @@
@require(passthru, functions, enums, options, version, extensions)
#include "flextGL.h"
#include <cstdio>
#include <cstdlib>
#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h"
void flextGLInit() {
Magnum::Platform::Implementation::OpenGLFunctionLoader loader;
@for category,funcs in functions:
@if category not in ['VERSION_1_0', 'VERSION_1_1','VERSION_1_0_DEPRECATED', 'VERSION_1_1_DEPRECATED']:
/* GL_@category */
@for f in funcs:
flextgl@f.name = reinterpret_cast<@f.returntype\
(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name"));
@end
@end
@end
}

2739
src/MagnumExternal/OpenGL/GL/gl_magnum.c vendored

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save