From 56f45499e140a44279cfdbceb98831619ec62a4d Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sun, 7 Dec 2025 11:07:58 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectGLES): Set divisor for VAO attrib. --- MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp | 6 +++--- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 7 +++++-- MobileGL/MG_Backend/DirectGLES/Managers.h | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index 2834ed52..e36da553 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -137,7 +137,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } // namespace BufferImpl namespace VertexArrayImpl { - void SyncCurrentVAO() { + void SyncCurrentVAO(Bool needDivisor) { auto currentVAOObject = MG_State::pGLContext->GetBoundVertexArray(); if (!currentVAOObject) { MGLOG_E("No VAO is currently bound, cannot sync current VAO."); @@ -152,7 +152,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } else { backendVAOObject = backendVAOIt->second; } - backendVAOObject->SyncToBackend(currentVAOObject); + backendVAOObject->SyncToBackend(currentVAOObject, needDivisor); } } // namespace VertexArrayImpl @@ -356,7 +356,7 @@ namespace MobileGL::MG_Backend::DirectGLES { void PrepareForDraw(DrawSyncBit syncBit) { BufferImpl::SyncNeccessaryBuffers(syncBit & DrawSyncBit::IndexBuffer, syncBit & DrawSyncBit::IndirectBuffer); - VertexArrayImpl::SyncCurrentVAO(); // TODO: instancing + VertexArrayImpl::SyncCurrentVAO(syncBit & DrawSyncBit::Instancing); TextureImpl::SyncNeccessaryTextures(); FramebufferImpl::SyncCurrentFBO(); PrgramImpl::SyncCurrentProgram(); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 21dff9a0..dc75d9c3 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -156,7 +156,8 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_External::GLES::glBindVertexArray(m_backendVAOId); } - void BackendVertexArrayObject::SyncToBackend(SharedPtr& stateVAOObject) { + void BackendVertexArrayObject::SyncToBackend(SharedPtr& stateVAOObject, + Bool needDivisor) { if (!stateVAOObject) { MGLOG_E("State VAO object is null, cannot sync to backend."); return; @@ -205,7 +206,9 @@ namespace MobileGL::MG_Backend::DirectGLES { attrib.Stride, (const void*)attrib.Offset); } - // TODO: divisor + if (needDivisor) { + MG_External::GLES::glVertexAttribDivisor(attribIndex, attrib.Divisor); + } } const auto& indexBufferBinding = stateVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index d3a6497d..86209aa8 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -34,7 +34,7 @@ namespace MobileGL::MG_Backend::DirectGLES { class BackendVertexArrayObject { public: BackendVertexArrayObject(); - void SyncToBackend(SharedPtr& stateVAOObject); + void SyncToBackend(SharedPtr& stateVAOObject, Bool needDivisor); Uint GetBackendVertexArrayId() { return m_backendVAOId; } void Bind();