@ -12,6 +12,7 @@
// CHANGELOG
// (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-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).
@ -69,14 +70,18 @@
# include "TargetConditionals.h"
# 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
# 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
# else
// About Desktop OpenGL function loaders:
@ -109,7 +114,10 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
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.
# 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 )
glsl_version = " #version 300 es " ;
# else
@ -154,7 +162,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
GLint last_sampler ; glGetIntegerv ( GL_SAMPLER_BINDING , & last_sampler ) ;
# endif
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 ) ;
# endif
# ifdef GL_POLYGON_MODE
GLint last_polygon_mode [ 2 ] ; glGetIntegerv ( GL_POLYGON_MODE , last_polygon_mode ) ;
# endif
@ -208,11 +218,14 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
# ifdef GL_SAMPLER_BINDING
glBindSampler ( 0 , 0 ) ; // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
# endif
# ifndef IMGUI_IMPL_OPENGL_ES2
// 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.)
GLuint vao_handle = 0 ;
glGenVertexArrays ( 1 , & vao_handle ) ;
glBindVertexArray ( vao_handle ) ;
# endif
glBindBuffer ( GL_ARRAY_BUFFER , g_VboHandle ) ;
glEnableVertexAttribArray ( g_AttribLocationPosition ) ;
glEnableVertexAttribArray ( g_AttribLocationUV ) ;
@ -270,7 +283,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
idx_buffer_offset + = pcmd - > ElemCount * sizeof ( ImDrawIdx ) ;
}
}
# ifndef IMGUI_IMPL_OPENGL_ES2
glDeleteVertexArrays ( 1 , & vao_handle ) ;
# endif
// Restore modified GL state
glUseProgram ( last_program ) ;
@ -279,7 +294,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
glBindSampler ( 0 , last_sampler ) ;
# endif
glActiveTexture ( last_active_texture ) ;
# ifndef IMGUI_IMPL_OPENGL_ES2
glBindVertexArray ( last_vertex_array ) ;
# endif
glBindBuffer ( GL_ARRAY_BUFFER , last_array_buffer ) ;
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 ) ;
@ -309,7 +326,9 @@ bool ImGui_ImplOpenGL3_CreateFontsTexture()
glBindTexture ( GL_TEXTURE_2D , g_FontTexture ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
# ifdef GL_UNPACK_ROW_LENGTH
glPixelStorei ( GL_UNPACK_ROW_LENGTH , 0 ) ;
# endif
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , width , height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , pixels ) ;
// Store our identifier
@ -371,10 +390,13 @@ static bool CheckProgram(GLuint handle, const char* desc)
bool ImGui_ImplOpenGL3_CreateDeviceObjects ( )
{
// 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_ARRAY_BUFFER_BINDING , & last_array_buffer ) ;
# ifndef IMGUI_IMPL_OPENGL_ES2
GLint last_vertex_array ;
glGetIntegerv ( GL_VERTEX_ARRAY_BINDING , & last_vertex_array ) ;
# endif
// Parse GLSL version string
int glsl_version = 130 ;
@ -538,7 +560,9 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects()
// Restore modified GL state
glBindTexture ( GL_TEXTURE_2D , last_texture ) ;
glBindBuffer ( GL_ARRAY_BUFFER , last_array_buffer ) ;
# ifndef IMGUI_IMPL_OPENGL_ES2
glBindVertexArray ( last_vertex_array ) ;
# endif
return true ;
}