mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Backends: OpenGL3: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers.. (#4468, #4504, #2981, #3381)
This commit is contained in:
		| @@ -14,6 +14,7 @@ | ||||
|  | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2021-12-15: OpenGL: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers. | ||||
| //  2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions. | ||||
| //  2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader. | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| @@ -174,6 +175,8 @@ struct ImGui_ImplOpenGL3_Data | ||||
|     GLuint          AttribLocationVtxUV; | ||||
|     GLuint          AttribLocationVtxColor; | ||||
|     unsigned int    VboHandle, ElementsHandle; | ||||
|     GLsizeiptr      VertexBufferSize; | ||||
|     GLsizeiptr      IndexBufferSize; | ||||
|     bool            HasClipOrigin; | ||||
|  | ||||
|     ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); } | ||||
| @@ -425,8 +428,20 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | ||||
|         const ImDrawList* cmd_list = draw_data->CmdLists[n]; | ||||
|  | ||||
|         // Upload vertex/index buffers | ||||
|         glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW); | ||||
|         glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW); | ||||
|         GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); | ||||
|         GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); | ||||
|         if (bd->VertexBufferSize < vtx_buffer_size) | ||||
|         { | ||||
|             bd->VertexBufferSize = vtx_buffer_size; | ||||
|             glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, NULL, GL_STREAM_DRAW); | ||||
|         } | ||||
|         if (bd->IndexBufferSize < idx_buffer_size) | ||||
|         { | ||||
|             bd->IndexBufferSize = idx_buffer_size; | ||||
|             glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, NULL, GL_STREAM_DRAW); | ||||
|         } | ||||
|         glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data); | ||||
|         glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data); | ||||
|  | ||||
|         for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) | ||||
|         { | ||||
|   | ||||
| @@ -249,11 +249,13 @@ typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); | ||||
| typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); | ||||
| typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); | ||||
| typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); | ||||
| typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); | ||||
| #ifdef GL_GLEXT_PROTOTYPES | ||||
| GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); | ||||
| GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); | ||||
| GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); | ||||
| GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); | ||||
| GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); | ||||
| #endif | ||||
| #endif /* GL_VERSION_1_5 */ | ||||
| #ifndef GL_VERSION_2_0 | ||||
| @@ -447,6 +449,7 @@ union GL3WProcs { | ||||
|         PFNGLBLENDEQUATIONSEPARATEPROC   BlendEquationSeparate; | ||||
|         PFNGLBLENDFUNCSEPARATEPROC       BlendFuncSeparate; | ||||
|         PFNGLBUFFERDATAPROC              BufferData; | ||||
|         PFNGLBUFFERSUBDATAPROC           BufferSubData; | ||||
|         PFNGLCLEARPROC                   Clear; | ||||
|         PFNGLCLEARCOLORPROC              ClearColor; | ||||
|         PFNGLCOMPILESHADERPROC           CompileShader; | ||||
| @@ -506,6 +509,7 @@ GL3W_API extern union GL3WProcs imgl3wProcs; | ||||
| #define glBlendEquationSeparate          imgl3wProcs.gl.BlendEquationSeparate | ||||
| #define glBlendFuncSeparate              imgl3wProcs.gl.BlendFuncSeparate | ||||
| #define glBufferData                     imgl3wProcs.gl.BufferData | ||||
| #define glBufferSubData                  imgl3wProcs.gl.BufferSubData | ||||
| #define glClear                          imgl3wProcs.gl.Clear | ||||
| #define glClearColor                     imgl3wProcs.gl.ClearColor | ||||
| #define glCompileShader                  imgl3wProcs.gl.CompileShader | ||||
| @@ -692,6 +696,7 @@ static const char *proc_names[] = { | ||||
|     "glBlendEquationSeparate", | ||||
|     "glBlendFuncSeparate", | ||||
|     "glBufferData", | ||||
|     "glBufferSubData", | ||||
|     "glClear", | ||||
|     "glClearColor", | ||||
|     "glCompileShader", | ||||
|   | ||||
| @@ -105,6 +105,8 @@ Other Changes: | ||||
| - Backends: Vulkan: Call vkCmdSetScissor() at the end of render with a full-viewport to reduce | ||||
|   likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling | ||||
|   vkCmdSetScissor() explicitly every frame. (#4644) | ||||
| - Backends: OpenGL3: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports | ||||
|   with some Intel HD drivers, and perhaps improve performances. (#4468, #4504, #2981, #3381) [@parbo] | ||||
| - Backends: OpenGL2, Allegro5, Marmalade: Fixed mishandling of the ImDrawCmd::IdxOffset field. | ||||
|   This is an old bug, but due to the way we created drawlists, it never had any visible side-effect before. | ||||
|   The new code for handling Modal and CTRL+Tab dimming/whitening recently made the bug surface. (#4790) | ||||
|   | ||||
| @@ -6882,7 +6882,7 @@ static bool IsRootOfOpenMenuSet() | ||||
|     // Instead we don't treat Popup specifically (in order to consistently support menu features in them), maybe the first child menu of a Popup | ||||
|     // doesn't have the _ChildWindow flag, and we rely on this IsRootOfOpenMenuSet() check to allow hovering between root window/popup and first chilld menu. | ||||
|     const ImGuiPopupData* upper_popup = &g.OpenPopupStack[g.BeginPopupStack.Size]; | ||||
|     return (upper_popup && /*upper_popup->OpenParentId == window->IDStack.back() &&*/ upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu)); | ||||
|     return (/*upper_popup->OpenParentId == window->IDStack.back() &&*/ upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu)); | ||||
| } | ||||
|  | ||||
| bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user