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 | // 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-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-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-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). | //  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          AttribLocationVtxUV; | ||||||
|     GLuint          AttribLocationVtxColor; |     GLuint          AttribLocationVtxColor; | ||||||
|     unsigned int    VboHandle, ElementsHandle; |     unsigned int    VboHandle, ElementsHandle; | ||||||
|  |     GLsizeiptr      VertexBufferSize; | ||||||
|  |     GLsizeiptr      IndexBufferSize; | ||||||
|     bool            HasClipOrigin; |     bool            HasClipOrigin; | ||||||
|  |  | ||||||
|     ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); } |     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]; |         const ImDrawList* cmd_list = draw_data->CmdLists[n]; | ||||||
|  |  | ||||||
|         // Upload vertex/index buffers |         // 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); |         GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); | ||||||
|         glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW); |         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++) |         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 PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); | ||||||
| typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, 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 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 | #ifdef GL_GLEXT_PROTOTYPES | ||||||
| GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); | GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); | ||||||
| GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); | GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); | ||||||
| GLAPI void APIENTRY glGenBuffers (GLsizei n, 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 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 | ||||||
| #endif /* GL_VERSION_1_5 */ | #endif /* GL_VERSION_1_5 */ | ||||||
| #ifndef GL_VERSION_2_0 | #ifndef GL_VERSION_2_0 | ||||||
| @@ -447,6 +449,7 @@ union GL3WProcs { | |||||||
|         PFNGLBLENDEQUATIONSEPARATEPROC   BlendEquationSeparate; |         PFNGLBLENDEQUATIONSEPARATEPROC   BlendEquationSeparate; | ||||||
|         PFNGLBLENDFUNCSEPARATEPROC       BlendFuncSeparate; |         PFNGLBLENDFUNCSEPARATEPROC       BlendFuncSeparate; | ||||||
|         PFNGLBUFFERDATAPROC              BufferData; |         PFNGLBUFFERDATAPROC              BufferData; | ||||||
|  |         PFNGLBUFFERSUBDATAPROC           BufferSubData; | ||||||
|         PFNGLCLEARPROC                   Clear; |         PFNGLCLEARPROC                   Clear; | ||||||
|         PFNGLCLEARCOLORPROC              ClearColor; |         PFNGLCLEARCOLORPROC              ClearColor; | ||||||
|         PFNGLCOMPILESHADERPROC           CompileShader; |         PFNGLCOMPILESHADERPROC           CompileShader; | ||||||
| @@ -506,6 +509,7 @@ GL3W_API extern union GL3WProcs imgl3wProcs; | |||||||
| #define glBlendEquationSeparate          imgl3wProcs.gl.BlendEquationSeparate | #define glBlendEquationSeparate          imgl3wProcs.gl.BlendEquationSeparate | ||||||
| #define glBlendFuncSeparate              imgl3wProcs.gl.BlendFuncSeparate | #define glBlendFuncSeparate              imgl3wProcs.gl.BlendFuncSeparate | ||||||
| #define glBufferData                     imgl3wProcs.gl.BufferData | #define glBufferData                     imgl3wProcs.gl.BufferData | ||||||
|  | #define glBufferSubData                  imgl3wProcs.gl.BufferSubData | ||||||
| #define glClear                          imgl3wProcs.gl.Clear | #define glClear                          imgl3wProcs.gl.Clear | ||||||
| #define glClearColor                     imgl3wProcs.gl.ClearColor | #define glClearColor                     imgl3wProcs.gl.ClearColor | ||||||
| #define glCompileShader                  imgl3wProcs.gl.CompileShader | #define glCompileShader                  imgl3wProcs.gl.CompileShader | ||||||
| @@ -692,6 +696,7 @@ static const char *proc_names[] = { | |||||||
|     "glBlendEquationSeparate", |     "glBlendEquationSeparate", | ||||||
|     "glBlendFuncSeparate", |     "glBlendFuncSeparate", | ||||||
|     "glBufferData", |     "glBufferData", | ||||||
|  |     "glBufferSubData", | ||||||
|     "glClear", |     "glClear", | ||||||
|     "glClearColor", |     "glClearColor", | ||||||
|     "glCompileShader", |     "glCompileShader", | ||||||
|   | |||||||
| @@ -105,6 +105,8 @@ Other Changes: | |||||||
| - Backends: Vulkan: Call vkCmdSetScissor() at the end of render with a full-viewport to reduce | - 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 |   likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling | ||||||
|   vkCmdSetScissor() explicitly every frame. (#4644) |   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. | - 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. |   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) |   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 |     // 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. |     // 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]; |     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) | bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user