chore: add necessary imgui files for opengl3
This commit is contained in:
		
							
								
								
									
										897
									
								
								libs/imgui/backends/imgui_impl_opengl3.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								libs/imgui/backends/imgui_impl_opengl3.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| // dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline | ||||
| // - Desktop GL: 2.x 3.x 4.x | ||||
| // - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0) | ||||
| // This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) | ||||
|  | ||||
| // Implemented features: | ||||
| //  [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! | ||||
| //  [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices. | ||||
|  | ||||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. | ||||
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. | ||||
| // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. | ||||
| // Read online: https://github.com/ocornut/imgui/tree/master/docs | ||||
|  | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2022-11-09: OpenGL: Reverted use of glBufferSubData(), too many corruptions issues + old issues seemingly can't be reproed with Intel drivers nowadays (revert 2021-12-15 and 2022-05-23 changes). | ||||
| //  2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. | ||||
| //  2022-09-27: OpenGL: Added ability to '#define IMGUI_IMPL_OPENGL_DEBUG'. | ||||
| //  2022-05-23: OpenGL: Reworking 2021-12-15 "Using buffer orphaning" so it only happens on Intel GPU, seems to cause problems otherwise. (#4468, #4825, #4832, #5127). | ||||
| //  2022-05-13: OpenGL: Fix state corruption on OpenGL ES 2.0 due to not preserving GL_ELEMENT_ARRAY_BUFFER_BINDING and vertex attribute states. | ||||
| //  2021-12-15: OpenGL: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers. | ||||
| //  2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions. | ||||
| //  2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader. | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| //  2021-06-25: OpenGL: Use OES_vertex_array extension on Emscripten + backup/restore current state. | ||||
| //  2021-06-21: OpenGL: Destroy individual vertex/fragment shader objects right after they are linked into the main shader. | ||||
| //  2021-05-24: OpenGL: Access GL_CLIP_ORIGIN when "GL_ARB_clip_control" extension is detected, inside of just OpenGL 4.5 version. | ||||
| //  2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) | ||||
| //  2021-04-06: OpenGL: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5 or greater. | ||||
| //  2021-02-18: OpenGL: Change blending equation to preserve alpha in output buffer. | ||||
| //  2021-01-03: OpenGL: Backup, setup and restore GL_STENCIL_TEST state. | ||||
| //  2020-10-23: OpenGL: Backup, setup and restore GL_PRIMITIVE_RESTART state. | ||||
| //  2020-10-15: OpenGL: Use glGetString(GL_VERSION) instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x) | ||||
| //  2020-09-17: OpenGL: Fix to avoid compiling/calling glBindSampler() on ES or pre 3.3 context which have the defines set by a loader. | ||||
| //  2020-07-10: OpenGL: Added support for glad2 OpenGL loader. | ||||
| //  2020-05-08: OpenGL: Made default GLSL version 150 (instead of 130) on OSX. | ||||
| //  2020-04-21: OpenGL: Fixed handling of glClipControl(GL_UPPER_LEFT) by inverting projection matrix. | ||||
| //  2020-04-12: OpenGL: Fixed context version check mistakenly testing for 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset. | ||||
| //  2020-03-24: OpenGL: Added support for glbinding 2.x OpenGL loader. | ||||
| //  2020-01-07: OpenGL: Added support for glbinding 3.x OpenGL loader. | ||||
| //  2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders. | ||||
| //  2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility. | ||||
| //  2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call. | ||||
| //  2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. | ||||
| //  2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. | ||||
| //  2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop. | ||||
| //  2019-03-15: OpenGL: Added a GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early. | ||||
| //  2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0). | ||||
| //  2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader. | ||||
| //  2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. | ||||
| //  2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450). | ||||
| //  2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. | ||||
| //  2018-11-13: OpenGL: Support for GL 4.5's glClipControl(GL_UPPER_LEFT) / GL_CLIP_ORIGIN. | ||||
| //  2018-08-29: OpenGL: Added support for more OpenGL loaders: glew and glad, with comments indicative that any loader can be used. | ||||
| //  2018-08-09: OpenGL: Default to OpenGL ES 3 on iOS and Android. GLSL version default to "#version 300 ES". | ||||
| //  2018-07-30: OpenGL: Support for GLSL 300 ES and 410 core. Fixes for Emscripten compilation. | ||||
| //  2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link. | ||||
| //  2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples. | ||||
| //  2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | ||||
| //  2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. | ||||
| //  2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a nullptr pointer. | ||||
| //  2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150". | ||||
| //  2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context. | ||||
| //  2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself. | ||||
| //  2018-01-07: OpenGL: Changed GLSL shader version from 330 to 150. | ||||
| //  2017-09-01: OpenGL: Save and restore current bound sampler. Save and restore current polygon mode. | ||||
| //  2017-05-01: OpenGL: Fixed save and restore of current blend func state. | ||||
| //  2017-05-01: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE. | ||||
| //  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | ||||
| //  2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752) | ||||
|  | ||||
| //---------------------------------------- | ||||
| // OpenGL    GLSL      GLSL | ||||
| // version   version   string | ||||
| //---------------------------------------- | ||||
| //  2.0       110       "#version 110" | ||||
| //  2.1       120       "#version 120" | ||||
| //  3.0       130       "#version 130" | ||||
| //  3.1       140       "#version 140" | ||||
| //  3.2       150       "#version 150" | ||||
| //  3.3       330       "#version 330 core" | ||||
| //  4.0       400       "#version 400 core" | ||||
| //  4.1       410       "#version 410 core" | ||||
| //  4.2       420       "#version 410 core" | ||||
| //  4.3       430       "#version 430 core" | ||||
| //  ES 2.0    100       "#version 100"      = WebGL 1.0 | ||||
| //  ES 3.0    300       "#version 300 es"   = WebGL 2.0 | ||||
| //---------------------------------------- | ||||
|  | ||||
| #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) | ||||
| #define _CRT_SECURE_NO_WARNINGS | ||||
| #endif | ||||
|  | ||||
| #include "imgui.h" | ||||
| #include "imgui_impl_opengl3.h" | ||||
| #include <stdio.h> | ||||
| #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier | ||||
| #include <stddef.h>     // intptr_t | ||||
| #else | ||||
| #include <stdint.h>     // intptr_t | ||||
| #endif | ||||
| #if defined(__APPLE__) | ||||
| #include <TargetConditionals.h> | ||||
| #endif | ||||
|  | ||||
| // Clang warnings with -Weverything | ||||
| #if defined(__clang__) | ||||
| #pragma clang diagnostic push | ||||
| #pragma clang diagnostic ignored "-Wold-style-cast"     // warning: use of old-style cast | ||||
| #pragma clang diagnostic ignored "-Wsign-conversion"    // warning: implicit conversion changes signedness | ||||
| #endif | ||||
| #if defined(__GNUC__) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wcast-function-type"   // warning: cast between incompatible function types | ||||
| #endif | ||||
|  | ||||
| // GL includes | ||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) | ||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) | ||||
| #include <OpenGLES/ES2/gl.h>    // Use GL ES 2 | ||||
| #else | ||||
| #include <GLES2/gl2.h>          // Use GL ES 2 | ||||
| #endif | ||||
| #if defined(__EMSCRIPTEN__) | ||||
| #ifndef GL_GLEXT_PROTOTYPES | ||||
| #define GL_GLEXT_PROTOTYPES | ||||
| #endif | ||||
| #include <GLES2/gl2ext.h> | ||||
| #endif | ||||
| #elif defined(IMGUI_IMPL_OPENGL_ES3) | ||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) | ||||
| #include <OpenGLES/ES3/gl.h>    // Use GL ES 3 | ||||
| #else | ||||
| #include <GLES3/gl3.h>          // Use GL ES 3 | ||||
| #endif | ||||
| #elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) | ||||
| // Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers. | ||||
| // Helper libraries are often used for this purpose! Here we are using our own minimal custom loader based on gl3w. | ||||
| // In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.). | ||||
| // If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp): | ||||
| // - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped | ||||
| // - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases | ||||
| // Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version. | ||||
| #define IMGL3W_IMPL | ||||
| #include "imgui_impl_opengl3_loader.h" | ||||
| #endif | ||||
|  | ||||
| // Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension | ||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | ||||
| #define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
| #elif defined(__EMSCRIPTEN__) | ||||
| #define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
| #define glBindVertexArray       glBindVertexArrayOES | ||||
| #define glGenVertexArrays       glGenVertexArraysOES | ||||
| #define glDeleteVertexArrays    glDeleteVertexArraysOES | ||||
| #define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES | ||||
| #endif | ||||
|  | ||||
| // Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have. | ||||
| #ifdef GL_POLYGON_MODE | ||||
| #define IMGUI_IMPL_HAS_POLYGON_MODE | ||||
| #endif | ||||
|  | ||||
| // Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have. | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2) | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||
| #endif | ||||
|  | ||||
| // Desktop GL 3.3+ has glBindSampler() | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3) | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | ||||
| #endif | ||||
|  | ||||
| // Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1) | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART | ||||
| #endif | ||||
|  | ||||
| // Desktop GL use extension detection | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS | ||||
| #endif | ||||
|  | ||||
| // [Debugging] | ||||
| //#define IMGUI_IMPL_OPENGL_DEBUG | ||||
| #ifdef IMGUI_IMPL_OPENGL_DEBUG | ||||
| #include <stdio.h> | ||||
| #define GL_CALL(_CALL)      do { _CALL; GLenum gl_err = glGetError(); if (gl_err != 0) fprintf(stderr, "GL error 0x%x returned from '%s'.\n", gl_err, #_CALL); } while (0)  // Call with error check | ||||
| #else | ||||
| #define GL_CALL(_CALL)      _CALL   // Call without error check | ||||
| #endif | ||||
|  | ||||
| // OpenGL Data | ||||
| struct ImGui_ImplOpenGL3_Data | ||||
| { | ||||
|     GLuint          GlVersion;               // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries (e.g. 320 for GL 3.2) | ||||
|     char            GlslVersionString[32];   // Specified by user or detected based on compile time GL settings. | ||||
|     GLuint          FontTexture; | ||||
|     GLuint          ShaderHandle; | ||||
|     GLint           AttribLocationTex;       // Uniforms location | ||||
|     GLint           AttribLocationProjMtx; | ||||
|     GLuint          AttribLocationVtxPos;    // Vertex attributes location | ||||
|     GLuint          AttribLocationVtxUV; | ||||
|     GLuint          AttribLocationVtxColor; | ||||
|     unsigned int    VboHandle, ElementsHandle; | ||||
|     GLsizeiptr      VertexBufferSize; | ||||
|     GLsizeiptr      IndexBufferSize; | ||||
|     bool            HasClipOrigin; | ||||
|     bool            UseBufferSubData; | ||||
|  | ||||
|     ImGui_ImplOpenGL3_Data() { memset((void*)this, 0, sizeof(*this)); } | ||||
| }; | ||||
|  | ||||
| // Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts | ||||
| // It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. | ||||
| static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData() | ||||
| { | ||||
|     return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; | ||||
| } | ||||
|  | ||||
| // OpenGL vertex attribute state (for ES 1.0 and ES 2.0 only) | ||||
| #ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
| struct ImGui_ImplOpenGL3_VtxAttribState | ||||
| { | ||||
|     GLint   Enabled, Size, Type, Normalized, Stride; | ||||
|     GLvoid* Ptr; | ||||
|  | ||||
|     void GetState(GLint index) | ||||
|     { | ||||
|         glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &Enabled); | ||||
|         glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &Size); | ||||
|         glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &Type); | ||||
|         glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &Normalized); | ||||
|         glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &Stride); | ||||
|         glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &Ptr); | ||||
|     } | ||||
|     void SetState(GLint index) | ||||
|     { | ||||
|         glVertexAttribPointer(index, Size, Type, (GLboolean)Normalized, Stride, Ptr); | ||||
|         if (Enabled) glEnableVertexAttribArray(index); else glDisableVertexAttribArray(index); | ||||
|     } | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| // Functions | ||||
| bool    ImGui_ImplOpenGL3_Init(const char* glsl_version) | ||||
| { | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); | ||||
|  | ||||
|     // Initialize our loader | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) | ||||
|     if (imgl3wInit() != 0) | ||||
|     { | ||||
|         fprintf(stderr, "Failed to initialize OpenGL loader!\n"); | ||||
|         return false; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     // Setup backend capabilities flags | ||||
|     ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)(); | ||||
|     io.BackendRendererUserData = (void*)bd; | ||||
|     io.BackendRendererName = "imgui_impl_opengl3"; | ||||
|  | ||||
|     // Query for GL version (e.g. 320 for GL 3.2) | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) | ||||
|     GLint major = 0; | ||||
|     GLint minor = 0; | ||||
|     glGetIntegerv(GL_MAJOR_VERSION, &major); | ||||
|     glGetIntegerv(GL_MINOR_VERSION, &minor); | ||||
|     if (major == 0 && minor == 0) | ||||
|     { | ||||
|         // Query GL_VERSION in desktop GL 2.x, the string will start with "<major>.<minor>" | ||||
|         const char* gl_version = (const char*)glGetString(GL_VERSION); | ||||
|         sscanf(gl_version, "%d.%d", &major, &minor); | ||||
|     } | ||||
|     bd->GlVersion = (GLuint)(major * 100 + minor * 10); | ||||
|  | ||||
|     bd->UseBufferSubData = false; | ||||
|     /* | ||||
|     // Query vendor to enable glBufferSubData kludge | ||||
| #ifdef _WIN32 | ||||
|     if (const char* vendor = (const char*)glGetString(GL_VENDOR)) | ||||
|         if (strncmp(vendor, "Intel", 5) == 0) | ||||
|             bd->UseBufferSubData = true; | ||||
| #endif | ||||
|     */ | ||||
| #else | ||||
|     bd->GlVersion = 200; // GLES 2 | ||||
| #endif | ||||
|  | ||||
| #ifdef IMGUI_IMPL_OPENGL_DEBUG | ||||
|     printf("GL_MAJOR_VERSION = %d\nGL_MINOR_VERSION = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", major, minor, (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG] | ||||
| #endif | ||||
|  | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||
|     if (bd->GlVersion >= 320) | ||||
|         io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. | ||||
| #endif | ||||
|  | ||||
|     // Store GLSL version string so we can refer to it later in case we recreate shaders. | ||||
|     // Note: GLSL version is NOT the same as GL version. Leave this to nullptr if unsure. | ||||
|     if (glsl_version == nullptr) | ||||
|     { | ||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) | ||||
|         glsl_version = "#version 100"; | ||||
| #elif defined(IMGUI_IMPL_OPENGL_ES3) | ||||
|         glsl_version = "#version 300 es"; | ||||
| #elif defined(__APPLE__) | ||||
|         glsl_version = "#version 150"; | ||||
| #else | ||||
|         glsl_version = "#version 130"; | ||||
| #endif | ||||
|     } | ||||
|     IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString)); | ||||
|     strcpy(bd->GlslVersionString, glsl_version); | ||||
|     strcat(bd->GlslVersionString, "\n"); | ||||
|  | ||||
|     // Make an arbitrary GL call (we don't actually need the result) | ||||
|     // IF YOU GET A CRASH HERE: it probably means the OpenGL function loader didn't do its job. Let us know! | ||||
|     GLint current_texture; | ||||
|     glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); | ||||
|  | ||||
|     // Detect extensions we support | ||||
|     bd->HasClipOrigin = (bd->GlVersion >= 450); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS | ||||
|     GLint num_extensions = 0; | ||||
|     glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); | ||||
|     for (GLint i = 0; i < num_extensions; i++) | ||||
|     { | ||||
|         const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i); | ||||
|         if (extension != nullptr && strcmp(extension, "GL_ARB_clip_control") == 0) | ||||
|             bd->HasClipOrigin = true; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void    ImGui_ImplOpenGL3_Shutdown() | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|  | ||||
|     ImGui_ImplOpenGL3_DestroyDeviceObjects(); | ||||
|     io.BackendRendererName = nullptr; | ||||
|     io.BackendRendererUserData = nullptr; | ||||
|     IM_DELETE(bd); | ||||
| } | ||||
|  | ||||
| void    ImGui_ImplOpenGL3_NewFrame() | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL3_Init()?"); | ||||
|  | ||||
|     if (!bd->ShaderHandle) | ||||
|         ImGui_ImplOpenGL3_CreateDeviceObjects(); | ||||
| } | ||||
|  | ||||
| static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object) | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|  | ||||
|     // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill | ||||
|     glEnable(GL_BLEND); | ||||
|     glBlendEquation(GL_FUNC_ADD); | ||||
|     glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); | ||||
|     glDisable(GL_CULL_FACE); | ||||
|     glDisable(GL_DEPTH_TEST); | ||||
|     glDisable(GL_STENCIL_TEST); | ||||
|     glEnable(GL_SCISSOR_TEST); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART | ||||
|     if (bd->GlVersion >= 310) | ||||
|         glDisable(GL_PRIMITIVE_RESTART); | ||||
| #endif | ||||
| #ifdef IMGUI_IMPL_HAS_POLYGON_MODE | ||||
|     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| #endif | ||||
|  | ||||
|     // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT) | ||||
| #if defined(GL_CLIP_ORIGIN) | ||||
|     bool clip_origin_lower_left = true; | ||||
|     if (bd->HasClipOrigin) | ||||
|     { | ||||
|         GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin); | ||||
|         if (current_clip_origin == GL_UPPER_LEFT) | ||||
|             clip_origin_lower_left = false; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     // Setup viewport, orthographic projection matrix | ||||
|     // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. | ||||
|     GL_CALL(glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); | ||||
|     float L = draw_data->DisplayPos.x; | ||||
|     float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; | ||||
|     float T = draw_data->DisplayPos.y; | ||||
|     float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; | ||||
| #if defined(GL_CLIP_ORIGIN) | ||||
|     if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left | ||||
| #endif | ||||
|     const float ortho_projection[4][4] = | ||||
|     { | ||||
|         { 2.0f/(R-L),   0.0f,         0.0f,   0.0f }, | ||||
|         { 0.0f,         2.0f/(T-B),   0.0f,   0.0f }, | ||||
|         { 0.0f,         0.0f,        -1.0f,   0.0f }, | ||||
|         { (R+L)/(L-R),  (T+B)/(B-T),  0.0f,   1.0f }, | ||||
|     }; | ||||
|     glUseProgram(bd->ShaderHandle); | ||||
|     glUniform1i(bd->AttribLocationTex, 0); | ||||
|     glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); | ||||
|  | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | ||||
|     if (bd->GlVersion >= 330) | ||||
|         glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise. | ||||
| #endif | ||||
|  | ||||
|     (void)vertex_array_object; | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     glBindVertexArray(vertex_array_object); | ||||
| #endif | ||||
|  | ||||
|     // Bind vertex/index buffers and setup attributes for ImDrawVert | ||||
|     GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle)); | ||||
|     GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle)); | ||||
|     GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxPos)); | ||||
|     GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxUV)); | ||||
|     GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxColor)); | ||||
|     GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos,   2, GL_FLOAT,         GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); | ||||
|     GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV,    2, GL_FLOAT,         GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); | ||||
|     GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); | ||||
| } | ||||
|  | ||||
| // OpenGL3 Render function. | ||||
| // Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly. | ||||
| // This is in order to be able to run within an OpenGL engine that doesn't do so. | ||||
| void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | ||||
| { | ||||
|     // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) | ||||
|     int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); | ||||
|     int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); | ||||
|     if (fb_width <= 0 || fb_height <= 0) | ||||
|         return; | ||||
|  | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|  | ||||
|     // Backup GL state | ||||
|     GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture); | ||||
|     glActiveTexture(GL_TEXTURE0); | ||||
|     GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program); | ||||
|     GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | ||||
|     GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } | ||||
| #endif | ||||
|     GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); | ||||
| #ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     // This is part of VAO on OpenGL 3.0+ and OpenGL ES 3.0+. | ||||
|     GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer); | ||||
|     ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_pos; last_vtx_attrib_state_pos.GetState(bd->AttribLocationVtxPos); | ||||
|     ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_uv; last_vtx_attrib_state_uv.GetState(bd->AttribLocationVtxUV); | ||||
|     ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_color; last_vtx_attrib_state_color.GetState(bd->AttribLocationVtxColor); | ||||
| #endif | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object); | ||||
| #endif | ||||
| #ifdef IMGUI_IMPL_HAS_POLYGON_MODE | ||||
|     GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); | ||||
| #endif | ||||
|     GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||||
|     GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); | ||||
|     GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb); | ||||
|     GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb); | ||||
|     GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha); | ||||
|     GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha); | ||||
|     GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb); | ||||
|     GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha); | ||||
|     GLboolean last_enable_blend = glIsEnabled(GL_BLEND); | ||||
|     GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); | ||||
|     GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); | ||||
|     GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST); | ||||
|     GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART | ||||
|     GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE; | ||||
| #endif | ||||
|  | ||||
|     // Setup desired GL state | ||||
|     // Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts) | ||||
|     // The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound. | ||||
|     GLuint vertex_array_object = 0; | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     GL_CALL(glGenVertexArrays(1, &vertex_array_object)); | ||||
| #endif | ||||
|     ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); | ||||
|  | ||||
|     // Will project scissor/clipping rectangles into framebuffer space | ||||
|     ImVec2 clip_off = draw_data->DisplayPos;         // (0,0) unless using multi-viewports | ||||
|     ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) | ||||
|  | ||||
|     // Render command lists | ||||
|     for (int n = 0; n < draw_data->CmdListsCount; n++) | ||||
|     { | ||||
|         const ImDrawList* cmd_list = draw_data->CmdLists[n]; | ||||
|  | ||||
|         // Upload vertex/index buffers | ||||
|         // - OpenGL drivers are in a very sorry state nowadays.... | ||||
|         //   During 2021 we attempted to switch from glBufferData() to orphaning+glBufferSubData() following reports | ||||
|         //   of leaks on Intel GPU when using multi-viewports on Windows. | ||||
|         // - After this we kept hearing of various display corruptions issues. We started disabling on non-Intel GPU, but issues still got reported on Intel. | ||||
|         // - We are now back to using exclusively glBufferData(). So bd->UseBufferSubData IS ALWAYS FALSE in this code. | ||||
|         //   We are keeping the old code path for a while in case people finding new issues may want to test the bd->UseBufferSubData path. | ||||
|         // - See https://github.com/ocornut/imgui/issues/4468 and please report any corruption issues. | ||||
|         const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); | ||||
|         const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); | ||||
|         if (bd->UseBufferSubData) | ||||
|         { | ||||
|             if (bd->VertexBufferSize < vtx_buffer_size) | ||||
|             { | ||||
|                 bd->VertexBufferSize = vtx_buffer_size; | ||||
|                 GL_CALL(glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, nullptr, GL_STREAM_DRAW)); | ||||
|             } | ||||
|             if (bd->IndexBufferSize < idx_buffer_size) | ||||
|             { | ||||
|                 bd->IndexBufferSize = idx_buffer_size; | ||||
|                 GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, nullptr, GL_STREAM_DRAW)); | ||||
|             } | ||||
|             GL_CALL(glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data)); | ||||
|             GL_CALL(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             GL_CALL(glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW)); | ||||
|             GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW)); | ||||
|         } | ||||
|  | ||||
|         for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) | ||||
|         { | ||||
|             const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; | ||||
|             if (pcmd->UserCallback != nullptr) | ||||
|             { | ||||
|                 // User callback, registered via ImDrawList::AddCallback() | ||||
|                 // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) | ||||
|                 if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) | ||||
|                     ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); | ||||
|                 else | ||||
|                     pcmd->UserCallback(cmd_list, pcmd); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // Project scissor/clipping rectangles into framebuffer space | ||||
|                 ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); | ||||
|                 ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); | ||||
|                 if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) | ||||
|                     continue; | ||||
|  | ||||
|                 // Apply scissor/clipping rectangle (Y is inverted in OpenGL) | ||||
|                 GL_CALL(glScissor((int)clip_min.x, (int)((float)fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y))); | ||||
|  | ||||
|                 // Bind texture, Draw | ||||
|                 GL_CALL(glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||
|                 if (bd->GlVersion >= 320) | ||||
|                     GL_CALL(glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset)); | ||||
|                 else | ||||
| #endif | ||||
|                 GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Destroy the temporary VAO | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     GL_CALL(glDeleteVertexArrays(1, &vertex_array_object)); | ||||
| #endif | ||||
|  | ||||
|     // Restore modified GL state | ||||
|     glUseProgram(last_program); | ||||
|     glBindTexture(GL_TEXTURE_2D, last_texture); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | ||||
|     if (bd->GlVersion >= 330) | ||||
|         glBindSampler(0, last_sampler); | ||||
| #endif | ||||
|     glActiveTexture(last_active_texture); | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     glBindVertexArray(last_vertex_array_object); | ||||
| #endif | ||||
|     glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); | ||||
| #ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer); | ||||
|     last_vtx_attrib_state_pos.SetState(bd->AttribLocationVtxPos); | ||||
|     last_vtx_attrib_state_uv.SetState(bd->AttribLocationVtxUV); | ||||
|     last_vtx_attrib_state_color.SetState(bd->AttribLocationVtxColor); | ||||
| #endif | ||||
|     glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha); | ||||
|     glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha); | ||||
|     if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND); | ||||
|     if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); | ||||
|     if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); | ||||
|     if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST); | ||||
|     if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); | ||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART | ||||
|     if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); } | ||||
| #endif | ||||
|  | ||||
| #ifdef IMGUI_IMPL_HAS_POLYGON_MODE | ||||
|     glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); | ||||
| #endif | ||||
|     glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); | ||||
|     glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); | ||||
|     (void)bd; // Not all compilation paths use this | ||||
| } | ||||
|  | ||||
| bool ImGui_ImplOpenGL3_CreateFontsTexture() | ||||
| { | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|  | ||||
|     // Build texture atlas | ||||
|     unsigned char* pixels; | ||||
|     int width, height; | ||||
|     io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. | ||||
|  | ||||
|     // Upload texture to graphics system | ||||
|     // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) | ||||
|     GLint last_texture; | ||||
|     GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); | ||||
|     GL_CALL(glGenTextures(1, &bd->FontTexture)); | ||||
|     GL_CALL(glBindTexture(GL_TEXTURE_2D, bd->FontTexture)); | ||||
|     GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | ||||
|     GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | ||||
| #ifdef GL_UNPACK_ROW_LENGTH // Not on WebGL/ES | ||||
|     GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)); | ||||
| #endif | ||||
|     GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); | ||||
|  | ||||
|     // Store our identifier | ||||
|     io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); | ||||
|  | ||||
|     // Restore state | ||||
|     GL_CALL(glBindTexture(GL_TEXTURE_2D, last_texture)); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void ImGui_ImplOpenGL3_DestroyFontsTexture() | ||||
| { | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     if (bd->FontTexture) | ||||
|     { | ||||
|         glDeleteTextures(1, &bd->FontTexture); | ||||
|         io.Fonts->SetTexID(0); | ||||
|         bd->FontTexture = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file. | ||||
| static bool CheckShader(GLuint handle, const char* desc) | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     GLint status = 0, log_length = 0; | ||||
|     glGetShaderiv(handle, GL_COMPILE_STATUS, &status); | ||||
|     glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length); | ||||
|     if ((GLboolean)status == GL_FALSE) | ||||
|         fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString); | ||||
|     if (log_length > 1) | ||||
|     { | ||||
|         ImVector<char> buf; | ||||
|         buf.resize((int)(log_length + 1)); | ||||
|         glGetShaderInfoLog(handle, log_length, nullptr, (GLchar*)buf.begin()); | ||||
|         fprintf(stderr, "%s\n", buf.begin()); | ||||
|     } | ||||
|     return (GLboolean)status == GL_TRUE; | ||||
| } | ||||
|  | ||||
| // If you get an error please report on GitHub. You may try different GL context version or GLSL version. | ||||
| static bool CheckProgram(GLuint handle, const char* desc) | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     GLint status = 0, log_length = 0; | ||||
|     glGetProgramiv(handle, GL_LINK_STATUS, &status); | ||||
|     glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length); | ||||
|     if ((GLboolean)status == GL_FALSE) | ||||
|         fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString); | ||||
|     if (log_length > 1) | ||||
|     { | ||||
|         ImVector<char> buf; | ||||
|         buf.resize((int)(log_length + 1)); | ||||
|         glGetProgramInfoLog(handle, log_length, nullptr, (GLchar*)buf.begin()); | ||||
|         fprintf(stderr, "%s\n", buf.begin()); | ||||
|     } | ||||
|     return (GLboolean)status == GL_TRUE; | ||||
| } | ||||
|  | ||||
| bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|  | ||||
|     // Backup GL state | ||||
|     GLint last_texture, last_array_buffer; | ||||
|     glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | ||||
|     glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     GLint last_vertex_array; | ||||
|     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); | ||||
| #endif | ||||
|  | ||||
|     // Parse GLSL version string | ||||
|     int glsl_version = 130; | ||||
|     sscanf(bd->GlslVersionString, "#version %d", &glsl_version); | ||||
|  | ||||
|     const GLchar* vertex_shader_glsl_120 = | ||||
|         "uniform mat4 ProjMtx;\n" | ||||
|         "attribute vec2 Position;\n" | ||||
|         "attribute vec2 UV;\n" | ||||
|         "attribute vec4 Color;\n" | ||||
|         "varying vec2 Frag_UV;\n" | ||||
|         "varying vec4 Frag_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Frag_UV = UV;\n" | ||||
|         "    Frag_Color = Color;\n" | ||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* vertex_shader_glsl_130 = | ||||
|         "uniform mat4 ProjMtx;\n" | ||||
|         "in vec2 Position;\n" | ||||
|         "in vec2 UV;\n" | ||||
|         "in vec4 Color;\n" | ||||
|         "out vec2 Frag_UV;\n" | ||||
|         "out vec4 Frag_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Frag_UV = UV;\n" | ||||
|         "    Frag_Color = Color;\n" | ||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* vertex_shader_glsl_300_es = | ||||
|         "precision highp float;\n" | ||||
|         "layout (location = 0) in vec2 Position;\n" | ||||
|         "layout (location = 1) in vec2 UV;\n" | ||||
|         "layout (location = 2) in vec4 Color;\n" | ||||
|         "uniform mat4 ProjMtx;\n" | ||||
|         "out vec2 Frag_UV;\n" | ||||
|         "out vec4 Frag_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Frag_UV = UV;\n" | ||||
|         "    Frag_Color = Color;\n" | ||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* vertex_shader_glsl_410_core = | ||||
|         "layout (location = 0) in vec2 Position;\n" | ||||
|         "layout (location = 1) in vec2 UV;\n" | ||||
|         "layout (location = 2) in vec4 Color;\n" | ||||
|         "uniform mat4 ProjMtx;\n" | ||||
|         "out vec2 Frag_UV;\n" | ||||
|         "out vec4 Frag_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Frag_UV = UV;\n" | ||||
|         "    Frag_Color = Color;\n" | ||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* fragment_shader_glsl_120 = | ||||
|         "#ifdef GL_ES\n" | ||||
|         "    precision mediump float;\n" | ||||
|         "#endif\n" | ||||
|         "uniform sampler2D Texture;\n" | ||||
|         "varying vec2 Frag_UV;\n" | ||||
|         "varying vec4 Frag_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* fragment_shader_glsl_130 = | ||||
|         "uniform sampler2D Texture;\n" | ||||
|         "in vec2 Frag_UV;\n" | ||||
|         "in vec4 Frag_Color;\n" | ||||
|         "out vec4 Out_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* fragment_shader_glsl_300_es = | ||||
|         "precision mediump float;\n" | ||||
|         "uniform sampler2D Texture;\n" | ||||
|         "in vec2 Frag_UV;\n" | ||||
|         "in vec4 Frag_Color;\n" | ||||
|         "layout (location = 0) out vec4 Out_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* fragment_shader_glsl_410_core = | ||||
|         "in vec2 Frag_UV;\n" | ||||
|         "in vec4 Frag_Color;\n" | ||||
|         "uniform sampler2D Texture;\n" | ||||
|         "layout (location = 0) out vec4 Out_Color;\n" | ||||
|         "void main()\n" | ||||
|         "{\n" | ||||
|         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     // Select shaders matching our GLSL versions | ||||
|     const GLchar* vertex_shader = nullptr; | ||||
|     const GLchar* fragment_shader = nullptr; | ||||
|     if (glsl_version < 130) | ||||
|     { | ||||
|         vertex_shader = vertex_shader_glsl_120; | ||||
|         fragment_shader = fragment_shader_glsl_120; | ||||
|     } | ||||
|     else if (glsl_version >= 410) | ||||
|     { | ||||
|         vertex_shader = vertex_shader_glsl_410_core; | ||||
|         fragment_shader = fragment_shader_glsl_410_core; | ||||
|     } | ||||
|     else if (glsl_version == 300) | ||||
|     { | ||||
|         vertex_shader = vertex_shader_glsl_300_es; | ||||
|         fragment_shader = fragment_shader_glsl_300_es; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         vertex_shader = vertex_shader_glsl_130; | ||||
|         fragment_shader = fragment_shader_glsl_130; | ||||
|     } | ||||
|  | ||||
|     // Create shaders | ||||
|     const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader }; | ||||
|     GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER); | ||||
|     glShaderSource(vert_handle, 2, vertex_shader_with_version, nullptr); | ||||
|     glCompileShader(vert_handle); | ||||
|     CheckShader(vert_handle, "vertex shader"); | ||||
|  | ||||
|     const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader }; | ||||
|     GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER); | ||||
|     glShaderSource(frag_handle, 2, fragment_shader_with_version, nullptr); | ||||
|     glCompileShader(frag_handle); | ||||
|     CheckShader(frag_handle, "fragment shader"); | ||||
|  | ||||
|     // Link | ||||
|     bd->ShaderHandle = glCreateProgram(); | ||||
|     glAttachShader(bd->ShaderHandle, vert_handle); | ||||
|     glAttachShader(bd->ShaderHandle, frag_handle); | ||||
|     glLinkProgram(bd->ShaderHandle); | ||||
|     CheckProgram(bd->ShaderHandle, "shader program"); | ||||
|  | ||||
|     glDetachShader(bd->ShaderHandle, vert_handle); | ||||
|     glDetachShader(bd->ShaderHandle, frag_handle); | ||||
|     glDeleteShader(vert_handle); | ||||
|     glDeleteShader(frag_handle); | ||||
|  | ||||
|     bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture"); | ||||
|     bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx"); | ||||
|     bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position"); | ||||
|     bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV"); | ||||
|     bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color"); | ||||
|  | ||||
|     // Create buffers | ||||
|     glGenBuffers(1, &bd->VboHandle); | ||||
|     glGenBuffers(1, &bd->ElementsHandle); | ||||
|  | ||||
|     ImGui_ImplOpenGL3_CreateFontsTexture(); | ||||
|  | ||||
|     // Restore modified GL state | ||||
|     glBindTexture(GL_TEXTURE_2D, last_texture); | ||||
|     glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); | ||||
| #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||
|     glBindVertexArray(last_vertex_array); | ||||
| #endif | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void    ImGui_ImplOpenGL3_DestroyDeviceObjects() | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); | ||||
|     if (bd->VboHandle)      { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; } | ||||
|     if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; } | ||||
|     if (bd->ShaderHandle)   { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; } | ||||
|     ImGui_ImplOpenGL3_DestroyFontsTexture(); | ||||
| } | ||||
|  | ||||
| #if defined(__GNUC__) | ||||
| #pragma GCC diagnostic pop | ||||
| #endif | ||||
| #if defined(__clang__) | ||||
| #pragma clang diagnostic pop | ||||
| #endif | ||||
							
								
								
									
										57
									
								
								libs/imgui/backends/imgui_impl_opengl3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								libs/imgui/backends/imgui_impl_opengl3.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline | ||||
