From 9a692a78458125ab583737625e3051cfe5fd1b3f Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Fri, 16 May 2025 13:34:15 +0800 Subject: [PATCH] [Feat] (BufferState): Implement glDeleteBuffers. --- MG/Global.h | 2 +- MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp | 11 +++++++++++ MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.h | 1 + MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp | 11 +++++++++++ .../GL/GLFuncsDefinitions/GLFuncsDefinitions.cpp | 2 +- MG/MG_GL/State/Buffer/BufferState.cpp | 11 +++++++++++ MG/MG_GL/State/Buffer/BufferState.h | 1 + MG/MG_GL/State/Core/GLState.cpp | 4 ++++ MG/MG_GL/State/Core/GLState.h | 1 + 9 files changed, 42 insertions(+), 2 deletions(-) diff --git a/MG/Global.h b/MG/Global.h index f2610bd5..c4226369 100644 --- a/MG/Global.h +++ b/MG/Global.h @@ -27,7 +27,7 @@ namespace MG_Global { } namespace Common { - inline constexpr int LogLevel = MG_Constants::Common::LOG_LEVEL_DEBUG; + inline constexpr int LogLevel = MG_Constants::Common::LOG_LEVEL_INFO; #ifdef __ANDROID__ inline const char* LOG_FILE_PATH = "/sdcard/MG/latest.log"; diff --git a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp index 658f1d6a..1ee4a7ed 100644 --- a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp +++ b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.cpp @@ -117,4 +117,15 @@ namespace MG_GL::GL { MG_Util::Debug::LogD("Buffer %u is %s", buffer, isValid ? "valid" : "invalid"); return isValid ? GL_TRUE : GL_FALSE; } + + void DeleteBuffers(GLsizei n, const GLuint *buffers) { + MG_Util::Debug::LogD("glDeleteBuffers, n: %d, buffers: %p", n, buffers); + + GLenum result = MG_State::DeleteBuffers(n, buffers); + if (result == GL_NO_ERROR) + return; + + MG_State::SetError(result); + MG_Util::Debug::LogE("Error from MG State: %s", MG_Util::Debug::GLEnumToString(result)); + } } \ No newline at end of file diff --git a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.h b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.h index 4ac655eb..a23fde71 100644 --- a/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.h +++ b/MG/MG_GL/Implementations/GL/Buffer/GL_Buffer.h @@ -14,6 +14,7 @@ namespace MG_GL::GL { void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage); void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params); void GenBuffers(GLsizei n, GLuint* buffers); + void DeleteBuffers(GLsizei n, const GLuint *buffers); GLboolean IsBuffer(GLuint buffer); } diff --git a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp index 0c9f7b0c..ece0e7be 100644 --- a/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp +++ b/MG/MG_GL/Implementations/GL/Drawing/GL_Drawing.cpp @@ -448,6 +448,17 @@ namespace MG_GL::GL { // static std::unordered_map s_bufferDirtyFlags_bufferObj; void SyncAllBuffersToGLES(BufferState* bufferState) { GLint prev_buf = 0; + // Delete removed buffers in GLES + std::vector buffersToErase; + for (auto it = s_bufferMap.begin(); it != s_bufferMap.end(); ++it) { + if (bufferState->buffers_.find(it->first) == bufferState->buffers_.end()) { + CallAndCheck(::GLES::glDeleteBuffers(1, &it->second);) + buffersToErase.push_back(it->first); + } + } + for (GLuint mgname : buffersToErase) { + s_bufferMap.erase(mgname); + } CallAndCheck(::GLES::glGetIntegerv(GL_COPY_WRITE_BUFFER_BINDING, &prev_buf);) for (auto& [mgname, obj] : bufferState->buffers_) { diff --git a/MG/MG_GL/Implementations/GL/GLFuncsDefinitions/GLFuncsDefinitions.cpp b/MG/MG_GL/Implementations/GL/GLFuncsDefinitions/GLFuncsDefinitions.cpp index 034f111a..1b7f4acd 100644 --- a/MG/MG_GL/Implementations/GL/GLFuncsDefinitions/GLFuncsDefinitions.cpp +++ b/MG/MG_GL/Implementations/GL/GLFuncsDefinitions/GLFuncsDefinitions.cpp @@ -61,7 +61,7 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, CopyTexSubImage2D, GLenum target, GLint leve DECLARE_GL_FUNCTION_HEAD(GLuint, CreateProgram) DECLARE_GL_FUNCTION_END(GLuint, CreateProgram) DECLARE_GL_FUNCTION_HEAD(GLuint, CreateShader, GLenum type) DECLARE_GL_FUNCTION_END(GLuint, CreateShader, type) DECLARE_GL_FUNCTION_STUB_HEAD(void, CullFace, GLenum mode) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, CullFace, mode) -DECLARE_GL_FUNCTION_STUB_HEAD(void, DeleteBuffers, GLsizei n, const GLuint *buffers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, DeleteBuffers, n,buffers) +DECLARE_GL_FUNCTION_HEAD(void, DeleteBuffers, GLsizei n, const GLuint *buffers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, DeleteBuffers, n,buffers) DECLARE_GL_FUNCTION_HEAD(void, DeleteFramebuffers, GLsizei n, const GLuint *framebuffers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, DeleteFramebuffers, n,framebuffers) DECLARE_GL_FUNCTION_HEAD(void, DeleteProgram, GLuint program) DECLARE_GL_FUNCTION_END_NO_RETURN(void, DeleteProgram, program) DECLARE_GL_FUNCTION_STUB_HEAD(void, DeleteRenderbuffers, GLsizei n, const GLuint *renderbuffers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, DeleteRenderbuffers, n,renderbuffers) diff --git a/MG/MG_GL/State/Buffer/BufferState.cpp b/MG/MG_GL/State/Buffer/BufferState.cpp index 0047b064..111af394 100644 --- a/MG/MG_GL/State/Buffer/BufferState.cpp +++ b/MG/MG_GL/State/Buffer/BufferState.cpp @@ -170,6 +170,17 @@ void BufferState::Delete(GLuint buffer) { MG_Util::Debug::LogD("MG_State: Buffer: Delete buffer %u", buffer); } +GLenum BufferState::DeleteN(GLsizei n, const GLuint* buffers) { + MG_Util::Debug::LogD("MG_State: Buffer: DeleteN called with n=%d", n); + if (n < 0) return GL_INVALID_VALUE; + + for (GLsizei i = 0; i < n; ++i) { + Delete(buffers[i]); + } + MG_Util::Debug::LogD("MG_State: Buffer: DeleteN deleted buffers successfully"); + return GL_NO_ERROR; +} + bool BufferState::IsValidTarget_(GLenum target) { MG_Util::Debug::LogD("MG_State: Buffer: IsValidTarget_ called with target=0x%x,result=%d", target, !(MG_Constants::Buffer::VALID_TARGETS.find(target) == MG_Constants::Buffer::VALID_TARGETS.end())); return !(MG_Constants::Buffer::VALID_TARGETS.find(target) == MG_Constants::Buffer::VALID_TARGETS.end()); diff --git a/MG/MG_GL/State/Buffer/BufferState.h b/MG/MG_GL/State/Buffer/BufferState.h index 1ddd4462..df21623e 100644 --- a/MG/MG_GL/State/Buffer/BufferState.h +++ b/MG/MG_GL/State/Buffer/BufferState.h @@ -37,6 +37,7 @@ public: bool ValidateAllocatedHandle(GLuint buffer); bool ValidateGeneratedName(GLuint buffer); void Delete(GLuint buffer); + GLenum DeleteN(GLsizei n, const GLuint* buffers); GLuint GetCurrentBinding(GLenum target) const; unordered_map currentBindings_; diff --git a/MG/MG_GL/State/Core/GLState.cpp b/MG/MG_GL/State/Core/GLState.cpp index 6d8011d9..ab8fe3fd 100644 --- a/MG/MG_GL/State/Core/GLState.cpp +++ b/MG/MG_GL/State/Core/GLState.cpp @@ -198,6 +198,10 @@ namespace MG_State { return MG_State_T::bufferState->Delete(buffer); } + GLenum DeleteBuffers(GLsizei n, const GLuint* buffers) { + return MG_State_T::bufferState->DeleteN(n, buffers); + } + GLenum QueryBufferPropertyIntVector(GLenum target, GLenum pname, GLint* params) { return MG_State_T::bufferState->QueryPropertyIntVector(target, pname, params); } diff --git a/MG/MG_GL/State/Core/GLState.h b/MG/MG_GL/State/Core/GLState.h index c702dc6f..1845aa6e 100644 --- a/MG/MG_GL/State/Core/GLState.h +++ b/MG/MG_GL/State/Core/GLState.h @@ -66,6 +66,7 @@ namespace MG_State { bool ValidateAllocatedBufferHandle(GLuint buffer); bool ValidateGeneratedName(GLuint buffer); void DeleteBuffer(GLuint buffer); + GLenum DeleteBuffers(GLsizei n, const GLuint* buffers); GLenum QueryBufferPropertyIntVector(GLenum target, GLenum pname, GLint* params); // VertexArray