|
@@ -12,6 +12,7 @@
|
|
|
|
|
|
// CHANGELOG
|
|
// CHANGELOG
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
|
+// 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-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-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).
|
|
// 2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450).
|
|
@@ -69,14 +70,18 @@
|
|
#include "TargetConditionals.h"
|
|
#include "TargetConditionals.h"
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-// iOS, Android and Emscripten can use GL ES 3
|
|
|
|
-// Call ImGui_ImplOpenGL3_Init() with "#version 300 es"
|
|
|
|
-#if (defined(__APPLE__) && TARGET_OS_IOS) || (defined(__ANDROID__)) || (defined(__EMSCRIPTEN__))
|
|
|
|
-#define USE_GL_ES3
|
|
|
|
|
|
+// Auto-detect GL version
|
|
|
|
+#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3)
|
|
|
|
+#if (defined(__APPLE__) && TARGET_OS_IOS) || (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"
|
|
|
|
+#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifdef USE_GL_ES3
|
|
|
|
-// OpenGL ES 3
|
|
|
|
|
|
+#if defined(IMGUI_IMPL_OPENGL_ES2)
|
|
|
|
+#include <GLES2/gl2.h>
|
|
|
|
+#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
|
#include <GLES3/gl3.h> // Use GL ES 3
|
|
#include <GLES3/gl3.h> // Use GL ES 3
|
|
#else
|
|
#else
|
|
// About Desktop OpenGL function loaders:
|
|
// About Desktop OpenGL function loaders:
|
|
@@ -109,7 +114,10 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
|
io.BackendRendererName = "imgui_impl_opengl3";
|
|
io.BackendRendererName = "imgui_impl_opengl3";
|
|
|
|
|
|
// 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 NULL if unsure.
|
|
// 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 NULL if unsure.
|
|
-#ifdef USE_GL_ES3
|
|
|
|
|
|
+#if defined(IMGUI_IMPL_OPENGL_ES2)
|
|
|
|
+ if (glsl_version == NULL)
|
|
|
|
+ glsl_version = "#version 100";
|
|
|
|
+#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
|
if (glsl_version == NULL)
|
|
if (glsl_version == NULL)
|
|
glsl_version = "#version 300 es";
|
|
glsl_version = "#version 300 es";
|
|
#else
|
|
#else
|
|
@@ -154,7 +162,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);
|
|
GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);
|
|
#endif
|
|
#endif
|
|
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
|
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
|
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
|
|
|
+#endif
|
|
#ifdef GL_POLYGON_MODE
|
|
#ifdef GL_POLYGON_MODE
|
|
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
|
|
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
|
|
#endif
|
|
#endif
|
|
@@ -208,11 +218,14 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
#ifdef GL_SAMPLER_BINDING
|
|
#ifdef GL_SAMPLER_BINDING
|
|
glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
|
glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
|
#endif
|
|
#endif
|
|
|
|
+
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
// Recreate the VAO every time
|
|
// Recreate the VAO every time
|
|
// (This is to easily allow multiple GL contexts. VAO are not shared among GL contexts, and we don't track creation/deletion of windows so we don't have an obvious key to use to cache them.)
|
|
// (This is to easily allow multiple GL contexts. VAO are not shared among GL contexts, and we don't track creation/deletion of windows so we don't have an obvious key to use to cache them.)
|
|
GLuint vao_handle = 0;
|
|
GLuint vao_handle = 0;
|
|
glGenVertexArrays(1, &vao_handle);
|
|
glGenVertexArrays(1, &vao_handle);
|
|
glBindVertexArray(vao_handle);
|
|
glBindVertexArray(vao_handle);
|
|
|
|
+#endif
|
|
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
|
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
|
glEnableVertexAttribArray(g_AttribLocationPosition);
|
|
glEnableVertexAttribArray(g_AttribLocationPosition);
|
|
glEnableVertexAttribArray(g_AttribLocationUV);
|
|
glEnableVertexAttribArray(g_AttribLocationUV);
|
|
@@ -270,7 +283,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
idx_buffer_offset += pcmd->ElemCount * sizeof(ImDrawIdx);
|
|
idx_buffer_offset += pcmd->ElemCount * sizeof(ImDrawIdx);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
glDeleteVertexArrays(1, &vao_handle);
|
|
glDeleteVertexArrays(1, &vao_handle);
|
|
|
|
+#endif
|
|
|
|
|
|
// Restore modified GL state
|
|
// Restore modified GL state
|
|
glUseProgram(last_program);
|
|
glUseProgram(last_program);
|
|
@@ -279,7 +294,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
glBindSampler(0, last_sampler);
|
|
glBindSampler(0, last_sampler);
|
|
#endif
|
|
#endif
|
|
glActiveTexture(last_active_texture);
|
|
glActiveTexture(last_active_texture);
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
glBindVertexArray(last_vertex_array);
|
|
glBindVertexArray(last_vertex_array);
|
|
|
|
+#endif
|
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
|
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
|
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);
|
|
glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
|
|
@@ -309,7 +326,9 @@ bool ImGui_ImplOpenGL3_CreateFontsTexture()
|
|
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
|
|
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
+#ifdef GL_UNPACK_ROW_LENGTH
|
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
|
|
+#endif
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
|
|
|
|
|
// Store our identifier
|
|
// Store our identifier
|
|
@@ -371,10 +390,13 @@ static bool CheckProgram(GLuint handle, const char* desc)
|
|
bool ImGui_ImplOpenGL3_CreateDeviceObjects()
|
|
bool ImGui_ImplOpenGL3_CreateDeviceObjects()
|
|
{
|
|
{
|
|
// Backup GL state
|
|
// Backup GL state
|
|
- GLint last_texture, last_array_buffer, last_vertex_array;
|
|
|
|
|
|
+ GLint last_texture, last_array_buffer;
|
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
|
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
|
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
|
|
+ GLint last_vertex_array;
|
|
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
|
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
|
|
|
+#endif
|
|
|
|
|
|
// Parse GLSL version string
|
|
// Parse GLSL version string
|
|
int glsl_version = 130;
|
|
int glsl_version = 130;
|
|
@@ -538,7 +560,9 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects()
|
|
// Restore modified GL state
|
|
// Restore modified GL state
|
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
glBindVertexArray(last_vertex_array);
|
|
glBindVertexArray(last_vertex_array);
|
|
|
|
+#endif
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|