| // - Desktop GL: 2.x 3.x 4.x | ||||
| // - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0) | ||||
| // This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) | ||||
|  | ||||
| // Implemented features: | ||||
| //  [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! | ||||
| //  [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices. | ||||
|  | ||||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. | ||||
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. | ||||
| // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. | ||||
| // Read online: https://github.com/ocornut/imgui/tree/master/docs | ||||
|  | ||||
| // About GLSL version: | ||||
| //  The 'glsl_version' initialization parameter should be nullptr (default) or a "#version XXX" string. | ||||
| //  On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es" | ||||
| //  Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp. | ||||
|  | ||||
| #pragma once | ||||
| #include "imgui.h"      // IMGUI_IMPL_API | ||||
|  | ||||
| extern "C" { | ||||
|  // Backend API | ||||
|  IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr); | ||||
|  IMGUI_IMPL_API void     ImGui_ImplOpenGL3_Shutdown(); | ||||
|  IMGUI_IMPL_API void     ImGui_ImplOpenGL3_NewFrame(); | ||||
|  IMGUI_IMPL_API void     ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data); | ||||
|  | ||||
|  // (Optional) Called by Init/NewFrame/Shutdown | ||||
|  IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_CreateFontsTexture(); | ||||
|  IMGUI_IMPL_API void     ImGui_ImplOpenGL3_DestroyFontsTexture(); | ||||
|  IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_CreateDeviceObjects(); | ||||
|  IMGUI_IMPL_API void     ImGui_ImplOpenGL3_DestroyDeviceObjects(); | ||||
| } | ||||
|  | ||||
| // Specific OpenGL ES versions | ||||
| //#define IMGUI_IMPL_OPENGL_ES2     // Auto-detected on Emscripten | ||||
| //#define IMGUI_IMPL_OPENGL_ES3     // Auto-detected on iOS/Android | ||||
|  | ||||
| // You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line. | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) \ | ||||
|  && !defined(IMGUI_IMPL_OPENGL_ES3) | ||||
|  | ||||
| // Try to detect GLES on matching platforms | ||||
| #if defined(__APPLE__) | ||||
| #include <TargetConditionals.h> | ||||
| #endif | ||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__)) | ||||
| #define IMGUI_IMPL_OPENGL_ES3               // iOS, Android  -> GL ES 3, "#version 300 es" | ||||
| #elif defined(__EMSCRIPTEN__) || defined(__amigaos4__) | ||||
| #define IMGUI_IMPL_OPENGL_ES2               // Emscripten    -> GL ES 2, "#version 100" | ||||
| #else | ||||
| // Otherwise imgui_impl_opengl3_loader.h will be used. | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										794
									
								
								libs/imgui/backends/imgui_impl_opengl3_loader.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										794
									
								
								libs/imgui/backends/imgui_impl_opengl3_loader.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,794 @@ | ||||
