[Feat] (MG_Backend/DirectGLES): Add cache for backend RBO.

This commit is contained in:
BZLZHH
2025-12-31 19:52:12 +08:00
parent 937ace68a6
commit e5c3a6beba
2 changed files with 22 additions and 5 deletions
+18 -5
View File
@@ -1048,18 +1048,31 @@ namespace MobileGL::MG_Backend::DirectGLES {
MGLOG_D("Syncing RBO with backend ID %u to backend for state ID %u", m_backendRBOId, MGLOG_D("Syncing RBO with backend ID %u to backend for state ID %u", m_backendRBOId,
stateRBOObject->GetExternalIndex()); stateRBOObject->GetExternalIndex());
if (m_isInitialized && m_cacheInternalFormat == stateRBOObject->GetInternalFormat() &&
m_cacheWidth == stateRBOObject->GetWidth() && m_cacheHeight == stateRBOObject->GetHeight()) {
MGLOG_D("RBO %u already initialized with matching parameters, skipping re-allocation.",
stateRBOObject->GetExternalIndex());
return;
}
Bind(); Bind();
// Allocate storage // Allocate storage
TextureInternalFormat internalFormat = stateRBOObject->GetInternalFormat();
Int width = static_cast<Int>(stateRBOObject->GetWidth());
Int height = static_cast<Int>(stateRBOObject->GetHeight());
GLenum glInternalFormat, glType, glFormat; GLenum glInternalFormat, glType, glFormat;
TextureImpl::GenerateTextureFormatInfo(stateRBOObject->GetInternalFormat(), &glInternalFormat, &glType, TextureImpl::GenerateTextureFormatInfo(internalFormat, &glInternalFormat, &glType, &glFormat);
&glFormat);
MG_External::GLES::glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, MG_External::GLES::glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, static_cast<GLsizei>(width),
static_cast<GLsizei>(stateRBOObject->GetWidth()), static_cast<GLsizei>(height));
static_cast<GLsizei>(stateRBOObject->GetHeight()));
m_cacheInternalFormat = internalFormat;
m_cacheWidth = width;
m_cacheHeight = height;
m_isInitialized = true; m_isInitialized = true;
MGLOG_D("RBO %u sync completed. backend ID %u", stateRBOObject->GetExternalIndex(), m_backendRBOId);
} }
UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>> UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>
@@ -9,6 +9,7 @@
#include <Includes.h> #include <Includes.h>
#include "DirectGLES.h" #include "DirectGLES.h"
#include "MG_State/GLState/SamplerState/SamplerObject.h" #include "MG_State/GLState/SamplerState/SamplerObject.h"
#include "MG_State/GLState/TextureState/TextureEnum.h"
#include <MG_State/GLState/TextureState/TextureObject.h> #include <MG_State/GLState/TextureState/TextureObject.h>
#include <MG_State/GLState/Core.h> #include <MG_State/GLState/Core.h>
@@ -185,6 +186,9 @@ namespace MobileGL::MG_Backend::DirectGLES {
private: private:
Uint m_backendRBOId = 0; Uint m_backendRBOId = 0;
Bool m_isInitialized = false; Bool m_isInitialized = false;
TextureInternalFormat m_cacheInternalFormat = TextureInternalFormat::Unknown;
Int m_cacheWidth = 0;
Int m_cacheHeight = 0;
}; };
extern UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>> extern UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>