From cb2ce8f2a598e402b6b5c2e35f7b611b74aa35f5 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Mon, 2 Feb 2026 12:58:50 +0800 Subject: [PATCH] [Optimize] (MG_Backend/DirectGLES): sync buffer object directly --- MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index 1280cb56..89aeb380 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -86,6 +86,21 @@ namespace MobileGL::MG_Backend::DirectGLES { // TODO: deletion for deleted objects namespace BufferImpl { + void CreateAndSyncBufferObject(SharedPtr& bufferObject) { + if (!(bufferObject->GetChangeBits() & BufferChangeBits::DirtyBit)) + return; + + const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject); + SharedPtr backendBufferObject; + if (backendBufferIt == g_backendBufferObjects.end()) { + backendBufferObject = MakeShared(); + g_backendBufferObjects[bufferObject] = backendBufferObject; + } else { + backendBufferObject = backendBufferIt->second; + } + backendBufferObject->SyncToBackend(bufferObject); + } + void SyncNeccessaryBuffers(Bool includeIBO = false, Bool includeIndirectBuffer = false) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); @@ -94,9 +109,8 @@ namespace MobileGL::MG_Backend::DirectGLES { // 1.VBO 2.IBO (if needed) 3.UBO 4.IndirectBuffer (if needed) 5.SSBO (TODO) // PBO is not needed since it should be handled in frontend - static Vector> buffersToSync; - - buffersToSync.clear(); + // static Vector> buffersToSync; + // buffersToSync.clear(); const auto& currentVAOObject = MG_State::pGLContext->GetBoundVertexArray(); if (!currentVAOObject) { @@ -107,26 +121,26 @@ namespace MobileGL::MG_Backend::DirectGLES { // VBO for (const auto& attrib : currentVAOObject->GetAllAttributes()) { if (!attrib.Enabled) continue; - const auto& bufferObject = attrib.Buffer; + auto bufferObject = attrib.Buffer; if (bufferObject) { - buffersToSync.push_back(bufferObject); + CreateAndSyncBufferObject(bufferObject); } } // IBO if (includeIBO) { - const auto& possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); + auto possibleIBO = currentVAOObject->GetIndexBufferBindingSlot().GetBoundObject(); if (possibleIBO) { - buffersToSync.push_back(possibleIBO); + CreateAndSyncBufferObject(possibleIBO); } } // Indirect Buffer Object if (includeIndirectBuffer) { - const auto& possibleIndirectBuffer = + auto possibleIndirectBuffer = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DrawIndirect).GetBoundObject(); if (possibleIndirectBuffer) { - buffersToSync.push_back(possibleIndirectBuffer); + CreateAndSyncBufferObject(possibleIndirectBuffer); } } @@ -136,24 +150,9 @@ namespace MobileGL::MG_Backend::DirectGLES { auto& point = MG_State::pGLContext->GetBufferBindingPoint(BufferTarget::Uniform, i); auto obj = point.GetBoundObject(); if (obj) { - buffersToSync.push_back(obj); + CreateAndSyncBufferObject(obj); } } - - // Do real sync - for (auto& bufferObject : buffersToSync) { - if (!(bufferObject->GetChangeBits() & BufferChangeBits::DirtyBit)) continue; - - const auto& backendBufferIt = g_backendBufferObjects.find(bufferObject); - SharedPtr backendBufferObject; - if (backendBufferIt == g_backendBufferObjects.end()) { - backendBufferObject = MakeShared(); - g_backendBufferObjects[bufferObject] = backendBufferObject; - } else { - backendBufferObject = backendBufferIt->second; - } - backendBufferObject->SyncToBackend(bufferObject); - } } } // namespace BufferImpl