From 54b78e6c6665dc348cc08b7f7e8d6710c5da0280 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 18 Jul 2023 15:43:14 +0300 Subject: [PATCH] Android WIP: support OpenGL ES 3.2 and implement Android backend library --- CMakeLists.txt | 23 +- libs/CMakeLists.txt | 6 +- libs/android/CMakeLists.txt | 6 + libs/android/source/audio_engine.cpp | 57 + libs/android/source/native_app.cpp | 117 + libs/android/source/resource.cpp | 59 + libs/gfx/CMakeLists.txt | 10 +- .../{ => api/gl33}/include/psemek/gfx/gl.hpp | 2 + libs/gfx/{ => api/gl33}/source/gl.cpp | 7 + libs/gfx/api/gles32/include/psemek/gfx/gl.hpp | 1965 +++++++++++++++++ libs/gfx/api/gles32/source/gl.cpp | 1285 +++++++++++ ...n => gl-loader-generator-config-gl33.json} | 0 .../gl-loader-generator-config-gles32.json | 21 + libs/gfx/include/psemek/gfx/attribs.hpp | 2 + libs/gfx/include/psemek/gfx/buffer.hpp | 2 +- libs/gfx/include/psemek/gfx/framebuffer.hpp | 13 +- libs/gfx/include/psemek/gfx/pixel.hpp | 7 +- .../include/psemek/gfx/renderer/deferred.hpp | 2 + libs/gfx/include/psemek/gfx/texture.hpp | 23 +- libs/gfx/source/framebuffer.cpp | 8 + libs/gfx/source/painter.cpp | 26 +- libs/gfx/source/pixel.cpp | 16 + libs/gfx/source/query.cpp | 6 +- libs/gfx/source/renderer/deferred.cpp | 4 + libs/gfx/source/texture.cpp | 8 + libs/log/CMakeLists.txt | 2 - libs/util/CMakeLists.txt | 1 - package/CMakeLists.txt | 54 +- 28 files changed, 3666 insertions(+), 66 deletions(-) create mode 100644 libs/android/CMakeLists.txt create mode 100644 libs/android/source/audio_engine.cpp create mode 100644 libs/android/source/native_app.cpp create mode 100644 libs/android/source/resource.cpp rename libs/gfx/{ => api/gl33}/include/psemek/gfx/gl.hpp (99%) rename libs/gfx/{ => api/gl33}/source/gl.cpp (99%) create mode 100644 libs/gfx/api/gles32/include/psemek/gfx/gl.hpp create mode 100644 libs/gfx/api/gles32/source/gl.cpp rename libs/gfx/{gl-loader-generator-config.json => gl-loader-generator-config-gl33.json} (100%) create mode 100644 libs/gfx/gl-loader-generator-config-gles32.json diff --git a/CMakeLists.txt b/CMakeLists.txt index d498b0f3..0fc7daf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,21 +31,37 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) list(APPEND PSEMEK_CXX_FLAGS -Wno-dtor-name) endif() -set(PSEMEK_BACKEND "SDL2" CACHE STRING "Application backend (OFF/SDL2)") +set(PSEMEK_BACKEND "SDL2" CACHE STRING "Application backend (OFF/SDL2/ANDROID)") option(PSEMEK_LEGACY_UI "Use legacy UI library" OFF) message(STATUS "Using backend ${PSEMEK_BACKEND}") +if(PSEMEK_BACKEND STREQUAL "ANDROID") + set(PSEMEK_GL_API gles32) + set(PSEMEK_GL_LIBRARIES GLESv3 EGL) + set(PSEMEK_PACKAGE_AS_LIBRARY ON CACHE INTERNAL "Build applications as shared libraries") + list(APPEND PSEMEK_CXX_FLAGS -fPIC) +else() + find_package(Threads REQUIRED) + set(OpenGL_GL_PREFERENCE LEGACY) + find_package(OpenGL REQUIRED) + set(PSEMEK_GL_API gl33) + set(PSEMEK_GL_LIBRARIES OpenGL::GL) + set(PSEMEK_PACKAGE_AS_LIBRARY OFF CACHE INTERNAL "Build applications as shared libraries") +endif() + add_subdirectory(3rdparty) get_directory_property(PSEMEK_PARENT_DIRECTORY PARENT_DIRECTORY) add_subdirectory(package) -if(PSEMEK_PACKAGE_MODE) +if(PSEMEK_PACKAGE_MODE AND PSEMEK_PACKAGE_TARGET AND NOT PSEMEK_PACKAGE_AS_LIBRARY) set(Boost_USE_STATIC_LIBS ON) endif() +find_package(PNG REQUIRED) + add_subdirectory(tools) add_subdirectory(libs) @@ -58,9 +74,6 @@ psemek_add_library(psemek EXCLUDE_FROM_ALL ${PSEMEK_SOURCES}) target_link_libraries(psemek INTERFACE ${PSEMEK_LIBRARIES}) set_target_properties(psemek PROPERTIES LINKER_LANGUAGE CXX) -psemek_add_library(psemek-backend EXCLUDE_FROM_ALL) -target_link_libraries(psemek-backend INTERFACE psemek ${PSEMEK_BACKEND_LIBRARY}) - option(PSEMEK_EXAMPLES "Build example apps" ON) if(PSEMEK_EXAMPLES) diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt index bf675328..284f4f8c 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -7,10 +7,12 @@ else() list(REMOVE_ITEM PSEMEK_LIB_DIRS "ui_legacy") endif() -list(REMOVE_ITEM PSEMEK_LIB_DIRS "sdl2") +list(REMOVE_ITEM PSEMEK_LIB_DIRS sdl2 android) set(PSEMEK_BACKEND_LIB_DIR) if(PSEMEK_BACKEND STREQUAL "SDL2") set(PSEMEK_BACKEND_LIB_DIR "sdl2") +elseif(PSEMEK_BACKEND STREQUAL "ANDROID") + set(PSEMEK_BACKEND_LIB_DIR "android") endif() set(PSEMEK_LIBRARIES) @@ -29,4 +31,4 @@ foreach(lib ${PSEMEK_LIB_DIRS} ${PSEMEK_BACKEND_LIB_DIR}) endforeach() set(PSEMEK_LIBRARIES ${PSEMEK_LIBRARIES} PARENT_SCOPE) -set(PSEMEK_BACKEND_LIBRARY ${PSEMEK_BACKEND_LIBRARY} PARENT_SCOPE) +set(PSEMEK_BACKEND_LIBRARY ${PSEMEK_BACKEND_LIBRARY} CACHE INTERNAL "Application backend library target") diff --git a/libs/android/CMakeLists.txt b/libs/android/CMakeLists.txt new file mode 100644 index 00000000..b4fa0d32 --- /dev/null +++ b/libs/android/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB_RECURSE PSEMEK_ANDROID_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "include/*.hpp") +file(GLOB_RECURSE PSEMEK_ANDROID_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "source/*.cpp") + +psemek_add_library(psemek-android ${PSEMEK_ANDROID_HEADERS} ${PSEMEK_ANDROID_SOURCES}) +target_include_directories(psemek-android PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(psemek-android PUBLIC psemek-log psemek-util psemek-gfx psemek-audio psemek-app android log) diff --git a/libs/android/source/audio_engine.cpp b/libs/android/source/audio_engine.cpp new file mode 100644 index 00000000..0234c41b --- /dev/null +++ b/libs/android/source/audio_engine.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include + +#include + +namespace psemek::android +{ + + namespace + { + + audio::channel_ptr output_channel = std::make_shared(); + + struct audio_engine_impl + : audio::engine + { + audio::channel_ptr output() override + { + return output_channel; + } + }; + + } + +} + +namespace psemek::audio +{ + + std::unique_ptr make_engine() + { + return std::make_unique(); + } + +} + +extern "C" int Java_psemek_app_PsemekApplication_audioFrequencyNative(JNIEnv *, jclass) +{ + return psemek::audio::frequency; +} + +extern "C" int Java_psemek_app_PsemekApplication_audioGetSamples(JNIEnv * env, jclass, jfloatArray buffer, jint sampleOffset, jint sampleCount) +{ + jfloat * data = env->GetFloatArrayElements(buffer, nullptr); + + int result = 0; + if (auto stream = psemek::android::output_channel->stream()) + result = stream->read({data + sampleOffset, sampleCount}); + + std::fill(data + sampleOffset + result, data + sampleOffset + sampleCount, 0.f); + + return sampleCount; +} diff --git a/libs/android/source/native_app.cpp b/libs/android/source/native_app.cpp new file mode 100644 index 00000000..d2a486bb --- /dev/null +++ b/libs/android/source/native_app.cpp @@ -0,0 +1,117 @@ +#include +#include + +#include +#include +#include + +namespace +{ + + using namespace psemek; + + android_LogPriority log_priority(log::level level) + { + switch (level) + { + case log::level::debug: + return ANDROID_LOG_DEBUG; + case log::level::info: + return ANDROID_LOG_INFO; + case log::level::warning: + return ANDROID_LOG_WARN; + case log::level::error: + return ANDROID_LOG_ERROR; + default: + return ANDROID_LOG_UNKNOWN; + } + } + + struct sink_impl + : log::sink + { + void put_message(log::message const & msg) override + { + __android_log_write(log_priority(msg.level), "psemek", msg.message.data()); + } + + void flush() override + {} + }; + +} + +extern "C" void Java_psemek_app_PsemekApplication_setupLogging(JNIEnv *, jclass) +{ + psemek::log::add_sink(std::make_unique()); +} + +extern "C" jlong Java_psemek_app_PsemekApplication_createNativeApp(JNIEnv * env, jclass) try +{ + auto factory = psemek::app::make_application_factory(); + + psemek::gfx::init(); + + psemek::app::application::context context; + auto app = factory->create(factory->options(), context).release(); + + return reinterpret_cast(app); +} +catch (std::exception const & e) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return 0; +} +catch (...) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); + return 0; +} + +extern "C" void Java_psemek_app_PsemekApplication_destroyNativeApp(JNIEnv *, jclass, jlong ptr) +{ + delete reinterpret_cast(ptr); +} + +extern "C" void Java_psemek_app_PsemekApplication_resizeNative(JNIEnv * env, jclass, jlong ptr, jint width, jint height) try +{ + auto app = reinterpret_cast(ptr); + app->on_event(psemek::app::resize_event{{width, height}}); +} +catch (std::exception const & e) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); +} +catch (...) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); +} + +extern "C" void Java_psemek_app_PsemekApplication_touchNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y) try +{ + auto app = reinterpret_cast(ptr); + app->on_event(psemek::app::touch_event{{x, y}}); +} +catch (std::exception const & e) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); +} +catch (...) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); +} + +extern "C" void Java_psemek_app_PsemekApplication_drawFrameNative(JNIEnv * env, jclass, jlong ptr) try +{ + auto app = reinterpret_cast(ptr); + app->update(); + app->present(); +} +catch (std::exception const & e) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); +} +catch (...) +{ + env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); +} diff --git a/libs/android/source/resource.cpp b/libs/android/source/resource.cpp new file mode 100644 index 00000000..7d554a0a --- /dev/null +++ b/libs/android/source/resource.cpp @@ -0,0 +1,59 @@ +#include +#include +#include + +#include + +namespace +{ + + jobject assetManagerRef; + AAssetManager * assetManager; + + struct stream_impl + : psemek::io::istream + { + stream_impl(AAsset * asset) + : asset_(asset) + {} + + ~stream_impl() + { + AAsset_close(asset_); + } + + std::size_t read(char * p, std::size_t size) override + { + int result = AAsset_read(asset_, p, size); + if (result < 0) + throw std::runtime_error("Failed to read from resource"); + return result; + } + + private: + AAsset * asset_; + }; + +} + +namespace psemek::app +{ + + std::unique_ptr open_resource(std::filesystem::path const & relative_path) + { + log::error() << "Opening resource " << relative_path; + + auto asset = AAssetManager_open(assetManager, relative_path.c_str(), AASSET_MODE_STREAMING); + if (!asset) + throw std::runtime_error(util::to_string("Failed to open resource ", relative_path)); + + return std::make_unique(asset); + } + +} + +extern "C" void Java_psemek_app_PsemekApplication_setAssetManager(JNIEnv * env, jclass, jobject manager) +{ + assetManagerRef = env->NewLocalRef(manager); + assetManager = AAssetManager_fromJava(env, manager); +} diff --git a/libs/gfx/CMakeLists.txt b/libs/gfx/CMakeLists.txt index 99c70193..d7895521 100644 --- a/libs/gfx/CMakeLists.txt +++ b/libs/gfx/CMakeLists.txt @@ -1,15 +1,11 @@ -set(OpenGL_GL_PREFERENCE LEGACY) -find_package(OpenGL REQUIRED) -find_package(PNG REQUIRED) - find_file(KHR_PLATFORM_FILE KHR/khrplatform.h) file(GLOB_RECURSE PSEMEK_GFX_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "include/*.hpp") file(GLOB_RECURSE PSEMEK_GFX_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "source/*.cpp") -psemek_add_library(psemek-gfx ${PSEMEK_GFX_HEADERS} ${PSEMEK_GFX_SOURCES}) -target_include_directories(psemek-gfx PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(psemek-gfx PUBLIC psemek-util psemek-geom psemek-cg psemek-random psemek-io psemek-log OpenGL::GL PNG::PNG rapidjson) +psemek_add_library(psemek-gfx ${PSEMEK_GFX_HEADERS} ${PSEMEK_GFX_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/api/${PSEMEK_GL_API}/source/gl.cpp") +target_include_directories(psemek-gfx PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/api/${PSEMEK_GL_API}/include") +target_link_libraries(psemek-gfx PUBLIC psemek-util psemek-geom psemek-cg psemek-random psemek-io psemek-log ${PSEMEK_GL_LIBRARIES} PNG::PNG rapidjson) if(NOT KHR_PLATFORM_FILE) message(STATUS "KHR/khrplatform.h not found, using a substitute header") target_include_directories(psemek-gfx PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/extra/khr/include") diff --git a/libs/gfx/include/psemek/gfx/gl.hpp b/libs/gfx/api/gl33/include/psemek/gfx/gl.hpp similarity index 99% rename from libs/gfx/include/psemek/gfx/gl.hpp rename to libs/gfx/api/gl33/include/psemek/gfx/gl.hpp index 8db56b06..cef88d06 100644 --- a/libs/gfx/include/psemek/gfx/gl.hpp +++ b/libs/gfx/api/gl33/include/psemek/gfx/gl.hpp @@ -1871,6 +1871,8 @@ namespace gl bool ext_ARB_shader_image_load_store(); bool ext_ARB_texture_filter_anisotropic(); + const char * shader_prefix(); + } // namespace sys } // namespace gl diff --git a/libs/gfx/source/gl.cpp b/libs/gfx/api/gl33/source/gl.cpp similarity index 99% rename from libs/gfx/source/gl.cpp rename to libs/gfx/api/gl33/source/gl.cpp index e922c12b..aa210728 100644 --- a/libs/gfx/source/gl.cpp +++ b/libs/gfx/api/gl33/source/gl.cpp @@ -1276,6 +1276,13 @@ namespace gl bool ext_ARB_shader_image_load_store(){ return ext_GL_ARB_shader_image_load_store_loaded; } bool ext_ARB_texture_filter_anisotropic(){ return ext_GL_ARB_texture_filter_anisotropic_loaded; } + const char * shader_prefix() + { + return R"(#version 330 core + +)"; + } + } // namespace sys } // namespace gl diff --git a/libs/gfx/api/gles32/include/psemek/gfx/gl.hpp b/libs/gfx/api/gles32/include/psemek/gfx/gl.hpp new file mode 100644 index 00000000..12280e0a --- /dev/null +++ b/libs/gfx/api/gles32/include/psemek/gfx/gl.hpp @@ -0,0 +1,1965 @@ +#pragma once + +// Prevent inclusion of other OpenGL-related headers + +#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_ + +// Undefine some macros that may interfere with OpenGL ES constants + +#undef ZERO +#undef NONE +#undef TRUE +#undef ONE +#undef LOAD +#undef MULT +#undef ADD +#undef LESS +#undef BACK +#undef LEFT +#undef AUX0 +#undef AUX1 +#undef AUX2 +#undef AUX3 +#undef EXP +#undef EXP2 +#undef CW +#undef CCW +#undef FOG +#undef BYTE +#undef INT +#undef AND +#undef COPY +#undef NOOP +#undef XOR +#undef OR +#undef NOR +#undef NAND +#undef SET +#undef RED +#undef BLUE +#undef RGB +#undef RGBA +#undef LINE +#undef FILL +#undef FLAT +#undef KEEP +#undef INCR +#undef DECR +#undef S +#undef T +#undef R +#undef Q +#undef V2F +#undef V3F +#undef MIN +#undef MAX +#undef RGB4 +#undef RGB5 +#undef RGB8 +#undef BGR +#undef BGRA +#undef RG +#undef R8 +#undef R16 +#undef RG8 +#undef RG16 +#undef R16F +#undef R32F +#undef R8I +#undef R8UI +#undef R16I +#undef R32I +#undef RG8I +#undef BOOL +#undef SRGB +#undef TYPE + +// OpenGL ES type definitions + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +typedef khronos_intptr_t GLintptr; +typedef khronos_intptr_t GLintptrARB; +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_ssize_t GLsizeiptrARB; +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLVULKANPROCNV)(void); + +namespace gl +{ + + namespace internal + { + + // OpenGL ES 2.0 + + extern void (*glActiveTexture)(GLenum texture); + extern void (*glAttachShader)(GLuint program, GLuint shader); + extern void (*glBindAttribLocation)(GLuint program, GLuint index, const GLchar *name); + extern void (*glBindBuffer)(GLenum target, GLuint buffer); + extern void (*glBindFramebuffer)(GLenum target, GLuint framebuffer); + extern void (*glBindRenderbuffer)(GLenum target, GLuint renderbuffer); + extern void (*glBindTexture)(GLenum target, GLuint texture); + extern void (*glBlendColor)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + extern void (*glBlendEquation)(GLenum mode); + extern void (*glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); + extern void (*glBlendFunc)(GLenum sfactor, GLenum dfactor); + extern void (*glBlendFuncSeparate)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + extern void (*glBufferData)(GLenum target, GLsizeiptr size, const void *data, GLenum usage); + extern void (*glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); + extern GLenum (*glCheckFramebufferStatus)(GLenum target); + extern void (*glClear)(GLbitfield mask); + extern void (*glClearColor)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + extern void (*glClearDepthf)(GLfloat d); + extern void (*glClearStencil)(GLint s); + extern void (*glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + extern void (*glCompileShader)(GLuint shader); + extern void (*glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); + extern void (*glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); + extern void (*glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + extern void (*glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + extern GLuint (*glCreateProgram)(); + extern GLuint (*glCreateShader)(GLenum type); + extern void (*glCullFace)(GLenum mode); + extern void (*glDeleteBuffers)(GLsizei n, const GLuint *buffers); + extern void (*glDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers); + extern void (*glDeleteProgram)(GLuint program); + extern void (*glDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers); + extern void (*glDeleteShader)(GLuint shader); + extern void (*glDeleteTextures)(GLsizei n, const GLuint *textures); + extern void (*glDepthFunc)(GLenum func); + extern void (*glDepthMask)(GLboolean flag); + extern void (*glDepthRangef)(GLfloat n, GLfloat f); + extern void (*glDetachShader)(GLuint program, GLuint shader); + extern void (*glDisable)(GLenum cap); + extern void (*glDisableVertexAttribArray)(GLuint index); + extern void (*glDrawArrays)(GLenum mode, GLint first, GLsizei count); + extern void (*glDrawElements)(GLenum mode, GLsizei count, GLenum type, const void *indices); + extern void (*glEnable)(GLenum cap); + extern void (*glEnableVertexAttribArray)(GLuint index); + extern void (*glFinish)(); + extern void (*glFlush)(); + extern void (*glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + extern void (*glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + extern void (*glFrontFace)(GLenum mode); + extern void (*glGenBuffers)(GLsizei n, GLuint *buffers); + extern void (*glGenerateMipmap)(GLenum target); + extern void (*glGenFramebuffers)(GLsizei n, GLuint *framebuffers); + extern void (*glGenRenderbuffers)(GLsizei n, GLuint *renderbuffers); + extern void (*glGenTextures)(GLsizei n, GLuint *textures); + extern void (*glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); + extern void (*glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); + extern void (*glGetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); + extern GLint (*glGetAttribLocation)(GLuint program, const GLchar *name); + extern void (*glGetBooleanv)(GLenum pname, GLboolean *data); + extern void (*glGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params); + extern GLenum (*glGetError)(); + extern void (*glGetFloatv)(GLenum pname, GLfloat *data); + extern void (*glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint *params); + extern void (*glGetIntegerv)(GLenum pname, GLint *data); + extern void (*glGetProgramiv)(GLuint program, GLenum pname, GLint *params); + extern void (*glGetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + extern void (*glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params); + extern void (*glGetShaderiv)(GLuint shader, GLenum pname, GLint *params); + extern void (*glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + extern void (*glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); + extern void (*glGetShaderSource)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); + extern const GLubyte *(*glGetString)(GLenum name); + extern void (*glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params); + extern void (*glGetTexParameteriv)(GLenum target, GLenum pname, GLint *params); + extern void (*glGetUniformfv)(GLuint program, GLint location, GLfloat *params); + extern void (*glGetUniformiv)(GLuint program, GLint location, GLint *params); + extern GLint (*glGetUniformLocation)(GLuint program, const GLchar *name); + extern void (*glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params); + extern void (*glGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params); + extern void (*glGetVertexAttribPointerv)(GLuint index, GLenum pname, void **pointer); + extern void (*glHint)(GLenum target, GLenum mode); + extern GLboolean (*glIsBuffer)(GLuint buffer); + extern GLboolean (*glIsEnabled)(GLenum cap); + extern GLboolean (*glIsFramebuffer)(GLuint framebuffer); + extern GLboolean (*glIsProgram)(GLuint program); + extern GLboolean (*glIsRenderbuffer)(GLuint renderbuffer); + extern GLboolean (*glIsShader)(GLuint shader); + extern GLboolean (*glIsTexture)(GLuint texture); + extern void (*glLineWidth)(GLfloat width); + extern void (*glLinkProgram)(GLuint program); + extern void (*glPixelStorei)(GLenum pname, GLint param); + extern void (*glPolygonOffset)(GLfloat factor, GLfloat units); + extern void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); + extern void (*glReleaseShaderCompiler)(); + extern void (*glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + extern void (*glSampleCoverage)(GLfloat value, GLboolean invert); + extern void (*glScissor)(GLint x, GLint y, GLsizei width, GLsizei height); + extern void (*glShaderBinary)(GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); + extern void (*glShaderSource)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); + extern void (*glStencilFunc)(GLenum func, GLint ref, GLuint mask); + extern void (*glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask); + extern void (*glStencilMask)(GLuint mask); + extern void (*glStencilMaskSeparate)(GLenum face, GLuint mask); + extern void (*glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass); + extern void (*glStencilOpSeparate)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + extern void (*glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); + extern void (*glTexParameterf)(GLenum target, GLenum pname, GLfloat param); + extern void (*glTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params); + extern void (*glTexParameteri)(GLenum target, GLenum pname, GLint param); + extern void (*glTexParameteriv)(GLenum target, GLenum pname, const GLint *params); + extern void (*glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + extern void (*glUniform1f)(GLint location, GLfloat v0); + extern void (*glUniform1fv)(GLint location, GLsizei count, const GLfloat *value); + extern void (*glUniform1i)(GLint location, GLint v0); + extern void (*glUniform1iv)(GLint location, GLsizei count, const GLint *value); + extern void (*glUniform2f)(GLint location, GLfloat v0, GLfloat v1); + extern void (*glUniform2fv)(GLint location, GLsizei count, const GLfloat *value); + extern void (*glUniform2i)(GLint location, GLint v0, GLint v1); + extern void (*glUniform2iv)(GLint location, GLsizei count, const GLint *value); + extern void (*glUniform3f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + extern void (*glUniform3fv)(GLint location, GLsizei count, const GLfloat *value); + extern void (*glUniform3i)(GLint location, GLint v0, GLint v1, GLint v2); + extern void (*glUniform3iv)(GLint location, GLsizei count, const GLint *value); + extern void (*glUniform4f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + extern void (*glUniform4fv)(GLint location, GLsizei count, const GLfloat *value); + extern void (*glUniform4i)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + extern void (*glUniform4iv)(GLint location, GLsizei count, const GLint *value); + extern void (*glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUseProgram)(GLuint program); + extern void (*glValidateProgram)(GLuint program); + extern void (*glVertexAttrib1f)(GLuint index, GLfloat x); + extern void (*glVertexAttrib1fv)(GLuint index, const GLfloat *v); + extern void (*glVertexAttrib2f)(GLuint index, GLfloat x, GLfloat y); + extern void (*glVertexAttrib2fv)(GLuint index, const GLfloat *v); + extern void (*glVertexAttrib3f)(GLuint index, GLfloat x, GLfloat y, GLfloat z); + extern void (*glVertexAttrib3fv)(GLuint index, const GLfloat *v); + extern void (*glVertexAttrib4f)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + extern void (*glVertexAttrib4fv)(GLuint index, const GLfloat *v); + extern void (*glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + extern void (*glViewport)(GLint x, GLint y, GLsizei width, GLsizei height); + + // OpenGL ES 3.0 + + extern void (*glReadBuffer)(GLenum src); + extern void (*glDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + extern void (*glTexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + extern void (*glTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + extern void (*glCopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + extern void (*glCompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); + extern void (*glCompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); + extern void (*glGenQueries)(GLsizei n, GLuint *ids); + extern void (*glDeleteQueries)(GLsizei n, const GLuint *ids); + extern GLboolean (*glIsQuery)(GLuint id); + extern void (*glBeginQuery)(GLenum target, GLuint id); + extern void (*glEndQuery)(GLenum target); + extern void (*glGetQueryiv)(GLenum target, GLenum pname, GLint *params); + extern void (*glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint *params); + extern GLboolean (*glUnmapBuffer)(GLenum target); + extern void (*glGetBufferPointerv)(GLenum target, GLenum pname, void **params); + extern void (*glDrawBuffers)(GLsizei n, const GLenum *bufs); + extern void (*glUniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glUniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + extern void (*glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + extern void (*glFramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + extern void *(*glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + extern void (*glFlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length); + extern void (*glBindVertexArray)(GLuint array); + extern void (*glDeleteVertexArrays)(GLsizei n, const GLuint *arrays); + extern void (*glGenVertexArrays)(GLsizei n, GLuint *arrays); + extern GLboolean (*glIsVertexArray)(GLuint array); + extern void (*glGetIntegeri_v)(GLenum target, GLuint index, GLint *data); + extern void (*glBeginTransformFeedback)(GLenum primitiveMode); + extern void (*glEndTransformFeedback)(); + extern void (*glBindBufferRange)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + extern void (*glBindBufferBase)(GLenum target, GLuint index, GLuint buffer); + extern void (*glTransformFeedbackVaryings)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); + extern void (*glGetTransformFeedbackVarying)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); + extern void (*glVertexAttribIPointer)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + extern void (*glGetVertexAttribIiv)(GLuint index, GLenum pname, GLint *params); + extern void (*glGetVertexAttribIuiv)(GLuint index, GLenum pname, GLuint *params); + extern void (*glVertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w); + extern void (*glVertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + extern void (*glVertexAttribI4iv)(GLuint index, const GLint *v); + extern void (*glVertexAttribI4uiv)(GLuint index, const GLuint *v); + extern void (*glGetUniformuiv)(GLuint program, GLint location, GLuint *params); + extern GLint (*glGetFragDataLocation)(GLuint program, const GLchar *name); + extern void (*glUniform1ui)(GLint location, GLuint v0); + extern void (*glUniform2ui)(GLint location, GLuint v0, GLuint v1); + extern void (*glUniform3ui)(GLint location, GLuint v0, GLuint v1, GLuint v2); + extern void (*glUniform4ui)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + extern void (*glUniform1uiv)(GLint location, GLsizei count, const GLuint *value); + extern void (*glUniform2uiv)(GLint location, GLsizei count, const GLuint *value); + extern void (*glUniform3uiv)(GLint location, GLsizei count, const GLuint *value); + extern void (*glUniform4uiv)(GLint location, GLsizei count, const GLuint *value); + extern void (*glClearBufferiv)(GLenum buffer, GLint drawbuffer, const GLint *value); + extern void (*glClearBufferuiv)(GLenum buffer, GLint drawbuffer, const GLuint *value); + extern void (*glClearBufferfv)(GLenum buffer, GLint drawbuffer, const GLfloat *value); + extern void (*glClearBufferfi)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); + extern const GLubyte *(*glGetStringi)(GLenum name, GLuint index); + extern void (*glCopyBufferSubData)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + extern void (*glGetUniformIndices)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); + extern void (*glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); + extern GLuint (*glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName); + extern void (*glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); + extern void (*glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); + extern void (*glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + extern void (*glDrawArraysInstanced)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); + extern void (*glDrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); + extern GLsync (*glFenceSync)(GLenum condition, GLbitfield flags); + extern GLboolean (*glIsSync)(GLsync sync); + extern void (*glDeleteSync)(GLsync sync); + extern GLenum (*glClientWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout); + extern void (*glWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout); + extern void (*glGetInteger64v)(GLenum pname, GLint64 *data); + extern void (*glGetSynciv)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); + extern void (*glGetInteger64i_v)(GLenum target, GLuint index, GLint64 *data); + extern void (*glGetBufferParameteri64v)(GLenum target, GLenum pname, GLint64 *params); + extern void (*glGenSamplers)(GLsizei count, GLuint *samplers); + extern void (*glDeleteSamplers)(GLsizei count, const GLuint *samplers); + extern GLboolean (*glIsSampler)(GLuint sampler); + extern void (*glBindSampler)(GLuint unit, GLuint sampler); + extern void (*glSamplerParameteri)(GLuint sampler, GLenum pname, GLint param); + extern void (*glSamplerParameteriv)(GLuint sampler, GLenum pname, const GLint *param); + extern void (*glSamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param); + extern void (*glSamplerParameterfv)(GLuint sampler, GLenum pname, const GLfloat *param); + extern void (*glGetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint *params); + extern void (*glGetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat *params); + extern void (*glVertexAttribDivisor)(GLuint index, GLuint divisor); + extern void (*glBindTransformFeedback)(GLenum target, GLuint id); + extern void (*glDeleteTransformFeedbacks)(GLsizei n, const GLuint *ids); + extern void (*glGenTransformFeedbacks)(GLsizei n, GLuint *ids); + extern GLboolean (*glIsTransformFeedback)(GLuint id); + extern void (*glPauseTransformFeedback)(); + extern void (*glResumeTransformFeedback)(); + extern void (*glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); + extern void (*glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); + extern void (*glProgramParameteri)(GLuint program, GLenum pname, GLint value); + extern void (*glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments); + extern void (*glInvalidateSubFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); + extern void (*glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); + extern void (*glTexStorage3D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + extern void (*glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); + + // OpenGL ES 3.1 + + extern void (*glDispatchCompute)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); + extern void (*glDispatchComputeIndirect)(GLintptr indirect); + extern void (*glDrawArraysIndirect)(GLenum mode, const void *indirect); + extern void (*glDrawElementsIndirect)(GLenum mode, GLenum type, const void *indirect); + extern void (*glFramebufferParameteri)(GLenum target, GLenum pname, GLint param); + extern void (*glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params); + extern void (*glGetProgramInterfaceiv)(GLuint program, GLenum programInterface, GLenum pname, GLint *params); + extern GLuint (*glGetProgramResourceIndex)(GLuint program, GLenum programInterface, const GLchar *name); + extern void (*glGetProgramResourceName)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); + extern void (*glGetProgramResourceiv)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); + extern GLint (*glGetProgramResourceLocation)(GLuint program, GLenum programInterface, const GLchar *name); + extern void (*glUseProgramStages)(GLuint pipeline, GLbitfield stages, GLuint program); + extern void (*glActiveShaderProgram)(GLuint pipeline, GLuint program); + extern GLuint (*glCreateShaderProgramv)(GLenum type, GLsizei count, const GLchar *const*strings); + extern void (*glBindProgramPipeline)(GLuint pipeline); + extern void (*glDeleteProgramPipelines)(GLsizei n, const GLuint *pipelines); + extern void (*glGenProgramPipelines)(GLsizei n, GLuint *pipelines); + extern GLboolean (*glIsProgramPipeline)(GLuint pipeline); + extern void (*glGetProgramPipelineiv)(GLuint pipeline, GLenum pname, GLint *params); + extern void (*glProgramUniform1i)(GLuint program, GLint location, GLint v0); + extern void (*glProgramUniform2i)(GLuint program, GLint location, GLint v0, GLint v1); + extern void (*glProgramUniform3i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); + extern void (*glProgramUniform4i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + extern void (*glProgramUniform1ui)(GLuint program, GLint location, GLuint v0); + extern void (*glProgramUniform2ui)(GLuint program, GLint location, GLuint v0, GLuint v1); + extern void (*glProgramUniform3ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); + extern void (*glProgramUniform4ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + extern void (*glProgramUniform1f)(GLuint program, GLint location, GLfloat v0); + extern void (*glProgramUniform2f)(GLuint program, GLint location, GLfloat v0, GLfloat v1); + extern void (*glProgramUniform3f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + extern void (*glProgramUniform4f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + extern void (*glProgramUniform1iv)(GLuint program, GLint location, GLsizei count, const GLint *value); + extern void (*glProgramUniform2iv)(GLuint program, GLint location, GLsizei count, const GLint *value); + extern void (*glProgramUniform3iv)(GLuint program, GLint location, GLsizei count, const GLint *value); + extern void (*glProgramUniform4iv)(GLuint program, GLint location, GLsizei count, const GLint *value); + extern void (*glProgramUniform1uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value); + extern void (*glProgramUniform2uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value); + extern void (*glProgramUniform3uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value); + extern void (*glProgramUniform4uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value); + extern void (*glProgramUniform1fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value); + extern void (*glProgramUniform2fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value); + extern void (*glProgramUniform3fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value); + extern void (*glProgramUniform4fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value); + extern void (*glProgramUniformMatrix2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix2x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix3x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix2x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix4x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix3x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glProgramUniformMatrix4x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + extern void (*glValidateProgramPipeline)(GLuint pipeline); + extern void (*glGetProgramPipelineInfoLog)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + extern void (*glBindImageTexture)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); + extern void (*glGetBooleani_v)(GLenum target, GLuint index, GLboolean *data); + extern void (*glMemoryBarrier)(GLbitfield barriers); + extern void (*glMemoryBarrierByRegion)(GLbitfield barriers); + extern void (*glTexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); + extern void (*glGetMultisamplefv)(GLenum pname, GLuint index, GLfloat *val); + extern void (*glSampleMaski)(GLuint maskNumber, GLbitfield mask); + extern void (*glGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params); + extern void (*glGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params); + extern void (*glBindVertexBuffer)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); + extern void (*glVertexAttribFormat)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); + extern void (*glVertexAttribIFormat)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + extern void (*glVertexAttribBinding)(GLuint attribindex, GLuint bindingindex); + extern void (*glVertexBindingDivisor)(GLuint bindingindex, GLuint divisor); + + // OpenGL ES 3.2 + + extern void (*glBlendBarrier)(); + extern void (*glCopyImageSubData)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + extern void (*glDebugMessageControl)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + extern void (*glDebugMessageInsert)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); + extern void (*glDebugMessageCallback)(GLDEBUGPROC callback, const void *userParam); + extern GLuint (*glGetDebugMessageLog)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); + extern void (*glPushDebugGroup)(GLenum source, GLuint id, GLsizei length, const GLchar *message); + extern void (*glPopDebugGroup)(); + extern void (*glObjectLabel)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); + extern void (*glGetObjectLabel)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); + extern void (*glObjectPtrLabel)(const void *ptr, GLsizei length, const GLchar *label); + extern void (*glGetObjectPtrLabel)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); + extern void (*glGetPointerv)(GLenum pname, void **params); + extern void (*glEnablei)(GLenum target, GLuint index); + extern void (*glDisablei)(GLenum target, GLuint index); + extern void (*glBlendEquationi)(GLuint buf, GLenum mode); + extern void (*glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); + extern void (*glBlendFunci)(GLuint buf, GLenum src, GLenum dst); + extern void (*glBlendFuncSeparatei)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + extern void (*glColorMaski)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); + extern GLboolean (*glIsEnabledi)(GLenum target, GLuint index); + extern void (*glDrawElementsBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); + extern void (*glDrawRangeElementsBaseVertex)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); + extern void (*glDrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); + extern void (*glFramebufferTexture)(GLenum target, GLenum attachment, GLuint texture, GLint level); + extern void (*glPrimitiveBoundingBox)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + extern GLenum (*glGetGraphicsResetStatus)(); + extern void (*glReadnPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + extern void (*glGetnUniformfv)(GLuint program, GLint location, GLsizei bufSize, GLfloat *params); + extern void (*glGetnUniformiv)(GLuint program, GLint location, GLsizei bufSize, GLint *params); + extern void (*glGetnUniformuiv)(GLuint program, GLint location, GLsizei bufSize, GLuint *params); + extern void (*glMinSampleShading)(GLfloat value); + extern void (*glPatchParameteri)(GLenum pname, GLint value); + extern void (*glTexParameterIiv)(GLenum target, GLenum pname, const GLint *params); + extern void (*glTexParameterIuiv)(GLenum target, GLenum pname, const GLuint *params); + extern void (*glGetTexParameterIiv)(GLenum target, GLenum pname, GLint *params); + extern void (*glGetTexParameterIuiv)(GLenum target, GLenum pname, GLuint *params); + extern void (*glSamplerParameterIiv)(GLuint sampler, GLenum pname, const GLint *param); + extern void (*glSamplerParameterIuiv)(GLuint sampler, GLenum pname, const GLuint *param); + extern void (*glGetSamplerParameterIiv)(GLuint sampler, GLenum pname, GLint *params); + extern void (*glGetSamplerParameterIuiv)(GLuint sampler, GLenum pname, GLuint *params); + extern void (*glTexBuffer)(GLenum target, GLenum internalformat, GLuint buffer); + extern void (*glTexBufferRange)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + extern void (*glTexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + + // GL_ARB_compute_shader + + + // GL_ARB_shader_image_load_store + + + // GL_ARB_texture_filter_anisotropic + + + } // namespace internal + + // OpenGL ES 2.0 + + constexpr GLenum DEPTH_BUFFER_BIT = 0x00000100; + constexpr GLenum STENCIL_BUFFER_BIT = 0x00000400; + constexpr GLenum COLOR_BUFFER_BIT = 0x00004000; + constexpr GLenum FALSE = 0; + constexpr GLenum TRUE = 1; + constexpr GLenum POINTS = 0x0000; + constexpr GLenum LINES = 0x0001; + constexpr GLenum LINE_LOOP = 0x0002; + constexpr GLenum LINE_STRIP = 0x0003; + constexpr GLenum TRIANGLES = 0x0004; + constexpr GLenum TRIANGLE_STRIP = 0x0005; + constexpr GLenum TRIANGLE_FAN = 0x0006; + constexpr GLenum ZERO = 0; + constexpr GLenum ONE = 1; + constexpr GLenum SRC_COLOR = 0x0300; + constexpr GLenum ONE_MINUS_SRC_COLOR = 0x0301; + constexpr GLenum SRC_ALPHA = 0x0302; + constexpr GLenum ONE_MINUS_SRC_ALPHA = 0x0303; + constexpr GLenum DST_ALPHA = 0x0304; + constexpr GLenum ONE_MINUS_DST_ALPHA = 0x0305; + constexpr GLenum DST_COLOR = 0x0306; + constexpr GLenum ONE_MINUS_DST_COLOR = 0x0307; + constexpr GLenum SRC_ALPHA_SATURATE = 0x0308; + constexpr GLenum FUNC_ADD = 0x8006; + constexpr GLenum BLEND_EQUATION = 0x8009; + constexpr GLenum BLEND_EQUATION_RGB = 0x8009; + constexpr GLenum BLEND_EQUATION_ALPHA = 0x883D; + constexpr GLenum FUNC_SUBTRACT = 0x800A; + constexpr GLenum FUNC_REVERSE_SUBTRACT = 0x800B; + constexpr GLenum BLEND_DST_RGB = 0x80C8; + constexpr GLenum BLEND_SRC_RGB = 0x80C9; + constexpr GLenum BLEND_DST_ALPHA = 0x80CA; + constexpr GLenum BLEND_SRC_ALPHA = 0x80CB; + constexpr GLenum CONSTANT_COLOR = 0x8001; + constexpr GLenum ONE_MINUS_CONSTANT_COLOR = 0x8002; + constexpr GLenum CONSTANT_ALPHA = 0x8003; + constexpr GLenum ONE_MINUS_CONSTANT_ALPHA = 0x8004; + constexpr GLenum BLEND_COLOR = 0x8005; + constexpr GLenum ARRAY_BUFFER = 0x8892; + constexpr GLenum ELEMENT_ARRAY_BUFFER = 0x8893; + constexpr GLenum ARRAY_BUFFER_BINDING = 0x8894; + constexpr GLenum ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; + constexpr GLenum STREAM_DRAW = 0x88E0; + constexpr GLenum STATIC_DRAW = 0x88E4; + constexpr GLenum DYNAMIC_DRAW = 0x88E8; + constexpr GLenum BUFFER_SIZE = 0x8764; + constexpr GLenum BUFFER_USAGE = 0x8765; + constexpr GLenum CURRENT_VERTEX_ATTRIB = 0x8626; + constexpr GLenum FRONT = 0x0404; + constexpr GLenum BACK = 0x0405; + constexpr GLenum FRONT_AND_BACK = 0x0408; + constexpr GLenum TEXTURE_2D = 0x0DE1; + constexpr GLenum CULL_FACE = 0x0B44; + constexpr GLenum BLEND = 0x0BE2; + constexpr GLenum DITHER = 0x0BD0; + constexpr GLenum STENCIL_TEST = 0x0B90; + constexpr GLenum DEPTH_TEST = 0x0B71; + constexpr GLenum SCISSOR_TEST = 0x0C11; + constexpr GLenum POLYGON_OFFSET_FILL = 0x8037; + constexpr GLenum SAMPLE_ALPHA_TO_COVERAGE = 0x809E; + constexpr GLenum SAMPLE_COVERAGE = 0x80A0; + constexpr GLenum NO_ERROR = 0; + constexpr GLenum INVALID_ENUM = 0x0500; + constexpr GLenum INVALID_VALUE = 0x0501; + constexpr GLenum INVALID_OPERATION = 0x0502; + constexpr GLenum OUT_OF_MEMORY = 0x0505; + constexpr GLenum CW = 0x0900; + constexpr GLenum CCW = 0x0901; + constexpr GLenum LINE_WIDTH = 0x0B21; + constexpr GLenum ALIASED_POINT_SIZE_RANGE = 0x846D; + constexpr GLenum ALIASED_LINE_WIDTH_RANGE = 0x846E; + constexpr GLenum CULL_FACE_MODE = 0x0B45; + constexpr GLenum FRONT_FACE = 0x0B46; + constexpr GLenum DEPTH_RANGE = 0x0B70; + constexpr GLenum DEPTH_WRITEMASK = 0x0B72; + constexpr GLenum DEPTH_CLEAR_VALUE = 0x0B73; + constexpr GLenum DEPTH_FUNC = 0x0B74; + constexpr GLenum STENCIL_CLEAR_VALUE = 0x0B91; + constexpr GLenum STENCIL_FUNC = 0x0B92; + constexpr GLenum STENCIL_FAIL = 0x0B94; + constexpr GLenum STENCIL_PASS_DEPTH_FAIL = 0x0B95; + constexpr GLenum STENCIL_PASS_DEPTH_PASS = 0x0B96; + constexpr GLenum STENCIL_REF = 0x0B97; + constexpr GLenum STENCIL_VALUE_MASK = 0x0B93; + constexpr GLenum STENCIL_WRITEMASK = 0x0B98; + constexpr GLenum STENCIL_BACK_FUNC = 0x8800; + constexpr GLenum STENCIL_BACK_FAIL = 0x8801; + constexpr GLenum STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802; + constexpr GLenum STENCIL_BACK_PASS_DEPTH_PASS = 0x8803; + constexpr GLenum STENCIL_BACK_REF = 0x8CA3; + constexpr GLenum STENCIL_BACK_VALUE_MASK = 0x8CA4; + constexpr GLenum STENCIL_BACK_WRITEMASK = 0x8CA5; + constexpr GLenum VIEWPORT = 0x0BA2; + constexpr GLenum SCISSOR_BOX = 0x0C10; + constexpr GLenum COLOR_CLEAR_VALUE = 0x0C22; + constexpr GLenum COLOR_WRITEMASK = 0x0C23; + constexpr GLenum UNPACK_ALIGNMENT = 0x0CF5; + constexpr GLenum PACK_ALIGNMENT = 0x0D05; + constexpr GLenum MAX_TEXTURE_SIZE = 0x0D33; + constexpr GLenum MAX_VIEWPORT_DIMS = 0x0D3A; + constexpr GLenum SUBPIXEL_BITS = 0x0D50; + constexpr GLenum RED_BITS = 0x0D52; + constexpr GLenum GREEN_BITS = 0x0D53; + constexpr GLenum BLUE_BITS = 0x0D54; + constexpr GLenum ALPHA_BITS = 0x0D55; + constexpr GLenum DEPTH_BITS = 0x0D56; + constexpr GLenum STENCIL_BITS = 0x0D57; + constexpr GLenum POLYGON_OFFSET_UNITS = 0x2A00; + constexpr GLenum POLYGON_OFFSET_FACTOR = 0x8038; + constexpr GLenum TEXTURE_BINDING_2D = 0x8069; + constexpr GLenum SAMPLE_BUFFERS = 0x80A8; + constexpr GLenum SAMPLES = 0x80A9; + constexpr GLenum SAMPLE_COVERAGE_VALUE = 0x80AA; + constexpr GLenum SAMPLE_COVERAGE_INVERT = 0x80AB; + constexpr GLenum NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2; + constexpr GLenum COMPRESSED_TEXTURE_FORMATS = 0x86A3; + constexpr GLenum DONT_CARE = 0x1100; + constexpr GLenum FASTEST = 0x1101; + constexpr GLenum NICEST = 0x1102; + constexpr GLenum GENERATE_MIPMAP_HINT = 0x8192; + constexpr GLenum BYTE = 0x1400; + constexpr GLenum UNSIGNED_BYTE = 0x1401; + constexpr GLenum SHORT = 0x1402; + constexpr GLenum UNSIGNED_SHORT = 0x1403; + constexpr GLenum INT = 0x1404; + constexpr GLenum UNSIGNED_INT = 0x1405; + constexpr GLenum FLOAT = 0x1406; + constexpr GLenum FIXED = 0x140C; + constexpr GLenum DEPTH_COMPONENT = 0x1902; + constexpr GLenum ALPHA = 0x1906; + constexpr GLenum RGB = 0x1907; + constexpr GLenum RGBA = 0x1908; + constexpr GLenum LUMINANCE = 0x1909; + constexpr GLenum LUMINANCE_ALPHA = 0x190A; + constexpr GLenum UNSIGNED_SHORT_4_4_4_4 = 0x8033; + constexpr GLenum UNSIGNED_SHORT_5_5_5_1 = 0x8034; + constexpr GLenum UNSIGNED_SHORT_5_6_5 = 0x8363; + constexpr GLenum FRAGMENT_SHADER = 0x8B30; + constexpr GLenum VERTEX_SHADER = 0x8B31; + constexpr GLenum MAX_VERTEX_ATTRIBS = 0x8869; + constexpr GLenum MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB; + constexpr GLenum MAX_VARYING_VECTORS = 0x8DFC; + constexpr GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D; + constexpr GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C; + constexpr GLenum MAX_TEXTURE_IMAGE_UNITS = 0x8872; + constexpr GLenum MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD; + constexpr GLenum SHADER_TYPE = 0x8B4F; + constexpr GLenum DELETE_STATUS = 0x8B80; + constexpr GLenum LINK_STATUS = 0x8B82; + constexpr GLenum VALIDATE_STATUS = 0x8B83; + constexpr GLenum ATTACHED_SHADERS = 0x8B85; + constexpr GLenum ACTIVE_UNIFORMS = 0x8B86; + constexpr GLenum ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87; + constexpr GLenum ACTIVE_ATTRIBUTES = 0x8B89; + constexpr GLenum ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A; + constexpr GLenum SHADING_LANGUAGE_VERSION = 0x8B8C; + constexpr GLenum CURRENT_PROGRAM = 0x8B8D; + constexpr GLenum NEVER = 0x0200; + constexpr GLenum LESS = 0x0201; + constexpr GLenum EQUAL = 0x0202; + constexpr GLenum LEQUAL = 0x0203; + constexpr GLenum GREATER = 0x0204; + constexpr GLenum NOTEQUAL = 0x0205; + constexpr GLenum GEQUAL = 0x0206; + constexpr GLenum ALWAYS = 0x0207; + constexpr GLenum KEEP = 0x1E00; + constexpr GLenum REPLACE = 0x1E01; + constexpr GLenum INCR = 0x1E02; + constexpr GLenum DECR = 0x1E03; + constexpr GLenum INVERT = 0x150A; + constexpr GLenum INCR_WRAP = 0x8507; + constexpr GLenum DECR_WRAP = 0x8508; + constexpr GLenum VENDOR = 0x1F00; + constexpr GLenum RENDERER = 0x1F01; + constexpr GLenum VERSION = 0x1F02; + constexpr GLenum EXTENSIONS = 0x1F03; + constexpr GLenum NEAREST = 0x2600; + constexpr GLenum LINEAR = 0x2601; + constexpr GLenum NEAREST_MIPMAP_NEAREST = 0x2700; + constexpr GLenum LINEAR_MIPMAP_NEAREST = 0x2701; + constexpr GLenum NEAREST_MIPMAP_LINEAR = 0x2702; + constexpr GLenum LINEAR_MIPMAP_LINEAR = 0x2703; + constexpr GLenum TEXTURE_MAG_FILTER = 0x2800; + constexpr GLenum TEXTURE_MIN_FILTER = 0x2801; + constexpr GLenum TEXTURE_WRAP_S = 0x2802; + constexpr GLenum TEXTURE_WRAP_T = 0x2803; + constexpr GLenum TEXTURE = 0x1702; + constexpr GLenum TEXTURE_CUBE_MAP = 0x8513; + constexpr GLenum TEXTURE_BINDING_CUBE_MAP = 0x8514; + constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; + constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; + constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; + constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; + constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; + constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; + constexpr GLenum MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + constexpr GLenum TEXTURE0 = 0x84C0; + constexpr GLenum TEXTURE1 = 0x84C1; + constexpr GLenum TEXTURE2 = 0x84C2; + constexpr GLenum TEXTURE3 = 0x84C3; + constexpr GLenum TEXTURE4 = 0x84C4; + constexpr GLenum TEXTURE5 = 0x84C5; + constexpr GLenum TEXTURE6 = 0x84C6; + constexpr GLenum TEXTURE7 = 0x84C7; + constexpr GLenum TEXTURE8 = 0x84C8; + constexpr GLenum TEXTURE9 = 0x84C9; + constexpr GLenum TEXTURE10 = 0x84CA; + constexpr GLenum TEXTURE11 = 0x84CB; + constexpr GLenum TEXTURE12 = 0x84CC; + constexpr GLenum TEXTURE13 = 0x84CD; + constexpr GLenum TEXTURE14 = 0x84CE; + constexpr GLenum TEXTURE15 = 0x84CF; + constexpr GLenum TEXTURE16 = 0x84D0; + constexpr GLenum TEXTURE17 = 0x84D1; + constexpr GLenum TEXTURE18 = 0x84D2; + constexpr GLenum TEXTURE19 = 0x84D3; + constexpr GLenum TEXTURE20 = 0x84D4; + constexpr GLenum TEXTURE21 = 0x84D5; + constexpr GLenum TEXTURE22 = 0x84D6; + constexpr GLenum TEXTURE23 = 0x84D7; + constexpr GLenum TEXTURE24 = 0x84D8; + constexpr GLenum TEXTURE25 = 0x84D9; + constexpr GLenum TEXTURE26 = 0x84DA; + constexpr GLenum TEXTURE27 = 0x84DB; + constexpr GLenum TEXTURE28 = 0x84DC; + constexpr GLenum TEXTURE29 = 0x84DD; + constexpr GLenum TEXTURE30 = 0x84DE; + constexpr GLenum TEXTURE31 = 0x84DF; + constexpr GLenum ACTIVE_TEXTURE = 0x84E0; + constexpr GLenum REPEAT = 0x2901; + constexpr GLenum CLAMP_TO_EDGE = 0x812F; + constexpr GLenum MIRRORED_REPEAT = 0x8370; + constexpr GLenum FLOAT_VEC2 = 0x8B50; + constexpr GLenum FLOAT_VEC3 = 0x8B51; + constexpr GLenum FLOAT_VEC4 = 0x8B52; + constexpr GLenum INT_VEC2 = 0x8B53; + constexpr GLenum INT_VEC3 = 0x8B54; + constexpr GLenum INT_VEC4 = 0x8B55; + constexpr GLenum BOOL = 0x8B56; + constexpr GLenum BOOL_VEC2 = 0x8B57; + constexpr GLenum BOOL_VEC3 = 0x8B58; + constexpr GLenum BOOL_VEC4 = 0x8B59; + constexpr GLenum FLOAT_MAT2 = 0x8B5A; + constexpr GLenum FLOAT_MAT3 = 0x8B5B; + constexpr GLenum FLOAT_MAT4 = 0x8B5C; + constexpr GLenum SAMPLER_2D = 0x8B5E; + constexpr GLenum SAMPLER_CUBE = 0x8B60; + constexpr GLenum VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622; + constexpr GLenum VERTEX_ATTRIB_ARRAY_SIZE = 0x8623; + constexpr GLenum VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624; + constexpr GLenum VERTEX_ATTRIB_ARRAY_TYPE = 0x8625; + constexpr GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A; + constexpr GLenum VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + constexpr GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + constexpr GLenum IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A; + constexpr GLenum IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + constexpr GLenum COMPILE_STATUS = 0x8B81; + constexpr GLenum INFO_LOG_LENGTH = 0x8B84; + constexpr GLenum SHADER_SOURCE_LENGTH = 0x8B88; + constexpr GLenum SHADER_COMPILER = 0x8DFA; + constexpr GLenum SHADER_BINARY_FORMATS = 0x8DF8; + constexpr GLenum NUM_SHADER_BINARY_FORMATS = 0x8DF9; + constexpr GLenum LOW_FLOAT = 0x8DF0; + constexpr GLenum MEDIUM_FLOAT = 0x8DF1; + constexpr GLenum HIGH_FLOAT = 0x8DF2; + constexpr GLenum LOW_INT = 0x8DF3; + constexpr GLenum MEDIUM_INT = 0x8DF4; + constexpr GLenum HIGH_INT = 0x8DF5; + constexpr GLenum FRAMEBUFFER = 0x8D40; + constexpr GLenum RENDERBUFFER = 0x8D41; + constexpr GLenum RGBA4 = 0x8056; + constexpr GLenum RGB5_A1 = 0x8057; + constexpr GLenum RGB565 = 0x8D62; + constexpr GLenum DEPTH_COMPONENT16 = 0x81A5; + constexpr GLenum STENCIL_INDEX8 = 0x8D48; + constexpr GLenum RENDERBUFFER_WIDTH = 0x8D42; + constexpr GLenum RENDERBUFFER_HEIGHT = 0x8D43; + constexpr GLenum RENDERBUFFER_INTERNAL_FORMAT = 0x8D44; + constexpr GLenum RENDERBUFFER_RED_SIZE = 0x8D50; + constexpr GLenum RENDERBUFFER_GREEN_SIZE = 0x8D51; + constexpr GLenum RENDERBUFFER_BLUE_SIZE = 0x8D52; + constexpr GLenum RENDERBUFFER_ALPHA_SIZE = 0x8D53; + constexpr GLenum RENDERBUFFER_DEPTH_SIZE = 0x8D54; + constexpr GLenum RENDERBUFFER_STENCIL_SIZE = 0x8D55; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3; + constexpr GLenum COLOR_ATTACHMENT0 = 0x8CE0; + constexpr GLenum DEPTH_ATTACHMENT = 0x8D00; + constexpr GLenum STENCIL_ATTACHMENT = 0x8D20; + constexpr GLenum NONE = 0; + constexpr GLenum FRAMEBUFFER_COMPLETE = 0x8CD5; + constexpr GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6; + constexpr GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7; + constexpr GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9; + constexpr GLenum FRAMEBUFFER_UNSUPPORTED = 0x8CDD; + constexpr GLenum FRAMEBUFFER_BINDING = 0x8CA6; + constexpr GLenum RENDERBUFFER_BINDING = 0x8CA7; + constexpr GLenum MAX_RENDERBUFFER_SIZE = 0x84E8; + constexpr GLenum INVALID_FRAMEBUFFER_OPERATION = 0x0506; + + inline void ActiveTexture(GLenum texture){ return internal::glActiveTexture(texture); } + inline void AttachShader(GLuint program, GLuint shader){ return internal::glAttachShader(program, shader); } + inline void BindAttribLocation(GLuint program, GLuint index, const GLchar *name){ return internal::glBindAttribLocation(program, index, name); } + inline void BindBuffer(GLenum target, GLuint buffer){ return internal::glBindBuffer(target, buffer); } + inline void BindFramebuffer(GLenum target, GLuint framebuffer){ return internal::glBindFramebuffer(target, framebuffer); } + inline void BindRenderbuffer(GLenum target, GLuint renderbuffer){ return internal::glBindRenderbuffer(target, renderbuffer); } + inline void BindTexture(GLenum target, GLuint texture){ return internal::glBindTexture(target, texture); } + inline void BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){ return internal::glBlendColor(red, green, blue, alpha); } + inline void BlendEquation(GLenum mode){ return internal::glBlendEquation(mode); } + inline void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha){ return internal::glBlendEquationSeparate(modeRGB, modeAlpha); } + inline void BlendFunc(GLenum sfactor, GLenum dfactor){ return internal::glBlendFunc(sfactor, dfactor); } + inline void BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha){ return internal::glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } + inline void BufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage){ return internal::glBufferData(target, size, data, usage); } + inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data){ return internal::glBufferSubData(target, offset, size, data); } + inline GLenum CheckFramebufferStatus(GLenum target){ return internal::glCheckFramebufferStatus(target); } + inline void Clear(GLbitfield mask){ return internal::glClear(mask); } + inline void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){ return internal::glClearColor(red, green, blue, alpha); } + inline void ClearDepthf(GLfloat d){ return internal::glClearDepthf(d); } + inline void ClearStencil(GLint s){ return internal::glClearStencil(s); } + inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha){ return internal::glColorMask(red, green, blue, alpha); } + inline void CompileShader(GLuint shader){ return internal::glCompileShader(shader); } + inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data){ return internal::glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); } + inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data){ return internal::glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); } + inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border){ return internal::glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); } + inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height){ return internal::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } + inline GLuint CreateProgram(){ return internal::glCreateProgram(); } + inline GLuint CreateShader(GLenum type){ return internal::glCreateShader(type); } + inline void CullFace(GLenum mode){ return internal::glCullFace(mode); } + inline void DeleteBuffers(GLsizei n, const GLuint *buffers){ return internal::glDeleteBuffers(n, buffers); } + inline void DeleteFramebuffers(GLsizei n, const GLuint *framebuffers){ return internal::glDeleteFramebuffers(n, framebuffers); } + inline void DeleteProgram(GLuint program){ return internal::glDeleteProgram(program); } + inline void DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers){ return internal::glDeleteRenderbuffers(n, renderbuffers); } + inline void DeleteShader(GLuint shader){ return internal::glDeleteShader(shader); } + inline void DeleteTextures(GLsizei n, const GLuint *textures){ return internal::glDeleteTextures(n, textures); } + inline void DepthFunc(GLenum func){ return internal::glDepthFunc(func); } + inline void DepthMask(GLboolean flag){ return internal::glDepthMask(flag); } + inline void DepthRangef(GLfloat n, GLfloat f){ return internal::glDepthRangef(n, f); } + inline void DetachShader(GLuint program, GLuint shader){ return internal::glDetachShader(program, shader); } + inline void Disable(GLenum cap){ return internal::glDisable(cap); } + inline void DisableVertexAttribArray(GLuint index){ return internal::glDisableVertexAttribArray(index); } + inline void DrawArrays(GLenum mode, GLint first, GLsizei count){ return internal::glDrawArrays(mode, first, count); } + inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices){ return internal::glDrawElements(mode, count, type, indices); } + inline void Enable(GLenum cap){ return internal::glEnable(cap); } + inline void EnableVertexAttribArray(GLuint index){ return internal::glEnableVertexAttribArray(index); } + inline void Finish(){ return internal::glFinish(); } + inline void Flush(){ return internal::glFlush(); } + inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer){ return internal::glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); } + inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){ return internal::glFramebufferTexture2D(target, attachment, textarget, texture, level); } + inline void FrontFace(GLenum mode){ return internal::glFrontFace(mode); } + inline void GenBuffers(GLsizei n, GLuint *buffers){ return internal::glGenBuffers(n, buffers); } + inline void GenerateMipmap(GLenum target){ return internal::glGenerateMipmap(target); } + inline void GenFramebuffers(GLsizei n, GLuint *framebuffers){ return internal::glGenFramebuffers(n, framebuffers); } + inline void GenRenderbuffers(GLsizei n, GLuint *renderbuffers){ return internal::glGenRenderbuffers(n, renderbuffers); } + inline void GenTextures(GLsizei n, GLuint *textures){ return internal::glGenTextures(n, textures); } + inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name){ return internal::glGetActiveAttrib(program, index, bufSize, length, size, type, name); } + inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name){ return internal::glGetActiveUniform(program, index, bufSize, length, size, type, name); } + inline void GetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders){ return internal::glGetAttachedShaders(program, maxCount, count, shaders); } + inline GLint GetAttribLocation(GLuint program, const GLchar *name){ return internal::glGetAttribLocation(program, name); } + inline void GetBooleanv(GLenum pname, GLboolean *data){ return internal::glGetBooleanv(pname, data); } + inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint *params){ return internal::glGetBufferParameteriv(target, pname, params); } + inline GLenum GetError(){ return internal::glGetError(); } + inline void GetFloatv(GLenum pname, GLfloat *data){ return internal::glGetFloatv(pname, data); } + inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params){ return internal::glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); } + inline void GetIntegerv(GLenum pname, GLint *data){ return internal::glGetIntegerv(pname, data); } + inline void GetProgramiv(GLuint program, GLenum pname, GLint *params){ return internal::glGetProgramiv(program, pname, params); } + inline void GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog){ return internal::glGetProgramInfoLog(program, bufSize, length, infoLog); } + inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params){ return internal::glGetRenderbufferParameteriv(target, pname, params); } + inline void GetShaderiv(GLuint shader, GLenum pname, GLint *params){ return internal::glGetShaderiv(shader, pname, params); } + inline void GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog){ return internal::glGetShaderInfoLog(shader, bufSize, length, infoLog); } + inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision){ return internal::glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); } + inline void GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source){ return internal::glGetShaderSource(shader, bufSize, length, source); } + inline const GLubyte *GetString(GLenum name){ return internal::glGetString(name); } + inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params){ return internal::glGetTexParameterfv(target, pname, params); } + inline void GetTexParameteriv(GLenum target, GLenum pname, GLint *params){ return internal::glGetTexParameteriv(target, pname, params); } + inline void GetUniformfv(GLuint program, GLint location, GLfloat *params){ return internal::glGetUniformfv(program, location, params); } + inline void GetUniformiv(GLuint program, GLint location, GLint *params){ return internal::glGetUniformiv(program, location, params); } + inline GLint GetUniformLocation(GLuint program, const GLchar *name){ return internal::glGetUniformLocation(program, name); } + inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params){ return internal::glGetVertexAttribfv(index, pname, params); } + inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint *params){ return internal::glGetVertexAttribiv(index, pname, params); } + inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void **pointer){ return internal::glGetVertexAttribPointerv(index, pname, pointer); } + inline void Hint(GLenum target, GLenum mode){ return internal::glHint(target, mode); } + inline GLboolean IsBuffer(GLuint buffer){ return internal::glIsBuffer(buffer); } + inline GLboolean IsEnabled(GLenum cap){ return internal::glIsEnabled(cap); } + inline GLboolean IsFramebuffer(GLuint framebuffer){ return internal::glIsFramebuffer(framebuffer); } + inline GLboolean IsProgram(GLuint program){ return internal::glIsProgram(program); } + inline GLboolean IsRenderbuffer(GLuint renderbuffer){ return internal::glIsRenderbuffer(renderbuffer); } + inline GLboolean IsShader(GLuint shader){ return internal::glIsShader(shader); } + inline GLboolean IsTexture(GLuint texture){ return internal::glIsTexture(texture); } + inline void LineWidth(GLfloat width){ return internal::glLineWidth(width); } + inline void LinkProgram(GLuint program){ return internal::glLinkProgram(program); } + inline void PixelStorei(GLenum pname, GLint param){ return internal::glPixelStorei(pname, param); } + inline void PolygonOffset(GLfloat factor, GLfloat units){ return internal::glPolygonOffset(factor, units); } + inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels){ return internal::glReadPixels(x, y, width, height, format, type, pixels); } + inline void ReleaseShaderCompiler(){ return internal::glReleaseShaderCompiler(); } + inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){ return internal::glRenderbufferStorage(target, internalformat, width, height); } + inline void SampleCoverage(GLfloat value, GLboolean invert){ return internal::glSampleCoverage(value, invert); } + inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height){ return internal::glScissor(x, y, width, height); } + inline void ShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length){ return internal::glShaderBinary(count, shaders, binaryFormat, binary, length); } + inline void ShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length){ return internal::glShaderSource(shader, count, string, length); } + inline void StencilFunc(GLenum func, GLint ref, GLuint mask){ return internal::glStencilFunc(func, ref, mask); } + inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask){ return internal::glStencilFuncSeparate(face, func, ref, mask); } + inline void StencilMask(GLuint mask){ return internal::glStencilMask(mask); } + inline void StencilMaskSeparate(GLenum face, GLuint mask){ return internal::glStencilMaskSeparate(face, mask); } + inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass){ return internal::glStencilOp(fail, zfail, zpass); } + inline void StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass){ return internal::glStencilOpSeparate(face, sfail, dpfail, dppass); } + inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels){ return internal::glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } + inline void TexParameterf(GLenum target, GLenum pname, GLfloat param){ return internal::glTexParameterf(target, pname, param); } + inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat *params){ return internal::glTexParameterfv(target, pname, params); } + inline void TexParameteri(GLenum target, GLenum pname, GLint param){ return internal::glTexParameteri(target, pname, param); } + inline void TexParameteriv(GLenum target, GLenum pname, const GLint *params){ return internal::glTexParameteriv(target, pname, params); } + inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels){ return internal::glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } + inline void Uniform1f(GLint location, GLfloat v0){ return internal::glUniform1f(location, v0); } + inline void Uniform1fv(GLint location, GLsizei count, const GLfloat *value){ return internal::glUniform1fv(location, count, value); } + inline void Uniform1i(GLint location, GLint v0){ return internal::glUniform1i(location, v0); } + inline void Uniform1iv(GLint location, GLsizei count, const GLint *value){ return internal::glUniform1iv(location, count, value); } + inline void Uniform2f(GLint location, GLfloat v0, GLfloat v1){ return internal::glUniform2f(location, v0, v1); } + inline void Uniform2fv(GLint location, GLsizei count, const GLfloat *value){ return internal::glUniform2fv(location, count, value); } + inline void Uniform2i(GLint location, GLint v0, GLint v1){ return internal::glUniform2i(location, v0, v1); } + inline void Uniform2iv(GLint location, GLsizei count, const GLint *value){ return internal::glUniform2iv(location, count, value); } + inline void Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2){ return internal::glUniform3f(location, v0, v1, v2); } + inline void Uniform3fv(GLint location, GLsizei count, const GLfloat *value){ return internal::glUniform3fv(location, count, value); } + inline void Uniform3i(GLint location, GLint v0, GLint v1, GLint v2){ return internal::glUniform3i(location, v0, v1, v2); } + inline void Uniform3iv(GLint location, GLsizei count, const GLint *value){ return internal::glUniform3iv(location, count, value); } + inline void Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3){ return internal::glUniform4f(location, v0, v1, v2, v3); } + inline void Uniform4fv(GLint location, GLsizei count, const GLfloat *value){ return internal::glUniform4fv(location, count, value); } + inline void Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3){ return internal::glUniform4i(location, v0, v1, v2, v3); } + inline void Uniform4iv(GLint location, GLsizei count, const GLint *value){ return internal::glUniform4iv(location, count, value); } + inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix2fv(location, count, transpose, value); } + inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix3fv(location, count, transpose, value); } + inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix4fv(location, count, transpose, value); } + inline void UseProgram(GLuint program){ return internal::glUseProgram(program); } + inline void ValidateProgram(GLuint program){ return internal::glValidateProgram(program); } + inline void VertexAttrib1f(GLuint index, GLfloat x){ return internal::glVertexAttrib1f(index, x); } + inline void VertexAttrib1fv(GLuint index, const GLfloat *v){ return internal::glVertexAttrib1fv(index, v); } + inline void VertexAttrib2f(GLuint index, GLfloat x, GLfloat y){ return internal::glVertexAttrib2f(index, x, y); } + inline void VertexAttrib2fv(GLuint index, const GLfloat *v){ return internal::glVertexAttrib2fv(index, v); } + inline void VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z){ return internal::glVertexAttrib3f(index, x, y, z); } + inline void VertexAttrib3fv(GLuint index, const GLfloat *v){ return internal::glVertexAttrib3fv(index, v); } + inline void VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w){ return internal::glVertexAttrib4f(index, x, y, z, w); } + inline void VertexAttrib4fv(GLuint index, const GLfloat *v){ return internal::glVertexAttrib4fv(index, v); } + inline void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer){ return internal::glVertexAttribPointer(index, size, type, normalized, stride, pointer); } + inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height){ return internal::glViewport(x, y, width, height); } + + // OpenGL ES 3.0 + + constexpr GLenum READ_BUFFER = 0x0C02; + constexpr GLenum UNPACK_ROW_LENGTH = 0x0CF2; + constexpr GLenum UNPACK_SKIP_ROWS = 0x0CF3; + constexpr GLenum UNPACK_SKIP_PIXELS = 0x0CF4; + constexpr GLenum PACK_ROW_LENGTH = 0x0D02; + constexpr GLenum PACK_SKIP_ROWS = 0x0D03; + constexpr GLenum PACK_SKIP_PIXELS = 0x0D04; + constexpr GLenum COLOR = 0x1800; + constexpr GLenum DEPTH = 0x1801; + constexpr GLenum STENCIL = 0x1802; + constexpr GLenum RED = 0x1903; + constexpr GLenum RGB8 = 0x8051; + constexpr GLenum RGBA8 = 0x8058; + constexpr GLenum RGB10_A2 = 0x8059; + constexpr GLenum TEXTURE_BINDING_3D = 0x806A; + constexpr GLenum UNPACK_SKIP_IMAGES = 0x806D; + constexpr GLenum UNPACK_IMAGE_HEIGHT = 0x806E; + constexpr GLenum TEXTURE_3D = 0x806F; + constexpr GLenum TEXTURE_WRAP_R = 0x8072; + constexpr GLenum MAX_3D_TEXTURE_SIZE = 0x8073; + constexpr GLenum UNSIGNED_INT_2_10_10_10_REV = 0x8368; + constexpr GLenum MAX_ELEMENTS_VERTICES = 0x80E8; + constexpr GLenum MAX_ELEMENTS_INDICES = 0x80E9; + constexpr GLenum TEXTURE_MIN_LOD = 0x813A; + constexpr GLenum TEXTURE_MAX_LOD = 0x813B; + constexpr GLenum TEXTURE_BASE_LEVEL = 0x813C; + constexpr GLenum TEXTURE_MAX_LEVEL = 0x813D; + constexpr GLenum MIN = 0x8007; + constexpr GLenum MAX = 0x8008; + constexpr GLenum DEPTH_COMPONENT24 = 0x81A6; + constexpr GLenum MAX_TEXTURE_LOD_BIAS = 0x84FD; + constexpr GLenum TEXTURE_COMPARE_MODE = 0x884C; + constexpr GLenum TEXTURE_COMPARE_FUNC = 0x884D; + constexpr GLenum CURRENT_QUERY = 0x8865; + constexpr GLenum QUERY_RESULT = 0x8866; + constexpr GLenum QUERY_RESULT_AVAILABLE = 0x8867; + constexpr GLenum BUFFER_MAPPED = 0x88BC; + constexpr GLenum BUFFER_MAP_POINTER = 0x88BD; + constexpr GLenum STREAM_READ = 0x88E1; + constexpr GLenum STREAM_COPY = 0x88E2; + constexpr GLenum STATIC_READ = 0x88E5; + constexpr GLenum STATIC_COPY = 0x88E6; + constexpr GLenum DYNAMIC_READ = 0x88E9; + constexpr GLenum DYNAMIC_COPY = 0x88EA; + constexpr GLenum MAX_DRAW_BUFFERS = 0x8824; + constexpr GLenum DRAW_BUFFER0 = 0x8825; + constexpr GLenum DRAW_BUFFER1 = 0x8826; + constexpr GLenum DRAW_BUFFER2 = 0x8827; + constexpr GLenum DRAW_BUFFER3 = 0x8828; + constexpr GLenum DRAW_BUFFER4 = 0x8829; + constexpr GLenum DRAW_BUFFER5 = 0x882A; + constexpr GLenum DRAW_BUFFER6 = 0x882B; + constexpr GLenum DRAW_BUFFER7 = 0x882C; + constexpr GLenum DRAW_BUFFER8 = 0x882D; + constexpr GLenum DRAW_BUFFER9 = 0x882E; + constexpr GLenum DRAW_BUFFER10 = 0x882F; + constexpr GLenum DRAW_BUFFER11 = 0x8830; + constexpr GLenum DRAW_BUFFER12 = 0x8831; + constexpr GLenum DRAW_BUFFER13 = 0x8832; + constexpr GLenum DRAW_BUFFER14 = 0x8833; + constexpr GLenum DRAW_BUFFER15 = 0x8834; + constexpr GLenum MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + constexpr GLenum MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A; + constexpr GLenum SAMPLER_3D = 0x8B5F; + constexpr GLenum SAMPLER_2D_SHADOW = 0x8B62; + constexpr GLenum FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + constexpr GLenum PIXEL_PACK_BUFFER = 0x88EB; + constexpr GLenum PIXEL_UNPACK_BUFFER = 0x88EC; + constexpr GLenum PIXEL_PACK_BUFFER_BINDING = 0x88ED; + constexpr GLenum PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + constexpr GLenum FLOAT_MAT2x3 = 0x8B65; + constexpr GLenum FLOAT_MAT2x4 = 0x8B66; + constexpr GLenum FLOAT_MAT3x2 = 0x8B67; + constexpr GLenum FLOAT_MAT3x4 = 0x8B68; + constexpr GLenum FLOAT_MAT4x2 = 0x8B69; + constexpr GLenum FLOAT_MAT4x3 = 0x8B6A; + constexpr GLenum SRGB = 0x8C40; + constexpr GLenum SRGB8 = 0x8C41; + constexpr GLenum SRGB8_ALPHA8 = 0x8C43; + constexpr GLenum COMPARE_REF_TO_TEXTURE = 0x884E; + constexpr GLenum MAJOR_VERSION = 0x821B; + constexpr GLenum MINOR_VERSION = 0x821C; + constexpr GLenum NUM_EXTENSIONS = 0x821D; + constexpr GLenum RGBA32F = 0x8814; + constexpr GLenum RGB32F = 0x8815; + constexpr GLenum RGBA16F = 0x881A; + constexpr GLenum RGB16F = 0x881B; + constexpr GLenum VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + constexpr GLenum MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + constexpr GLenum MIN_PROGRAM_TEXEL_OFFSET = 0x8904; + constexpr GLenum MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + constexpr GLenum MAX_VARYING_COMPONENTS = 0x8B4B; + constexpr GLenum TEXTURE_2D_ARRAY = 0x8C1A; + constexpr GLenum TEXTURE_BINDING_2D_ARRAY = 0x8C1D; + constexpr GLenum R11F_G11F_B10F = 0x8C3A; + constexpr GLenum UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + constexpr GLenum RGB9_E5 = 0x8C3D; + constexpr GLenum UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + constexpr GLenum TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F; + constexpr GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + constexpr GLenum TRANSFORM_FEEDBACK_VARYINGS = 0x8C83; + constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84; + constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + constexpr GLenum TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + constexpr GLenum RASTERIZER_DISCARD = 0x8C89; + constexpr GLenum MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A; + constexpr GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B; + constexpr GLenum INTERLEAVED_ATTRIBS = 0x8C8C; + constexpr GLenum SEPARATE_ATTRIBS = 0x8C8D; + constexpr GLenum TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + constexpr GLenum RGBA32UI = 0x8D70; + constexpr GLenum RGB32UI = 0x8D71; + constexpr GLenum RGBA16UI = 0x8D76; + constexpr GLenum RGB16UI = 0x8D77; + constexpr GLenum RGBA8UI = 0x8D7C; + constexpr GLenum RGB8UI = 0x8D7D; + constexpr GLenum RGBA32I = 0x8D82; + constexpr GLenum RGB32I = 0x8D83; + constexpr GLenum RGBA16I = 0x8D88; + constexpr GLenum RGB16I = 0x8D89; + constexpr GLenum RGBA8I = 0x8D8E; + constexpr GLenum RGB8I = 0x8D8F; + constexpr GLenum RED_INTEGER = 0x8D94; + constexpr GLenum RGB_INTEGER = 0x8D98; + constexpr GLenum RGBA_INTEGER = 0x8D99; + constexpr GLenum SAMPLER_2D_ARRAY = 0x8DC1; + constexpr GLenum SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; + constexpr GLenum SAMPLER_CUBE_SHADOW = 0x8DC5; + constexpr GLenum UNSIGNED_INT_VEC2 = 0x8DC6; + constexpr GLenum UNSIGNED_INT_VEC3 = 0x8DC7; + constexpr GLenum UNSIGNED_INT_VEC4 = 0x8DC8; + constexpr GLenum INT_SAMPLER_2D = 0x8DCA; + constexpr GLenum INT_SAMPLER_3D = 0x8DCB; + constexpr GLenum INT_SAMPLER_CUBE = 0x8DCC; + constexpr GLenum INT_SAMPLER_2D_ARRAY = 0x8DCF; + constexpr GLenum UNSIGNED_INT_SAMPLER_2D = 0x8DD2; + constexpr GLenum UNSIGNED_INT_SAMPLER_3D = 0x8DD3; + constexpr GLenum UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4; + constexpr GLenum UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + constexpr GLenum BUFFER_ACCESS_FLAGS = 0x911F; + constexpr GLenum BUFFER_MAP_LENGTH = 0x9120; + constexpr GLenum BUFFER_MAP_OFFSET = 0x9121; + constexpr GLenum DEPTH_COMPONENT32F = 0x8CAC; + constexpr GLenum DEPTH32F_STENCIL8 = 0x8CAD; + constexpr GLenum FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + constexpr GLenum FRAMEBUFFER_DEFAULT = 0x8218; + constexpr GLenum FRAMEBUFFER_UNDEFINED = 0x8219; + constexpr GLenum DEPTH_STENCIL_ATTACHMENT = 0x821A; + constexpr GLenum DEPTH_STENCIL = 0x84F9; + constexpr GLenum UNSIGNED_INT_24_8 = 0x84FA; + constexpr GLenum DEPTH24_STENCIL8 = 0x88F0; + constexpr GLenum UNSIGNED_NORMALIZED = 0x8C17; + constexpr GLenum DRAW_FRAMEBUFFER_BINDING = 0x8CA6; + constexpr GLenum READ_FRAMEBUFFER = 0x8CA8; + constexpr GLenum DRAW_FRAMEBUFFER = 0x8CA9; + constexpr GLenum READ_FRAMEBUFFER_BINDING = 0x8CAA; + constexpr GLenum RENDERBUFFER_SAMPLES = 0x8CAB; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + constexpr GLenum MAX_COLOR_ATTACHMENTS = 0x8CDF; + constexpr GLenum COLOR_ATTACHMENT1 = 0x8CE1; + constexpr GLenum COLOR_ATTACHMENT2 = 0x8CE2; + constexpr GLenum COLOR_ATTACHMENT3 = 0x8CE3; + constexpr GLenum COLOR_ATTACHMENT4 = 0x8CE4; + constexpr GLenum COLOR_ATTACHMENT5 = 0x8CE5; + constexpr GLenum COLOR_ATTACHMENT6 = 0x8CE6; + constexpr GLenum COLOR_ATTACHMENT7 = 0x8CE7; + constexpr GLenum COLOR_ATTACHMENT8 = 0x8CE8; + constexpr GLenum COLOR_ATTACHMENT9 = 0x8CE9; + constexpr GLenum COLOR_ATTACHMENT10 = 0x8CEA; + constexpr GLenum COLOR_ATTACHMENT11 = 0x8CEB; + constexpr GLenum COLOR_ATTACHMENT12 = 0x8CEC; + constexpr GLenum COLOR_ATTACHMENT13 = 0x8CED; + constexpr GLenum COLOR_ATTACHMENT14 = 0x8CEE; + constexpr GLenum COLOR_ATTACHMENT15 = 0x8CEF; + constexpr GLenum COLOR_ATTACHMENT16 = 0x8CF0; + constexpr GLenum COLOR_ATTACHMENT17 = 0x8CF1; + constexpr GLenum COLOR_ATTACHMENT18 = 0x8CF2; + constexpr GLenum COLOR_ATTACHMENT19 = 0x8CF3; + constexpr GLenum COLOR_ATTACHMENT20 = 0x8CF4; + constexpr GLenum COLOR_ATTACHMENT21 = 0x8CF5; + constexpr GLenum COLOR_ATTACHMENT22 = 0x8CF6; + constexpr GLenum COLOR_ATTACHMENT23 = 0x8CF7; + constexpr GLenum COLOR_ATTACHMENT24 = 0x8CF8; + constexpr GLenum COLOR_ATTACHMENT25 = 0x8CF9; + constexpr GLenum COLOR_ATTACHMENT26 = 0x8CFA; + constexpr GLenum COLOR_ATTACHMENT27 = 0x8CFB; + constexpr GLenum COLOR_ATTACHMENT28 = 0x8CFC; + constexpr GLenum COLOR_ATTACHMENT29 = 0x8CFD; + constexpr GLenum COLOR_ATTACHMENT30 = 0x8CFE; + constexpr GLenum COLOR_ATTACHMENT31 = 0x8CFF; + constexpr GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; + constexpr GLenum MAX_SAMPLES = 0x8D57; + constexpr GLenum HALF_FLOAT = 0x140B; + constexpr GLenum MAP_READ_BIT = 0x0001; + constexpr GLenum MAP_WRITE_BIT = 0x0002; + constexpr GLenum MAP_INVALIDATE_RANGE_BIT = 0x0004; + constexpr GLenum MAP_INVALIDATE_BUFFER_BIT = 0x0008; + constexpr GLenum MAP_FLUSH_EXPLICIT_BIT = 0x0010; + constexpr GLenum MAP_UNSYNCHRONIZED_BIT = 0x0020; + constexpr GLenum RG = 0x8227; + constexpr GLenum RG_INTEGER = 0x8228; + constexpr GLenum R8 = 0x8229; + constexpr GLenum RG8 = 0x822B; + constexpr GLenum R16F = 0x822D; + constexpr GLenum R32F = 0x822E; + constexpr GLenum RG16F = 0x822F; + constexpr GLenum RG32F = 0x8230; + constexpr GLenum R8I = 0x8231; + constexpr GLenum R8UI = 0x8232; + constexpr GLenum R16I = 0x8233; + constexpr GLenum R16UI = 0x8234; + constexpr GLenum R32I = 0x8235; + constexpr GLenum R32UI = 0x8236; + constexpr GLenum RG8I = 0x8237; + constexpr GLenum RG8UI = 0x8238; + constexpr GLenum RG16I = 0x8239; + constexpr GLenum RG16UI = 0x823A; + constexpr GLenum RG32I = 0x823B; + constexpr GLenum RG32UI = 0x823C; + constexpr GLenum VERTEX_ARRAY_BINDING = 0x85B5; + constexpr GLenum R8_SNORM = 0x8F94; + constexpr GLenum RG8_SNORM = 0x8F95; + constexpr GLenum RGB8_SNORM = 0x8F96; + constexpr GLenum RGBA8_SNORM = 0x8F97; + constexpr GLenum SIGNED_NORMALIZED = 0x8F9C; + constexpr GLenum PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + constexpr GLenum COPY_READ_BUFFER = 0x8F36; + constexpr GLenum COPY_WRITE_BUFFER = 0x8F37; + constexpr GLenum COPY_READ_BUFFER_BINDING = 0x8F36; + constexpr GLenum COPY_WRITE_BUFFER_BINDING = 0x8F37; + constexpr GLenum UNIFORM_BUFFER = 0x8A11; + constexpr GLenum UNIFORM_BUFFER_BINDING = 0x8A28; + constexpr GLenum UNIFORM_BUFFER_START = 0x8A29; + constexpr GLenum UNIFORM_BUFFER_SIZE = 0x8A2A; + constexpr GLenum MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; + constexpr GLenum MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; + constexpr GLenum MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; + constexpr GLenum MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; + constexpr GLenum MAX_UNIFORM_BLOCK_SIZE = 0x8A30; + constexpr GLenum MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; + constexpr GLenum MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; + constexpr GLenum UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + constexpr GLenum ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35; + constexpr GLenum ACTIVE_UNIFORM_BLOCKS = 0x8A36; + constexpr GLenum UNIFORM_TYPE = 0x8A37; + constexpr GLenum UNIFORM_SIZE = 0x8A38; + constexpr GLenum UNIFORM_NAME_LENGTH = 0x8A39; + constexpr GLenum UNIFORM_BLOCK_INDEX = 0x8A3A; + constexpr GLenum UNIFORM_OFFSET = 0x8A3B; + constexpr GLenum UNIFORM_ARRAY_STRIDE = 0x8A3C; + constexpr GLenum UNIFORM_MATRIX_STRIDE = 0x8A3D; + constexpr GLenum UNIFORM_IS_ROW_MAJOR = 0x8A3E; + constexpr GLenum UNIFORM_BLOCK_BINDING = 0x8A3F; + constexpr GLenum UNIFORM_BLOCK_DATA_SIZE = 0x8A40; + constexpr GLenum UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; + constexpr GLenum UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; + constexpr GLenum UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; + constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; + constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + constexpr unsigned INVALID_INDEX = 0xFFFFFFFF; + constexpr GLenum MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122; + constexpr GLenum MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + constexpr GLenum MAX_SERVER_WAIT_TIMEOUT = 0x9111; + constexpr GLenum OBJECT_TYPE = 0x9112; + constexpr GLenum SYNC_CONDITION = 0x9113; + constexpr GLenum SYNC_STATUS = 0x9114; + constexpr GLenum SYNC_FLAGS = 0x9115; + constexpr GLenum SYNC_FENCE = 0x9116; + constexpr GLenum SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + constexpr GLenum UNSIGNALED = 0x9118; + constexpr GLenum SIGNALED = 0x9119; + constexpr GLenum ALREADY_SIGNALED = 0x911A; + constexpr GLenum TIMEOUT_EXPIRED = 0x911B; + constexpr GLenum CONDITION_SATISFIED = 0x911C; + constexpr GLenum WAIT_FAILED = 0x911D; + constexpr GLenum SYNC_FLUSH_COMMANDS_BIT = 0x00000001; + constexpr unsigned long long TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFF; + constexpr GLenum VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + constexpr GLenum ANY_SAMPLES_PASSED = 0x8C2F; + constexpr GLenum ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + constexpr GLenum SAMPLER_BINDING = 0x8919; + constexpr GLenum RGB10_A2UI = 0x906F; + constexpr GLenum TEXTURE_SWIZZLE_R = 0x8E42; + constexpr GLenum TEXTURE_SWIZZLE_G = 0x8E43; + constexpr GLenum TEXTURE_SWIZZLE_B = 0x8E44; + constexpr GLenum TEXTURE_SWIZZLE_A = 0x8E45; + constexpr GLenum GREEN = 0x1904; + constexpr GLenum BLUE = 0x1905; + constexpr GLenum INT_2_10_10_10_REV = 0x8D9F; + constexpr GLenum TRANSFORM_FEEDBACK = 0x8E22; + constexpr GLenum TRANSFORM_FEEDBACK_PAUSED = 0x8E23; + constexpr GLenum TRANSFORM_FEEDBACK_ACTIVE = 0x8E24; + constexpr GLenum TRANSFORM_FEEDBACK_BINDING = 0x8E25; + constexpr GLenum PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + constexpr GLenum PROGRAM_BINARY_LENGTH = 0x8741; + constexpr GLenum NUM_PROGRAM_BINARY_FORMATS = 0x87FE; + constexpr GLenum PROGRAM_BINARY_FORMATS = 0x87FF; + constexpr GLenum COMPRESSED_R11_EAC = 0x9270; + constexpr GLenum COMPRESSED_SIGNED_R11_EAC = 0x9271; + constexpr GLenum COMPRESSED_RG11_EAC = 0x9272; + constexpr GLenum COMPRESSED_SIGNED_RG11_EAC = 0x9273; + constexpr GLenum COMPRESSED_RGB8_ETC2 = 0x9274; + constexpr GLenum COMPRESSED_SRGB8_ETC2 = 0x9275; + constexpr GLenum COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276; + constexpr GLenum COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277; + constexpr GLenum COMPRESSED_RGBA8_ETC2_EAC = 0x9278; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279; + constexpr GLenum TEXTURE_IMMUTABLE_FORMAT = 0x912F; + constexpr GLenum MAX_ELEMENT_INDEX = 0x8D6B; + constexpr GLenum NUM_SAMPLE_COUNTS = 0x9380; + constexpr GLenum TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + inline void ReadBuffer(GLenum src){ return internal::glReadBuffer(src); } + inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices){ return internal::glDrawRangeElements(mode, start, end, count, type, indices); } + inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels){ return internal::glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); } + inline void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels){ return internal::glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } + inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height){ return internal::glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); } + inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data){ return internal::glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); } + inline void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data){ return internal::glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } + inline void GenQueries(GLsizei n, GLuint *ids){ return internal::glGenQueries(n, ids); } + inline void DeleteQueries(GLsizei n, const GLuint *ids){ return internal::glDeleteQueries(n, ids); } + inline GLboolean IsQuery(GLuint id){ return internal::glIsQuery(id); } + inline void BeginQuery(GLenum target, GLuint id){ return internal::glBeginQuery(target, id); } + inline void EndQuery(GLenum target){ return internal::glEndQuery(target); } + inline void GetQueryiv(GLenum target, GLenum pname, GLint *params){ return internal::glGetQueryiv(target, pname, params); } + inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params){ return internal::glGetQueryObjectuiv(id, pname, params); } + inline GLboolean UnmapBuffer(GLenum target){ return internal::glUnmapBuffer(target); } + inline void GetBufferPointerv(GLenum target, GLenum pname, void **params){ return internal::glGetBufferPointerv(target, pname, params); } + inline void DrawBuffers(GLsizei n, const GLenum *bufs){ return internal::glDrawBuffers(n, bufs); } + inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix2x3fv(location, count, transpose, value); } + inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix3x2fv(location, count, transpose, value); } + inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix2x4fv(location, count, transpose, value); } + inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix4x2fv(location, count, transpose, value); } + inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix3x4fv(location, count, transpose, value); } + inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glUniformMatrix4x3fv(location, count, transpose, value); } + inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter){ return internal::glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } + inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height){ return internal::glRenderbufferStorageMultisample(target, samples, internalformat, width, height); } + inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer){ return internal::glFramebufferTextureLayer(target, attachment, texture, level, layer); } + inline void *MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access){ return internal::glMapBufferRange(target, offset, length, access); } + inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length){ return internal::glFlushMappedBufferRange(target, offset, length); } + inline void BindVertexArray(GLuint array){ return internal::glBindVertexArray(array); } + inline void DeleteVertexArrays(GLsizei n, const GLuint *arrays){ return internal::glDeleteVertexArrays(n, arrays); } + inline void GenVertexArrays(GLsizei n, GLuint *arrays){ return internal::glGenVertexArrays(n, arrays); } + inline GLboolean IsVertexArray(GLuint array){ return internal::glIsVertexArray(array); } + inline void GetIntegeri_v(GLenum target, GLuint index, GLint *data){ return internal::glGetIntegeri_v(target, index, data); } + inline void BeginTransformFeedback(GLenum primitiveMode){ return internal::glBeginTransformFeedback(primitiveMode); } + inline void EndTransformFeedback(){ return internal::glEndTransformFeedback(); } + inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size){ return internal::glBindBufferRange(target, index, buffer, offset, size); } + inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer){ return internal::glBindBufferBase(target, index, buffer); } + inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode){ return internal::glTransformFeedbackVaryings(program, count, varyings, bufferMode); } + inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name){ return internal::glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name); } + inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer){ return internal::glVertexAttribIPointer(index, size, type, stride, pointer); } + inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params){ return internal::glGetVertexAttribIiv(index, pname, params); } + inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params){ return internal::glGetVertexAttribIuiv(index, pname, params); } + inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w){ return internal::glVertexAttribI4i(index, x, y, z, w); } + inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w){ return internal::glVertexAttribI4ui(index, x, y, z, w); } + inline void VertexAttribI4iv(GLuint index, const GLint *v){ return internal::glVertexAttribI4iv(index, v); } + inline void VertexAttribI4uiv(GLuint index, const GLuint *v){ return internal::glVertexAttribI4uiv(index, v); } + inline void GetUniformuiv(GLuint program, GLint location, GLuint *params){ return internal::glGetUniformuiv(program, location, params); } + inline GLint GetFragDataLocation(GLuint program, const GLchar *name){ return internal::glGetFragDataLocation(program, name); } + inline void Uniform1ui(GLint location, GLuint v0){ return internal::glUniform1ui(location, v0); } + inline void Uniform2ui(GLint location, GLuint v0, GLuint v1){ return internal::glUniform2ui(location, v0, v1); } + inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2){ return internal::glUniform3ui(location, v0, v1, v2); } + inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3){ return internal::glUniform4ui(location, v0, v1, v2, v3); } + inline void Uniform1uiv(GLint location, GLsizei count, const GLuint *value){ return internal::glUniform1uiv(location, count, value); } + inline void Uniform2uiv(GLint location, GLsizei count, const GLuint *value){ return internal::glUniform2uiv(location, count, value); } + inline void Uniform3uiv(GLint location, GLsizei count, const GLuint *value){ return internal::glUniform3uiv(location, count, value); } + inline void Uniform4uiv(GLint location, GLsizei count, const GLuint *value){ return internal::glUniform4uiv(location, count, value); } + inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value){ return internal::glClearBufferiv(buffer, drawbuffer, value); } + inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value){ return internal::glClearBufferuiv(buffer, drawbuffer, value); } + inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value){ return internal::glClearBufferfv(buffer, drawbuffer, value); } + inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil){ return internal::glClearBufferfi(buffer, drawbuffer, depth, stencil); } + inline const GLubyte *GetStringi(GLenum name, GLuint index){ return internal::glGetStringi(name, index); } + inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size){ return internal::glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); } + inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices){ return internal::glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices); } + inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params){ return internal::glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params); } + inline GLuint GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName){ return internal::glGetUniformBlockIndex(program, uniformBlockName); } + inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params){ return internal::glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); } + inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName){ return internal::glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); } + inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding){ return internal::glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); } + inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount){ return internal::glDrawArraysInstanced(mode, first, count, instancecount); } + inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount){ return internal::glDrawElementsInstanced(mode, count, type, indices, instancecount); } + inline GLsync FenceSync(GLenum condition, GLbitfield flags){ return internal::glFenceSync(condition, flags); } + inline GLboolean IsSync(GLsync sync){ return internal::glIsSync(sync); } + inline void DeleteSync(GLsync sync){ return internal::glDeleteSync(sync); } + inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout){ return internal::glClientWaitSync(sync, flags, timeout); } + inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout){ return internal::glWaitSync(sync, flags, timeout); } + inline void GetInteger64v(GLenum pname, GLint64 *data){ return internal::glGetInteger64v(pname, data); } + inline void GetSynciv(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values){ return internal::glGetSynciv(sync, pname, count, length, values); } + inline void GetInteger64i_v(GLenum target, GLuint index, GLint64 *data){ return internal::glGetInteger64i_v(target, index, data); } + inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params){ return internal::glGetBufferParameteri64v(target, pname, params); } + inline void GenSamplers(GLsizei count, GLuint *samplers){ return internal::glGenSamplers(count, samplers); } + inline void DeleteSamplers(GLsizei count, const GLuint *samplers){ return internal::glDeleteSamplers(count, samplers); } + inline GLboolean IsSampler(GLuint sampler){ return internal::glIsSampler(sampler); } + inline void BindSampler(GLuint unit, GLuint sampler){ return internal::glBindSampler(unit, sampler); } + inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param){ return internal::glSamplerParameteri(sampler, pname, param); } + inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param){ return internal::glSamplerParameteriv(sampler, pname, param); } + inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param){ return internal::glSamplerParameterf(sampler, pname, param); } + inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param){ return internal::glSamplerParameterfv(sampler, pname, param); } + inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params){ return internal::glGetSamplerParameteriv(sampler, pname, params); } + inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params){ return internal::glGetSamplerParameterfv(sampler, pname, params); } + inline void VertexAttribDivisor(GLuint index, GLuint divisor){ return internal::glVertexAttribDivisor(index, divisor); } + inline void BindTransformFeedback(GLenum target, GLuint id){ return internal::glBindTransformFeedback(target, id); } + inline void DeleteTransformFeedbacks(GLsizei n, const GLuint *ids){ return internal::glDeleteTransformFeedbacks(n, ids); } + inline void GenTransformFeedbacks(GLsizei n, GLuint *ids){ return internal::glGenTransformFeedbacks(n, ids); } + inline GLboolean IsTransformFeedback(GLuint id){ return internal::glIsTransformFeedback(id); } + inline void PauseTransformFeedback(){ return internal::glPauseTransformFeedback(); } + inline void ResumeTransformFeedback(){ return internal::glResumeTransformFeedback(); } + inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary){ return internal::glGetProgramBinary(program, bufSize, length, binaryFormat, binary); } + inline void ProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length){ return internal::glProgramBinary(program, binaryFormat, binary, length); } + inline void ProgramParameteri(GLuint program, GLenum pname, GLint value){ return internal::glProgramParameteri(program, pname, value); } + inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments){ return internal::glInvalidateFramebuffer(target, numAttachments, attachments); } + inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height){ return internal::glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height); } + inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height){ return internal::glTexStorage2D(target, levels, internalformat, width, height); } + inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth){ return internal::glTexStorage3D(target, levels, internalformat, width, height, depth); } + inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params){ return internal::glGetInternalformativ(target, internalformat, pname, count, params); } + + // OpenGL ES 3.1 + + constexpr GLenum COMPUTE_SHADER = 0x91B9; + constexpr GLenum MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB; + constexpr GLenum MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC; + constexpr GLenum MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD; + constexpr GLenum MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262; + constexpr GLenum MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263; + constexpr GLenum MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264; + constexpr GLenum MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265; + constexpr GLenum MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266; + constexpr GLenum MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + constexpr GLenum MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE; + constexpr GLenum MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + constexpr GLenum COMPUTE_WORK_GROUP_SIZE = 0x8267; + constexpr GLenum DISPATCH_INDIRECT_BUFFER = 0x90EE; + constexpr GLenum DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + constexpr GLenum COMPUTE_SHADER_BIT = 0x00000020; + constexpr GLenum DRAW_INDIRECT_BUFFER = 0x8F3F; + constexpr GLenum DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + constexpr GLenum MAX_UNIFORM_LOCATIONS = 0x826E; + constexpr GLenum FRAMEBUFFER_DEFAULT_WIDTH = 0x9310; + constexpr GLenum FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311; + constexpr GLenum FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313; + constexpr GLenum FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + constexpr GLenum MAX_FRAMEBUFFER_WIDTH = 0x9315; + constexpr GLenum MAX_FRAMEBUFFER_HEIGHT = 0x9316; + constexpr GLenum MAX_FRAMEBUFFER_SAMPLES = 0x9318; + constexpr GLenum UNIFORM = 0x92E1; + constexpr GLenum UNIFORM_BLOCK = 0x92E2; + constexpr GLenum PROGRAM_INPUT = 0x92E3; + constexpr GLenum PROGRAM_OUTPUT = 0x92E4; + constexpr GLenum BUFFER_VARIABLE = 0x92E5; + constexpr GLenum SHADER_STORAGE_BLOCK = 0x92E6; + constexpr GLenum ATOMIC_COUNTER_BUFFER = 0x92C0; + constexpr GLenum TRANSFORM_FEEDBACK_VARYING = 0x92F4; + constexpr GLenum ACTIVE_RESOURCES = 0x92F5; + constexpr GLenum MAX_NAME_LENGTH = 0x92F6; + constexpr GLenum MAX_NUM_ACTIVE_VARIABLES = 0x92F7; + constexpr GLenum NAME_LENGTH = 0x92F9; + constexpr GLenum TYPE = 0x92FA; + constexpr GLenum ARRAY_SIZE = 0x92FB; + constexpr GLenum OFFSET = 0x92FC; + constexpr GLenum BLOCK_INDEX = 0x92FD; + constexpr GLenum ARRAY_STRIDE = 0x92FE; + constexpr GLenum MATRIX_STRIDE = 0x92FF; + constexpr GLenum IS_ROW_MAJOR = 0x9300; + constexpr GLenum ATOMIC_COUNTER_BUFFER_INDEX = 0x9301; + constexpr GLenum BUFFER_BINDING = 0x9302; + constexpr GLenum BUFFER_DATA_SIZE = 0x9303; + constexpr GLenum NUM_ACTIVE_VARIABLES = 0x9304; + constexpr GLenum ACTIVE_VARIABLES = 0x9305; + constexpr GLenum REFERENCED_BY_VERTEX_SHADER = 0x9306; + constexpr GLenum REFERENCED_BY_FRAGMENT_SHADER = 0x930A; + constexpr GLenum REFERENCED_BY_COMPUTE_SHADER = 0x930B; + constexpr GLenum TOP_LEVEL_ARRAY_SIZE = 0x930C; + constexpr GLenum TOP_LEVEL_ARRAY_STRIDE = 0x930D; + constexpr GLenum LOCATION = 0x930E; + constexpr GLenum VERTEX_SHADER_BIT = 0x00000001; + constexpr GLenum FRAGMENT_SHADER_BIT = 0x00000002; + constexpr GLenum ALL_SHADER_BITS = 0xFFFFFFFF; + constexpr GLenum PROGRAM_SEPARABLE = 0x8258; + constexpr GLenum ACTIVE_PROGRAM = 0x8259; + constexpr GLenum PROGRAM_PIPELINE_BINDING = 0x825A; + constexpr GLenum ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + constexpr GLenum ATOMIC_COUNTER_BUFFER_START = 0x92C2; + constexpr GLenum ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + constexpr GLenum MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC; + constexpr GLenum MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0; + constexpr GLenum MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1; + constexpr GLenum MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2; + constexpr GLenum MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6; + constexpr GLenum MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7; + constexpr GLenum MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8; + constexpr GLenum MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + constexpr GLenum ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + constexpr GLenum UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + constexpr GLenum MAX_IMAGE_UNITS = 0x8F38; + constexpr GLenum MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA; + constexpr GLenum MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE; + constexpr GLenum MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + constexpr GLenum IMAGE_BINDING_NAME = 0x8F3A; + constexpr GLenum IMAGE_BINDING_LEVEL = 0x8F3B; + constexpr GLenum IMAGE_BINDING_LAYERED = 0x8F3C; + constexpr GLenum IMAGE_BINDING_LAYER = 0x8F3D; + constexpr GLenum IMAGE_BINDING_ACCESS = 0x8F3E; + constexpr GLenum IMAGE_BINDING_FORMAT = 0x906E; + constexpr GLenum VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x00000001; + constexpr GLenum ELEMENT_ARRAY_BARRIER_BIT = 0x00000002; + constexpr GLenum UNIFORM_BARRIER_BIT = 0x00000004; + constexpr GLenum TEXTURE_FETCH_BARRIER_BIT = 0x00000008; + constexpr GLenum SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x00000020; + constexpr GLenum COMMAND_BARRIER_BIT = 0x00000040; + constexpr GLenum PIXEL_BUFFER_BARRIER_BIT = 0x00000080; + constexpr GLenum TEXTURE_UPDATE_BARRIER_BIT = 0x00000100; + constexpr GLenum BUFFER_UPDATE_BARRIER_BIT = 0x00000200; + constexpr GLenum FRAMEBUFFER_BARRIER_BIT = 0x00000400; + constexpr GLenum TRANSFORM_FEEDBACK_BARRIER_BIT = 0x00000800; + constexpr GLenum ATOMIC_COUNTER_BARRIER_BIT = 0x00001000; + constexpr GLenum ALL_BARRIER_BITS = 0xFFFFFFFF; + constexpr GLenum IMAGE_2D = 0x904D; + constexpr GLenum IMAGE_3D = 0x904E; + constexpr GLenum IMAGE_CUBE = 0x9050; + constexpr GLenum IMAGE_2D_ARRAY = 0x9053; + constexpr GLenum INT_IMAGE_2D = 0x9058; + constexpr GLenum INT_IMAGE_3D = 0x9059; + constexpr GLenum INT_IMAGE_CUBE = 0x905B; + constexpr GLenum INT_IMAGE_2D_ARRAY = 0x905E; + constexpr GLenum UNSIGNED_INT_IMAGE_2D = 0x9063; + constexpr GLenum UNSIGNED_INT_IMAGE_3D = 0x9064; + constexpr GLenum UNSIGNED_INT_IMAGE_CUBE = 0x9066; + constexpr GLenum UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069; + constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8; + constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + constexpr GLenum READ_ONLY = 0x88B8; + constexpr GLenum WRITE_ONLY = 0x88B9; + constexpr GLenum READ_WRITE = 0x88BA; + constexpr GLenum SHADER_STORAGE_BUFFER = 0x90D2; + constexpr GLenum SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + constexpr GLenum SHADER_STORAGE_BUFFER_START = 0x90D4; + constexpr GLenum SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + constexpr GLenum MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6; + constexpr GLenum MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA; + constexpr GLenum MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB; + constexpr GLenum MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC; + constexpr GLenum MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD; + constexpr GLenum MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE; + constexpr GLenum SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + constexpr GLenum SHADER_STORAGE_BARRIER_BIT = 0x00002000; + constexpr GLenum MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + constexpr GLenum DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + constexpr GLenum STENCIL_INDEX = 0x1901; + constexpr GLenum MIN_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5E; + constexpr GLenum MAX_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5F; + constexpr GLenum SAMPLE_POSITION = 0x8E50; + constexpr GLenum SAMPLE_MASK = 0x8E51; + constexpr GLenum SAMPLE_MASK_VALUE = 0x8E52; + constexpr GLenum TEXTURE_2D_MULTISAMPLE = 0x9100; + constexpr GLenum MAX_SAMPLE_MASK_WORDS = 0x8E59; + constexpr GLenum MAX_COLOR_TEXTURE_SAMPLES = 0x910E; + constexpr GLenum MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; + constexpr GLenum MAX_INTEGER_SAMPLES = 0x9110; + constexpr GLenum TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104; + constexpr GLenum TEXTURE_SAMPLES = 0x9106; + constexpr GLenum TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + constexpr GLenum TEXTURE_WIDTH = 0x1000; + constexpr GLenum TEXTURE_HEIGHT = 0x1001; + constexpr GLenum TEXTURE_DEPTH = 0x8071; + constexpr GLenum TEXTURE_INTERNAL_FORMAT = 0x1003; + constexpr GLenum TEXTURE_RED_SIZE = 0x805C; + constexpr GLenum TEXTURE_GREEN_SIZE = 0x805D; + constexpr GLenum TEXTURE_BLUE_SIZE = 0x805E; + constexpr GLenum TEXTURE_ALPHA_SIZE = 0x805F; + constexpr GLenum TEXTURE_DEPTH_SIZE = 0x884A; + constexpr GLenum TEXTURE_STENCIL_SIZE = 0x88F1; + constexpr GLenum TEXTURE_SHARED_SIZE = 0x8C3F; + constexpr GLenum TEXTURE_RED_TYPE = 0x8C10; + constexpr GLenum TEXTURE_GREEN_TYPE = 0x8C11; + constexpr GLenum TEXTURE_BLUE_TYPE = 0x8C12; + constexpr GLenum TEXTURE_ALPHA_TYPE = 0x8C13; + constexpr GLenum TEXTURE_DEPTH_TYPE = 0x8C16; + constexpr GLenum TEXTURE_COMPRESSED = 0x86A1; + constexpr GLenum SAMPLER_2D_MULTISAMPLE = 0x9108; + constexpr GLenum INT_SAMPLER_2D_MULTISAMPLE = 0x9109; + constexpr GLenum UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A; + constexpr GLenum VERTEX_ATTRIB_BINDING = 0x82D4; + constexpr GLenum VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + constexpr GLenum VERTEX_BINDING_DIVISOR = 0x82D6; + constexpr GLenum VERTEX_BINDING_OFFSET = 0x82D7; + constexpr GLenum VERTEX_BINDING_STRIDE = 0x82D8; + constexpr GLenum VERTEX_BINDING_BUFFER = 0x8F4F; + constexpr GLenum MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9; + constexpr GLenum MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + constexpr GLenum MAX_VERTEX_ATTRIB_STRIDE = 0x82E5; + + inline void DispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z){ return internal::glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); } + inline void DispatchComputeIndirect(GLintptr indirect){ return internal::glDispatchComputeIndirect(indirect); } + inline void DrawArraysIndirect(GLenum mode, const void *indirect){ return internal::glDrawArraysIndirect(mode, indirect); } + inline void DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect){ return internal::glDrawElementsIndirect(mode, type, indirect); } + inline void FramebufferParameteri(GLenum target, GLenum pname, GLint param){ return internal::glFramebufferParameteri(target, pname, param); } + inline void GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params){ return internal::glGetFramebufferParameteriv(target, pname, params); } + inline void GetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params){ return internal::glGetProgramInterfaceiv(program, programInterface, pname, params); } + inline GLuint GetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name){ return internal::glGetProgramResourceIndex(program, programInterface, name); } + inline void GetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name){ return internal::glGetProgramResourceName(program, programInterface, index, bufSize, length, name); } + inline void GetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params){ return internal::glGetProgramResourceiv(program, programInterface, index, propCount, props, count, length, params); } + inline GLint GetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name){ return internal::glGetProgramResourceLocation(program, programInterface, name); } + inline void UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program){ return internal::glUseProgramStages(pipeline, stages, program); } + inline void ActiveShaderProgram(GLuint pipeline, GLuint program){ return internal::glActiveShaderProgram(pipeline, program); } + inline GLuint CreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const*strings){ return internal::glCreateShaderProgramv(type, count, strings); } + inline void BindProgramPipeline(GLuint pipeline){ return internal::glBindProgramPipeline(pipeline); } + inline void DeleteProgramPipelines(GLsizei n, const GLuint *pipelines){ return internal::glDeleteProgramPipelines(n, pipelines); } + inline void GenProgramPipelines(GLsizei n, GLuint *pipelines){ return internal::glGenProgramPipelines(n, pipelines); } + inline GLboolean IsProgramPipeline(GLuint pipeline){ return internal::glIsProgramPipeline(pipeline); } + inline void GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params){ return internal::glGetProgramPipelineiv(pipeline, pname, params); } + inline void ProgramUniform1i(GLuint program, GLint location, GLint v0){ return internal::glProgramUniform1i(program, location, v0); } + inline void ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1){ return internal::glProgramUniform2i(program, location, v0, v1); } + inline void ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2){ return internal::glProgramUniform3i(program, location, v0, v1, v2); } + inline void ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3){ return internal::glProgramUniform4i(program, location, v0, v1, v2, v3); } + inline void ProgramUniform1ui(GLuint program, GLint location, GLuint v0){ return internal::glProgramUniform1ui(program, location, v0); } + inline void ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1){ return internal::glProgramUniform2ui(program, location, v0, v1); } + inline void ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2){ return internal::glProgramUniform3ui(program, location, v0, v1, v2); } + inline void ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3){ return internal::glProgramUniform4ui(program, location, v0, v1, v2, v3); } + inline void ProgramUniform1f(GLuint program, GLint location, GLfloat v0){ return internal::glProgramUniform1f(program, location, v0); } + inline void ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1){ return internal::glProgramUniform2f(program, location, v0, v1); } + inline void ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2){ return internal::glProgramUniform3f(program, location, v0, v1, v2); } + inline void ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3){ return internal::glProgramUniform4f(program, location, v0, v1, v2, v3); } + inline void ProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value){ return internal::glProgramUniform1iv(program, location, count, value); } + inline void ProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value){ return internal::glProgramUniform2iv(program, location, count, value); } + inline void ProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value){ return internal::glProgramUniform3iv(program, location, count, value); } + inline void ProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value){ return internal::glProgramUniform4iv(program, location, count, value); } + inline void ProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value){ return internal::glProgramUniform1uiv(program, location, count, value); } + inline void ProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value){ return internal::glProgramUniform2uiv(program, location, count, value); } + inline void ProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value){ return internal::glProgramUniform3uiv(program, location, count, value); } + inline void ProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value){ return internal::glProgramUniform4uiv(program, location, count, value); } + inline void ProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value){ return internal::glProgramUniform1fv(program, location, count, value); } + inline void ProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value){ return internal::glProgramUniform2fv(program, location, count, value); } + inline void ProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value){ return internal::glProgramUniform3fv(program, location, count, value); } + inline void ProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value){ return internal::glProgramUniform4fv(program, location, count, value); } + inline void ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix2fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix3fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix4fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix2x3fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix3x2fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix2x4fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix4x2fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix3x4fv(program, location, count, transpose, value); } + inline void ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value){ return internal::glProgramUniformMatrix4x3fv(program, location, count, transpose, value); } + inline void ValidateProgramPipeline(GLuint pipeline){ return internal::glValidateProgramPipeline(pipeline); } + inline void GetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog){ return internal::glGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog); } + inline void BindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format){ return internal::glBindImageTexture(unit, texture, level, layered, layer, access, format); } + inline void GetBooleani_v(GLenum target, GLuint index, GLboolean *data){ return internal::glGetBooleani_v(target, index, data); } + inline void MemoryBarrier(GLbitfield barriers){ return internal::glMemoryBarrier(barriers); } + inline void MemoryBarrierByRegion(GLbitfield barriers){ return internal::glMemoryBarrierByRegion(barriers); } + inline void TexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations){ return internal::glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); } + inline void GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val){ return internal::glGetMultisamplefv(pname, index, val); } + inline void SampleMaski(GLuint maskNumber, GLbitfield mask){ return internal::glSampleMaski(maskNumber, mask); } + inline void GetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params){ return internal::glGetTexLevelParameteriv(target, level, pname, params); } + inline void GetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params){ return internal::glGetTexLevelParameterfv(target, level, pname, params); } + inline void BindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride){ return internal::glBindVertexBuffer(bindingindex, buffer, offset, stride); } + inline void VertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset){ return internal::glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); } + inline void VertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset){ return internal::glVertexAttribIFormat(attribindex, size, type, relativeoffset); } + inline void VertexAttribBinding(GLuint attribindex, GLuint bindingindex){ return internal::glVertexAttribBinding(attribindex, bindingindex); } + inline void VertexBindingDivisor(GLuint bindingindex, GLuint divisor){ return internal::glVertexBindingDivisor(bindingindex, divisor); } + + // OpenGL ES 3.2 + + constexpr GLenum MULTISAMPLE_LINE_WIDTH_RANGE = 0x9381; + constexpr GLenum MULTISAMPLE_LINE_WIDTH_GRANULARITY = 0x9382; + constexpr GLenum MULTIPLY = 0x9294; + constexpr GLenum SCREEN = 0x9295; + constexpr GLenum OVERLAY = 0x9296; + constexpr GLenum DARKEN = 0x9297; + constexpr GLenum LIGHTEN = 0x9298; + constexpr GLenum COLORDODGE = 0x9299; + constexpr GLenum COLORBURN = 0x929A; + constexpr GLenum HARDLIGHT = 0x929B; + constexpr GLenum SOFTLIGHT = 0x929C; + constexpr GLenum DIFFERENCE = 0x929E; + constexpr GLenum EXCLUSION = 0x92A0; + constexpr GLenum HSL_HUE = 0x92AD; + constexpr GLenum HSL_SATURATION = 0x92AE; + constexpr GLenum HSL_COLOR = 0x92AF; + constexpr GLenum HSL_LUMINOSITY = 0x92B0; + constexpr GLenum DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + constexpr GLenum DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243; + constexpr GLenum DEBUG_CALLBACK_FUNCTION = 0x8244; + constexpr GLenum DEBUG_CALLBACK_USER_PARAM = 0x8245; + constexpr GLenum DEBUG_SOURCE_API = 0x8246; + constexpr GLenum DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247; + constexpr GLenum DEBUG_SOURCE_SHADER_COMPILER = 0x8248; + constexpr GLenum DEBUG_SOURCE_THIRD_PARTY = 0x8249; + constexpr GLenum DEBUG_SOURCE_APPLICATION = 0x824A; + constexpr GLenum DEBUG_SOURCE_OTHER = 0x824B; + constexpr GLenum DEBUG_TYPE_ERROR = 0x824C; + constexpr GLenum DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D; + constexpr GLenum DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E; + constexpr GLenum DEBUG_TYPE_PORTABILITY = 0x824F; + constexpr GLenum DEBUG_TYPE_PERFORMANCE = 0x8250; + constexpr GLenum DEBUG_TYPE_OTHER = 0x8251; + constexpr GLenum DEBUG_TYPE_MARKER = 0x8268; + constexpr GLenum DEBUG_TYPE_PUSH_GROUP = 0x8269; + constexpr GLenum DEBUG_TYPE_POP_GROUP = 0x826A; + constexpr GLenum DEBUG_SEVERITY_NOTIFICATION = 0x826B; + constexpr GLenum MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C; + constexpr GLenum DEBUG_GROUP_STACK_DEPTH = 0x826D; + constexpr GLenum BUFFER = 0x82E0; + constexpr GLenum SHADER = 0x82E1; + constexpr GLenum PROGRAM = 0x82E2; + constexpr GLenum VERTEX_ARRAY = 0x8074; + constexpr GLenum QUERY = 0x82E3; + constexpr GLenum PROGRAM_PIPELINE = 0x82E4; + constexpr GLenum SAMPLER = 0x82E6; + constexpr GLenum MAX_LABEL_LENGTH = 0x82E8; + constexpr GLenum MAX_DEBUG_MESSAGE_LENGTH = 0x9143; + constexpr GLenum MAX_DEBUG_LOGGED_MESSAGES = 0x9144; + constexpr GLenum DEBUG_LOGGED_MESSAGES = 0x9145; + constexpr GLenum DEBUG_SEVERITY_HIGH = 0x9146; + constexpr GLenum DEBUG_SEVERITY_MEDIUM = 0x9147; + constexpr GLenum DEBUG_SEVERITY_LOW = 0x9148; + constexpr GLenum DEBUG_OUTPUT = 0x92E0; + constexpr GLenum CONTEXT_FLAG_DEBUG_BIT = 0x00000002; + constexpr GLenum STACK_OVERFLOW = 0x0503; + constexpr GLenum STACK_UNDERFLOW = 0x0504; + constexpr GLenum GEOMETRY_SHADER = 0x8DD9; + constexpr GLenum GEOMETRY_SHADER_BIT = 0x00000004; + constexpr GLenum GEOMETRY_VERTICES_OUT = 0x8916; + constexpr GLenum GEOMETRY_INPUT_TYPE = 0x8917; + constexpr GLenum GEOMETRY_OUTPUT_TYPE = 0x8918; + constexpr GLenum GEOMETRY_SHADER_INVOCATIONS = 0x887F; + constexpr GLenum LAYER_PROVOKING_VERTEX = 0x825E; + constexpr GLenum LINES_ADJACENCY = 0x000A; + constexpr GLenum LINE_STRIP_ADJACENCY = 0x000B; + constexpr GLenum TRIANGLES_ADJACENCY = 0x000C; + constexpr GLenum TRIANGLE_STRIP_ADJACENCY = 0x000D; + constexpr GLenum MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF; + constexpr GLenum MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C; + constexpr GLenum MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32; + constexpr GLenum MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123; + constexpr GLenum MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124; + constexpr GLenum MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0; + constexpr GLenum MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; + constexpr GLenum MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A; + constexpr GLenum MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29; + constexpr GLenum MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF; + constexpr GLenum MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5; + constexpr GLenum MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD; + constexpr GLenum MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7; + constexpr GLenum FIRST_VERTEX_CONVENTION = 0x8E4D; + constexpr GLenum LAST_VERTEX_CONVENTION = 0x8E4E; + constexpr GLenum UNDEFINED_VERTEX = 0x8260; + constexpr GLenum PRIMITIVES_GENERATED = 0x8C87; + constexpr GLenum FRAMEBUFFER_DEFAULT_LAYERS = 0x9312; + constexpr GLenum MAX_FRAMEBUFFER_LAYERS = 0x9317; + constexpr GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; + constexpr GLenum FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7; + constexpr GLenum REFERENCED_BY_GEOMETRY_SHADER = 0x9309; + constexpr GLenum PRIMITIVE_BOUNDING_BOX = 0x92BE; + constexpr GLenum CONTEXT_FLAG_ROBUST_ACCESS_BIT = 0x00000004; + constexpr GLenum CONTEXT_FLAGS = 0x821E; + constexpr GLenum LOSE_CONTEXT_ON_RESET = 0x8252; + constexpr GLenum GUILTY_CONTEXT_RESET = 0x8253; + constexpr GLenum INNOCENT_CONTEXT_RESET = 0x8254; + constexpr GLenum UNKNOWN_CONTEXT_RESET = 0x8255; + constexpr GLenum RESET_NOTIFICATION_STRATEGY = 0x8256; + constexpr GLenum NO_RESET_NOTIFICATION = 0x8261; + constexpr GLenum CONTEXT_LOST = 0x0507; + constexpr GLenum SAMPLE_SHADING = 0x8C36; + constexpr GLenum MIN_SAMPLE_SHADING_VALUE = 0x8C37; + constexpr GLenum MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B; + constexpr GLenum MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C; + constexpr GLenum FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D; + constexpr GLenum PATCHES = 0x000E; + constexpr GLenum PATCH_VERTICES = 0x8E72; + constexpr GLenum TESS_CONTROL_OUTPUT_VERTICES = 0x8E75; + constexpr GLenum TESS_GEN_MODE = 0x8E76; + constexpr GLenum TESS_GEN_SPACING = 0x8E77; + constexpr GLenum TESS_GEN_VERTEX_ORDER = 0x8E78; + constexpr GLenum TESS_GEN_POINT_MODE = 0x8E79; + constexpr GLenum ISOLINES = 0x8E7A; + constexpr GLenum QUADS = 0x0007; + constexpr GLenum FRACTIONAL_ODD = 0x8E7B; + constexpr GLenum FRACTIONAL_EVEN = 0x8E7C; + constexpr GLenum MAX_PATCH_VERTICES = 0x8E7D; + constexpr GLenum MAX_TESS_GEN_LEVEL = 0x8E7E; + constexpr GLenum MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F; + constexpr GLenum MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80; + constexpr GLenum MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81; + constexpr GLenum MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82; + constexpr GLenum MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83; + constexpr GLenum MAX_TESS_PATCH_COMPONENTS = 0x8E84; + constexpr GLenum MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85; + constexpr GLenum MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86; + constexpr GLenum MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89; + constexpr GLenum MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A; + constexpr GLenum MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C; + constexpr GLenum MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D; + constexpr GLenum MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E; + constexpr GLenum MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + constexpr GLenum MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD; + constexpr GLenum MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE; + constexpr GLenum MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3; + constexpr GLenum MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4; + constexpr GLenum MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB; + constexpr GLenum MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC; + constexpr GLenum MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8; + constexpr GLenum MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9; + constexpr GLenum PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = 0x8221; + constexpr GLenum IS_PER_PATCH = 0x92E7; + constexpr GLenum REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307; + constexpr GLenum REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308; + constexpr GLenum TESS_CONTROL_SHADER = 0x8E88; + constexpr GLenum TESS_EVALUATION_SHADER = 0x8E87; + constexpr GLenum TESS_CONTROL_SHADER_BIT = 0x00000008; + constexpr GLenum TESS_EVALUATION_SHADER_BIT = 0x00000010; + constexpr GLenum TEXTURE_BORDER_COLOR = 0x1004; + constexpr GLenum CLAMP_TO_BORDER = 0x812D; + constexpr GLenum TEXTURE_BUFFER = 0x8C2A; + constexpr GLenum TEXTURE_BUFFER_BINDING = 0x8C2A; + constexpr GLenum MAX_TEXTURE_BUFFER_SIZE = 0x8C2B; + constexpr GLenum TEXTURE_BINDING_BUFFER = 0x8C2C; + constexpr GLenum TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D; + constexpr GLenum TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + constexpr GLenum SAMPLER_BUFFER = 0x8DC2; + constexpr GLenum INT_SAMPLER_BUFFER = 0x8DD0; + constexpr GLenum UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; + constexpr GLenum IMAGE_BUFFER = 0x9051; + constexpr GLenum INT_IMAGE_BUFFER = 0x905C; + constexpr GLenum UNSIGNED_INT_IMAGE_BUFFER = 0x9067; + constexpr GLenum TEXTURE_BUFFER_OFFSET = 0x919D; + constexpr GLenum TEXTURE_BUFFER_SIZE = 0x919E; + constexpr GLenum COMPRESSED_RGBA_ASTC_4x4 = 0x93B0; + constexpr GLenum COMPRESSED_RGBA_ASTC_5x4 = 0x93B1; + constexpr GLenum COMPRESSED_RGBA_ASTC_5x5 = 0x93B2; + constexpr GLenum COMPRESSED_RGBA_ASTC_6x5 = 0x93B3; + constexpr GLenum COMPRESSED_RGBA_ASTC_6x6 = 0x93B4; + constexpr GLenum COMPRESSED_RGBA_ASTC_8x5 = 0x93B5; + constexpr GLenum COMPRESSED_RGBA_ASTC_8x6 = 0x93B6; + constexpr GLenum COMPRESSED_RGBA_ASTC_8x8 = 0x93B7; + constexpr GLenum COMPRESSED_RGBA_ASTC_10x5 = 0x93B8; + constexpr GLenum COMPRESSED_RGBA_ASTC_10x6 = 0x93B9; + constexpr GLenum COMPRESSED_RGBA_ASTC_10x8 = 0x93BA; + constexpr GLenum COMPRESSED_RGBA_ASTC_10x10 = 0x93BB; + constexpr GLenum COMPRESSED_RGBA_ASTC_12x10 = 0x93BC; + constexpr GLenum COMPRESSED_RGBA_ASTC_12x12 = 0x93BD; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 = 0x93D0; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 = 0x93D1; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 = 0x93D2; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 = 0x93D3; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 = 0x93D4; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 = 0x93D5; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 = 0x93D6; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 = 0x93D7; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 = 0x93D8; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 = 0x93D9; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 = 0x93DA; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 = 0x93DB; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 = 0x93DC; + constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 = 0x93DD; + constexpr GLenum TEXTURE_CUBE_MAP_ARRAY = 0x9009; + constexpr GLenum TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A; + constexpr GLenum SAMPLER_CUBE_MAP_ARRAY = 0x900C; + constexpr GLenum SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D; + constexpr GLenum INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E; + constexpr GLenum UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F; + constexpr GLenum IMAGE_CUBE_MAP_ARRAY = 0x9054; + constexpr GLenum INT_IMAGE_CUBE_MAP_ARRAY = 0x905F; + constexpr GLenum UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A; + constexpr GLenum TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + constexpr GLenum TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + constexpr GLenum SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B; + constexpr GLenum INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C; + constexpr GLenum UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + inline void BlendBarrier(){ return internal::glBlendBarrier(); } + inline void CopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth){ return internal::glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); } + inline void DebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled){ return internal::glDebugMessageControl(source, type, severity, count, ids, enabled); } + inline void DebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf){ return internal::glDebugMessageInsert(source, type, id, severity, length, buf); } + inline void DebugMessageCallback(GLDEBUGPROC callback, const void *userParam){ return internal::glDebugMessageCallback(callback, userParam); } + inline GLuint GetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog){ return internal::glGetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog); } + inline void PushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message){ return internal::glPushDebugGroup(source, id, length, message); } + inline void PopDebugGroup(){ return internal::glPopDebugGroup(); } + inline void ObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label){ return internal::glObjectLabel(identifier, name, length, label); } + inline void GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label){ return internal::glGetObjectLabel(identifier, name, bufSize, length, label); } + inline void ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label){ return internal::glObjectPtrLabel(ptr, length, label); } + inline void GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label){ return internal::glGetObjectPtrLabel(ptr, bufSize, length, label); } + inline void GetPointerv(GLenum pname, void **params){ return internal::glGetPointerv(pname, params); } + inline void Enablei(GLenum target, GLuint index){ return internal::glEnablei(target, index); } + inline void Disablei(GLenum target, GLuint index){ return internal::glDisablei(target, index); } + inline void BlendEquationi(GLuint buf, GLenum mode){ return internal::glBlendEquationi(buf, mode); } + inline void BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha){ return internal::glBlendEquationSeparatei(buf, modeRGB, modeAlpha); } + inline void BlendFunci(GLuint buf, GLenum src, GLenum dst){ return internal::glBlendFunci(buf, src, dst); } + inline void BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha){ return internal::glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } + inline void ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a){ return internal::glColorMaski(index, r, g, b, a); } + inline GLboolean IsEnabledi(GLenum target, GLuint index){ return internal::glIsEnabledi(target, index); } + inline void DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex){ return internal::glDrawElementsBaseVertex(mode, count, type, indices, basevertex); } + inline void DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex){ return internal::glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); } + inline void DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex){ return internal::glDrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex); } + inline void FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level){ return internal::glFramebufferTexture(target, attachment, texture, level); } + inline void PrimitiveBoundingBox(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW){ return internal::glPrimitiveBoundingBox(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); } + inline GLenum GetGraphicsResetStatus(){ return internal::glGetGraphicsResetStatus(); } + inline void ReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data){ return internal::glReadnPixels(x, y, width, height, format, type, bufSize, data); } + inline void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params){ return internal::glGetnUniformfv(program, location, bufSize, params); } + inline void GetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params){ return internal::glGetnUniformiv(program, location, bufSize, params); } + inline void GetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params){ return internal::glGetnUniformuiv(program, location, bufSize, params); } + inline void MinSampleShading(GLfloat value){ return internal::glMinSampleShading(value); } + inline void PatchParameteri(GLenum pname, GLint value){ return internal::glPatchParameteri(pname, value); } + inline void TexParameterIiv(GLenum target, GLenum pname, const GLint *params){ return internal::glTexParameterIiv(target, pname, params); } + inline void TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params){ return internal::glTexParameterIuiv(target, pname, params); } + inline void GetTexParameterIiv(GLenum target, GLenum pname, GLint *params){ return internal::glGetTexParameterIiv(target, pname, params); } + inline void GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params){ return internal::glGetTexParameterIuiv(target, pname, params); } + inline void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param){ return internal::glSamplerParameterIiv(sampler, pname, param); } + inline void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param){ return internal::glSamplerParameterIuiv(sampler, pname, param); } + inline void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params){ return internal::glGetSamplerParameterIiv(sampler, pname, params); } + inline void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params){ return internal::glGetSamplerParameterIuiv(sampler, pname, params); } + inline void TexBuffer(GLenum target, GLenum internalformat, GLuint buffer){ return internal::glTexBuffer(target, internalformat, buffer); } + inline void TexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size){ return internal::glTexBufferRange(target, internalformat, buffer, offset, size); } + inline void TexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations){ return internal::glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); } + + // GL_ARB_compute_shader + + constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + + // GL_ARB_shader_image_load_store + + constexpr GLenum MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39; + constexpr GLenum IMAGE_1D = 0x904C; + constexpr GLenum IMAGE_2D_RECT = 0x904F; + constexpr GLenum IMAGE_1D_ARRAY = 0x9052; + constexpr GLenum IMAGE_2D_MULTISAMPLE = 0x9055; + constexpr GLenum IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056; + constexpr GLenum INT_IMAGE_1D = 0x9057; + constexpr GLenum INT_IMAGE_2D_RECT = 0x905A; + constexpr GLenum INT_IMAGE_1D_ARRAY = 0x905D; + constexpr GLenum INT_IMAGE_2D_MULTISAMPLE = 0x9060; + constexpr GLenum INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061; + constexpr GLenum UNSIGNED_INT_IMAGE_1D = 0x9062; + constexpr GLenum UNSIGNED_INT_IMAGE_2D_RECT = 0x9065; + constexpr GLenum UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068; + constexpr GLenum UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B; + constexpr GLenum UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + constexpr GLenum MAX_IMAGE_SAMPLES = 0x906D; + + + // GL_ARB_texture_filter_anisotropic + + constexpr GLenum TEXTURE_MAX_ANISOTROPY = 0x84FE; + constexpr GLenum MAX_TEXTURE_MAX_ANISOTROPY = 0x84FF; + + + namespace sys + { + + bool initialize(); + const char * api(); + int major_version(); + int minor_version(); + + bool has_extension(const char * name); + bool ext_ARB_compute_shader(); + bool ext_ARB_shader_image_load_store(); + bool ext_ARB_texture_filter_anisotropic(); + + const char * shader_prefix(); + + } // namespace sys + +} // namespace gl + +#define PSEMEK_GLES 1 + diff --git a/libs/gfx/api/gles32/source/gl.cpp b/libs/gfx/api/gles32/source/gl.cpp new file mode 100644 index 00000000..b2561305 --- /dev/null +++ b/libs/gfx/api/gles32/source/gl.cpp @@ -0,0 +1,1285 @@ +#include + + +#include +#include + +#if defined(__APPLE__) +#include +#elif defined(__sgi) || defined (__sun) +#include +#include +#elif defined(_WIN32) +#include +#elif defined(__ANDROID__) +#include +#else +#include +#endif + +namespace gl +{ + + namespace internal + { + + + #if defined(__APPLE__) + + static void * get_proc_address(const char *func) + { + static void * image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); + + if (!image) return nullptr; + + return dlsym(image, func); + } + + #elif defined(__sgi) || defined (__sun) + + static void * get_proc_address(const char *func) + { + static void * image = dlopen(nullptr, RTLD_LAZY | RTLD_LOCAL); + static void * gpa = image ? dlsym(image, "glXGetProcAddress") : nullptr; + + if (gpa) + return reinterpret_cast(gpa)(reinterpret_cast(name)); + else + return dlsym(image, name); + } + + #elif defined(_WIN32) + + #ifdef _MSC_VER + #pragma warning(disable: 4055) + #pragma warning(disable: 4054) + #pragma warning(disable: 4996) + #endif + + static int test_pointer(const PROC p) + { + ptrdiff_t i; + if (!p) return 0; + i = (ptrdiff_t)p; + + if(i == 1 || i == 2 || i == 3 || i == -1) return 0; + + return 1; + } + + static void * get_proc_address(const char *name) + { + static HMODULE image = GetModuleHandleA("opengl32.dll"); + + PROC func = wglGetProcAddress(reinterpret_cast(name)); + if (test_pointer(func)) + { + return reinterpret_cast(func); + } + + return reinterpret_cast(GetProcAddress(image, reinterpret_cast(name))); + } + + #elif defined(__ANDROID__) + + static void * get_proc_address(const char *func) + { + return reinterpret_cast(eglGetProcAddress(func)); + } + + #else // GLX + + static void * get_proc_address(const char *func) + { + return reinterpret_cast(glXGetProcAddress(reinterpret_cast(func))); + } + + #endif + + // OpenGL ES 2.0 + + void (*glActiveTexture)(GLenum texture) = nullptr; + void (*glAttachShader)(GLuint program, GLuint shader) = nullptr; + void (*glBindAttribLocation)(GLuint program, GLuint index, const GLchar *name) = nullptr; + void (*glBindBuffer)(GLenum target, GLuint buffer) = nullptr; + void (*glBindFramebuffer)(GLenum target, GLuint framebuffer) = nullptr; + void (*glBindRenderbuffer)(GLenum target, GLuint renderbuffer) = nullptr; + void (*glBindTexture)(GLenum target, GLuint texture) = nullptr; + void (*glBlendColor)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = nullptr; + void (*glBlendEquation)(GLenum mode) = nullptr; + void (*glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha) = nullptr; + void (*glBlendFunc)(GLenum sfactor, GLenum dfactor) = nullptr; + void (*glBlendFuncSeparate)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) = nullptr; + void (*glBufferData)(GLenum target, GLsizeiptr size, const void *data, GLenum usage) = nullptr; + void (*glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data) = nullptr; + GLenum (*glCheckFramebufferStatus)(GLenum target) = nullptr; + void (*glClear)(GLbitfield mask) = nullptr; + void (*glClearColor)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = nullptr; + void (*glClearDepthf)(GLfloat d) = nullptr; + void (*glClearStencil)(GLint s) = nullptr; + void (*glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = nullptr; + void (*glCompileShader)(GLuint shader) = nullptr; + void (*glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) = nullptr; + void (*glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) = nullptr; + void (*glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = nullptr; + void (*glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = nullptr; + GLuint (*glCreateProgram)() = nullptr; + GLuint (*glCreateShader)(GLenum type) = nullptr; + void (*glCullFace)(GLenum mode) = nullptr; + void (*glDeleteBuffers)(GLsizei n, const GLuint *buffers) = nullptr; + void (*glDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers) = nullptr; + void (*glDeleteProgram)(GLuint program) = nullptr; + void (*glDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers) = nullptr; + void (*glDeleteShader)(GLuint shader) = nullptr; + void (*glDeleteTextures)(GLsizei n, const GLuint *textures) = nullptr; + void (*glDepthFunc)(GLenum func) = nullptr; + void (*glDepthMask)(GLboolean flag) = nullptr; + void (*glDepthRangef)(GLfloat n, GLfloat f) = nullptr; + void (*glDetachShader)(GLuint program, GLuint shader) = nullptr; + void (*glDisable)(GLenum cap) = nullptr; + void (*glDisableVertexAttribArray)(GLuint index) = nullptr; + void (*glDrawArrays)(GLenum mode, GLint first, GLsizei count) = nullptr; + void (*glDrawElements)(GLenum mode, GLsizei count, GLenum type, const void *indices) = nullptr; + void (*glEnable)(GLenum cap) = nullptr; + void (*glEnableVertexAttribArray)(GLuint index) = nullptr; + void (*glFinish)() = nullptr; + void (*glFlush)() = nullptr; + void (*glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = nullptr; + void (*glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = nullptr; + void (*glFrontFace)(GLenum mode) = nullptr; + void (*glGenBuffers)(GLsizei n, GLuint *buffers) = nullptr; + void (*glGenerateMipmap)(GLenum target) = nullptr; + void (*glGenFramebuffers)(GLsizei n, GLuint *framebuffers) = nullptr; + void (*glGenRenderbuffers)(GLsizei n, GLuint *renderbuffers) = nullptr; + void (*glGenTextures)(GLsizei n, GLuint *textures) = nullptr; + void (*glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) = nullptr; + void (*glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) = nullptr; + void (*glGetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) = nullptr; + GLint (*glGetAttribLocation)(GLuint program, const GLchar *name) = nullptr; + void (*glGetBooleanv)(GLenum pname, GLboolean *data) = nullptr; + void (*glGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params) = nullptr; + GLenum (*glGetError)() = nullptr; + void (*glGetFloatv)(GLenum pname, GLfloat *data) = nullptr; + void (*glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint *params) = nullptr; + void (*glGetIntegerv)(GLenum pname, GLint *data) = nullptr; + void (*glGetProgramiv)(GLuint program, GLenum pname, GLint *params) = nullptr; + void (*glGetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = nullptr; + void (*glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params) = nullptr; + void (*glGetShaderiv)(GLuint shader, GLenum pname, GLint *params) = nullptr; + void (*glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = nullptr; + void (*glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) = nullptr; + void (*glGetShaderSource)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) = nullptr; + const GLubyte *(*glGetString)(GLenum name) = nullptr; + void (*glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params) = nullptr; + void (*glGetTexParameteriv)(GLenum target, GLenum pname, GLint *params) = nullptr; + void (*glGetUniformfv)(GLuint program, GLint location, GLfloat *params) = nullptr; + void (*glGetUniformiv)(GLuint program, GLint location, GLint *params) = nullptr; + GLint (*glGetUniformLocation)(GLuint program, const GLchar *name) = nullptr; + void (*glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params) = nullptr; + void (*glGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params) = nullptr; + void (*glGetVertexAttribPointerv)(GLuint index, GLenum pname, void **pointer) = nullptr; + void (*glHint)(GLenum target, GLenum mode) = nullptr; + GLboolean (*glIsBuffer)(GLuint buffer) = nullptr; + GLboolean (*glIsEnabled)(GLenum cap) = nullptr; + GLboolean (*glIsFramebuffer)(GLuint framebuffer) = nullptr; + GLboolean (*glIsProgram)(GLuint program) = nullptr; + GLboolean (*glIsRenderbuffer)(GLuint renderbuffer) = nullptr; + GLboolean (*glIsShader)(GLuint shader) = nullptr; + GLboolean (*glIsTexture)(GLuint texture) = nullptr; + void (*glLineWidth)(GLfloat width) = nullptr; + void (*glLinkProgram)(GLuint program) = nullptr; + void (*glPixelStorei)(GLenum pname, GLint param) = nullptr; + void (*glPolygonOffset)(GLfloat factor, GLfloat units) = nullptr; + void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) = nullptr; + void (*glReleaseShaderCompiler)() = nullptr; + void (*glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = nullptr; + void (*glSampleCoverage)(GLfloat value, GLboolean invert) = nullptr; + void (*glScissor)(GLint x, GLint y, GLsizei width, GLsizei height) = nullptr; + void (*glShaderBinary)(GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length) = nullptr; + void (*glShaderSource)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) = nullptr; + void (*glStencilFunc)(GLenum func, GLint ref, GLuint mask) = nullptr; + void (*glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask) = nullptr; + void (*glStencilMask)(GLuint mask) = nullptr; + void (*glStencilMaskSeparate)(GLenum face, GLuint mask) = nullptr; + void (*glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass) = nullptr; + void (*glStencilOpSeparate)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) = nullptr; + void (*glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) = nullptr; + void (*glTexParameterf)(GLenum target, GLenum pname, GLfloat param) = nullptr; + void (*glTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params) = nullptr; + void (*glTexParameteri)(GLenum target, GLenum pname, GLint param) = nullptr; + void (*glTexParameteriv)(GLenum target, GLenum pname, const GLint *params) = nullptr; + void (*glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) = nullptr; + void (*glUniform1f)(GLint location, GLfloat v0) = nullptr; + void (*glUniform1fv)(GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glUniform1i)(GLint location, GLint v0) = nullptr; + void (*glUniform1iv)(GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glUniform2f)(GLint location, GLfloat v0, GLfloat v1) = nullptr; + void (*glUniform2fv)(GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glUniform2i)(GLint location, GLint v0, GLint v1) = nullptr; + void (*glUniform2iv)(GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glUniform3f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) = nullptr; + void (*glUniform3fv)(GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glUniform3i)(GLint location, GLint v0, GLint v1, GLint v2) = nullptr; + void (*glUniform3iv)(GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glUniform4f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) = nullptr; + void (*glUniform4fv)(GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glUniform4i)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) = nullptr; + void (*glUniform4iv)(GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUseProgram)(GLuint program) = nullptr; + void (*glValidateProgram)(GLuint program) = nullptr; + void (*glVertexAttrib1f)(GLuint index, GLfloat x) = nullptr; + void (*glVertexAttrib1fv)(GLuint index, const GLfloat *v) = nullptr; + void (*glVertexAttrib2f)(GLuint index, GLfloat x, GLfloat y) = nullptr; + void (*glVertexAttrib2fv)(GLuint index, const GLfloat *v) = nullptr; + void (*glVertexAttrib3f)(GLuint index, GLfloat x, GLfloat y, GLfloat z) = nullptr; + void (*glVertexAttrib3fv)(GLuint index, const GLfloat *v) = nullptr; + void (*glVertexAttrib4f)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = nullptr; + void (*glVertexAttrib4fv)(GLuint index, const GLfloat *v) = nullptr; + void (*glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) = nullptr; + void (*glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) = nullptr; + + // OpenGL ES 3.0 + + void (*glReadBuffer)(GLenum src) = nullptr; + void (*glDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices) = nullptr; + void (*glTexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels) = nullptr; + void (*glTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) = nullptr; + void (*glCopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = nullptr; + void (*glCompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data) = nullptr; + void (*glCompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data) = nullptr; + void (*glGenQueries)(GLsizei n, GLuint *ids) = nullptr; + void (*glDeleteQueries)(GLsizei n, const GLuint *ids) = nullptr; + GLboolean (*glIsQuery)(GLuint id) = nullptr; + void (*glBeginQuery)(GLenum target, GLuint id) = nullptr; + void (*glEndQuery)(GLenum target) = nullptr; + void (*glGetQueryiv)(GLenum target, GLenum pname, GLint *params) = nullptr; + void (*glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint *params) = nullptr; + GLboolean (*glUnmapBuffer)(GLenum target) = nullptr; + void (*glGetBufferPointerv)(GLenum target, GLenum pname, void **params) = nullptr; + void (*glDrawBuffers)(GLsizei n, const GLenum *bufs) = nullptr; + void (*glUniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glUniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) = nullptr; + void (*glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) = nullptr; + void (*glFramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) = nullptr; + void *(*glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) = nullptr; + void (*glFlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length) = nullptr; + void (*glBindVertexArray)(GLuint array) = nullptr; + void (*glDeleteVertexArrays)(GLsizei n, const GLuint *arrays) = nullptr; + void (*glGenVertexArrays)(GLsizei n, GLuint *arrays) = nullptr; + GLboolean (*glIsVertexArray)(GLuint array) = nullptr; + void (*glGetIntegeri_v)(GLenum target, GLuint index, GLint *data) = nullptr; + void (*glBeginTransformFeedback)(GLenum primitiveMode) = nullptr; + void (*glEndTransformFeedback)() = nullptr; + void (*glBindBufferRange)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) = nullptr; + void (*glBindBufferBase)(GLenum target, GLuint index, GLuint buffer) = nullptr; + void (*glTransformFeedbackVaryings)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode) = nullptr; + void (*glGetTransformFeedbackVarying)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) = nullptr; + void (*glVertexAttribIPointer)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) = nullptr; + void (*glGetVertexAttribIiv)(GLuint index, GLenum pname, GLint *params) = nullptr; + void (*glGetVertexAttribIuiv)(GLuint index, GLenum pname, GLuint *params) = nullptr; + void (*glVertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w) = nullptr; + void (*glVertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) = nullptr; + void (*glVertexAttribI4iv)(GLuint index, const GLint *v) = nullptr; + void (*glVertexAttribI4uiv)(GLuint index, const GLuint *v) = nullptr; + void (*glGetUniformuiv)(GLuint program, GLint location, GLuint *params) = nullptr; + GLint (*glGetFragDataLocation)(GLuint program, const GLchar *name) = nullptr; + void (*glUniform1ui)(GLint location, GLuint v0) = nullptr; + void (*glUniform2ui)(GLint location, GLuint v0, GLuint v1) = nullptr; + void (*glUniform3ui)(GLint location, GLuint v0, GLuint v1, GLuint v2) = nullptr; + void (*glUniform4ui)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = nullptr; + void (*glUniform1uiv)(GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glUniform2uiv)(GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glUniform3uiv)(GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glUniform4uiv)(GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glClearBufferiv)(GLenum buffer, GLint drawbuffer, const GLint *value) = nullptr; + void (*glClearBufferuiv)(GLenum buffer, GLint drawbuffer, const GLuint *value) = nullptr; + void (*glClearBufferfv)(GLenum buffer, GLint drawbuffer, const GLfloat *value) = nullptr; + void (*glClearBufferfi)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) = nullptr; + const GLubyte *(*glGetStringi)(GLenum name, GLuint index) = nullptr; + void (*glCopyBufferSubData)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) = nullptr; + void (*glGetUniformIndices)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices) = nullptr; + void (*glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params) = nullptr; + GLuint (*glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName) = nullptr; + void (*glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params) = nullptr; + void (*glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) = nullptr; + void (*glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) = nullptr; + void (*glDrawArraysInstanced)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) = nullptr; + void (*glDrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) = nullptr; + GLsync (*glFenceSync)(GLenum condition, GLbitfield flags) = nullptr; + GLboolean (*glIsSync)(GLsync sync) = nullptr; + void (*glDeleteSync)(GLsync sync) = nullptr; + GLenum (*glClientWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout) = nullptr; + void (*glWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout) = nullptr; + void (*glGetInteger64v)(GLenum pname, GLint64 *data) = nullptr; + void (*glGetSynciv)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values) = nullptr; + void (*glGetInteger64i_v)(GLenum target, GLuint index, GLint64 *data) = nullptr; + void (*glGetBufferParameteri64v)(GLenum target, GLenum pname, GLint64 *params) = nullptr; + void (*glGenSamplers)(GLsizei count, GLuint *samplers) = nullptr; + void (*glDeleteSamplers)(GLsizei count, const GLuint *samplers) = nullptr; + GLboolean (*glIsSampler)(GLuint sampler) = nullptr; + void (*glBindSampler)(GLuint unit, GLuint sampler) = nullptr; + void (*glSamplerParameteri)(GLuint sampler, GLenum pname, GLint param) = nullptr; + void (*glSamplerParameteriv)(GLuint sampler, GLenum pname, const GLint *param) = nullptr; + void (*glSamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param) = nullptr; + void (*glSamplerParameterfv)(GLuint sampler, GLenum pname, const GLfloat *param) = nullptr; + void (*glGetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint *params) = nullptr; + void (*glGetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat *params) = nullptr; + void (*glVertexAttribDivisor)(GLuint index, GLuint divisor) = nullptr; + void (*glBindTransformFeedback)(GLenum target, GLuint id) = nullptr; + void (*glDeleteTransformFeedbacks)(GLsizei n, const GLuint *ids) = nullptr; + void (*glGenTransformFeedbacks)(GLsizei n, GLuint *ids) = nullptr; + GLboolean (*glIsTransformFeedback)(GLuint id) = nullptr; + void (*glPauseTransformFeedback)() = nullptr; + void (*glResumeTransformFeedback)() = nullptr; + void (*glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = nullptr; + void (*glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length) = nullptr; + void (*glProgramParameteri)(GLuint program, GLenum pname, GLint value) = nullptr; + void (*glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments) = nullptr; + void (*glInvalidateSubFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) = nullptr; + void (*glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) = nullptr; + void (*glTexStorage3D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) = nullptr; + void (*glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params) = nullptr; + + // OpenGL ES 3.1 + + void (*glDispatchCompute)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) = nullptr; + void (*glDispatchComputeIndirect)(GLintptr indirect) = nullptr; + void (*glDrawArraysIndirect)(GLenum mode, const void *indirect) = nullptr; + void (*glDrawElementsIndirect)(GLenum mode, GLenum type, const void *indirect) = nullptr; + void (*glFramebufferParameteri)(GLenum target, GLenum pname, GLint param) = nullptr; + void (*glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params) = nullptr; + void (*glGetProgramInterfaceiv)(GLuint program, GLenum programInterface, GLenum pname, GLint *params) = nullptr; + GLuint (*glGetProgramResourceIndex)(GLuint program, GLenum programInterface, const GLchar *name) = nullptr; + void (*glGetProgramResourceName)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) = nullptr; + void (*glGetProgramResourceiv)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params) = nullptr; + GLint (*glGetProgramResourceLocation)(GLuint program, GLenum programInterface, const GLchar *name) = nullptr; + void (*glUseProgramStages)(GLuint pipeline, GLbitfield stages, GLuint program) = nullptr; + void (*glActiveShaderProgram)(GLuint pipeline, GLuint program) = nullptr; + GLuint (*glCreateShaderProgramv)(GLenum type, GLsizei count, const GLchar *const*strings) = nullptr; + void (*glBindProgramPipeline)(GLuint pipeline) = nullptr; + void (*glDeleteProgramPipelines)(GLsizei n, const GLuint *pipelines) = nullptr; + void (*glGenProgramPipelines)(GLsizei n, GLuint *pipelines) = nullptr; + GLboolean (*glIsProgramPipeline)(GLuint pipeline) = nullptr; + void (*glGetProgramPipelineiv)(GLuint pipeline, GLenum pname, GLint *params) = nullptr; + void (*glProgramUniform1i)(GLuint program, GLint location, GLint v0) = nullptr; + void (*glProgramUniform2i)(GLuint program, GLint location, GLint v0, GLint v1) = nullptr; + void (*glProgramUniform3i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) = nullptr; + void (*glProgramUniform4i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) = nullptr; + void (*glProgramUniform1ui)(GLuint program, GLint location, GLuint v0) = nullptr; + void (*glProgramUniform2ui)(GLuint program, GLint location, GLuint v0, GLuint v1) = nullptr; + void (*glProgramUniform3ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) = nullptr; + void (*glProgramUniform4ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = nullptr; + void (*glProgramUniform1f)(GLuint program, GLint location, GLfloat v0) = nullptr; + void (*glProgramUniform2f)(GLuint program, GLint location, GLfloat v0, GLfloat v1) = nullptr; + void (*glProgramUniform3f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) = nullptr; + void (*glProgramUniform4f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) = nullptr; + void (*glProgramUniform1iv)(GLuint program, GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glProgramUniform2iv)(GLuint program, GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glProgramUniform3iv)(GLuint program, GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glProgramUniform4iv)(GLuint program, GLint location, GLsizei count, const GLint *value) = nullptr; + void (*glProgramUniform1uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glProgramUniform2uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glProgramUniform3uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glProgramUniform4uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value) = nullptr; + void (*glProgramUniform1fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glProgramUniform2fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glProgramUniform3fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glProgramUniform4fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix2x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix3x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix2x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix4x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix3x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glProgramUniformMatrix4x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = nullptr; + void (*glValidateProgramPipeline)(GLuint pipeline) = nullptr; + void (*glGetProgramPipelineInfoLog)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = nullptr; + void (*glBindImageTexture)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) = nullptr; + void (*glGetBooleani_v)(GLenum target, GLuint index, GLboolean *data) = nullptr; + void (*glMemoryBarrier)(GLbitfield barriers) = nullptr; + void (*glMemoryBarrierByRegion)(GLbitfield barriers) = nullptr; + void (*glTexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) = nullptr; + void (*glGetMultisamplefv)(GLenum pname, GLuint index, GLfloat *val) = nullptr; + void (*glSampleMaski)(GLuint maskNumber, GLbitfield mask) = nullptr; + void (*glGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params) = nullptr; + void (*glGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params) = nullptr; + void (*glBindVertexBuffer)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) = nullptr; + void (*glVertexAttribFormat)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) = nullptr; + void (*glVertexAttribIFormat)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) = nullptr; + void (*glVertexAttribBinding)(GLuint attribindex, GLuint bindingindex) = nullptr; + void (*glVertexBindingDivisor)(GLuint bindingindex, GLuint divisor) = nullptr; + + // OpenGL ES 3.2 + + void (*glBlendBarrier)() = nullptr; + void (*glCopyImageSubData)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) = nullptr; + void (*glDebugMessageControl)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) = nullptr; + void (*glDebugMessageInsert)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) = nullptr; + void (*glDebugMessageCallback)(GLDEBUGPROC callback, const void *userParam) = nullptr; + GLuint (*glGetDebugMessageLog)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog) = nullptr; + void (*glPushDebugGroup)(GLenum source, GLuint id, GLsizei length, const GLchar *message) = nullptr; + void (*glPopDebugGroup)() = nullptr; + void (*glObjectLabel)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label) = nullptr; + void (*glGetObjectLabel)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label) = nullptr; + void (*glObjectPtrLabel)(const void *ptr, GLsizei length, const GLchar *label) = nullptr; + void (*glGetObjectPtrLabel)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) = nullptr; + void (*glGetPointerv)(GLenum pname, void **params) = nullptr; + void (*glEnablei)(GLenum target, GLuint index) = nullptr; + void (*glDisablei)(GLenum target, GLuint index) = nullptr; + void (*glBlendEquationi)(GLuint buf, GLenum mode) = nullptr; + void (*glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha) = nullptr; + void (*glBlendFunci)(GLuint buf, GLenum src, GLenum dst) = nullptr; + void (*glBlendFuncSeparatei)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = nullptr; + void (*glColorMaski)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) = nullptr; + GLboolean (*glIsEnabledi)(GLenum target, GLuint index) = nullptr; + void (*glDrawElementsBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) = nullptr; + void (*glDrawRangeElementsBaseVertex)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex) = nullptr; + void (*glDrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex) = nullptr; + void (*glFramebufferTexture)(GLenum target, GLenum attachment, GLuint texture, GLint level) = nullptr; + void (*glPrimitiveBoundingBox)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) = nullptr; + GLenum (*glGetGraphicsResetStatus)() = nullptr; + void (*glReadnPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data) = nullptr; + void (*glGetnUniformfv)(GLuint program, GLint location, GLsizei bufSize, GLfloat *params) = nullptr; + void (*glGetnUniformiv)(GLuint program, GLint location, GLsizei bufSize, GLint *params) = nullptr; + void (*glGetnUniformuiv)(GLuint program, GLint location, GLsizei bufSize, GLuint *params) = nullptr; + void (*glMinSampleShading)(GLfloat value) = nullptr; + void (*glPatchParameteri)(GLenum pname, GLint value) = nullptr; + void (*glTexParameterIiv)(GLenum target, GLenum pname, const GLint *params) = nullptr; + void (*glTexParameterIuiv)(GLenum target, GLenum pname, const GLuint *params) = nullptr; + void (*glGetTexParameterIiv)(GLenum target, GLenum pname, GLint *params) = nullptr; + void (*glGetTexParameterIuiv)(GLenum target, GLenum pname, GLuint *params) = nullptr; + void (*glSamplerParameterIiv)(GLuint sampler, GLenum pname, const GLint *param) = nullptr; + void (*glSamplerParameterIuiv)(GLuint sampler, GLenum pname, const GLuint *param) = nullptr; + void (*glGetSamplerParameterIiv)(GLuint sampler, GLenum pname, GLint *params) = nullptr; + void (*glGetSamplerParameterIuiv)(GLuint sampler, GLenum pname, GLuint *params) = nullptr; + void (*glTexBuffer)(GLenum target, GLenum internalformat, GLuint buffer) = nullptr; + void (*glTexBufferRange)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) = nullptr; + void (*glTexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) = nullptr; + + // GL_ARB_compute_shader + + + // GL_ARB_shader_image_load_store + + + // GL_ARB_texture_filter_anisotropic + + + } // namespace internal + + namespace sys + { + + static bool ext_GL_ARB_compute_shader_loaded = false; + static bool ext_GL_ARB_shader_image_load_store_loaded = false; + static bool ext_GL_ARB_texture_filter_anisotropic_loaded = false; + + static bool load_core() + { + // OpenGL ES 2.0 + + internal::glActiveTexture = reinterpret_cast(internal::get_proc_address("glActiveTexture")); + if (!internal::glActiveTexture) return false; + internal::glAttachShader = reinterpret_cast(internal::get_proc_address("glAttachShader")); + if (!internal::glAttachShader) return false; + internal::glBindAttribLocation = reinterpret_cast(internal::get_proc_address("glBindAttribLocation")); + if (!internal::glBindAttribLocation) return false; + internal::glBindBuffer = reinterpret_cast(internal::get_proc_address("glBindBuffer")); + if (!internal::glBindBuffer) return false; + internal::glBindFramebuffer = reinterpret_cast(internal::get_proc_address("glBindFramebuffer")); + if (!internal::glBindFramebuffer) return false; + internal::glBindRenderbuffer = reinterpret_cast(internal::get_proc_address("glBindRenderbuffer")); + if (!internal::glBindRenderbuffer) return false; + internal::glBindTexture = reinterpret_cast(internal::get_proc_address("glBindTexture")); + if (!internal::glBindTexture) return false; + internal::glBlendColor = reinterpret_cast(internal::get_proc_address("glBlendColor")); + if (!internal::glBlendColor) return false; + internal::glBlendEquation = reinterpret_cast(internal::get_proc_address("glBlendEquation")); + if (!internal::glBlendEquation) return false; + internal::glBlendEquationSeparate = reinterpret_cast(internal::get_proc_address("glBlendEquationSeparate")); + if (!internal::glBlendEquationSeparate) return false; + internal::glBlendFunc = reinterpret_cast(internal::get_proc_address("glBlendFunc")); + if (!internal::glBlendFunc) return false; + internal::glBlendFuncSeparate = reinterpret_cast(internal::get_proc_address("glBlendFuncSeparate")); + if (!internal::glBlendFuncSeparate) return false; + internal::glBufferData = reinterpret_cast(internal::get_proc_address("glBufferData")); + if (!internal::glBufferData) return false; + internal::glBufferSubData = reinterpret_cast(internal::get_proc_address("glBufferSubData")); + if (!internal::glBufferSubData) return false; + internal::glCheckFramebufferStatus = reinterpret_cast(internal::get_proc_address("glCheckFramebufferStatus")); + if (!internal::glCheckFramebufferStatus) return false; + internal::glClear = reinterpret_cast(internal::get_proc_address("glClear")); + if (!internal::glClear) return false; + internal::glClearColor = reinterpret_cast(internal::get_proc_address("glClearColor")); + if (!internal::glClearColor) return false; + internal::glClearDepthf = reinterpret_cast(internal::get_proc_address("glClearDepthf")); + if (!internal::glClearDepthf) return false; + internal::glClearStencil = reinterpret_cast(internal::get_proc_address("glClearStencil")); + if (!internal::glClearStencil) return false; + internal::glColorMask = reinterpret_cast(internal::get_proc_address("glColorMask")); + if (!internal::glColorMask) return false; + internal::glCompileShader = reinterpret_cast(internal::get_proc_address("glCompileShader")); + if (!internal::glCompileShader) return false; + internal::glCompressedTexImage2D = reinterpret_cast(internal::get_proc_address("glCompressedTexImage2D")); + if (!internal::glCompressedTexImage2D) return false; + internal::glCompressedTexSubImage2D = reinterpret_cast(internal::get_proc_address("glCompressedTexSubImage2D")); + if (!internal::glCompressedTexSubImage2D) return false; + internal::glCopyTexImage2D = reinterpret_cast(internal::get_proc_address("glCopyTexImage2D")); + if (!internal::glCopyTexImage2D) return false; + internal::glCopyTexSubImage2D = reinterpret_cast(internal::get_proc_address("glCopyTexSubImage2D")); + if (!internal::glCopyTexSubImage2D) return false; + internal::glCreateProgram = reinterpret_cast(internal::get_proc_address("glCreateProgram")); + if (!internal::glCreateProgram) return false; + internal::glCreateShader = reinterpret_cast(internal::get_proc_address("glCreateShader")); + if (!internal::glCreateShader) return false; + internal::glCullFace = reinterpret_cast(internal::get_proc_address("glCullFace")); + if (!internal::glCullFace) return false; + internal::glDeleteBuffers = reinterpret_cast(internal::get_proc_address("glDeleteBuffers")); + if (!internal::glDeleteBuffers) return false; + internal::glDeleteFramebuffers = reinterpret_cast(internal::get_proc_address("glDeleteFramebuffers")); + if (!internal::glDeleteFramebuffers) return false; + internal::glDeleteProgram = reinterpret_cast(internal::get_proc_address("glDeleteProgram")); + if (!internal::glDeleteProgram) return false; + internal::glDeleteRenderbuffers = reinterpret_cast(internal::get_proc_address("glDeleteRenderbuffers")); + if (!internal::glDeleteRenderbuffers) return false; + internal::glDeleteShader = reinterpret_cast(internal::get_proc_address("glDeleteShader")); + if (!internal::glDeleteShader) return false; + internal::glDeleteTextures = reinterpret_cast(internal::get_proc_address("glDeleteTextures")); + if (!internal::glDeleteTextures) return false; + internal::glDepthFunc = reinterpret_cast(internal::get_proc_address("glDepthFunc")); + if (!internal::glDepthFunc) return false; + internal::glDepthMask = reinterpret_cast(internal::get_proc_address("glDepthMask")); + if (!internal::glDepthMask) return false; + internal::glDepthRangef = reinterpret_cast(internal::get_proc_address("glDepthRangef")); + if (!internal::glDepthRangef) return false; + internal::glDetachShader = reinterpret_cast(internal::get_proc_address("glDetachShader")); + if (!internal::glDetachShader) return false; + internal::glDisable = reinterpret_cast(internal::get_proc_address("glDisable")); + if (!internal::glDisable) return false; + internal::glDisableVertexAttribArray = reinterpret_cast(internal::get_proc_address("glDisableVertexAttribArray")); + if (!internal::glDisableVertexAttribArray) return false; + internal::glDrawArrays = reinterpret_cast(internal::get_proc_address("glDrawArrays")); + if (!internal::glDrawArrays) return false; + internal::glDrawElements = reinterpret_cast(internal::get_proc_address("glDrawElements")); + if (!internal::glDrawElements) return false; + internal::glEnable = reinterpret_cast(internal::get_proc_address("glEnable")); + if (!internal::glEnable) return false; + internal::glEnableVertexAttribArray = reinterpret_cast(internal::get_proc_address("glEnableVertexAttribArray")); + if (!internal::glEnableVertexAttribArray) return false; + internal::glFinish = reinterpret_cast(internal::get_proc_address("glFinish")); + if (!internal::glFinish) return false; + internal::glFlush = reinterpret_cast(internal::get_proc_address("glFlush")); + if (!internal::glFlush) return false; + internal::glFramebufferRenderbuffer = reinterpret_cast(internal::get_proc_address("glFramebufferRenderbuffer")); + if (!internal::glFramebufferRenderbuffer) return false; + internal::glFramebufferTexture2D = reinterpret_cast(internal::get_proc_address("glFramebufferTexture2D")); + if (!internal::glFramebufferTexture2D) return false; + internal::glFrontFace = reinterpret_cast(internal::get_proc_address("glFrontFace")); + if (!internal::glFrontFace) return false; + internal::glGenBuffers = reinterpret_cast(internal::get_proc_address("glGenBuffers")); + if (!internal::glGenBuffers) return false; + internal::glGenerateMipmap = reinterpret_cast(internal::get_proc_address("glGenerateMipmap")); + if (!internal::glGenerateMipmap) return false; + internal::glGenFramebuffers = reinterpret_cast(internal::get_proc_address("glGenFramebuffers")); + if (!internal::glGenFramebuffers) return false; + internal::glGenRenderbuffers = reinterpret_cast(internal::get_proc_address("glGenRenderbuffers")); + if (!internal::glGenRenderbuffers) return false; + internal::glGenTextures = reinterpret_cast(internal::get_proc_address("glGenTextures")); + if (!internal::glGenTextures) return false; + internal::glGetActiveAttrib = reinterpret_cast(internal::get_proc_address("glGetActiveAttrib")); + if (!internal::glGetActiveAttrib) return false; + internal::glGetActiveUniform = reinterpret_cast(internal::get_proc_address("glGetActiveUniform")); + if (!internal::glGetActiveUniform) return false; + internal::glGetAttachedShaders = reinterpret_cast(internal::get_proc_address("glGetAttachedShaders")); + if (!internal::glGetAttachedShaders) return false; + internal::glGetAttribLocation = reinterpret_cast(internal::get_proc_address("glGetAttribLocation")); + if (!internal::glGetAttribLocation) return false; + internal::glGetBooleanv = reinterpret_cast(internal::get_proc_address("glGetBooleanv")); + if (!internal::glGetBooleanv) return false; + internal::glGetBufferParameteriv = reinterpret_cast(internal::get_proc_address("glGetBufferParameteriv")); + if (!internal::glGetBufferParameteriv) return false; + internal::glGetError = reinterpret_cast(internal::get_proc_address("glGetError")); + if (!internal::glGetError) return false; + internal::glGetFloatv = reinterpret_cast(internal::get_proc_address("glGetFloatv")); + if (!internal::glGetFloatv) return false; + internal::glGetFramebufferAttachmentParameteriv = reinterpret_cast(internal::get_proc_address("glGetFramebufferAttachmentParameteriv")); + if (!internal::glGetFramebufferAttachmentParameteriv) return false; + internal::glGetIntegerv = reinterpret_cast(internal::get_proc_address("glGetIntegerv")); + if (!internal::glGetIntegerv) return false; + internal::glGetProgramiv = reinterpret_cast(internal::get_proc_address("glGetProgramiv")); + if (!internal::glGetProgramiv) return false; + internal::glGetProgramInfoLog = reinterpret_cast(internal::get_proc_address("glGetProgramInfoLog")); + if (!internal::glGetProgramInfoLog) return false; + internal::glGetRenderbufferParameteriv = reinterpret_cast(internal::get_proc_address("glGetRenderbufferParameteriv")); + if (!internal::glGetRenderbufferParameteriv) return false; + internal::glGetShaderiv = reinterpret_cast(internal::get_proc_address("glGetShaderiv")); + if (!internal::glGetShaderiv) return false; + internal::glGetShaderInfoLog = reinterpret_cast(internal::get_proc_address("glGetShaderInfoLog")); + if (!internal::glGetShaderInfoLog) return false; + internal::glGetShaderPrecisionFormat = reinterpret_cast(internal::get_proc_address("glGetShaderPrecisionFormat")); + if (!internal::glGetShaderPrecisionFormat) return false; + internal::glGetShaderSource = reinterpret_cast(internal::get_proc_address("glGetShaderSource")); + if (!internal::glGetShaderSource) return false; + internal::glGetString = reinterpret_cast(internal::get_proc_address("glGetString")); + if (!internal::glGetString) return false; + internal::glGetTexParameterfv = reinterpret_cast(internal::get_proc_address("glGetTexParameterfv")); + if (!internal::glGetTexParameterfv) return false; + internal::glGetTexParameteriv = reinterpret_cast(internal::get_proc_address("glGetTexParameteriv")); + if (!internal::glGetTexParameteriv) return false; + internal::glGetUniformfv = reinterpret_cast(internal::get_proc_address("glGetUniformfv")); + if (!internal::glGetUniformfv) return false; + internal::glGetUniformiv = reinterpret_cast(internal::get_proc_address("glGetUniformiv")); + if (!internal::glGetUniformiv) return false; + internal::glGetUniformLocation = reinterpret_cast(internal::get_proc_address("glGetUniformLocation")); + if (!internal::glGetUniformLocation) return false; + internal::glGetVertexAttribfv = reinterpret_cast(internal::get_proc_address("glGetVertexAttribfv")); + if (!internal::glGetVertexAttribfv) return false; + internal::glGetVertexAttribiv = reinterpret_cast(internal::get_proc_address("glGetVertexAttribiv")); + if (!internal::glGetVertexAttribiv) return false; + internal::glGetVertexAttribPointerv = reinterpret_cast(internal::get_proc_address("glGetVertexAttribPointerv")); + if (!internal::glGetVertexAttribPointerv) return false; + internal::glHint = reinterpret_cast(internal::get_proc_address("glHint")); + if (!internal::glHint) return false; + internal::glIsBuffer = reinterpret_cast(internal::get_proc_address("glIsBuffer")); + if (!internal::glIsBuffer) return false; + internal::glIsEnabled = reinterpret_cast(internal::get_proc_address("glIsEnabled")); + if (!internal::glIsEnabled) return false; + internal::glIsFramebuffer = reinterpret_cast(internal::get_proc_address("glIsFramebuffer")); + if (!internal::glIsFramebuffer) return false; + internal::glIsProgram = reinterpret_cast(internal::get_proc_address("glIsProgram")); + if (!internal::glIsProgram) return false; + internal::glIsRenderbuffer = reinterpret_cast(internal::get_proc_address("glIsRenderbuffer")); + if (!internal::glIsRenderbuffer) return false; + internal::glIsShader = reinterpret_cast(internal::get_proc_address("glIsShader")); + if (!internal::glIsShader) return false; + internal::glIsTexture = reinterpret_cast(internal::get_proc_address("glIsTexture")); + if (!internal::glIsTexture) return false; + internal::glLineWidth = reinterpret_cast(internal::get_proc_address("glLineWidth")); + if (!internal::glLineWidth) return false; + internal::glLinkProgram = reinterpret_cast(internal::get_proc_address("glLinkProgram")); + if (!internal::glLinkProgram) return false; + internal::glPixelStorei = reinterpret_cast(internal::get_proc_address("glPixelStorei")); + if (!internal::glPixelStorei) return false; + internal::glPolygonOffset = reinterpret_cast(internal::get_proc_address("glPolygonOffset")); + if (!internal::glPolygonOffset) return false; + internal::glReadPixels = reinterpret_cast(internal::get_proc_address("glReadPixels")); + if (!internal::glReadPixels) return false; + internal::glReleaseShaderCompiler = reinterpret_cast(internal::get_proc_address("glReleaseShaderCompiler")); + if (!internal::glReleaseShaderCompiler) return false; + internal::glRenderbufferStorage = reinterpret_cast(internal::get_proc_address("glRenderbufferStorage")); + if (!internal::glRenderbufferStorage) return false; + internal::glSampleCoverage = reinterpret_cast(internal::get_proc_address("glSampleCoverage")); + if (!internal::glSampleCoverage) return false; + internal::glScissor = reinterpret_cast(internal::get_proc_address("glScissor")); + if (!internal::glScissor) return false; + internal::glShaderBinary = reinterpret_cast(internal::get_proc_address("glShaderBinary")); + if (!internal::glShaderBinary) return false; + internal::glShaderSource = reinterpret_cast(internal::get_proc_address("glShaderSource")); + if (!internal::glShaderSource) return false; + internal::glStencilFunc = reinterpret_cast(internal::get_proc_address("glStencilFunc")); + if (!internal::glStencilFunc) return false; + internal::glStencilFuncSeparate = reinterpret_cast(internal::get_proc_address("glStencilFuncSeparate")); + if (!internal::glStencilFuncSeparate) return false; + internal::glStencilMask = reinterpret_cast(internal::get_proc_address("glStencilMask")); + if (!internal::glStencilMask) return false; + internal::glStencilMaskSeparate = reinterpret_cast(internal::get_proc_address("glStencilMaskSeparate")); + if (!internal::glStencilMaskSeparate) return false; + internal::glStencilOp = reinterpret_cast(internal::get_proc_address("glStencilOp")); + if (!internal::glStencilOp) return false; + internal::glStencilOpSeparate = reinterpret_cast(internal::get_proc_address("glStencilOpSeparate")); + if (!internal::glStencilOpSeparate) return false; + internal::glTexImage2D = reinterpret_cast(internal::get_proc_address("glTexImage2D")); + if (!internal::glTexImage2D) return false; + internal::glTexParameterf = reinterpret_cast(internal::get_proc_address("glTexParameterf")); + if (!internal::glTexParameterf) return false; + internal::glTexParameterfv = reinterpret_cast(internal::get_proc_address("glTexParameterfv")); + if (!internal::glTexParameterfv) return false; + internal::glTexParameteri = reinterpret_cast(internal::get_proc_address("glTexParameteri")); + if (!internal::glTexParameteri) return false; + internal::glTexParameteriv = reinterpret_cast(internal::get_proc_address("glTexParameteriv")); + if (!internal::glTexParameteriv) return false; + internal::glTexSubImage2D = reinterpret_cast(internal::get_proc_address("glTexSubImage2D")); + if (!internal::glTexSubImage2D) return false; + internal::glUniform1f = reinterpret_cast(internal::get_proc_address("glUniform1f")); + if (!internal::glUniform1f) return false; + internal::glUniform1fv = reinterpret_cast(internal::get_proc_address("glUniform1fv")); + if (!internal::glUniform1fv) return false; + internal::glUniform1i = reinterpret_cast(internal::get_proc_address("glUniform1i")); + if (!internal::glUniform1i) return false; + internal::glUniform1iv = reinterpret_cast(internal::get_proc_address("glUniform1iv")); + if (!internal::glUniform1iv) return false; + internal::glUniform2f = reinterpret_cast(internal::get_proc_address("glUniform2f")); + if (!internal::glUniform2f) return false; + internal::glUniform2fv = reinterpret_cast(internal::get_proc_address("glUniform2fv")); + if (!internal::glUniform2fv) return false; + internal::glUniform2i = reinterpret_cast(internal::get_proc_address("glUniform2i")); + if (!internal::glUniform2i) return false; + internal::glUniform2iv = reinterpret_cast(internal::get_proc_address("glUniform2iv")); + if (!internal::glUniform2iv) return false; + internal::glUniform3f = reinterpret_cast(internal::get_proc_address("glUniform3f")); + if (!internal::glUniform3f) return false; + internal::glUniform3fv = reinterpret_cast(internal::get_proc_address("glUniform3fv")); + if (!internal::glUniform3fv) return false; + internal::glUniform3i = reinterpret_cast(internal::get_proc_address("glUniform3i")); + if (!internal::glUniform3i) return false; + internal::glUniform3iv = reinterpret_cast(internal::get_proc_address("glUniform3iv")); + if (!internal::glUniform3iv) return false; + internal::glUniform4f = reinterpret_cast(internal::get_proc_address("glUniform4f")); + if (!internal::glUniform4f) return false; + internal::glUniform4fv = reinterpret_cast(internal::get_proc_address("glUniform4fv")); + if (!internal::glUniform4fv) return false; + internal::glUniform4i = reinterpret_cast(internal::get_proc_address("glUniform4i")); + if (!internal::glUniform4i) return false; + internal::glUniform4iv = reinterpret_cast(internal::get_proc_address("glUniform4iv")); + if (!internal::glUniform4iv) return false; + internal::glUniformMatrix2fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix2fv")); + if (!internal::glUniformMatrix2fv) return false; + internal::glUniformMatrix3fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix3fv")); + if (!internal::glUniformMatrix3fv) return false; + internal::glUniformMatrix4fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix4fv")); + if (!internal::glUniformMatrix4fv) return false; + internal::glUseProgram = reinterpret_cast(internal::get_proc_address("glUseProgram")); + if (!internal::glUseProgram) return false; + internal::glValidateProgram = reinterpret_cast(internal::get_proc_address("glValidateProgram")); + if (!internal::glValidateProgram) return false; + internal::glVertexAttrib1f = reinterpret_cast(internal::get_proc_address("glVertexAttrib1f")); + if (!internal::glVertexAttrib1f) return false; + internal::glVertexAttrib1fv = reinterpret_cast(internal::get_proc_address("glVertexAttrib1fv")); + if (!internal::glVertexAttrib1fv) return false; + internal::glVertexAttrib2f = reinterpret_cast(internal::get_proc_address("glVertexAttrib2f")); + if (!internal::glVertexAttrib2f) return false; + internal::glVertexAttrib2fv = reinterpret_cast(internal::get_proc_address("glVertexAttrib2fv")); + if (!internal::glVertexAttrib2fv) return false; + internal::glVertexAttrib3f = reinterpret_cast(internal::get_proc_address("glVertexAttrib3f")); + if (!internal::glVertexAttrib3f) return false; + internal::glVertexAttrib3fv = reinterpret_cast(internal::get_proc_address("glVertexAttrib3fv")); + if (!internal::glVertexAttrib3fv) return false; + internal::glVertexAttrib4f = reinterpret_cast(internal::get_proc_address("glVertexAttrib4f")); + if (!internal::glVertexAttrib4f) return false; + internal::glVertexAttrib4fv = reinterpret_cast(internal::get_proc_address("glVertexAttrib4fv")); + if (!internal::glVertexAttrib4fv) return false; + internal::glVertexAttribPointer = reinterpret_cast(internal::get_proc_address("glVertexAttribPointer")); + if (!internal::glVertexAttribPointer) return false; + internal::glViewport = reinterpret_cast(internal::get_proc_address("glViewport")); + if (!internal::glViewport) return false; + + // OpenGL ES 3.0 + + internal::glReadBuffer = reinterpret_cast(internal::get_proc_address("glReadBuffer")); + if (!internal::glReadBuffer) return false; + internal::glDrawRangeElements = reinterpret_cast(internal::get_proc_address("glDrawRangeElements")); + if (!internal::glDrawRangeElements) return false; + internal::glTexImage3D = reinterpret_cast(internal::get_proc_address("glTexImage3D")); + if (!internal::glTexImage3D) return false; + internal::glTexSubImage3D = reinterpret_cast(internal::get_proc_address("glTexSubImage3D")); + if (!internal::glTexSubImage3D) return false; + internal::glCopyTexSubImage3D = reinterpret_cast(internal::get_proc_address("glCopyTexSubImage3D")); + if (!internal::glCopyTexSubImage3D) return false; + internal::glCompressedTexImage3D = reinterpret_cast(internal::get_proc_address("glCompressedTexImage3D")); + if (!internal::glCompressedTexImage3D) return false; + internal::glCompressedTexSubImage3D = reinterpret_cast(internal::get_proc_address("glCompressedTexSubImage3D")); + if (!internal::glCompressedTexSubImage3D) return false; + internal::glGenQueries = reinterpret_cast(internal::get_proc_address("glGenQueries")); + if (!internal::glGenQueries) return false; + internal::glDeleteQueries = reinterpret_cast(internal::get_proc_address("glDeleteQueries")); + if (!internal::glDeleteQueries) return false; + internal::glIsQuery = reinterpret_cast(internal::get_proc_address("glIsQuery")); + if (!internal::glIsQuery) return false; + internal::glBeginQuery = reinterpret_cast(internal::get_proc_address("glBeginQuery")); + if (!internal::glBeginQuery) return false; + internal::glEndQuery = reinterpret_cast(internal::get_proc_address("glEndQuery")); + if (!internal::glEndQuery) return false; + internal::glGetQueryiv = reinterpret_cast(internal::get_proc_address("glGetQueryiv")); + if (!internal::glGetQueryiv) return false; + internal::glGetQueryObjectuiv = reinterpret_cast(internal::get_proc_address("glGetQueryObjectuiv")); + if (!internal::glGetQueryObjectuiv) return false; + internal::glUnmapBuffer = reinterpret_cast(internal::get_proc_address("glUnmapBuffer")); + if (!internal::glUnmapBuffer) return false; + internal::glGetBufferPointerv = reinterpret_cast(internal::get_proc_address("glGetBufferPointerv")); + if (!internal::glGetBufferPointerv) return false; + internal::glDrawBuffers = reinterpret_cast(internal::get_proc_address("glDrawBuffers")); + if (!internal::glDrawBuffers) return false; + internal::glUniformMatrix2x3fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix2x3fv")); + if (!internal::glUniformMatrix2x3fv) return false; + internal::glUniformMatrix3x2fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix3x2fv")); + if (!internal::glUniformMatrix3x2fv) return false; + internal::glUniformMatrix2x4fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix2x4fv")); + if (!internal::glUniformMatrix2x4fv) return false; + internal::glUniformMatrix4x2fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix4x2fv")); + if (!internal::glUniformMatrix4x2fv) return false; + internal::glUniformMatrix3x4fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix3x4fv")); + if (!internal::glUniformMatrix3x4fv) return false; + internal::glUniformMatrix4x3fv = reinterpret_cast(internal::get_proc_address("glUniformMatrix4x3fv")); + if (!internal::glUniformMatrix4x3fv) return false; + internal::glBlitFramebuffer = reinterpret_cast(internal::get_proc_address("glBlitFramebuffer")); + if (!internal::glBlitFramebuffer) return false; + internal::glRenderbufferStorageMultisample = reinterpret_cast(internal::get_proc_address("glRenderbufferStorageMultisample")); + if (!internal::glRenderbufferStorageMultisample) return false; + internal::glFramebufferTextureLayer = reinterpret_cast(internal::get_proc_address("glFramebufferTextureLayer")); + if (!internal::glFramebufferTextureLayer) return false; + internal::glMapBufferRange = reinterpret_cast(internal::get_proc_address("glMapBufferRange")); + if (!internal::glMapBufferRange) return false; + internal::glFlushMappedBufferRange = reinterpret_cast(internal::get_proc_address("glFlushMappedBufferRange")); + if (!internal::glFlushMappedBufferRange) return false; + internal::glBindVertexArray = reinterpret_cast(internal::get_proc_address("glBindVertexArray")); + if (!internal::glBindVertexArray) return false; + internal::glDeleteVertexArrays = reinterpret_cast(internal::get_proc_address("glDeleteVertexArrays")); + if (!internal::glDeleteVertexArrays) return false; + internal::glGenVertexArrays = reinterpret_cast(internal::get_proc_address("glGenVertexArrays")); + if (!internal::glGenVertexArrays) return false; + internal::glIsVertexArray = reinterpret_cast(internal::get_proc_address("glIsVertexArray")); + if (!internal::glIsVertexArray) return false; + internal::glGetIntegeri_v = reinterpret_cast(internal::get_proc_address("glGetIntegeri_v")); + if (!internal::glGetIntegeri_v) return false; + internal::glBeginTransformFeedback = reinterpret_cast(internal::get_proc_address("glBeginTransformFeedback")); + if (!internal::glBeginTransformFeedback) return false; + internal::glEndTransformFeedback = reinterpret_cast(internal::get_proc_address("glEndTransformFeedback")); + if (!internal::glEndTransformFeedback) return false; + internal::glBindBufferRange = reinterpret_cast(internal::get_proc_address("glBindBufferRange")); + if (!internal::glBindBufferRange) return false; + internal::glBindBufferBase = reinterpret_cast(internal::get_proc_address("glBindBufferBase")); + if (!internal::glBindBufferBase) return false; + internal::glTransformFeedbackVaryings = reinterpret_cast(internal::get_proc_address("glTransformFeedbackVaryings")); + if (!internal::glTransformFeedbackVaryings) return false; + internal::glGetTransformFeedbackVarying = reinterpret_cast(internal::get_proc_address("glGetTransformFeedbackVarying")); + if (!internal::glGetTransformFeedbackVarying) return false; + internal::glVertexAttribIPointer = reinterpret_cast(internal::get_proc_address("glVertexAttribIPointer")); + if (!internal::glVertexAttribIPointer) return false; + internal::glGetVertexAttribIiv = reinterpret_cast(internal::get_proc_address("glGetVertexAttribIiv")); + if (!internal::glGetVertexAttribIiv) return false; + internal::glGetVertexAttribIuiv = reinterpret_cast(internal::get_proc_address("glGetVertexAttribIuiv")); + if (!internal::glGetVertexAttribIuiv) return false; + internal::glVertexAttribI4i = reinterpret_cast(internal::get_proc_address("glVertexAttribI4i")); + if (!internal::glVertexAttribI4i) return false; + internal::glVertexAttribI4ui = reinterpret_cast(internal::get_proc_address("glVertexAttribI4ui")); + if (!internal::glVertexAttribI4ui) return false; + internal::glVertexAttribI4iv = reinterpret_cast(internal::get_proc_address("glVertexAttribI4iv")); + if (!internal::glVertexAttribI4iv) return false; + internal::glVertexAttribI4uiv = reinterpret_cast(internal::get_proc_address("glVertexAttribI4uiv")); + if (!internal::glVertexAttribI4uiv) return false; + internal::glGetUniformuiv = reinterpret_cast(internal::get_proc_address("glGetUniformuiv")); + if (!internal::glGetUniformuiv) return false; + internal::glGetFragDataLocation = reinterpret_cast(internal::get_proc_address("glGetFragDataLocation")); + if (!internal::glGetFragDataLocation) return false; + internal::glUniform1ui = reinterpret_cast(internal::get_proc_address("glUniform1ui")); + if (!internal::glUniform1ui) return false; + internal::glUniform2ui = reinterpret_cast(internal::get_proc_address("glUniform2ui")); + if (!internal::glUniform2ui) return false; + internal::glUniform3ui = reinterpret_cast(internal::get_proc_address("glUniform3ui")); + if (!internal::glUniform3ui) return false; + internal::glUniform4ui = reinterpret_cast(internal::get_proc_address("glUniform4ui")); + if (!internal::glUniform4ui) return false; + internal::glUniform1uiv = reinterpret_cast(internal::get_proc_address("glUniform1uiv")); + if (!internal::glUniform1uiv) return false; + internal::glUniform2uiv = reinterpret_cast(internal::get_proc_address("glUniform2uiv")); + if (!internal::glUniform2uiv) return false; + internal::glUniform3uiv = reinterpret_cast(internal::get_proc_address("glUniform3uiv")); + if (!internal::glUniform3uiv) return false; + internal::glUniform4uiv = reinterpret_cast(internal::get_proc_address("glUniform4uiv")); + if (!internal::glUniform4uiv) return false; + internal::glClearBufferiv = reinterpret_cast(internal::get_proc_address("glClearBufferiv")); + if (!internal::glClearBufferiv) return false; + internal::glClearBufferuiv = reinterpret_cast(internal::get_proc_address("glClearBufferuiv")); + if (!internal::glClearBufferuiv) return false; + internal::glClearBufferfv = reinterpret_cast(internal::get_proc_address("glClearBufferfv")); + if (!internal::glClearBufferfv) return false; + internal::glClearBufferfi = reinterpret_cast(internal::get_proc_address("glClearBufferfi")); + if (!internal::glClearBufferfi) return false; + internal::glGetStringi = reinterpret_cast(internal::get_proc_address("glGetStringi")); + if (!internal::glGetStringi) return false; + internal::glCopyBufferSubData = reinterpret_cast(internal::get_proc_address("glCopyBufferSubData")); + if (!internal::glCopyBufferSubData) return false; + internal::glGetUniformIndices = reinterpret_cast(internal::get_proc_address("glGetUniformIndices")); + if (!internal::glGetUniformIndices) return false; + internal::glGetActiveUniformsiv = reinterpret_cast(internal::get_proc_address("glGetActiveUniformsiv")); + if (!internal::glGetActiveUniformsiv) return false; + internal::glGetUniformBlockIndex = reinterpret_cast(internal::get_proc_address("glGetUniformBlockIndex")); + if (!internal::glGetUniformBlockIndex) return false; + internal::glGetActiveUniformBlockiv = reinterpret_cast(internal::get_proc_address("glGetActiveUniformBlockiv")); + if (!internal::glGetActiveUniformBlockiv) return false; + internal::glGetActiveUniformBlockName = reinterpret_cast(internal::get_proc_address("glGetActiveUniformBlockName")); + if (!internal::glGetActiveUniformBlockName) return false; + internal::glUniformBlockBinding = reinterpret_cast(internal::get_proc_address("glUniformBlockBinding")); + if (!internal::glUniformBlockBinding) return false; + internal::glDrawArraysInstanced = reinterpret_cast(internal::get_proc_address("glDrawArraysInstanced")); + if (!internal::glDrawArraysInstanced) return false; + internal::glDrawElementsInstanced = reinterpret_cast(internal::get_proc_address("glDrawElementsInstanced")); + if (!internal::glDrawElementsInstanced) return false; + internal::glFenceSync = reinterpret_cast(internal::get_proc_address("glFenceSync")); + if (!internal::glFenceSync) return false; + internal::glIsSync = reinterpret_cast(internal::get_proc_address("glIsSync")); + if (!internal::glIsSync) return false; + internal::glDeleteSync = reinterpret_cast(internal::get_proc_address("glDeleteSync")); + if (!internal::glDeleteSync) return false; + internal::glClientWaitSync = reinterpret_cast(internal::get_proc_address("glClientWaitSync")); + if (!internal::glClientWaitSync) return false; + internal::glWaitSync = reinterpret_cast(internal::get_proc_address("glWaitSync")); + if (!internal::glWaitSync) return false; + internal::glGetInteger64v = reinterpret_cast(internal::get_proc_address("glGetInteger64v")); + if (!internal::glGetInteger64v) return false; + internal::glGetSynciv = reinterpret_cast(internal::get_proc_address("glGetSynciv")); + if (!internal::glGetSynciv) return false; + internal::glGetInteger64i_v = reinterpret_cast(internal::get_proc_address("glGetInteger64i_v")); + if (!internal::glGetInteger64i_v) return false; + internal::glGetBufferParameteri64v = reinterpret_cast(internal::get_proc_address("glGetBufferParameteri64v")); + if (!internal::glGetBufferParameteri64v) return false; + internal::glGenSamplers = reinterpret_cast(internal::get_proc_address("glGenSamplers")); + if (!internal::glGenSamplers) return false; + internal::glDeleteSamplers = reinterpret_cast(internal::get_proc_address("glDeleteSamplers")); + if (!internal::glDeleteSamplers) return false; + internal::glIsSampler = reinterpret_cast(internal::get_proc_address("glIsSampler")); + if (!internal::glIsSampler) return false; + internal::glBindSampler = reinterpret_cast(internal::get_proc_address("glBindSampler")); + if (!internal::glBindSampler) return false; + internal::glSamplerParameteri = reinterpret_cast(internal::get_proc_address("glSamplerParameteri")); + if (!internal::glSamplerParameteri) return false; + internal::glSamplerParameteriv = reinterpret_cast(internal::get_proc_address("glSamplerParameteriv")); + if (!internal::glSamplerParameteriv) return false; + internal::glSamplerParameterf = reinterpret_cast(internal::get_proc_address("glSamplerParameterf")); + if (!internal::glSamplerParameterf) return false; + internal::glSamplerParameterfv = reinterpret_cast(internal::get_proc_address("glSamplerParameterfv")); + if (!internal::glSamplerParameterfv) return false; + internal::glGetSamplerParameteriv = reinterpret_cast(internal::get_proc_address("glGetSamplerParameteriv")); + if (!internal::glGetSamplerParameteriv) return false; + internal::glGetSamplerParameterfv = reinterpret_cast(internal::get_proc_address("glGetSamplerParameterfv")); + if (!internal::glGetSamplerParameterfv) return false; + internal::glVertexAttribDivisor = reinterpret_cast(internal::get_proc_address("glVertexAttribDivisor")); + if (!internal::glVertexAttribDivisor) return false; + internal::glBindTransformFeedback = reinterpret_cast(internal::get_proc_address("glBindTransformFeedback")); + if (!internal::glBindTransformFeedback) return false; + internal::glDeleteTransformFeedbacks = reinterpret_cast(internal::get_proc_address("glDeleteTransformFeedbacks")); + if (!internal::glDeleteTransformFeedbacks) return false; + internal::glGenTransformFeedbacks = reinterpret_cast(internal::get_proc_address("glGenTransformFeedbacks")); + if (!internal::glGenTransformFeedbacks) return false; + internal::glIsTransformFeedback = reinterpret_cast(internal::get_proc_address("glIsTransformFeedback")); + if (!internal::glIsTransformFeedback) return false; + internal::glPauseTransformFeedback = reinterpret_cast(internal::get_proc_address("glPauseTransformFeedback")); + if (!internal::glPauseTransformFeedback) return false; + internal::glResumeTransformFeedback = reinterpret_cast(internal::get_proc_address("glResumeTransformFeedback")); + if (!internal::glResumeTransformFeedback) return false; + internal::glGetProgramBinary = reinterpret_cast(internal::get_proc_address("glGetProgramBinary")); + if (!internal::glGetProgramBinary) return false; + internal::glProgramBinary = reinterpret_cast(internal::get_proc_address("glProgramBinary")); + if (!internal::glProgramBinary) return false; + internal::glProgramParameteri = reinterpret_cast(internal::get_proc_address("glProgramParameteri")); + if (!internal::glProgramParameteri) return false; + internal::glInvalidateFramebuffer = reinterpret_cast(internal::get_proc_address("glInvalidateFramebuffer")); + if (!internal::glInvalidateFramebuffer) return false; + internal::glInvalidateSubFramebuffer = reinterpret_cast(internal::get_proc_address("glInvalidateSubFramebuffer")); + if (!internal::glInvalidateSubFramebuffer) return false; + internal::glTexStorage2D = reinterpret_cast(internal::get_proc_address("glTexStorage2D")); + if (!internal::glTexStorage2D) return false; + internal::glTexStorage3D = reinterpret_cast(internal::get_proc_address("glTexStorage3D")); + if (!internal::glTexStorage3D) return false; + internal::glGetInternalformativ = reinterpret_cast(internal::get_proc_address("glGetInternalformativ")); + if (!internal::glGetInternalformativ) return false; + + // OpenGL ES 3.1 + + internal::glDispatchCompute = reinterpret_cast(internal::get_proc_address("glDispatchCompute")); + if (!internal::glDispatchCompute) return false; + internal::glDispatchComputeIndirect = reinterpret_cast(internal::get_proc_address("glDispatchComputeIndirect")); + if (!internal::glDispatchComputeIndirect) return false; + internal::glDrawArraysIndirect = reinterpret_cast(internal::get_proc_address("glDrawArraysIndirect")); + if (!internal::glDrawArraysIndirect) return false; + internal::glDrawElementsIndirect = reinterpret_cast(internal::get_proc_address("glDrawElementsIndirect")); + if (!internal::glDrawElementsIndirect) return false; + internal::glFramebufferParameteri = reinterpret_cast(internal::get_proc_address("glFramebufferParameteri")); + if (!internal::glFramebufferParameteri) return false; + internal::glGetFramebufferParameteriv = reinterpret_cast(internal::get_proc_address("glGetFramebufferParameteriv")); + if (!internal::glGetFramebufferParameteriv) return false; + internal::glGetProgramInterfaceiv = reinterpret_cast(internal::get_proc_address("glGetProgramInterfaceiv")); + if (!internal::glGetProgramInterfaceiv) return false; + internal::glGetProgramResourceIndex = reinterpret_cast(internal::get_proc_address("glGetProgramResourceIndex")); + if (!internal::glGetProgramResourceIndex) return false; + internal::glGetProgramResourceName = reinterpret_cast(internal::get_proc_address("glGetProgramResourceName")); + if (!internal::glGetProgramResourceName) return false; + internal::glGetProgramResourceiv = reinterpret_cast(internal::get_proc_address("glGetProgramResourceiv")); + if (!internal::glGetProgramResourceiv) return false; + internal::glGetProgramResourceLocation = reinterpret_cast(internal::get_proc_address("glGetProgramResourceLocation")); + if (!internal::glGetProgramResourceLocation) return false; + internal::glUseProgramStages = reinterpret_cast(internal::get_proc_address("glUseProgramStages")); + if (!internal::glUseProgramStages) return false; + internal::glActiveShaderProgram = reinterpret_cast(internal::get_proc_address("glActiveShaderProgram")); + if (!internal::glActiveShaderProgram) return false; + internal::glCreateShaderProgramv = reinterpret_cast(internal::get_proc_address("glCreateShaderProgramv")); + if (!internal::glCreateShaderProgramv) return false; + internal::glBindProgramPipeline = reinterpret_cast(internal::get_proc_address("glBindProgramPipeline")); + if (!internal::glBindProgramPipeline) return false; + internal::glDeleteProgramPipelines = reinterpret_cast(internal::get_proc_address("glDeleteProgramPipelines")); + if (!internal::glDeleteProgramPipelines) return false; + internal::glGenProgramPipelines = reinterpret_cast(internal::get_proc_address("glGenProgramPipelines")); + if (!internal::glGenProgramPipelines) return false; + internal::glIsProgramPipeline = reinterpret_cast(internal::get_proc_address("glIsProgramPipeline")); + if (!internal::glIsProgramPipeline) return false; + internal::glGetProgramPipelineiv = reinterpret_cast(internal::get_proc_address("glGetProgramPipelineiv")); + if (!internal::glGetProgramPipelineiv) return false; + internal::glProgramUniform1i = reinterpret_cast(internal::get_proc_address("glProgramUniform1i")); + if (!internal::glProgramUniform1i) return false; + internal::glProgramUniform2i = reinterpret_cast(internal::get_proc_address("glProgramUniform2i")); + if (!internal::glProgramUniform2i) return false; + internal::glProgramUniform3i = reinterpret_cast(internal::get_proc_address("glProgramUniform3i")); + if (!internal::glProgramUniform3i) return false; + internal::glProgramUniform4i = reinterpret_cast(internal::get_proc_address("glProgramUniform4i")); + if (!internal::glProgramUniform4i) return false; + internal::glProgramUniform1ui = reinterpret_cast(internal::get_proc_address("glProgramUniform1ui")); + if (!internal::glProgramUniform1ui) return false; + internal::glProgramUniform2ui = reinterpret_cast(internal::get_proc_address("glProgramUniform2ui")); + if (!internal::glProgramUniform2ui) return false; + internal::glProgramUniform3ui = reinterpret_cast(internal::get_proc_address("glProgramUniform3ui")); + if (!internal::glProgramUniform3ui) return false; + internal::glProgramUniform4ui = reinterpret_cast(internal::get_proc_address("glProgramUniform4ui")); + if (!internal::glProgramUniform4ui) return false; + internal::glProgramUniform1f = reinterpret_cast(internal::get_proc_address("glProgramUniform1f")); + if (!internal::glProgramUniform1f) return false; + internal::glProgramUniform2f = reinterpret_cast(internal::get_proc_address("glProgramUniform2f")); + if (!internal::glProgramUniform2f) return false; + internal::glProgramUniform3f = reinterpret_cast(internal::get_proc_address("glProgramUniform3f")); + if (!internal::glProgramUniform3f) return false; + internal::glProgramUniform4f = reinterpret_cast(internal::get_proc_address("glProgramUniform4f")); + if (!internal::glProgramUniform4f) return false; + internal::glProgramUniform1iv = reinterpret_cast(internal::get_proc_address("glProgramUniform1iv")); + if (!internal::glProgramUniform1iv) return false; + internal::glProgramUniform2iv = reinterpret_cast(internal::get_proc_address("glProgramUniform2iv")); + if (!internal::glProgramUniform2iv) return false; + internal::glProgramUniform3iv = reinterpret_cast(internal::get_proc_address("glProgramUniform3iv")); + if (!internal::glProgramUniform3iv) return false; + internal::glProgramUniform4iv = reinterpret_cast(internal::get_proc_address("glProgramUniform4iv")); + if (!internal::glProgramUniform4iv) return false; + internal::glProgramUniform1uiv = reinterpret_cast(internal::get_proc_address("glProgramUniform1uiv")); + if (!internal::glProgramUniform1uiv) return false; + internal::glProgramUniform2uiv = reinterpret_cast(internal::get_proc_address("glProgramUniform2uiv")); + if (!internal::glProgramUniform2uiv) return false; + internal::glProgramUniform3uiv = reinterpret_cast(internal::get_proc_address("glProgramUniform3uiv")); + if (!internal::glProgramUniform3uiv) return false; + internal::glProgramUniform4uiv = reinterpret_cast(internal::get_proc_address("glProgramUniform4uiv")); + if (!internal::glProgramUniform4uiv) return false; + internal::glProgramUniform1fv = reinterpret_cast(internal::get_proc_address("glProgramUniform1fv")); + if (!internal::glProgramUniform1fv) return false; + internal::glProgramUniform2fv = reinterpret_cast(internal::get_proc_address("glProgramUniform2fv")); + if (!internal::glProgramUniform2fv) return false; + internal::glProgramUniform3fv = reinterpret_cast(internal::get_proc_address("glProgramUniform3fv")); + if (!internal::glProgramUniform3fv) return false; + internal::glProgramUniform4fv = reinterpret_cast(internal::get_proc_address("glProgramUniform4fv")); + if (!internal::glProgramUniform4fv) return false; + internal::glProgramUniformMatrix2fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix2fv")); + if (!internal::glProgramUniformMatrix2fv) return false; + internal::glProgramUniformMatrix3fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix3fv")); + if (!internal::glProgramUniformMatrix3fv) return false; + internal::glProgramUniformMatrix4fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix4fv")); + if (!internal::glProgramUniformMatrix4fv) return false; + internal::glProgramUniformMatrix2x3fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix2x3fv")); + if (!internal::glProgramUniformMatrix2x3fv) return false; + internal::glProgramUniformMatrix3x2fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix3x2fv")); + if (!internal::glProgramUniformMatrix3x2fv) return false; + internal::glProgramUniformMatrix2x4fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix2x4fv")); + if (!internal::glProgramUniformMatrix2x4fv) return false; + internal::glProgramUniformMatrix4x2fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix4x2fv")); + if (!internal::glProgramUniformMatrix4x2fv) return false; + internal::glProgramUniformMatrix3x4fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix3x4fv")); + if (!internal::glProgramUniformMatrix3x4fv) return false; + internal::glProgramUniformMatrix4x3fv = reinterpret_cast(internal::get_proc_address("glProgramUniformMatrix4x3fv")); + if (!internal::glProgramUniformMatrix4x3fv) return false; + internal::glValidateProgramPipeline = reinterpret_cast(internal::get_proc_address("glValidateProgramPipeline")); + if (!internal::glValidateProgramPipeline) return false; + internal::glGetProgramPipelineInfoLog = reinterpret_cast(internal::get_proc_address("glGetProgramPipelineInfoLog")); + if (!internal::glGetProgramPipelineInfoLog) return false; + internal::glBindImageTexture = reinterpret_cast(internal::get_proc_address("glBindImageTexture")); + if (!internal::glBindImageTexture) return false; + internal::glGetBooleani_v = reinterpret_cast(internal::get_proc_address("glGetBooleani_v")); + if (!internal::glGetBooleani_v) return false; + internal::glMemoryBarrier = reinterpret_cast(internal::get_proc_address("glMemoryBarrier")); + if (!internal::glMemoryBarrier) return false; + internal::glMemoryBarrierByRegion = reinterpret_cast(internal::get_proc_address("glMemoryBarrierByRegion")); + if (!internal::glMemoryBarrierByRegion) return false; + internal::glTexStorage2DMultisample = reinterpret_cast(internal::get_proc_address("glTexStorage2DMultisample")); + if (!internal::glTexStorage2DMultisample) return false; + internal::glGetMultisamplefv = reinterpret_cast(internal::get_proc_address("glGetMultisamplefv")); + if (!internal::glGetMultisamplefv) return false; + internal::glSampleMaski = reinterpret_cast(internal::get_proc_address("glSampleMaski")); + if (!internal::glSampleMaski) return false; + internal::glGetTexLevelParameteriv = reinterpret_cast(internal::get_proc_address("glGetTexLevelParameteriv")); + if (!internal::glGetTexLevelParameteriv) return false; + internal::glGetTexLevelParameterfv = reinterpret_cast(internal::get_proc_address("glGetTexLevelParameterfv")); + if (!internal::glGetTexLevelParameterfv) return false; + internal::glBindVertexBuffer = reinterpret_cast(internal::get_proc_address("glBindVertexBuffer")); + if (!internal::glBindVertexBuffer) return false; + internal::glVertexAttribFormat = reinterpret_cast(internal::get_proc_address("glVertexAttribFormat")); + if (!internal::glVertexAttribFormat) return false; + internal::glVertexAttribIFormat = reinterpret_cast(internal::get_proc_address("glVertexAttribIFormat")); + if (!internal::glVertexAttribIFormat) return false; + internal::glVertexAttribBinding = reinterpret_cast(internal::get_proc_address("glVertexAttribBinding")); + if (!internal::glVertexAttribBinding) return false; + internal::glVertexBindingDivisor = reinterpret_cast(internal::get_proc_address("glVertexBindingDivisor")); + if (!internal::glVertexBindingDivisor) return false; + + // OpenGL ES 3.2 + + internal::glBlendBarrier = reinterpret_cast(internal::get_proc_address("glBlendBarrier")); + if (!internal::glBlendBarrier) return false; + internal::glCopyImageSubData = reinterpret_cast(internal::get_proc_address("glCopyImageSubData")); + if (!internal::glCopyImageSubData) return false; + internal::glDebugMessageControl = reinterpret_cast(internal::get_proc_address("glDebugMessageControl")); + if (!internal::glDebugMessageControl) return false; + internal::glDebugMessageInsert = reinterpret_cast(internal::get_proc_address("glDebugMessageInsert")); + if (!internal::glDebugMessageInsert) return false; + internal::glDebugMessageCallback = reinterpret_cast(internal::get_proc_address("glDebugMessageCallback")); + if (!internal::glDebugMessageCallback) return false; + internal::glGetDebugMessageLog = reinterpret_cast(internal::get_proc_address("glGetDebugMessageLog")); + if (!internal::glGetDebugMessageLog) return false; + internal::glPushDebugGroup = reinterpret_cast(internal::get_proc_address("glPushDebugGroup")); + if (!internal::glPushDebugGroup) return false; + internal::glPopDebugGroup = reinterpret_cast(internal::get_proc_address("glPopDebugGroup")); + if (!internal::glPopDebugGroup) return false; + internal::glObjectLabel = reinterpret_cast(internal::get_proc_address("glObjectLabel")); + if (!internal::glObjectLabel) return false; + internal::glGetObjectLabel = reinterpret_cast(internal::get_proc_address("glGetObjectLabel")); + if (!internal::glGetObjectLabel) return false; + internal::glObjectPtrLabel = reinterpret_cast(internal::get_proc_address("glObjectPtrLabel")); + if (!internal::glObjectPtrLabel) return false; + internal::glGetObjectPtrLabel = reinterpret_cast(internal::get_proc_address("glGetObjectPtrLabel")); + if (!internal::glGetObjectPtrLabel) return false; + internal::glGetPointerv = reinterpret_cast(internal::get_proc_address("glGetPointerv")); + if (!internal::glGetPointerv) return false; + internal::glEnablei = reinterpret_cast(internal::get_proc_address("glEnablei")); + if (!internal::glEnablei) return false; + internal::glDisablei = reinterpret_cast(internal::get_proc_address("glDisablei")); + if (!internal::glDisablei) return false; + internal::glBlendEquationi = reinterpret_cast(internal::get_proc_address("glBlendEquationi")); + if (!internal::glBlendEquationi) return false; + internal::glBlendEquationSeparatei = reinterpret_cast(internal::get_proc_address("glBlendEquationSeparatei")); + if (!internal::glBlendEquationSeparatei) return false; + internal::glBlendFunci = reinterpret_cast(internal::get_proc_address("glBlendFunci")); + if (!internal::glBlendFunci) return false; + internal::glBlendFuncSeparatei = reinterpret_cast(internal::get_proc_address("glBlendFuncSeparatei")); + if (!internal::glBlendFuncSeparatei) return false; + internal::glColorMaski = reinterpret_cast(internal::get_proc_address("glColorMaski")); + if (!internal::glColorMaski) return false; + internal::glIsEnabledi = reinterpret_cast(internal::get_proc_address("glIsEnabledi")); + if (!internal::glIsEnabledi) return false; + internal::glDrawElementsBaseVertex = reinterpret_cast(internal::get_proc_address("glDrawElementsBaseVertex")); + if (!internal::glDrawElementsBaseVertex) return false; + internal::glDrawRangeElementsBaseVertex = reinterpret_cast(internal::get_proc_address("glDrawRangeElementsBaseVertex")); + if (!internal::glDrawRangeElementsBaseVertex) return false; + internal::glDrawElementsInstancedBaseVertex = reinterpret_cast(internal::get_proc_address("glDrawElementsInstancedBaseVertex")); + if (!internal::glDrawElementsInstancedBaseVertex) return false; + internal::glFramebufferTexture = reinterpret_cast(internal::get_proc_address("glFramebufferTexture")); + if (!internal::glFramebufferTexture) return false; + internal::glPrimitiveBoundingBox = reinterpret_cast(internal::get_proc_address("glPrimitiveBoundingBox")); + if (!internal::glPrimitiveBoundingBox) return false; + internal::glGetGraphicsResetStatus = reinterpret_cast(internal::get_proc_address("glGetGraphicsResetStatus")); + if (!internal::glGetGraphicsResetStatus) return false; + internal::glReadnPixels = reinterpret_cast(internal::get_proc_address("glReadnPixels")); + if (!internal::glReadnPixels) return false; + internal::glGetnUniformfv = reinterpret_cast(internal::get_proc_address("glGetnUniformfv")); + if (!internal::glGetnUniformfv) return false; + internal::glGetnUniformiv = reinterpret_cast(internal::get_proc_address("glGetnUniformiv")); + if (!internal::glGetnUniformiv) return false; + internal::glGetnUniformuiv = reinterpret_cast(internal::get_proc_address("glGetnUniformuiv")); + if (!internal::glGetnUniformuiv) return false; + internal::glMinSampleShading = reinterpret_cast(internal::get_proc_address("glMinSampleShading")); + if (!internal::glMinSampleShading) return false; + internal::glPatchParameteri = reinterpret_cast(internal::get_proc_address("glPatchParameteri")); + if (!internal::glPatchParameteri) return false; + internal::glTexParameterIiv = reinterpret_cast(internal::get_proc_address("glTexParameterIiv")); + if (!internal::glTexParameterIiv) return false; + internal::glTexParameterIuiv = reinterpret_cast(internal::get_proc_address("glTexParameterIuiv")); + if (!internal::glTexParameterIuiv) return false; + internal::glGetTexParameterIiv = reinterpret_cast(internal::get_proc_address("glGetTexParameterIiv")); + if (!internal::glGetTexParameterIiv) return false; + internal::glGetTexParameterIuiv = reinterpret_cast(internal::get_proc_address("glGetTexParameterIuiv")); + if (!internal::glGetTexParameterIuiv) return false; + internal::glSamplerParameterIiv = reinterpret_cast(internal::get_proc_address("glSamplerParameterIiv")); + if (!internal::glSamplerParameterIiv) return false; + internal::glSamplerParameterIuiv = reinterpret_cast(internal::get_proc_address("glSamplerParameterIuiv")); + if (!internal::glSamplerParameterIuiv) return false; + internal::glGetSamplerParameterIiv = reinterpret_cast(internal::get_proc_address("glGetSamplerParameterIiv")); + if (!internal::glGetSamplerParameterIiv) return false; + internal::glGetSamplerParameterIuiv = reinterpret_cast(internal::get_proc_address("glGetSamplerParameterIuiv")); + if (!internal::glGetSamplerParameterIuiv) return false; + internal::glTexBuffer = reinterpret_cast(internal::get_proc_address("glTexBuffer")); + if (!internal::glTexBuffer) return false; + internal::glTexBufferRange = reinterpret_cast(internal::get_proc_address("glTexBufferRange")); + if (!internal::glTexBufferRange) return false; + internal::glTexStorage3DMultisample = reinterpret_cast(internal::get_proc_address("glTexStorage3DMultisample")); + if (!internal::glTexStorage3DMultisample) return false; + + return true; + } + + static bool load_ext_GL_ARB_compute_shader() + { + + return true; + } + + static bool load_ext_GL_ARB_shader_image_load_store() + { + + return true; + } + + static bool load_ext_GL_ARB_texture_filter_anisotropic() + { + + return true; + } + + static std::unordered_set extensions; + bool initialize() + { + if (!load_core()) return false; + + GLint num_extensions; + internal::glGetIntegerv(0x821D, &num_extensions); + for (GLint i = 0; i < num_extensions; ++i) + extensions.insert(reinterpret_cast(internal::glGetStringi(0x1F03, i))); + + if (extensions.count("GL_ARB_compute_shader") > 0) + ext_GL_ARB_compute_shader_loaded = load_ext_GL_ARB_compute_shader(); + if (extensions.count("GL_ARB_shader_image_load_store") > 0) + ext_GL_ARB_shader_image_load_store_loaded = load_ext_GL_ARB_shader_image_load_store(); + if (extensions.count("GL_ARB_texture_filter_anisotropic") > 0) + ext_GL_ARB_texture_filter_anisotropic_loaded = load_ext_GL_ARB_texture_filter_anisotropic(); + + return true; + } + + const char * api(){ return "OpenGL ES"; } + + int major_version(){ return 3; } + + int minor_version(){ return 2; } + + bool has_extension(const char * name){ return extensions.contains(name); } + + bool ext_ARB_compute_shader(){ return ext_GL_ARB_compute_shader_loaded; } + bool ext_ARB_shader_image_load_store(){ return ext_GL_ARB_shader_image_load_store_loaded; } + bool ext_ARB_texture_filter_anisotropic(){ return ext_GL_ARB_texture_filter_anisotropic_loaded; } + + const char * shader_prefix() + { + return R"(#version 320 es + +precision highp int; +precision highp float; +precision highp sampler2D; +precision highp usampler2D; + +)"; + } + + } // namespace sys + +} // namespace gl + diff --git a/libs/gfx/gl-loader-generator-config.json b/libs/gfx/gl-loader-generator-config-gl33.json similarity index 100% rename from libs/gfx/gl-loader-generator-config.json rename to libs/gfx/gl-loader-generator-config-gl33.json diff --git a/libs/gfx/gl-loader-generator-config-gles32.json b/libs/gfx/gl-loader-generator-config-gles32.json new file mode 100644 index 00000000..6c70f62e --- /dev/null +++ b/libs/gfx/gl-loader-generator-config-gles32.json @@ -0,0 +1,21 @@ +{ + "spec_file": "gl.xml", + "api": "gles2", + "version": "3.2", + "profile": "core", + "extensions": [ + "ARB_texture_filter_anisotropic", + "ARB_compute_shader", + "ARB_shader_image_load_store" + ], + "indent": "\t", + "namespace": "gl", + "loader_namespace": "sys", + "internal_namespace": "internal", + "internal_prefix": "", + "undef": 4, + "strip": true, + "out_header": "gl.hpp", + "out_source": "gl.cpp", + "include": "" +} diff --git a/libs/gfx/include/psemek/gfx/attribs.hpp b/libs/gfx/include/psemek/gfx/attribs.hpp index ea0c9d0a..a3d9efab 100644 --- a/libs/gfx/include/psemek/gfx/attribs.hpp +++ b/libs/gfx/include/psemek/gfx/attribs.hpp @@ -171,6 +171,7 @@ namespace psemek::gfx static constexpr GLboolean normalized = gl::FALSE; }; +#ifndef PSEMEK_GLES template <> struct attrib_traits { @@ -181,6 +182,7 @@ namespace psemek::gfx static constexpr bool integer = false; static constexpr GLboolean normalized = gl::FALSE; }; +#endif template struct attrib_traits> diff --git a/libs/gfx/include/psemek/gfx/buffer.hpp b/libs/gfx/include/psemek/gfx/buffer.hpp index a0daad75..400f0fe2 100644 --- a/libs/gfx/include/psemek/gfx/buffer.hpp +++ b/libs/gfx/include/psemek/gfx/buffer.hpp @@ -160,7 +160,7 @@ namespace psemek::gfx return std::static_pointer_cast(p); bind(); - std::shared_ptr p(reinterpret_cast(gl::MapBuffer(Target, gl::WRITE_ONLY)), [this](T *){ + std::shared_ptr p(reinterpret_cast(gl::MapBufferRange(Target, 0, size_, gl::WRITE_ONLY)), [this](T *){ bind(); gl::UnmapBuffer(Target); }); diff --git a/libs/gfx/include/psemek/gfx/framebuffer.hpp b/libs/gfx/include/psemek/gfx/framebuffer.hpp index 6e1f61b5..abc27ff3 100644 --- a/libs/gfx/include/psemek/gfx/framebuffer.hpp +++ b/libs/gfx/include/psemek/gfx/framebuffer.hpp @@ -32,27 +32,30 @@ namespace psemek::gfx void reset(); - void color(texture_1d const & tex, int attachment = 0); void color(texture_2d const & tex, int attachment = 0); - void color(texture_2d_multisample const & tex, int attachment = 0); - void color(texture_3d const & tex, int layer, int attachment = 0); void color(texture_2d_array const & tex, int layer, int attachment = 0); void color(texture_cubemap const & tex, int attachment = 0); void color(texture_cubemap const & tex, int face, int attachment = 0); void color(renderbuffer const & rb, int attachment = 0); void depth(texture_2d const & tex); - void depth(texture_2d_multisample const & tex); void depth(texture_2d_array const & tex, int layer); void depth(texture_cubemap const & tex); void depth(texture_cubemap const & tex, int face); void depth(renderbuffer const & rb); void depth_stencil(texture_2d const & tex); - void depth_stencil(texture_2d_multisample const & tex); void depth_stencil(texture_2d_array const & tex, int layer); void depth_stencil(texture_cubemap const & tex); void depth_stencil(texture_cubemap const & tex, int face); void depth_stencil(renderbuffer const & rb); +#ifndef PSEMEK_GLES + void color(texture_1d const & tex, int attachment = 0); + void color(texture_2d_multisample const & tex, int attachment = 0); + void color(texture_3d const & tex, int layer, int attachment = 0); + void depth(texture_2d_multisample const & tex); + void depth_stencil(texture_2d_multisample const & tex); +#endif + GLenum status() const; bool complete() const; void assert_complete(std::string_view name = {}) const; diff --git a/libs/gfx/include/psemek/gfx/pixel.hpp b/libs/gfx/include/psemek/gfx/pixel.hpp index 2c26b4c2..d30de69b 100644 --- a/libs/gfx/include/psemek/gfx/pixel.hpp +++ b/libs/gfx/include/psemek/gfx/pixel.hpp @@ -93,6 +93,7 @@ namespace psemek::gfx // Normalized 10-bit +#ifndef PSEMEK_GLES template <> struct pixel_traits> { @@ -153,6 +154,8 @@ namespace psemek::gfx static constexpr GLenum type = gl::UNSIGNED_SHORT; }; +#endif + // Normalized 10-10-10-2 template <> @@ -442,7 +445,7 @@ namespace psemek::gfx { static constexpr GLenum internal_format = gl::DEPTH_COMPONENT24; static constexpr GLenum format = gl::DEPTH_COMPONENT; - static constexpr GLenum type = gl::UNSIGNED_BYTE; + static constexpr GLenum type = gl::UNSIGNED_INT; }; template <> @@ -450,7 +453,7 @@ namespace psemek::gfx { static constexpr GLenum internal_format = gl::DEPTH24_STENCIL8; static constexpr GLenum format = gl::DEPTH_STENCIL; - static constexpr GLenum type = gl::UNSIGNED_BYTE; + static constexpr GLenum type = gl::UNSIGNED_INT_24_8; }; std::size_t pixel_size(GLint internal_format); diff --git a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp index 96474a3e..530eb87d 100644 --- a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp +++ b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp @@ -15,6 +15,7 @@ namespace psemek::gfx { +#ifndef PSEMEK_GLES struct deferred_renderer { deferred_renderer(); @@ -134,5 +135,6 @@ namespace psemek::gfx private: psemek_declare_pimpl }; +#endif } diff --git a/libs/gfx/include/psemek/gfx/texture.hpp b/libs/gfx/include/psemek/gfx/texture.hpp index 5352cfd4..5e2a698f 100644 --- a/libs/gfx/include/psemek/gfx/texture.hpp +++ b/libs/gfx/include/psemek/gfx/texture.hpp @@ -59,6 +59,7 @@ namespace psemek::gfx template void load_srgb(util::array const & p); +#ifndef PSEMEK_GLES void pixels(GLenum format, GLenum type, void * data, int layer = 0) const; template @@ -66,6 +67,7 @@ namespace psemek::gfx template Pixmap pixels(int layer = 0) const; +#endif static basic_texture from_data(GLint internal_format, geom::vector const & size, GLenum format, GLenum type, const void * data); @@ -93,20 +95,23 @@ namespace psemek::gfx explicit basic_texture(std::nullptr_t); }; - using texture_1d = basic_texture<1, gl::TEXTURE_1D>; - using texture_1d_array = basic_texture<2, gl::TEXTURE_1D_ARRAY>; using texture_2d = basic_texture<2, gl::TEXTURE_2D>; using texture_2d_array = basic_texture<3, gl::TEXTURE_2D_ARRAY>; using texture_3d = basic_texture<3, gl::TEXTURE_3D>; - extern template struct basic_texture<1, gl::TEXTURE_1D>; - extern template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>; extern template struct basic_texture<2, gl::TEXTURE_2D>; extern template struct basic_texture<3, gl::TEXTURE_2D_ARRAY>; extern template struct basic_texture<3, gl::TEXTURE_3D>; extern template struct basic_texture<2, gl::TEXTURE_CUBE_MAP>; +#ifndef PSEMEK_GLES + using texture_1d = basic_texture<1, gl::TEXTURE_1D>; + using texture_1d_array = basic_texture<2, gl::TEXTURE_1D_ARRAY>; + extern template struct basic_texture<1, gl::TEXTURE_1D>; + extern template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>; +#endif + struct texture_cubemap : basic_texture<2, gl::TEXTURE_CUBE_MAP> { @@ -165,6 +170,7 @@ namespace psemek::gfx {} }; +#ifndef PSEMEK_GLES struct texture_2d_multisample { texture_2d_multisample(); @@ -207,6 +213,7 @@ namespace psemek::gfx explicit texture_2d_multisample(std::nullptr_t); }; +#endif struct buffer_texture { @@ -350,7 +357,9 @@ namespace psemek::gfx if constexpr (D == 1) { +#ifndef PSEMEK_GLES gl::TexImage1D(Target, 0, internal_format, size[0], 0, format, type, data); +#endif } else if (D == 2) { @@ -399,6 +408,7 @@ namespace psemek::gfx load_srgb(size, p.data()); } +#ifndef PSEMEK_GLES template void basic_texture::pixels(GLenum format, GLenum type, void * data, int layer) const { @@ -426,6 +436,7 @@ namespace psemek::gfx pixels(pixmap, layer); return pixmap; } +#endif template basic_texture basic_texture::from_data(GLint internal_format, geom::vector const & size, GLenum format, GLenum type, const void * data) @@ -524,11 +535,13 @@ namespace psemek::gfx basic_texture::basic_texture(std::nullptr_t) {} +#ifndef PSEMEK_GLES template void texture_2d_multisample::load(geom::vector const & size, int samples, bool fixed_sample_locations) { load(pixel_traits::internal_format, size, samples, fixed_sample_locations); } +#endif inline buffer_texture::buffer_texture() { @@ -625,10 +638,12 @@ namespace psemek::gfx { switch (Target) { +#ifndef PSEMEK_GLES case gl::TEXTURE_1D: case gl::TEXTURE_1D_ARRAY: mipmap_factor = 2.f; break; +#endif case gl::TEXTURE_2D: case gl::TEXTURE_2D_ARRAY: mipmap_factor = 4.f / 3.f; diff --git a/libs/gfx/source/framebuffer.cpp b/libs/gfx/source/framebuffer.cpp index c01d462a..93bf87f1 100644 --- a/libs/gfx/source/framebuffer.cpp +++ b/libs/gfx/source/framebuffer.cpp @@ -67,11 +67,13 @@ namespace psemek::gfx id_ = 0; } +#ifndef PSEMEK_GLES void framebuffer::color(texture_1d const & tex, int attachment) { bind(); gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::COLOR_ATTACHMENT0 + attachment, tex.target, tex.id(), 0); } +#endif void framebuffer::color(texture_2d const & tex, int attachment) { @@ -79,6 +81,7 @@ namespace psemek::gfx gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::COLOR_ATTACHMENT0 + attachment, tex.target, tex.id(), 0); } +#ifndef PSEMEK_GLES void framebuffer::color(texture_2d_multisample const & tex, int attachment) { bind(); @@ -90,6 +93,7 @@ namespace psemek::gfx bind(); gl::FramebufferTexture3D(gl::DRAW_FRAMEBUFFER, gl::COLOR_ATTACHMENT0 + attachment, tex.target, tex.id(), 0, layer); } +#endif void framebuffer::color(texture_2d_array const & tex, int layer, int attachment) { @@ -121,11 +125,13 @@ namespace psemek::gfx gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::DEPTH_ATTACHMENT, tex.target, tex.id(), 0); } +#ifndef PSEMEK_GLES void framebuffer::depth(texture_2d_multisample const & tex) { bind(); gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::DEPTH_ATTACHMENT, tex.target, tex.id(), 0); } +#endif void framebuffer::depth(texture_2d_array const & tex, int layer) { @@ -157,11 +163,13 @@ namespace psemek::gfx gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::DEPTH_STENCIL_ATTACHMENT, tex.target, tex.id(), 0); } +#ifndef PSEMEK_GLES void framebuffer::depth_stencil(texture_2d_multisample const & tex) { bind(); gl::FramebufferTexture2D(gl::DRAW_FRAMEBUFFER, gl::DEPTH_STENCIL_ATTACHMENT, tex.target, tex.id(), 0); } +#endif void framebuffer::depth_stencil(texture_2d_array const & tex, int layer) { diff --git a/libs/gfx/source/painter.cpp b/libs/gfx/source/painter.cpp index 81f8c25f..a43adec0 100644 --- a/libs/gfx/source/painter.cpp +++ b/libs/gfx/source/painter.cpp @@ -7,8 +7,7 @@ #include static const char vertex_source[] = -R"(#version 330 - +R"( uniform mat4 u_transform; layout (location = 0) in vec4 in_position; @@ -24,8 +23,7 @@ void main() )"; static const char fragment_source[] = -R"(#version 330 - +R"( in vec4 color; out vec4 out_color; @@ -37,8 +35,7 @@ void main() )"; static const char text_vertex_source[] = -R"(#version 330 - +R"( uniform mat4 u_transform; uniform uvec2 u_texture_size; @@ -58,8 +55,7 @@ void main() )"; static const char text_fragment_source[] = -R"(#version 330 - +R"( uniform sampler2D u_texture; in vec4 color; @@ -74,8 +70,7 @@ void main() )"; static const char texture_vertex_source[] = -R"(#version 330 - +R"( uniform mat4 u_transform; layout (location = 0) in vec4 in_position; @@ -91,8 +86,7 @@ void main() )"; static const char texture_fragment_source[] = -R"(#version 330 - +R"( uniform sampler2D u_texture; uniform vec4 u_color; @@ -111,6 +105,8 @@ void main() namespace psemek::gfx { + static std::string shader_prefix = gl::sys::shader_prefix(); + struct painter::impl { struct vertex @@ -132,9 +128,9 @@ namespace psemek::gfx geom::point texcoord; }; - gfx::program program{vertex_source, fragment_source}; - gfx::program text_program{text_vertex_source, text_fragment_source}; - gfx::program texture_program{texture_vertex_source, texture_fragment_source}; + gfx::program program{shader_prefix + vertex_source, shader_prefix + fragment_source}; + gfx::program text_program{shader_prefix + text_vertex_source, shader_prefix + text_fragment_source}; + gfx::program texture_program{shader_prefix + texture_vertex_source, shader_prefix + texture_fragment_source}; gfx::mesh mesh; gfx::mesh text_mesh; gfx::mesh texture_mesh; diff --git a/libs/gfx/source/pixel.cpp b/libs/gfx/source/pixel.cpp index 39d01206..ebda2ab2 100644 --- a/libs/gfx/source/pixel.cpp +++ b/libs/gfx/source/pixel.cpp @@ -13,7 +13,9 @@ namespace psemek::gfx case gl::RGBA32F: return 16; case gl::RGBA32I: return 16; case gl::RGBA32UI: return 16; +#ifndef PSEMEK_GLES case gl::RGBA16: return 8; +#endif case gl::RGBA16F: return 8; case gl::RGBA16I: return 8; case gl::RGBA16UI: return 8; @@ -26,7 +28,9 @@ namespace psemek::gfx case gl::RG32F: return 8; case gl::RG32I: return 8; case gl::RG32UI: return 8; +#ifndef PSEMEK_GLES case gl::RG16: return 4; +#endif case gl::RG16F: return 4; case gl::RGB16I: return 4; case gl::RGB16UI: return 4; @@ -42,23 +46,33 @@ namespace psemek::gfx case gl::R8: return 1; case gl::R8I: return 1; case gl::R8UI: return 1; +#ifndef PSEMEK_GLES case gl::RGBA16_SNORM: return 8; +#endif case gl::RGBA8_SNORM: return 4; case gl::RGB32F: return 12; case gl::RGB32I: return 12; case gl::RGB32UI: return 12; +#ifndef PSEMEK_GLES case gl::RGB16_SNORM: return 6; +#endif case gl::RGB16F: return 6; +#ifndef PSEMEK_GLES case gl::RGB16: return 6; +#endif case gl::RGB8_SNORM: return 3; case gl::RGB8: return 3; case gl::RGB8I: return 3; case gl::RGB8UI: return 3; case gl::SRGB8: return 3; case gl::RGB9_E5: return 4; +#ifndef PSEMEK_GLES case gl::RG16_SNORM: return 4; +#endif case gl::RG8_SNORM: return 2; +#ifndef PSEMEK_GLES case gl::R16_SNORM: return 2; +#endif case gl::R8_SNORM: return 1; case gl::DEPTH_COMPONENT32F: return 4; case gl::DEPTH_COMPONENT24: return 3; @@ -66,10 +80,12 @@ namespace psemek::gfx case gl::DEPTH32F_STENCIL8: return 5; case gl::DEPTH24_STENCIL8: return 4; // Assume uncompressed size as an upper bound +#ifndef PSEMEK_GLES case gl::COMPRESSED_RG_RGTC2: return 2; case gl::COMPRESSED_SIGNED_RG_RGTC2: return 2; case gl::COMPRESSED_RED_RGTC1: return 1; case gl::COMPRESSED_SIGNED_RED_RGTC1: return 1; +#endif }; log::warning() << "Unknown pixel format: 0x" << std::hex << internal_format; diff --git a/libs/gfx/source/query.cpp b/libs/gfx/source/query.cpp index b71f5967..3a5010f6 100644 --- a/libs/gfx/source/query.cpp +++ b/libs/gfx/source/query.cpp @@ -39,11 +39,11 @@ namespace psemek::gfx { if (!callbacks_[i]) continue; - GLint result; - gl::GetQueryObjectiv(ids_[i], gl::QUERY_RESULT_AVAILABLE, &result); + GLuint result; + gl::GetQueryObjectuiv(ids_[i], gl::QUERY_RESULT_AVAILABLE, &result); if (result == gl::TRUE) { - gl::GetQueryObjectiv(ids_[i], gl::QUERY_RESULT, &result); + gl::GetQueryObjectuiv(ids_[i], gl::QUERY_RESULT, &result); callbacks_[i](result); callbacks_[i].reset(); } diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index 32c96831..7716718f 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -1,5 +1,7 @@ #include +#ifndef PSEMEK_GLES + #include #include #include @@ -1972,3 +1974,5 @@ void main(){} } } + +#endif diff --git a/libs/gfx/source/texture.cpp b/libs/gfx/source/texture.cpp index a33ceb7c..bb0c46cd 100644 --- a/libs/gfx/source/texture.cpp +++ b/libs/gfx/source/texture.cpp @@ -4,8 +4,10 @@ namespace psemek::gfx { +#ifndef PSEMEK_GLES template struct basic_texture<1, gl::TEXTURE_1D>; template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>; +#endif template struct basic_texture<2, gl::TEXTURE_2D>; template struct basic_texture<3, gl::TEXTURE_2D_ARRAY>; template struct basic_texture<3, gl::TEXTURE_3D>; @@ -41,17 +43,21 @@ namespace psemek::gfx size_ = size; } +#ifndef PSEMEK_GLES void texture_cubemap::pixels(int f, GLenum format, GLenum type, void * data) const { bind(); gl::GetTexImage(face_to_gl(f), 0, format, type, data); } +#endif GLenum texture_cubemap::face_to_gl(int f) { return gl::TEXTURE_CUBE_MAP_POSITIVE_X + f; } +#ifndef PSEMEK_GLES + texture_2d_multisample::texture_2d_multisample() { gl::GenTextures(1, &id_); @@ -120,4 +126,6 @@ namespace psemek::gfx texture_2d_multisample::texture_2d_multisample(std::nullptr_t) {} +#endif + } diff --git a/libs/log/CMakeLists.txt b/libs/log/CMakeLists.txt index fbc3e6bc..54d3fa8c 100644 --- a/libs/log/CMakeLists.txt +++ b/libs/log/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(Threads REQUIRED) - file(GLOB_RECURSE PSEMEK_LOG_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "include/*.hpp") file(GLOB_RECURSE PSEMEK_LOG_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "source/*.cpp") diff --git a/libs/util/CMakeLists.txt b/libs/util/CMakeLists.txt index 7821099f..b6ac1849 100644 --- a/libs/util/CMakeLists.txt +++ b/libs/util/CMakeLists.txt @@ -1,4 +1,3 @@ -find_package(Threads REQUIRED) find_package(Boost REQUIRED) file(GLOB_RECURSE PSEMEK_UTIL_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "include/*.hpp") diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt index 17c477a4..32ec3027 100644 --- a/package/CMakeLists.txt +++ b/package/CMakeLists.txt @@ -5,10 +5,12 @@ set(PSEMEK_PACKAGE_VERSION_SUFFIX "" CACHE STRING "Packaging version suffix") if(PSEMEK_PACKAGE_MODE) if(WIN32) set(PSEMEK_PACKAGE_SUFFIX_RAW win) - elseif(UNIX AND (NOT APPLE)) - set(PSEMEK_PACKAGE_SUFFIX_RAW linux) - elseif(UNIX AND APPLE) + elseif(APPLE) set(PSEMEK_PACKAGE_SUFFIX_RAW mac) + elseif(ANDROID) + set(PSEMEK_PACKAGE_SUFFIX_RAW android) + elseif(UNIX) + set(PSEMEK_PACKAGE_SUFFIX_RAW linux) else() message(FATAL "Uknown system for packaging") endif() @@ -31,15 +33,23 @@ function(psemek_package_output_path target outvar) set(${outvar} "${CMAKE_CURRENT_LIST_DIR}/${PSEMEK_PACKAGE_OUTPUT_PATH}/${target}${PSEMEK_PACKAGE_VERSION_SUFFIX}-${PSEMEK_PACKAGE_SUFFIX}.zip" PARENT_SCOPE) endfunction() -function(psemek_add_executable_impl target link_backend) +function(psemek_add_executable_impl target is_application) if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_TARGET) - add_executable(${target} ${ARGN}) + if(${PSEMEK_PACKAGE_AS_LIBRARY} AND ${is_application}) + add_library(${target} SHARED ${ARGN}) + else() + add_executable(${target} ${ARGN}) + endif() target_link_libraries(${target} PUBLIC psemek) - if(${link_backend}) - target_link_libraries(${target} PUBLIC psemek-backend) + if(${is_application}) + target_link_libraries(${target} PUBLIC + "-Wl,--whole-archive $ -Wl,--no-whole-archive" + ${PSEMEK_BACKEND_LIBRARY}) endif() + install(TARGETS ${target}) + if(PSEMEK_PACKAGE_MODE) target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS}) @@ -55,18 +65,20 @@ function(psemek_add_executable_impl target link_backend) COMMAND ${CMAKE_STRIP} $ ) - if(UNIX AND (NOT APPLE)) + if(UNIX AND (NOT APPLE) AND (NOT ANDROID)) add_custom_command(TARGET ${target} POST_BUILD COMMAND chrpath -r . $ ) endif() - psemek_package_output_path(${target} _OUTPUT_PATH) + if(NOT ANDROID) + psemek_package_output_path(${target} _OUTPUT_PATH) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND echo Packaging target ${target} into ${_OUTPUT_PATH} - COMMAND zip -v "${_OUTPUT_PATH}" -j $ ${PSEMEK_PACKAGE_COPY_FILES} - ) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND echo Packaging target ${target} into ${_OUTPUT_PATH} + COMMAND zip -v "${_OUTPUT_PATH}" -j $ ${PSEMEK_PACKAGE_COPY_FILES} + ) + endif() endif() endif() endfunction() @@ -96,7 +108,7 @@ function(psemek_add_build_tool target link_psemek) find_file(_LOCATION ${target} PATHS "${PSEMEK_PACKAGE_TOOLS_PATH}/bin") message(STATUS "Found ${target}: ${_LOCATION}") if(NOT _LOCATION) - message(FATAL "Could not locate ${target} build tool in ${PSEMEK_PACKAGE_TOOLS_PATH}") + message(FATAL_ERROR "Could not locate ${target} build tool in ${PSEMEK_PACKAGE_TOOLS_PATH}") endif() add_executable(${target} IMPORTED GLOBAL) set_target_properties(${target} PROPERTIES IMPORTED_LOCATION ${_LOCATION}) @@ -138,12 +150,16 @@ endfunction() function(psemek_package_files target) if(PSEMEK_PACKAGE_MODE) if(PSEMEK_PACKAGE_TARGET) - psemek_package_output_path(${target} _OUTPUT_PATH) + if(ANDROID) - add_custom_command(TARGET ${target} POST_BUILD - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - COMMAND zip -v "${_OUTPUT_PATH}" -r ${ARGN} - ) + else() + psemek_package_output_path(${target} _OUTPUT_PATH) + + add_custom_command(TARGET ${target} POST_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMAND zip -v "${_OUTPUT_PATH}" -r ${ARGN} + ) + endif() endif() else() foreach(_FILE ${ARGN})