[Scummvm-git-logs] scummvm master -> 4cd62e3398d8b8d90025f10e8beb34eb9109dfe8
sev-
noreply at scummvm.org
Thu May 16 23:47:35 UTC 2024
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
9a494e7795 BACKENDS: IMGUI: Undo code formatting changes to minimize diff with the upstream
4cd62e3398 BACKENDS: IMGUI: Renamed modified files to minimize diff with upstream
Commit: 9a494e7795e5374a2bd840a307f48a3ac2e60b99
https://github.com/scummvm/scummvm/commit/9a494e7795e5374a2bd840a307f48a3ac2e60b99
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-05-17T01:31:08+02:00
Commit Message:
BACKENDS: IMGUI: Undo code formatting changes to minimize diff with the upstream
Changed paths:
backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
backends/imgui/backends/imgui_impl_opengl3_scummvm.h
diff --git a/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp b/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
index 870adda0e57..a2dcf45e35b 100644
--- a/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
+++ b/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
@@ -113,7 +113,7 @@
#ifndef IMGUI_DISABLE
#include "imgui_impl_opengl3_scummvm.h"
#include <stdio.h>
-#include <stdint.h> // intptr_t
+#include <stdint.h> // intptr_t
#if defined(__APPLE__)
#include <TargetConditionals.h>
#endif
@@ -121,25 +121,25 @@
// Clang/GCC 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
-#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
+#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
+#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used
#pragma clang diagnostic ignored "-Wnonportable-system-include-path"
-#pragma clang diagnostic ignored "-Wcast-function-type" // warning: cast between incompatible function types (for loader)
+#pragma clang diagnostic ignored "-Wcast-function-type" // warning: cast between incompatible function types (for loader)
#endif
#if defined(__GNUC__)
#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
-#pragma GCC diagnostic ignored "-Wcast-function-type" // warning: cast between incompatible function types (for loader)
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
+#pragma GCC diagnostic ignored "-Wcast-function-type" // warning: cast between incompatible function types (for loader)
#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
+#include <OpenGLES/ES2/gl.h> // Use GL ES 2
#else
-#include <GLES2/gl2.h> // Use GL ES 2
+#include <GLES2/gl2.h> // Use GL ES 2
#endif
#if defined(__EMSCRIPTEN__)
#ifndef GL_GLEXT_PROTOTYPES
@@ -149,9 +149,9 @@
#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
+#include <OpenGLES/ES3/gl.h> // Use GL ES 3
#else
-#include <GLES3/gl3.h> // Use GL ES 3
+#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.
@@ -171,9 +171,9 @@
#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 glBindVertexArray glBindVertexArrayOES
+#define glGenVertexArrays glGenVertexArraysOES
+#define glDeleteVertexArrays glDeleteVertexArraysOES
#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES
#endif
@@ -203,761 +203,738 @@
#endif
// [Debugging]
-// #define IMGUI_IMPL_OPENGL_DEBUG
+//#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
+#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
+#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.
- bool GlProfileIsES2;
- bool GlProfileIsES3;
- bool GlProfileIsCompat;
- GLint GlProfileMask;
- 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)); }
+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.
+ bool GlProfileIsES2;
+ bool GlProfileIsES3;
+ bool GlProfileIsCompat;
+ GLint GlProfileMask;
+ 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;
+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);
- }
+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!");
+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
+ // 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;
- }
+ 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";
+ // 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)
+ // Query for GL version (e.g. 320 for GL 3.2)
#if defined(IMGUI_IMPL_OPENGL_ES2)
- // GLES 2
- bd->GlVersion = 200;
- bd->GlProfileIsES2 = true;
+ // GLES 2
+ bd->GlVersion = 200;
+ bd->GlProfileIsES2 = true;
#else
- // Desktop or GLES 3
- 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);
+ // Desktop or GLES 3
+ 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);
#if defined(GL_CONTEXT_PROFILE_MASK)
- if (bd->GlVersion >= 320)
- glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask);
- bd->GlProfileIsCompat = (bd->GlProfileMask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0;
+ if (bd->GlVersion >= 320)
+ glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask);
+ bd->GlProfileIsCompat = (bd->GlProfileMask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0;
#endif
#if defined(IMGUI_IMPL_OPENGL_ES3)
- bd->GlProfileIsES3 = true;
+ bd->GlProfileIsES3 = true;
#endif
- bd->UseBufferSubData = false;
- /*
- // Query vendor to enable glBufferSubData kludge
+ 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;
+ if (const char* vendor = (const char*)glGetString(GL_VENDOR))
+ if (strncmp(vendor, "Intel", 5) == 0)
+ bd->UseBufferSubData = true;
#endif
- */
+ */
#endif
#ifdef IMGUI_IMPL_OPENGL_DEBUG
- printf("GlVersion = %d\nGlProfileIsCompat = %d\nGlProfileMask = 0x%X\nGlProfileIsES2 = %d, GlProfileIsES3 = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", bd->GlVersion, bd->GlProfileIsCompat, bd->GlProfileMask, bd->GlProfileIsES2, bd->GlProfileIsES3, (const char *)glGetString(GL_VENDOR), (const char *)glGetString(GL_RENDERER)); // [DEBUG]
+ printf("GlVersion = %d\nGlProfileIsCompat = %d\nGlProfileMask = 0x%X\nGlProfileIsES2 = %d, GlProfileIsES3 = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", bd->GlVersion, bd->GlProfileIsCompat, bd->GlProfileMask, bd->GlProfileIsES2, bd->GlProfileIsES3, (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.
+ 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) {
+ // 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";
+ glsl_version = "#version 100";
#elif defined(IMGUI_IMPL_OPENGL_ES3)
- glsl_version = "#version 300 es";
+ glsl_version = "#version 300 es";
#elif defined(__APPLE__)
- glsl_version = "#version 150";
+ glsl_version = "#version 150";
#else
- glsl_version = "#version 130";
+ 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");
+ }
+ 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);
+ // 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);
+ // 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;
- }
+ 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;
+ 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;
- io.BackendFlags &= ~ImGuiBackendFlags_RendererHasVtxOffset;
- IM_DELETE(bd);
+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;
+ io.BackendFlags &= ~ImGuiBackendFlags_RendererHasVtxOffset;
+ IM_DELETE(bd);
}
-void ImGui_ImplOpenGL3_NewFrame() {
- ImGui_ImplOpenGL3_Data *bd = ImGui_ImplOpenGL3_GetBackendData();
- IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL3_Init()?");
+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();
+ 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);
+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);
+ if (bd->GlVersion >= 310)
+ glDisable(GL_PRIMITIVE_RESTART);
#endif
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
- // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT)
+ // 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;
+ 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]);
+ 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 || bd->GlProfileIsES3)
- glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 and GL ES 3.0 may set that otherwise.
+ if (bd->GlVersion >= 330 || bd->GlProfileIsES3)
+ glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 and GL ES 3.0 may set that otherwise.
#endif
- (void)vertex_array_object;
+ (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 *)offsetof(ImDrawVert, pos)));
- GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid *)offsetof(ImDrawVert, uv)));
- GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid *)offsetof(ImDrawVert, col)));
+ 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*)offsetof(ImDrawVert, pos)));
+ GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, uv)));
+ GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)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);
+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 || bd->GlProfileIsES3) {
- 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);
+ GLuint last_sampler; if (bd->GlVersion >= 330 || bd->GlProfileIsES3) { 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);
+ // 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);
+ 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);
+ 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;
+ 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;
+ // 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()));
+ 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
+ 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))));
- }
- }
- }
+ 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
+ // Destroy the temporary VAO
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- GL_CALL(glDeleteVertexArrays(1, &vertex_array_object));
+ GL_CALL(glDeleteVertexArrays(1, &vertex_array_object));
#endif
- // Restore modified GL state
- // This "glIsProgram()" check is required because if the program is "pending deletion" at the time of binding backup, it will have been deleted by now and will cause an OpenGL error. See #6220.
- if (last_program == 0 || glIsProgram(last_program))
- glUseProgram(last_program);
- glBindTexture(GL_TEXTURE_2D, last_texture);
+ // Restore modified GL state
+ // This "glIsProgram()" check is required because if the program is "pending deletion" at the time of binding backup, it will have been deleted by now and will cause an OpenGL error. See #6220.
+ if (last_program == 0 || glIsProgram(last_program)) glUseProgram(last_program);
+ glBindTexture(GL_TEXTURE_2D, last_texture);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
- if (bd->GlVersion >= 330 || bd->GlProfileIsES3)
- glBindSampler(0, last_sampler);
+ if (bd->GlVersion >= 330 || bd->GlProfileIsES3)
+ glBindSampler(0, last_sampler);
#endif
- glActiveTexture(last_active_texture);
+ glActiveTexture(last_active_texture);
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glBindVertexArray(last_vertex_array_object);
+ glBindVertexArray(last_vertex_array_object);
#endif
- glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
+ 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);
+ 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);
- }
+ 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
- // Desktop OpenGL 3.0 and OpenGL 3.1 had separate polygon draw modes for front-facing and back-facing faces of polygons
- if (bd->GlVersion <= 310 || bd->GlProfileIsCompat) {
- glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]);
- glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
- } else {
- glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
- }
+ // Desktop OpenGL 3.0 and OpenGL 3.1 had separate polygon draw modes for front-facing and back-facing faces of polygons
+ if (bd->GlVersion <= 310 || bd->GlProfileIsCompat)
+ {
+ glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]);
+ glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
+ }
+ else
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
+ }
#endif // IMGUI_IMPL_HAS_POLYGON_MODE
- 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
+ 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));
+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));
+ 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));
+ 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);
+ // Store our identifier
+ io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
- // Restore state
- GL_CALL(glBindTexture(GL_TEXTURE_2D, last_texture));
+ // Restore state
+ GL_CALL(glBindTexture(GL_TEXTURE_2D, last_texture));
- return true;
+ 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;
- }
+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;
+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;
+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();
+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);
+ // 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);
+ 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);
+ glBindVertexArray(last_vertex_array);
#endif
- return true;
+ 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();
+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();
}
//-----------------------------------------------------------------------------
diff --git a/backends/imgui/backends/imgui_impl_opengl3_scummvm.h b/backends/imgui/backends/imgui_impl_opengl3_scummvm.h
index 63f199f8768..e9146c4eccf 100644
--- a/backends/imgui/backends/imgui_impl_opengl3_scummvm.h
+++ b/backends/imgui/backends/imgui_impl_opengl3_scummvm.h
@@ -30,32 +30,33 @@
#ifndef IMGUI_DISABLE
// 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);
+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();
+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
+//#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)
+#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__)
-#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100"
+#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
Commit: 4cd62e3398d8b8d90025f10e8beb34eb9109dfe8
https://github.com/scummvm/scummvm/commit/4cd62e3398d8b8d90025f10e8beb34eb9109dfe8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-05-17T01:46:45+02:00
Commit Message:
BACKENDS: IMGUI: Renamed modified files to minimize diff with upstream
Changed paths:
A backends/imgui/backends/imgui_impl_opengl3.cpp
A backends/imgui/backends/imgui_impl_opengl3.h
A backends/imgui/backends/imgui_impl_sdl2.cpp
A backends/imgui/backends/imgui_impl_sdl2.h
R backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
R backends/imgui/backends/imgui_impl_opengl3_scummvm.h
R backends/imgui/backends/imgui_impl_sdl2_scummvm.cpp
R backends/imgui/backends/imgui_impl_sdl2_scummvm.h
backends/events/sdl/sdl-events.cpp
backends/graphics/openglsdl/openglsdl-graphics.cpp
backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp
backends/module.mk
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp
index 694fe39fed0..bef0ef75bc6 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -33,7 +33,7 @@
#include "gui/gui-manager.h"
#if defined(USE_IMGUI) && SDL_VERSION_ATLEAST(2, 0, 0)
-#include "backends/imgui/backends/imgui_impl_sdl2_scummvm.h"
+#include "backends/imgui/backends/imgui_impl_sdl2.h"
#endif
#if SDL_VERSION_ATLEAST(2, 0, 0)
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index 3ea5d1048b4..3d3c09dde33 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -35,8 +35,8 @@
#endif
#ifdef USE_IMGUI
-#include "backends/imgui/backends/imgui_impl_sdl2_scummvm.h"
-#include "backends/imgui/backends/imgui_impl_opengl3_scummvm.h"
+#include "backends/imgui/backends/imgui_impl_sdl2.h"
+#include "backends/imgui/backends/imgui_impl_opengl3.h"
#endif
OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *eventSource, SdlWindow *window)
diff --git a/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp b/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp
index 1e30f6f2a76..a54b76230f5 100644
--- a/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp
+++ b/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp
@@ -47,8 +47,8 @@
#endif
#ifdef USE_IMGUI
-#include "backends/imgui/backends/imgui_impl_sdl2_scummvm.h"
-#include "backends/imgui/backends/imgui_impl_opengl3_scummvm.h"
+#include "backends/imgui/backends/imgui_impl_sdl2.h"
+#include "backends/imgui/backends/imgui_impl_opengl3.h"
#endif
OpenGLSdlGraphics3dManager::OpenGLSdlGraphics3dManager(SdlEventSource *eventSource, SdlWindow *window, bool supportsFrameBuffer)
diff --git a/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp b/backends/imgui/backends/imgui_impl_opengl3.cpp
similarity index 99%
rename from backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
rename to backends/imgui/backends/imgui_impl_opengl3.cpp
index a2dcf45e35b..fd7640b55f0 100644
--- a/backends/imgui/backends/imgui_impl_opengl3_scummvm.cpp
+++ b/backends/imgui/backends/imgui_impl_opengl3.cpp
@@ -111,7 +111,7 @@
#include "backends/imgui/imgui.h"
#ifndef IMGUI_DISABLE
-#include "imgui_impl_opengl3_scummvm.h"
+#include "imgui_impl_opengl3.h"
#include <stdio.h>
#include <stdint.h> // intptr_t
#if defined(__APPLE__)
@@ -163,7 +163,7 @@
// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
#define IMGL3W_SCUMMVM_LOADER
#define IMGL3W_IMPL
-#include "backends/imgui/backends/imgui_impl_opengl3_loader.h"
+#include "imgui_impl_opengl3_loader.h"
#endif
// Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension
diff --git a/backends/imgui/backends/imgui_impl_opengl3_scummvm.h b/backends/imgui/backends/imgui_impl_opengl3.h
similarity index 98%
rename from backends/imgui/backends/imgui_impl_opengl3_scummvm.h
rename to backends/imgui/backends/imgui_impl_opengl3.h
index e9146c4eccf..5def59ad84d 100644
--- a/backends/imgui/backends/imgui_impl_opengl3_scummvm.h
+++ b/backends/imgui/backends/imgui_impl_opengl3.h
@@ -26,7 +26,7 @@
// 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 "backends/imgui/imgui.h" // IMGUI_IMPL_API
+#include "backends/imgui/imgui.h" // IMGUI_IMPL_API
#ifndef IMGUI_DISABLE
// Backend API
diff --git a/backends/imgui/backends/imgui_impl_sdl2_scummvm.cpp b/backends/imgui/backends/imgui_impl_sdl2.cpp
similarity index 99%
rename from backends/imgui/backends/imgui_impl_sdl2_scummvm.cpp
rename to backends/imgui/backends/imgui_impl_sdl2.cpp
index 7c25d6b9b92..38d73066d59 100644
--- a/backends/imgui/backends/imgui_impl_sdl2_scummvm.cpp
+++ b/backends/imgui/backends/imgui_impl_sdl2.cpp
@@ -78,7 +78,7 @@
#ifndef IMGUI_DISABLE
#include "backends/platform/sdl/sdl.h"
-#include "imgui_impl_sdl2_scummvm.h"
+#include "imgui_impl_sdl2.h"
#if SDL_VERSION_ATLEAST(2, 0, 0)
// Clang warnings with -Weverything
diff --git a/backends/imgui/backends/imgui_impl_sdl2_scummvm.h b/backends/imgui/backends/imgui_impl_sdl2.h
similarity index 100%
rename from backends/imgui/backends/imgui_impl_sdl2_scummvm.h
rename to backends/imgui/backends/imgui_impl_sdl2.h
diff --git a/backends/module.mk b/backends/module.mk
index 8361801ddcb..54a890fa8ff 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -500,8 +500,8 @@ endif
ifdef USE_SDL2
ifdef USE_IMGUI
MODULE_OBJS += \
- imgui/backends/imgui_impl_opengl3_scummvm.o \
- imgui/backends/imgui_impl_sdl2_scummvm.o
+ imgui/backends/imgui_impl_opengl3.o \
+ imgui/backends/imgui_impl_sdl2.o
endif
endif
More information about the Scummvm-git-logs
mailing list