mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Feat] (MG_Backend/DirectGLES): Sync RBO in backend.
This commit is contained in:
@@ -652,7 +652,21 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
backendTextureObject->GetBackendTextureId(),
|
backendTextureObject->GetBackendTextureId(),
|
||||||
static_cast<GLint>(attachment.GetTextureLevel()));
|
static_cast<GLint>(attachment.GetTextureLevel()));
|
||||||
} else if (attachment.IsRenderbuffer()) {
|
} else if (attachment.IsRenderbuffer()) {
|
||||||
// TODO: renderbuffer support
|
const auto& renderbufferObject = attachment.GetRenderbuffer();
|
||||||
|
const auto& backendRenderbufferIt =
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject);
|
||||||
|
SharedPtr<RenderbufferImpl::BackendRenderbufferObject> backendRenderbufferObject;
|
||||||
|
if (backendRenderbufferIt == RenderbufferImpl::g_backendRenderbufferObjects.end()) {
|
||||||
|
backendRenderbufferObject = MakeShared<RenderbufferImpl::BackendRenderbufferObject>();
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects[renderbufferObject] = backendRenderbufferObject;
|
||||||
|
} else {
|
||||||
|
backendRenderbufferObject = backendRenderbufferIt->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
backendRenderbufferObject->SyncToBackend(renderbufferObject);
|
||||||
|
backendRenderbufferObject->Bind();
|
||||||
|
MG_External::GLES::glFramebufferRenderbuffer(glFBOTarget, glAttachment, GL_RENDERBUFFER,
|
||||||
|
backendRenderbufferObject->GetBackendRenderbufferId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Handle draw buffers for DRAW_FRAMEBUFFER
|
// Handle draw buffers for DRAW_FRAMEBUFFER
|
||||||
@@ -709,7 +723,21 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
backendTextureObject->GetBackendTextureId(),
|
backendTextureObject->GetBackendTextureId(),
|
||||||
static_cast<GLint>(readAttachment.GetTextureLevel()));
|
static_cast<GLint>(readAttachment.GetTextureLevel()));
|
||||||
} else if (readAttachment.IsRenderbuffer()) {
|
} else if (readAttachment.IsRenderbuffer()) {
|
||||||
// TODO: renderbuffer support
|
const auto& renderbufferObject = readAttachment.GetRenderbuffer();
|
||||||
|
const auto& backendRenderbufferIt =
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects.find(renderbufferObject);
|
||||||
|
SharedPtr<RenderbufferImpl::BackendRenderbufferObject> backendRenderbufferObject;
|
||||||
|
if (backendRenderbufferIt == RenderbufferImpl::g_backendRenderbufferObjects.end()) {
|
||||||
|
backendRenderbufferObject = MakeShared<RenderbufferImpl::BackendRenderbufferObject>();
|
||||||
|
RenderbufferImpl::g_backendRenderbufferObjects[renderbufferObject] = backendRenderbufferObject;
|
||||||
|
} else {
|
||||||
|
backendRenderbufferObject = backendRenderbufferIt->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
backendRenderbufferObject->SyncToBackend(renderbufferObject);
|
||||||
|
backendRenderbufferObject->Bind();
|
||||||
|
MG_External::GLES::glFramebufferRenderbuffer(glFBOTarget, glAttachment, GL_RENDERBUFFER,
|
||||||
|
backendRenderbufferObject->GetBackendRenderbufferId());
|
||||||
}
|
}
|
||||||
MG_External::GLES::glReadBuffer(glAttachment);
|
MG_External::GLES::glReadBuffer(glAttachment);
|
||||||
}
|
}
|
||||||
@@ -988,5 +1016,55 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
g_backendSamplerObjects;
|
g_backendSamplerObjects;
|
||||||
} // namespace SamplerImpl
|
} // namespace SamplerImpl
|
||||||
|
|
||||||
|
namespace RenderbufferImpl {
|
||||||
|
BackendRenderbufferObject::BackendRenderbufferObject() {
|
||||||
|
#ifdef TRACY_ENABLE
|
||||||
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
|
#endif
|
||||||
|
MG_External::GLES::glGenRenderbuffers(1, &m_backendRBOId);
|
||||||
|
if (m_backendRBOId == 0) {
|
||||||
|
MGLOG_E("Failed to generate renderbuffer object.");
|
||||||
|
MGLOG_E("ES glGetError(): %s", MG_Util::ConvertGLEnumToString(MG_External::GLES::glGetError()).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendRenderbufferObject::Bind() {
|
||||||
|
#ifdef TRACY_ENABLE
|
||||||
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
|
#endif
|
||||||
|
MG_External::GLES::glBindRenderbuffer(GL_RENDERBUFFER, m_backendRBOId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendRenderbufferObject::SyncToBackend(
|
||||||
|
const SharedPtr<MG_State::GLState::RenderbufferObject>& stateRBOObject) {
|
||||||
|
#ifdef TRACY_ENABLE
|
||||||
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
|
#endif
|
||||||
|
if (!stateRBOObject) {
|
||||||
|
MGLOG_E("State RBO object is null, cannot sync to backend.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MGLOG_D("Syncing RBO with backend ID %u to backend for state ID %u", m_backendRBOId,
|
||||||
|
stateRBOObject->GetExternalIndex());
|
||||||
|
|
||||||
|
Bind();
|
||||||
|
|
||||||
|
// Allocate storage
|
||||||
|
GLenum glInternalFormat, glType, glFormat;
|
||||||
|
TextureImpl::GenerateTextureFormatInfo(stateRBOObject->GetInternalFormat(), &glInternalFormat, &glType,
|
||||||
|
&glFormat);
|
||||||
|
|
||||||
|
MG_External::GLES::glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat,
|
||||||
|
static_cast<GLsizei>(stateRBOObject->GetWidth()),
|
||||||
|
static_cast<GLsizei>(stateRBOObject->GetHeight()));
|
||||||
|
|
||||||
|
m_isInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>
|
||||||
|
g_backendRenderbufferObjects;
|
||||||
|
} // namespace RenderbufferImpl
|
||||||
|
|
||||||
namespace Utils {} // namespace Utils
|
namespace Utils {} // namespace Utils
|
||||||
} // namespace MobileGL::MG_Backend::DirectGLES
|
} // namespace MobileGL::MG_Backend::DirectGLES
|
||||||
|
|||||||
@@ -173,4 +173,21 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
extern UnorderedMap<SharedPtr<MG_State::GLState::SamplerObject>, SharedPtr<BackendSamplerObject>>
|
extern UnorderedMap<SharedPtr<MG_State::GLState::SamplerObject>, SharedPtr<BackendSamplerObject>>
|
||||||
g_backendSamplerObjects;
|
g_backendSamplerObjects;
|
||||||
} // namespace SamplerImpl
|
} // namespace SamplerImpl
|
||||||
|
|
||||||
|
namespace RenderbufferImpl {
|
||||||
|
class BackendRenderbufferObject {
|
||||||
|
public:
|
||||||
|
BackendRenderbufferObject();
|
||||||
|
void SyncToBackend(const SharedPtr<MG_State::GLState::RenderbufferObject>& stateRBOObject);
|
||||||
|
Uint GetBackendRenderbufferId() { return m_backendRBOId; }
|
||||||
|
void Bind();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Uint m_backendRBOId = 0;
|
||||||
|
Bool m_isInitialized = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern UnorderedMap<SharedPtr<MG_State::GLState::RenderbufferObject>, SharedPtr<BackendRenderbufferObject>>
|
||||||
|
g_backendRenderbufferObjects;
|
||||||
|
} // namespace RenderbufferImpl
|
||||||
} // namespace MobileGL::MG_Backend::DirectGLES
|
} // namespace MobileGL::MG_Backend::DirectGLES
|
||||||
|
|||||||
Reference in New Issue
Block a user