From fcfd91c35f2a1f2dc05556b0512302d5e5b7e538 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 28 Jun 2025 23:39:08 +0300 Subject: [PATCH] Object Memory management small optimization --- src/DivaGL/object.cpp | 24 +++++++++++++++++------- src/DivaGL/sprite.cpp | 6 +++--- src/DivaGL/wrap.cpp | 2 ++ src/DivaGL/wrap.hpp | 3 +++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/DivaGL/object.cpp b/src/DivaGL/object.cpp index d69535a..c8580fb 100644 --- a/src/DivaGL/object.cpp +++ b/src/DivaGL/object.cpp @@ -1213,10 +1213,15 @@ static void free_index_buffer(GLuint buffer) { disp_manager->check_index_buffer(buffer); - GLint size; - gl_state.bind_element_array_buffer(buffer); - glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); - gl_state.bind_element_array_buffer(0); + GLint size = 0; + if (DIVA_GL_VERSION_4_5) + glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &size); + else { + gl_state.bind_element_array_buffer(buffer); + glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); + gl_state.bind_element_array_buffer(0); + } + bufobj_mgr.ib_all_size -= size; glDeleteBuffers(1, &buffer); @@ -1230,9 +1235,14 @@ static void free_vertex_buffer(GLuint buffer) { disp_manager->check_vertex_buffer(buffer); GLint size = 0; - gl_state.bind_array_buffer(buffer); - glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); - gl_state.bind_array_buffer(0); + if (DIVA_GL_VERSION_4_5) + glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &size); + else { + gl_state.bind_array_buffer(buffer); + glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); + gl_state.bind_array_buffer(0); + } + bufobj_mgr.vb_all_size -= size; glDeleteBuffers(1, &buffer); diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index 400b3e3..88295cc 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -228,13 +228,13 @@ namespace spr { } SpriteManager::RenderData::~RenderData() { - ebo.Destroy(); - vbo.Destroy(); - if (vao[0]) { glDeleteVertexArrays(3, vao); vao[0] = 0; } + + ebo.Destroy(); + vbo.Destroy(); } template diff --git a/src/DivaGL/wrap.cpp b/src/DivaGL/wrap.cpp index 225deb4..85832b7 100644 --- a/src/DivaGL/wrap.cpp +++ b/src/DivaGL/wrap.cpp @@ -2469,6 +2469,7 @@ PFNGLNAMEDBUFFERSUBDATAPROC divagl_glNamedBufferSubData = 0; PFNGLMAPNAMEDBUFFERPROC divagl_glMapNamedBuffer = 0; PFNGLMAPNAMEDBUFFERRANGEPROC divagl_glMapNamedBufferRange = 0; PFNGLUNMAPNAMEDBUFFERPROC divagl_glUnmapNamedBuffer = 0; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC divagl_glGetNamedBufferParameteriv = 0; PFNGLTEXTURESUBIMAGE2DPROC divagl_glTextureSubImage2D = 0; PFNGLGENERATETEXTUREMIPMAPPROC divagl_glGenerateTextureMipmap = 0; PFNGLBINDTEXTUREUNITPROC divagl_glBindTextureUnit = 0; @@ -2624,6 +2625,7 @@ HOOK(void, FASTCALL, wglGetProcAddresses, 0x0000000140461B50) { glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)wglGetProcAddressDLL("glMapNamedBuffer"); glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)wglGetProcAddressDLL("glMapNamedBufferRange"); glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)wglGetProcAddressDLL("glUnmapNamedBuffer"); + glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)wglGetProcAddressDLL("glGetNamedBufferParameteriv"); glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)wglGetProcAddressDLL("glTextureSubImage2D"); glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)wglGetProcAddressDLL("glGenerateTextureMipmap"); glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)wglGetProcAddressDLL("glBindTextureUnit"); diff --git a/src/DivaGL/wrap.hpp b/src/DivaGL/wrap.hpp index 2fd9437..4194ffd 100644 --- a/src/DivaGL/wrap.hpp +++ b/src/DivaGL/wrap.hpp @@ -1262,6 +1262,7 @@ typedef void (GLAPIENTRY* PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr typedef void* (GLAPIENTRY* PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); typedef void* (GLAPIENTRY* PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef GLboolean (GLAPIENTRY* PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRY* PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY* PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY* PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); typedef void (GLAPIENTRY* PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); @@ -2520,6 +2521,7 @@ extern PFNGLNAMEDBUFFERSUBDATAPROC divagl_glNamedBufferSubData; extern PFNGLMAPNAMEDBUFFERPROC divagl_glMapNamedBuffer; extern PFNGLMAPNAMEDBUFFERRANGEPROC divagl_glMapNamedBufferRange; extern PFNGLUNMAPNAMEDBUFFERPROC divagl_glUnmapNamedBuffer; +extern PFNGLGETNAMEDBUFFERPARAMETERIVPROC divagl_glGetNamedBufferParameteriv; extern PFNGLTEXTURESUBIMAGE2DPROC divagl_glTextureSubImage2D; extern PFNGLGENERATETEXTUREMIPMAPPROC divagl_glGenerateTextureMipmap; extern PFNGLBINDTEXTUREUNITPROC divagl_glBindTextureUnit; @@ -3778,6 +3780,7 @@ extern PFNGLBINDTEXTUREUNITPROC divagl_glBindTextureUnit; #define glMapNamedBuffer divagl_glMapNamedBuffer #define glMapNamedBufferRange divagl_glMapNamedBufferRange #define glUnmapNamedBuffer divagl_glUnmapNamedBuffer +#define glGetNamedBufferParameteriv divagl_glGetNamedBufferParameteriv #define glTextureSubImage2D divagl_glTextureSubImage2D #define glGenerateTextureMipmap divagl_glGenerateTextureMipmap #define glBindTextureUnit divagl_glBindTextureUnit