| //----------------------------------------------------------------------------- | ||||
| // About imgui_impl_opengl3_loader.h: | ||||
| // | ||||
| // We embed our own OpenGL loader to not require user to provide their own or to have to use ours, | ||||
| // which proved to be endless problems for users. | ||||
| // Our loader is custom-generated, based on gl3w but automatically filtered to only include | ||||
| // enums/functions that we use in our imgui_impl_opengl3.cpp source file in order to be small. | ||||
| // | ||||
| // YOU SHOULD NOT NEED TO INCLUDE/USE THIS DIRECTLY. THIS IS USED BY imgui_impl_opengl3.cpp ONLY. | ||||
| // THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE. | ||||
| // | ||||
| // IF YOU GET BUILD ERRORS IN THIS FILE (commonly macro redefinitions or function redefinitions): | ||||
| // IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCUDING 'imgui_impl_opengl3_loader.h' | ||||
| // IN THE SAME COMPILATION UNIT AS ONE OF YOUR FILE WHICH IS USING A THIRD-PARTY OPENGL LOADER. | ||||
| // (e.g. COULD HAPPEN IF YOU ARE DOING A UNITY/JUMBO BUILD, OR INCLUDING .CPP FILES FROM OTHERS) | ||||
| // YOU SHOULD NOT BUILD BOTH IN THE SAME COMPILATION UNIT. | ||||
| // BUT IF YOU REALLY WANT TO, you can '#define IMGUI_IMPL_OPENGL_LOADER_CUSTOM' and imgui_impl_opengl3.cpp | ||||
| // WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT. | ||||
| // | ||||
| // Regenerate with: | ||||
| //   python gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt | ||||
| // | ||||
| // More info: | ||||
| //   https://github.com/dearimgui/gl3w_stripped | ||||
| //   https://github.com/ocornut/imgui/issues/4445 | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| /* | ||||
|  * This file was generated with gl3w_gen.py, part of imgl3w | ||||
|  * (hosted at https://github.com/dearimgui/gl3w_stripped) | ||||
|  * | ||||
|  * This is free and unencumbered software released into the public domain. | ||||
|  * | ||||
|  * Anyone is free to copy, modify, publish, use, compile, sell, or | ||||
|  * distribute this software, either in source code form or as a compiled | ||||
|  * binary, for any purpose, commercial or non-commercial, and by any | ||||
|  * means. | ||||
|  * | ||||
|  * In jurisdictions that recognize copyright laws, the author or authors | ||||
|  * of this software dedicate any and all copyright interest in the | ||||
|  * software to the public domain. We make this dedication for the benefit | ||||
|  * of the public at large and to the detriment of our heirs and | ||||
|  * successors. We intend this dedication to be an overt act of | ||||
|  * relinquishment in perpetuity of all present and future rights to this | ||||
|  * software under copyright law. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
|  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
|  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
|  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||
|  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||
|  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
|  * OTHER DEALINGS IN THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #ifndef __gl3w_h_ | ||||
| #define __gl3w_h_ | ||||
|  | ||||
| // Adapted from KHR/khrplatform.h to avoid including entire file. | ||||
| #ifndef __khrplatform_h_ | ||||
| typedef          float         khronos_float_t; | ||||
| typedef signed   char          khronos_int8_t; | ||||
| typedef unsigned char          khronos_uint8_t; | ||||
| typedef signed   short int     khronos_int16_t; | ||||
| typedef unsigned short int     khronos_uint16_t; | ||||
| #ifdef _WIN64 | ||||
| typedef signed   long long int khronos_intptr_t; | ||||
| typedef signed   long long int khronos_ssize_t; | ||||
| #else | ||||
| typedef signed   long  int     khronos_intptr_t; | ||||
| typedef signed   long  int     khronos_ssize_t; | ||||
| #endif | ||||
|  | ||||
| #if defined(_MSC_VER) && !defined(__clang__) | ||||
| typedef signed   __int64       khronos_int64_t; | ||||
| typedef unsigned __int64       khronos_uint64_t; | ||||
| #elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100) | ||||
| #include <stdint.h> | ||||
| typedef          int64_t       khronos_int64_t; | ||||
| typedef          uint64_t      khronos_uint64_t; | ||||
| #else | ||||
| typedef signed   long long     khronos_int64_t; | ||||
| typedef unsigned long long     khronos_uint64_t; | ||||
| #endif | ||||
| #endif  // __khrplatform_h_ | ||||
|  | ||||
| #ifndef __gl_glcorearb_h_ | ||||
| #define __gl_glcorearb_h_ 1 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| /* | ||||
| ** Copyright 2013-2020 The Khronos Group Inc. | ||||
| ** SPDX-License-Identifier: MIT | ||||
| ** | ||||
| ** This header is generated from the Khronos OpenGL / OpenGL ES XML | ||||
| ** API Registry. The current version of the Registry, generator scripts | ||||
| ** used to make the header, and the header can be found at | ||||
| **   https://github.com/KhronosGroup/OpenGL-Registry | ||||
| */ | ||||
| #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN 1 | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #endif | ||||
| #ifndef APIENTRY | ||||
| #define APIENTRY | ||||
| #endif | ||||
| #ifndef APIENTRYP | ||||
| #define APIENTRYP APIENTRY * | ||||
| #endif | ||||
| #ifndef GLAPI | ||||
| #define GLAPI extern | ||||
| #endif | ||||
| /* glcorearb.h is for use with OpenGL core profile implementations. | ||||
| ** It should should be placed in the same directory as gl.h and | ||||
| ** included as <GL/glcorearb.h>. | ||||
| ** | ||||
| ** glcorearb.h includes only APIs in the latest OpenGL core profile | ||||
| ** implementation together with APIs in newer ARB extensions which  | ||||
| ** can be supported by the core profile. It does not, and never will | ||||
| ** include functionality removed from the core profile, such as | ||||
| ** fixed-function vertex and fragment processing. | ||||
| ** | ||||
| ** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or | ||||
| ** <GL/glext.h> in the same source file. | ||||
| */ | ||||
| /* Generated C header for: | ||||
|  * API: gl | ||||
|  * Profile: core | ||||
|  * Versions considered: .* | ||||
|  * Versions emitted: .* | ||||
|  * Default extensions included: glcore | ||||
|  * Additional extensions included: _nomatch_^ | ||||
|  * Extensions removed: _nomatch_^ | ||||
|  */ | ||||
| #ifndef GL_VERSION_1_0 | ||||
| typedef void GLvoid; | ||||
| typedef unsigned int GLenum; | ||||
|  | ||||
| typedef khronos_float_t GLfloat; | ||||
| typedef int GLint; | ||||
| typedef int GLsizei; | ||||
| typedef unsigned int GLbitfield; | ||||
| typedef double GLdouble; | ||||
| typedef unsigned int GLuint; | ||||
| typedef unsigned char GLboolean; | ||||
| typedef khronos_uint8_t GLubyte; | ||||
| #define GL_COLOR_BUFFER_BIT               0x00004000 | ||||
| #define GL_FALSE                          0 | ||||
| #define GL_TRUE                           1 | ||||
| #define GL_TRIANGLES                      0x0004 | ||||
| #define GL_ONE                            1 | ||||
| #define GL_SRC_ALPHA                      0x0302 | ||||
| #define GL_ONE_MINUS_SRC_ALPHA            0x0303 | ||||
| #define GL_FRONT_AND_BACK                 0x0408 | ||||
| #define GL_POLYGON_MODE                   0x0B40 | ||||
| #define GL_CULL_FACE                      0x0B44 | ||||
| #define GL_DEPTH_TEST                     0x0B71 | ||||
| #define GL_STENCIL_TEST                   0x0B90 | ||||
| #define GL_VIEWPORT                       0x0BA2 | ||||
| #define GL_BLEND                          0x0BE2 | ||||
| #define GL_SCISSOR_BOX                    0x0C10 | ||||
| #define GL_SCISSOR_TEST                   0x0C11 | ||||
| #define GL_UNPACK_ROW_LENGTH              0x0CF2 | ||||
| #define GL_PACK_ALIGNMENT                 0x0D05 | ||||
| #define GL_TEXTURE_2D                     0x0DE1 | ||||
| #define GL_UNSIGNED_BYTE                  0x1401 | ||||
| #define GL_UNSIGNED_SHORT                 0x1403 | ||||
| #define GL_UNSIGNED_INT                   0x1405 | ||||
| #define GL_FLOAT                          0x1406 | ||||
| #define GL_RGBA                           0x1908 | ||||
| #define GL_FILL                           0x1B02 | ||||
| #define GL_VENDOR                         0x1F00 | ||||
| #define GL_RENDERER                       0x1F01 | ||||
| #define GL_VERSION                        0x1F02 | ||||
| #define GL_EXTENSIONS                     0x1F03 | ||||
| #define GL_LINEAR                         0x2601 | ||||
| #define GL_TEXTURE_MAG_FILTER             0x2800 | ||||
| #define GL_TEXTURE_MIN_FILTER             0x2801 | ||||
| typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); | ||||
| typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); | ||||
| typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); | ||||
| typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); | ||||
| typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); | ||||
| typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); | ||||
| typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); | ||||
| typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap); | ||||
| typedef void (APIENTRYP PFNGLFLUSHPROC) (void); | ||||
| typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); | ||||
| typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); | ||||
| typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void); | ||||
| typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); | ||||
| typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); | ||||
| typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); | ||||
| typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); | ||||
| GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); | ||||
| GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); | ||||
| GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); | ||||
| GLAPI void APIENTRY glClear (GLbitfield mask); | ||||
| GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); | ||||
| GLAPI void APIENTRY glDisable (GLenum cap); | ||||
| GLAPI void APIENTRY glEnable (GLenum cap); | ||||
| GLAPI void APIENTRY glFlush (void); | ||||
| GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); | ||||
| GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); | ||||
| GLAPI GLenum APIENTRY glGetError (void); | ||||
| GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data); | ||||
| GLAPI const GLubyte *APIENTRY glGetString (GLenum name); | ||||
| GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap); | ||||
| GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_0 */ | ||||
| #ifndef GL_VERSION_1_1 | ||||
| typedef khronos_float_t GLclampf; | ||||
| typedef double GLclampd; | ||||
| #define GL_TEXTURE_BINDING_2D             0x8069 | ||||
| typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); | ||||
| typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); | ||||
| typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); | ||||
| typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); | ||||
| GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); | ||||
| GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); | ||||
| GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_1 */ | ||||
| #ifndef GL_VERSION_1_3 | ||||
| #define GL_TEXTURE0                       0x84C0 | ||||
| #define GL_ACTIVE_TEXTURE                 0x84E0 | ||||
| typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glActiveTexture (GLenum texture); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_3 */ | ||||
| #ifndef GL_VERSION_1_4 | ||||
| #define GL_BLEND_DST_RGB                  0x80C8 | ||||
| #define GL_BLEND_SRC_RGB                  0x80C9 | ||||
| #define GL_BLEND_DST_ALPHA                0x80CA | ||||
| #define GL_BLEND_SRC_ALPHA                0x80CB | ||||
| #define GL_FUNC_ADD                       0x8006 | ||||
| typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); | ||||
| typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); | ||||
| GLAPI void APIENTRY glBlendEquation (GLenum mode); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_4 */ | ||||
| #ifndef GL_VERSION_1_5 | ||||
| typedef khronos_ssize_t GLsizeiptr; | ||||
| typedef khronos_intptr_t GLintptr; | ||||
| #define GL_ARRAY_BUFFER                   0x8892 | ||||
| #define GL_ELEMENT_ARRAY_BUFFER           0x8893 | ||||
| #define GL_ARRAY_BUFFER_BINDING           0x8894 | ||||
| #define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895 | ||||
| #define GL_STREAM_DRAW                    0x88E0 | ||||
| typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); | ||||
| typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); | ||||
| typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); | ||||
| typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); | ||||
| typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); | ||||
| GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); | ||||
| GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); | ||||
| GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); | ||||
| GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_5 */ | ||||
| #ifndef GL_VERSION_2_0 | ||||
| typedef char GLchar; | ||||
| typedef khronos_int16_t GLshort; | ||||
| typedef khronos_int8_t GLbyte; | ||||
| typedef khronos_uint16_t GLushort; | ||||
| #define GL_BLEND_EQUATION_RGB             0x8009 | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622 | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623 | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624 | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625 | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645 | ||||
| #define GL_BLEND_EQUATION_ALPHA           0x883D | ||||
| #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A | ||||
| #define GL_FRAGMENT_SHADER                0x8B30 | ||||
| #define GL_VERTEX_SHADER                  0x8B31 | ||||
| #define GL_COMPILE_STATUS                 0x8B81 | ||||
| #define GL_LINK_STATUS                    0x8B82 | ||||
| #define GL_INFO_LOG_LENGTH                0x8B84 | ||||
| #define GL_CURRENT_PROGRAM                0x8B8D | ||||
| #define GL_UPPER_LEFT                     0x8CA2 | ||||
| typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); | ||||
| typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); | ||||
| typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); | ||||
| typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); | ||||
| typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); | ||||
| typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); | ||||
| typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); | ||||
| typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); | ||||
| typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); | ||||
| typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); | ||||
| typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); | ||||
| typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); | ||||
| typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); | ||||
| typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); | ||||
| typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); | ||||
| typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); | ||||
| typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); | ||||
| typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); | ||||
| typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); | ||||
| typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); | ||||
| typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); | ||||
| typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); | ||||
| typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); | ||||
| typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); | ||||
| GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); | ||||
| GLAPI void APIENTRY glCompileShader (GLuint shader); | ||||
| GLAPI GLuint APIENTRY glCreateProgram (void); | ||||
| GLAPI GLuint APIENTRY glCreateShader (GLenum type); | ||||
| GLAPI void APIENTRY glDeleteProgram (GLuint program); | ||||
| GLAPI void APIENTRY glDeleteShader (GLuint shader); | ||||
| GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); | ||||
| GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); | ||||
| GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); | ||||
| GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); | ||||
| GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); | ||||
| GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); | ||||
| GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); | ||||
| GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); | ||||
| GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); | ||||
| GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); | ||||
| GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); | ||||
| GLAPI void APIENTRY glLinkProgram (GLuint program); | ||||
| GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); | ||||
| GLAPI void APIENTRY glUseProgram (GLuint program); | ||||
| GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); | ||||
| GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); | ||||
| GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); | ||||
| #endif | ||||
| #endif /* GL_VERSION_2_0 */ | ||||
| #ifndef GL_VERSION_3_0 | ||||
| typedef khronos_uint16_t GLhalf; | ||||
| #define GL_MAJOR_VERSION                  0x821B | ||||
| #define GL_MINOR_VERSION                  0x821C | ||||
| #define GL_NUM_EXTENSIONS                 0x821D | ||||
| #define GL_FRAMEBUFFER_SRGB               0x8DB9 | ||||
| #define GL_VERTEX_ARRAY_BINDING           0x85B5 | ||||
| typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); | ||||
| typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); | ||||
| typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); | ||||
| typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); | ||||
| typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); | ||||
| typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); | ||||
| GLAPI void APIENTRY glBindVertexArray (GLuint array); | ||||
| GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); | ||||
| GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); | ||||
| #endif | ||||
| #endif /* GL_VERSION_3_0 */ | ||||
| #ifndef GL_VERSION_3_1 | ||||
| #define GL_VERSION_3_1 1 | ||||
| #define GL_PRIMITIVE_RESTART              0x8F9D | ||||
| #endif /* GL_VERSION_3_1 */ | ||||
| #ifndef GL_VERSION_3_2 | ||||
| #define GL_VERSION_3_2 1 | ||||
| typedef struct __GLsync *GLsync; | ||||
| typedef khronos_uint64_t GLuint64; | ||||
| typedef khronos_int64_t GLint64; | ||||
| typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); | ||||
| typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); | ||||
| #endif | ||||
| #endif /* GL_VERSION_3_2 */ | ||||
| #ifndef GL_VERSION_3_3 | ||||
| #define GL_VERSION_3_3 1 | ||||
| #define GL_SAMPLER_BINDING                0x8919 | ||||
| typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); | ||||
| #endif | ||||
| #endif /* GL_VERSION_3_3 */ | ||||
| #ifndef GL_VERSION_4_1 | ||||
| typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); | ||||
| typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); | ||||
| #endif /* GL_VERSION_4_1 */ | ||||
| #ifndef GL_VERSION_4_3 | ||||
| typedef void (APIENTRY  *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); | ||||
| #endif /* GL_VERSION_4_3 */ | ||||
| #ifndef GL_VERSION_4_5 | ||||
| #define GL_CLIP_ORIGIN                    0x935C | ||||
| typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); | ||||
| typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); | ||||
| #endif /* GL_VERSION_4_5 */ | ||||
| #ifndef GL_ARB_bindless_texture | ||||
| typedef khronos_uint64_t GLuint64EXT; | ||||
| #endif /* GL_ARB_bindless_texture */ | ||||
| #ifndef GL_ARB_cl_event | ||||
| struct _cl_context; | ||||
| struct _cl_event; | ||||
| #endif /* GL_ARB_cl_event */ | ||||
| #ifndef GL_ARB_clip_control | ||||
| #define GL_ARB_clip_control 1 | ||||
| #endif /* GL_ARB_clip_control */ | ||||
| #ifndef GL_ARB_debug_output | ||||
| typedef void (APIENTRY  *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); | ||||
| #endif /* GL_ARB_debug_output */ | ||||
| #ifndef GL_EXT_EGL_image_storage | ||||
| typedef void *GLeglImageOES; | ||||
| #endif /* GL_EXT_EGL_image_storage */ | ||||
| #ifndef GL_EXT_direct_state_access | ||||
| typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); | ||||
| typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); | ||||
| typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); | ||||
| typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); | ||||
| typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); | ||||
| #endif /* GL_EXT_direct_state_access */ | ||||
| #ifndef GL_NV_draw_vulkan_image | ||||
| typedef void (APIENTRY  *GLVULKANPROCNV)(void); | ||||
| #endif /* GL_NV_draw_vulkan_image */ | ||||
| #ifndef GL_NV_gpu_shader5 | ||||
| typedef khronos_int64_t GLint64EXT; | ||||
| #endif /* GL_NV_gpu_shader5 */ | ||||
| #ifndef GL_NV_vertex_buffer_unified_memory | ||||
| typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); | ||||
| #endif /* GL_NV_vertex_buffer_unified_memory */ | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef GL3W_API | ||||
| #define GL3W_API | ||||
| #endif | ||||
|  | ||||
| #ifndef __gl_h_ | ||||
| #define __gl_h_ | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define GL3W_OK 0 | ||||
| #define GL3W_ERROR_INIT -1 | ||||
| #define GL3W_ERROR_LIBRARY_OPEN -2 | ||||
| #define GL3W_ERROR_OPENGL_VERSION -3 | ||||
|  | ||||
| typedef void (*GL3WglProc)(void); | ||||
| typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc); | ||||
|  | ||||
| /* gl3w api */ | ||||
| GL3W_API int imgl3wInit(void); | ||||
| GL3W_API int imgl3wInit2(GL3WGetProcAddressProc proc); | ||||
| GL3W_API int imgl3wIsSupported(int major, int minor); | ||||
| GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc); | ||||
|  | ||||
| /* gl3w internal state */ | ||||
| union GL3WProcs { | ||||
|     GL3WglProc ptr[58]; | ||||
|     struct { | ||||
|         PFNGLACTIVETEXTUREPROC            ActiveTexture; | ||||
|         PFNGLATTACHSHADERPROC             AttachShader; | ||||
|         PFNGLBINDBUFFERPROC               BindBuffer; | ||||
|         PFNGLBINDSAMPLERPROC              BindSampler; | ||||
|         PFNGLBINDTEXTUREPROC              BindTexture; | ||||
|         PFNGLBINDVERTEXARRAYPROC          BindVertexArray; | ||||
|         PFNGLBLENDEQUATIONPROC            BlendEquation; | ||||
|         PFNGLBLENDEQUATIONSEPARATEPROC    BlendEquationSeparate; | ||||
|         PFNGLBLENDFUNCSEPARATEPROC        BlendFuncSeparate; | ||||
|         PFNGLBUFFERDATAPROC               BufferData; | ||||
|         PFNGLBUFFERSUBDATAPROC            BufferSubData; | ||||
|         PFNGLCLEARPROC                    Clear; | ||||
|         PFNGLCLEARCOLORPROC               ClearColor; | ||||
|         PFNGLCOMPILESHADERPROC            CompileShader; | ||||
|         PFNGLCREATEPROGRAMPROC            CreateProgram; | ||||
|         PFNGLCREATESHADERPROC             CreateShader; | ||||
|         PFNGLDELETEBUFFERSPROC            DeleteBuffers; | ||||
|         PFNGLDELETEPROGRAMPROC            DeleteProgram; | ||||
|         PFNGLDELETESHADERPROC             DeleteShader; | ||||
|         PFNGLDELETETEXTURESPROC           DeleteTextures; | ||||
|         PFNGLDELETEVERTEXARRAYSPROC       DeleteVertexArrays; | ||||
|         PFNGLDETACHSHADERPROC             DetachShader; | ||||
|         PFNGLDISABLEPROC                  Disable; | ||||
|         PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray; | ||||
|         PFNGLDRAWELEMENTSPROC             DrawElements; | ||||
|         PFNGLDRAWELEMENTSBASEVERTEXPROC   DrawElementsBaseVertex; | ||||
|         PFNGLENABLEPROC                   Enable; | ||||
|         PFNGLENABLEVERTEXATTRIBARRAYPROC  EnableVertexAttribArray; | ||||
|         PFNGLFLUSHPROC                    Flush; | ||||
|         PFNGLGENBUFFERSPROC               GenBuffers; | ||||
|         PFNGLGENTEXTURESPROC              GenTextures; | ||||
|         PFNGLGENVERTEXARRAYSPROC          GenVertexArrays; | ||||
|         PFNGLGETATTRIBLOCATIONPROC        GetAttribLocation; | ||||
|         PFNGLGETERRORPROC                 GetError; | ||||
|         PFNGLGETINTEGERVPROC              GetIntegerv; | ||||
|         PFNGLGETPROGRAMINFOLOGPROC        GetProgramInfoLog; | ||||
|         PFNGLGETPROGRAMIVPROC             GetProgramiv; | ||||
|         PFNGLGETSHADERINFOLOGPROC         GetShaderInfoLog; | ||||
|         PFNGLGETSHADERIVPROC              GetShaderiv; | ||||
|         PFNGLGETSTRINGPROC                GetString; | ||||
|         PFNGLGETSTRINGIPROC               GetStringi; | ||||
|         PFNGLGETUNIFORMLOCATIONPROC       GetUniformLocation; | ||||
|         PFNGLGETVERTEXATTRIBPOINTERVPROC  GetVertexAttribPointerv; | ||||
|         PFNGLGETVERTEXATTRIBIVPROC        GetVertexAttribiv; | ||||
|         PFNGLISENABLEDPROC                IsEnabled; | ||||
|         PFNGLLINKPROGRAMPROC              LinkProgram; | ||||
|         PFNGLPIXELSTOREIPROC              PixelStorei; | ||||
|         PFNGLPOLYGONMODEPROC              PolygonMode; | ||||
|         PFNGLREADPIXELSPROC               ReadPixels; | ||||
|         PFNGLSCISSORPROC                  Scissor; | ||||
|         PFNGLSHADERSOURCEPROC             ShaderSource; | ||||
|         PFNGLTEXIMAGE2DPROC               TexImage2D; | ||||
|         PFNGLTEXPARAMETERIPROC            TexParameteri; | ||||
|         PFNGLUNIFORM1IPROC                Uniform1i; | ||||
|         PFNGLUNIFORMMATRIX4FVPROC         UniformMatrix4fv; | ||||
|         PFNGLUSEPROGRAMPROC               UseProgram; | ||||
|         PFNGLVERTEXATTRIBPOINTERPROC      VertexAttribPointer; | ||||
|         PFNGLVIEWPORTPROC                 Viewport; | ||||
|     } gl; | ||||
| }; | ||||
|  | ||||
| GL3W_API extern union GL3WProcs imgl3wProcs; | ||||
|  | ||||
| /* OpenGL functions */ | ||||
| #define glActiveTexture                   imgl3wProcs.gl.ActiveTexture | ||||
| #define glAttachShader                    imgl3wProcs.gl.AttachShader | ||||
| #define glBindBuffer                      imgl3wProcs.gl.BindBuffer | ||||
| #define glBindSampler                     imgl3wProcs.gl.BindSampler | ||||
| #define glBindTexture                     imgl3wProcs.gl.BindTexture | ||||
| #define glBindVertexArray                 imgl3wProcs.gl.BindVertexArray | ||||
| #define glBlendEquation                   imgl3wProcs.gl.BlendEquation | ||||
| #define glBlendEquationSeparate           imgl3wProcs.gl.BlendEquationSeparate | ||||
| #define glBlendFuncSeparate               imgl3wProcs.gl.BlendFuncSeparate | ||||
| #define glBufferData                      imgl3wProcs.gl.BufferData | ||||
| #define glBufferSubData                   imgl3wProcs.gl.BufferSubData | ||||
| #define glClear                           imgl3wProcs.gl.Clear | ||||
| #define glClearColor                      imgl3wProcs.gl.ClearColor | ||||
| #define glCompileShader                   imgl3wProcs.gl.CompileShader | ||||
| #define glCreateProgram                   imgl3wProcs.gl.CreateProgram | ||||
| #define glCreateShader                    imgl3wProcs.gl.CreateShader | ||||
| #define glDeleteBuffers                   imgl3wProcs.gl.DeleteBuffers | ||||
| #define glDeleteProgram                   imgl3wProcs.gl.DeleteProgram | ||||
| #define glDeleteShader                    imgl3wProcs.gl.DeleteShader | ||||
| #define glDeleteTextures                  imgl3wProcs.gl.DeleteTextures | ||||
| #define glDeleteVertexArrays              imgl3wProcs.gl.DeleteVertexArrays | ||||
| #define glDetachShader                    imgl3wProcs.gl.DetachShader | ||||
| #define glDisable                         imgl3wProcs.gl.Disable | ||||
| #define glDisableVertexAttribArray        imgl3wProcs.gl.DisableVertexAttribArray | ||||
| #define glDrawElements                    imgl3wProcs.gl.DrawElements | ||||
| #define glDrawElementsBaseVertex          imgl3wProcs.gl.DrawElementsBaseVertex | ||||
| #define glEnable                          imgl3wProcs.gl.Enable | ||||
| #define glEnableVertexAttribArray         imgl3wProcs.gl.EnableVertexAttribArray | ||||
| #define glFlush                           imgl3wProcs.gl.Flush | ||||
| #define glGenBuffers                      imgl3wProcs.gl.GenBuffers | ||||
| #define glGenTextures                     imgl3wProcs.gl.GenTextures | ||||
| #define glGenVertexArrays                 imgl3wProcs.gl.GenVertexArrays | ||||
| #define glGetAttribLocation               imgl3wProcs.gl.GetAttribLocation | ||||
| #define glGetError                        imgl3wProcs.gl.GetError | ||||
| #define glGetIntegerv                     imgl3wProcs.gl.GetIntegerv | ||||
| #define glGetProgramInfoLog               imgl3wProcs.gl.GetProgramInfoLog | ||||
| #define glGetProgramiv                    imgl3wProcs.gl.GetProgramiv | ||||
| #define glGetShaderInfoLog                imgl3wProcs.gl.GetShaderInfoLog | ||||
| #define glGetShaderiv                     imgl3wProcs.gl.GetShaderiv | ||||
| #define glGetString                       imgl3wProcs.gl.GetString | ||||
| #define glGetStringi                      imgl3wProcs.gl.GetStringi | ||||
| #define glGetUniformLocation              imgl3wProcs.gl.GetUniformLocation | ||||
| #define glGetVertexAttribPointerv         imgl3wProcs.gl.GetVertexAttribPointerv | ||||
| #define glGetVertexAttribiv               imgl3wProcs.gl.GetVertexAttribiv | ||||
| #define glIsEnabled                       imgl3wProcs.gl.IsEnabled | ||||
| #define glLinkProgram                     imgl3wProcs.gl.LinkProgram | ||||
| #define glPixelStorei                     imgl3wProcs.gl.PixelStorei | ||||
| #define glPolygonMode                     imgl3wProcs.gl.PolygonMode | ||||
| #define glReadPixels                      imgl3wProcs.gl.ReadPixels | ||||
| #define glScissor                         imgl3wProcs.gl.Scissor | ||||
| #define glShaderSource                    imgl3wProcs.gl.ShaderSource | ||||
| #define glTexImage2D                      imgl3wProcs.gl.TexImage2D | ||||
| #define glTexParameteri                   imgl3wProcs.gl.TexParameteri | ||||
| #define glUniform1i                       imgl3wProcs.gl.Uniform1i | ||||
| #define glUniformMatrix4fv                imgl3wProcs.gl.UniformMatrix4fv | ||||
| #define glUseProgram                      imgl3wProcs.gl.UseProgram | ||||
| #define glVertexAttribPointer             imgl3wProcs.gl.VertexAttribPointer | ||||
| #define glViewport                        imgl3wProcs.gl.Viewport | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef IMGL3W_IMPL | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #define ARRAY_SIZE(x)  (sizeof(x) / sizeof((x)[0])) | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN 1 | ||||
| #endif | ||||
| #include <windows.h> | ||||
|  | ||||
| static HMODULE libgl; | ||||
| typedef PROC(__stdcall* GL3WglGetProcAddr)(LPCSTR); | ||||
| static GL3WglGetProcAddr wgl_get_proc_address; | ||||
|  | ||||
| static int open_libgl(void) | ||||
| { | ||||
|     libgl = LoadLibraryA("opengl32.dll"); | ||||
|     if (!libgl) | ||||
|         return GL3W_ERROR_LIBRARY_OPEN; | ||||
|     wgl_get_proc_address = (GL3WglGetProcAddr)GetProcAddress(libgl, "wglGetProcAddress"); | ||||
|     return GL3W_OK; | ||||
| } | ||||
|  | ||||
| static void close_libgl(void) { FreeLibrary(libgl); } | ||||
| static GL3WglProc get_proc(const char *proc) | ||||
| { | ||||
|     GL3WglProc res; | ||||
|     res = (GL3WglProc)wgl_get_proc_address(proc); | ||||
|     if (!res) | ||||
|         res = (GL3WglProc)GetProcAddress(libgl, proc); | ||||
|     return res; | ||||
| } | ||||
| #elif defined(__APPLE__) | ||||
| #include <dlfcn.h> | ||||
|  | ||||
| static void *libgl; | ||||
| static int open_libgl(void) | ||||
| { | ||||
|     libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL); | ||||
|     if (!libgl) | ||||
|         return GL3W_ERROR_LIBRARY_OPEN; | ||||
|     return GL3W_OK; | ||||
| } | ||||
|  | ||||
| static void close_libgl(void) { dlclose(libgl); } | ||||
|  | ||||
| static GL3WglProc get_proc(const char *proc) | ||||
| { | ||||
|     GL3WglProc res; | ||||
|     *(void **)(&res) = dlsym(libgl, proc); | ||||
|     return res; | ||||
| } | ||||
| #else | ||||
| #include <dlfcn.h> | ||||
|  | ||||
| static void *libgl; | ||||
| static GL3WglProc (*glx_get_proc_address)(const GLubyte *); | ||||
|  | ||||
| static int open_libgl(void) | ||||
| { | ||||
|     libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); | ||||
|     if (!libgl) | ||||
|         return GL3W_ERROR_LIBRARY_OPEN; | ||||
|     *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB"); | ||||
|     return GL3W_OK; | ||||
| } | ||||
|  | ||||
| static void close_libgl(void) { dlclose(libgl); } | ||||
|  | ||||
| static GL3WglProc get_proc(const char *proc) | ||||
| { | ||||
|     GL3WglProc res; | ||||
|     res = glx_get_proc_address((const GLubyte *)proc); | ||||
|     if (!res) | ||||
|         *(void **)(&res) = dlsym(libgl, proc); | ||||
|     return res; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static struct { int major, minor; } version; | ||||
|  | ||||
| static int parse_version(void) | ||||
| { | ||||
|     if (!glGetIntegerv) | ||||
|         return GL3W_ERROR_INIT; | ||||
|     glGetIntegerv(GL_MAJOR_VERSION, &version.major); | ||||
|     glGetIntegerv(GL_MINOR_VERSION, &version.minor); | ||||
|     if (version.major < 3) | ||||
|         return GL3W_ERROR_OPENGL_VERSION; | ||||
|     return GL3W_OK; | ||||
| } | ||||
|  | ||||
| static void load_procs(GL3WGetProcAddressProc proc); | ||||
|  | ||||
| int imgl3wInit(void) | ||||
| { | ||||
|     int res = open_libgl(); | ||||
|     if (res) | ||||
|         return res; | ||||
|     atexit(close_libgl); | ||||
|     return imgl3wInit2(get_proc); | ||||
| } | ||||
|  | ||||
| int imgl3wInit2(GL3WGetProcAddressProc proc) | ||||
| { | ||||
|     load_procs(proc); | ||||
|     return parse_version(); | ||||
| } | ||||
|  | ||||
| int imgl3wIsSupported(int major, int minor) | ||||
| { | ||||
|     if (major < 3) | ||||
|         return 0; | ||||
|     if (version.major == major) | ||||
|         return version.minor >= minor; | ||||
|     return version.major >= major; | ||||
| } | ||||
|  | ||||
| GL3WglProc imgl3wGetProcAddress(const char *proc) { return get_proc(proc); } | ||||
|  | ||||
| static const char *proc_names[] = { | ||||
|     "glActiveTexture", | ||||
|     "glAttachShader", | ||||
|     "glBindBuffer", | ||||
|     "glBindSampler", | ||||
|     "glBindTexture", | ||||
|     "glBindVertexArray", | ||||
|     "glBlendEquation", | ||||
|     "glBlendEquationSeparate", | ||||
|     "glBlendFuncSeparate", | ||||
|     "glBufferData", | ||||
|     "glBufferSubData", | ||||
|     "glClear", | ||||
|     "glClearColor", | ||||
|     "glCompileShader", | ||||
|     "glCreateProgram", | ||||
|     "glCreateShader", | ||||
|     "glDeleteBuffers", | ||||
|     "glDeleteProgram", | ||||
|     "glDeleteShader", | ||||
|     "glDeleteTextures", | ||||
|     "glDeleteVertexArrays", | ||||
|     "glDetachShader", | ||||
|     "glDisable", | ||||
|     "glDisableVertexAttribArray", | ||||
|     "glDrawElements", | ||||
|     "glDrawElementsBaseVertex", | ||||
|     "glEnable", | ||||
|     "glEnableVertexAttribArray", | ||||
|     "glFlush", | ||||
|     "glGenBuffers", | ||||
|     "glGenTextures", | ||||
|     "glGenVertexArrays", | ||||
|     "glGetAttribLocation", | ||||
|     "glGetError", | ||||
|     "glGetIntegerv", | ||||
|     "glGetProgramInfoLog", | ||||
|     "glGetProgramiv", | ||||
|     "glGetShaderInfoLog", | ||||
|     "glGetShaderiv", | ||||
|     "glGetString", | ||||
|     "glGetStringi", | ||||
|     "glGetUniformLocation", | ||||
|     "glGetVertexAttribPointerv", | ||||
|     "glGetVertexAttribiv", | ||||
|     "glIsEnabled", | ||||
|     "glLinkProgram", | ||||
|     "glPixelStorei", | ||||
|     "glPolygonMode", | ||||
|     "glReadPixels", | ||||
|     "glScissor", | ||||
|     "glShaderSource", | ||||
|     "glTexImage2D", | ||||
|     "glTexParameteri", | ||||
|     "glUniform1i", | ||||
|     "glUniformMatrix4fv", | ||||
|     "glUseProgram", | ||||
|     "glVertexAttribPointer", | ||||
|     "glViewport", | ||||
| }; | ||||
|  | ||||
| GL3W_API union GL3WProcs imgl3wProcs; | ||||
|  | ||||
| static void load_procs(GL3WGetProcAddressProc proc) | ||||
| { | ||||
|     size_t i; | ||||
|     for (i = 0; i < ARRAY_SIZE(proc_names); i++) | ||||
|         imgl3wProcs.ptr[i] = proc(proc_names[i]); | ||||
| } | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user