mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Backends: OpenGL3: Enable OES_vertex_array_object extension for emscripten/wasm build (#4266, #4267)
This commit is contained in:
		| @@ -14,6 +14,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) | ||||||
|  | //  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-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-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-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) | ||||||
| @@ -94,6 +95,12 @@ | |||||||
| // GL includes | // GL includes | ||||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) | #if defined(IMGUI_IMPL_OPENGL_ES2) | ||||||
| #include <GLES2/gl2.h> | #include <GLES2/gl2.h> | ||||||
|  | #if defined(__EMSCRIPTEN__) | ||||||
|  | #ifndef GL_GLEXT_PROTOTYPES | ||||||
|  | #define GL_GLEXT_PROTOTYPES | ||||||
|  | #endif | ||||||
|  | #include <GLES2/gl2ext.h> | ||||||
|  | #endif | ||||||
| #elif defined(IMGUI_IMPL_OPENGL_ES3) | #elif defined(IMGUI_IMPL_OPENGL_ES3) | ||||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) | #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 | ||||||
| @@ -132,6 +139,17 @@ using namespace gl; | |||||||
| #endif | #endif | ||||||
| #endif | #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 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have. | // 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) | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2) | ||||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||||
| @@ -323,7 +341,7 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     (void)vertex_array_object; |     (void)vertex_array_object; | ||||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     glBindVertexArray(vertex_array_object); |     glBindVertexArray(vertex_array_object); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -358,7 +376,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | |||||||
|     GLuint last_sampler; if (g_GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } |     GLuint last_sampler; if (g_GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } | ||||||
| #endif | #endif | ||||||
|     GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); |     GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); | ||||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | #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 | #endif | ||||||
| #ifdef GL_POLYGON_MODE | #ifdef GL_POLYGON_MODE | ||||||
| @@ -385,7 +403,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | |||||||
|     // Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts) |     // 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. |     // 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; |     GLuint vertex_array_object = 0; | ||||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     glGenVertexArrays(1, &vertex_array_object); |     glGenVertexArrays(1, &vertex_array_object); | ||||||
| #endif | #endif | ||||||
|     ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); |     ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); | ||||||
| @@ -443,7 +461,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Destroy the temporary VAO |     // Destroy the temporary VAO | ||||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     glDeleteVertexArrays(1, &vertex_array_object); |     glDeleteVertexArrays(1, &vertex_array_object); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -455,7 +473,7 @@ 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 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     glBindVertexArray(last_vertex_array_object); |     glBindVertexArray(last_vertex_array_object); | ||||||
| #endif | #endif | ||||||
|     glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); |     glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); | ||||||
| @@ -559,7 +577,7 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | |||||||
|     GLint last_texture, last_array_buffer; |     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 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     GLint last_vertex_array; |     GLint last_vertex_array; | ||||||
|     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); |     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); | ||||||
| #endif | #endif | ||||||
| @@ -732,7 +750,7 @@ 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 | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY | ||||||
|     glBindVertexArray(last_vertex_array); |     glBindVertexArray(last_vertex_array); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -63,6 +63,7 @@ Other Changes: | |||||||
|   about building on 32-bit systems. (#4225) [@kingofthebongo2008] |   about building on 32-bit systems. (#4225) [@kingofthebongo2008] | ||||||
| - Backends: OpenGL3: Handle GL_CLIP_ORIGIN on <4.5 contexts if "GL_ARB_clip_control" extension is detected. (#4170, #3998) | - Backends: OpenGL3: Handle GL_CLIP_ORIGIN on <4.5 contexts if "GL_ARB_clip_control" extension is detected. (#4170, #3998) | ||||||
| - Backends: OpenGL3: Destroy vertex/fragment shader objects right after they are linked into main shader. (#4244) [@Crowbarous] | - Backends: OpenGL3: Destroy vertex/fragment shader objects right after they are linked into main shader. (#4244) [@Crowbarous] | ||||||
|  | - Backends: OpenGL3: Use OES_vertex_array extension on Emscripten + backup/restore current state. (#4266, #4267) [@harry75369] | ||||||
| - Backends: OSX: Added a fix for shortcuts using CTRL key instead of CMD key. (#4253) [@rokups] | - Backends: OSX: Added a fix for shortcuts using CTRL key instead of CMD key. (#4253) [@rokups] | ||||||
| - Examples: OSX+OpenGL2: Fix event forwarding (fix key remaining stuck when using shortcuts with Cmd/Super key). | - Examples: OSX+OpenGL2: Fix event forwarding (fix key remaining stuck when using shortcuts with Cmd/Super key). | ||||||
|   Other OSX examples were not affected. (#4253, #1873) [@rokups] |   Other OSX examples were not affected. (#4253, #1873) [@rokups] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user