From 899563165e0c93d29f2ae0942421d566672cab55 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 14 Nov 2025 17:08:55 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectGLES): hook up `glDrawBuffers` --- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 17 +++++++++++++++++ .../FramebufferState/FramebufferObject.cpp | 8 ++++---- .../FramebufferState/FramebufferObject.h | 6 ++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 0293a1ea..658e9d55 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -423,6 +423,23 @@ namespace MobileGL::MG_Backend::DirectGLES { // TODO } } + + if (stateFBOObject->DrawBuffersIsDirty()) { + static GLenum drawbufs[MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS]; + std::fill(drawbufs, drawbufs + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS, GL_NONE); + auto& stateDrawBuffers = stateFBOObject->GetDrawBuffers(); + GLint i = 0; + for (; i < stateDrawBuffers.size(); ++i) { + if (stateDrawBuffers[i] == FramebufferAttachmentType::None) { + break; + } + drawbufs[i] = MG_Util::ConvertFramebufferAttachmentTypeToGLEnum(stateDrawBuffers[i]); + } + + MG_External::GLES::glDrawBuffers(i, drawbufs); + + stateFBOObject->ClearDrawBuffersDirtyState(); + } } UnorderedMap, SharedPtr> diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp index 127eb719..3ac66fbd 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp @@ -72,18 +72,18 @@ namespace MobileGL { void FramebufferObject::AttachTexture(FramebufferAttachmentType type, SharedPtr texture, int level) { m_attachments[static_cast(type)] = FramebufferAttachment(std::move(texture), level); - m_drawBuffersDirty = true; +// m_drawBuffersDirty = true; } void FramebufferObject::AttachRenderbuffer(FramebufferAttachmentType type, std::shared_ptr renderbuffer) { m_attachments[static_cast(type)] = FramebufferAttachment(renderbuffer); - m_drawBuffersDirty = true; +// m_drawBuffersDirty = true; } void FramebufferObject::Detach(FramebufferAttachmentType type) { m_attachments[static_cast(type)] = FramebufferAttachment(false); - m_drawBuffersDirty = true; +// m_drawBuffersDirty = true; } const FramebufferAttachment& FramebufferObject::GetAttachment(FramebufferAttachmentType type) const { @@ -143,7 +143,7 @@ namespace MobileGL { // // } - const auto& FramebufferObject::GetDrawBuffers() const { + const Array& FramebufferObject::GetDrawBuffers() const { return m_drawBuffers; } diff --git a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h index 7f4f85a5..84c53d04 100644 --- a/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h +++ b/MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.h @@ -105,7 +105,9 @@ namespace MobileGL { Bool CheckCompleteness() const; // void SetDrawBuffers(const Vector& buffers); void SetDrawBuffer(Uint index, FramebufferAttachmentType buffer); - const auto& GetDrawBuffers() const; + bool DrawBuffersIsDirty() const { return m_drawBuffersDirty; } + void ClearDrawBuffersDirtyState() { m_drawBuffersDirty = false; } + const Array& GetDrawBuffers() const; Uint GetExternalIndex() const; private: @@ -113,7 +115,7 @@ namespace MobileGL { Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)> m_attachments; - Bool m_drawBuffersDirty = true; + Bool m_drawBuffersDirty = false; Array m_drawBuffers; };