From 52d98ee7c3a22ed237781bf02689aeec2aa29aad Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sun, 4 Jan 2026 17:37:24 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectGLES): implement `glTexImage3D` in the ES backend --- MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp | 2 +- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 35 +++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index e91ef8d4..1d2e4671 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -449,7 +449,7 @@ namespace MobileGL::MG_Backend::DirectGLES { auto target = textureObject->GetTarget(); if (target == TextureTarget::Texture1D || target == TextureTarget::TextureRectangle || target == TextureTarget::Texture2DMultisampleArray || target == TextureTarget::Texture1DArray || - target == TextureTarget::Texture3D || target == TextureTarget::Texture2DMultisample || + target == TextureTarget::Texture2DMultisample || target == TextureTarget::Texture2DArray) { MGLOG_D(" Texture target %s is not supported, skipping.", MG_Util::ConvertTextureTargetToString(target).c_str()); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index c6b976cd..9dcea1b1 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -314,9 +314,10 @@ namespace MobileGL::MG_Backend::DirectGLES { auto targetInternal = stateTextureObject->GetTarget(); MGLOG_D(" Texture target for syncing is %s", MG_Util::ConvertTextureTargetToString(targetInternal).c_str()); - if (targetInternal == TextureTarget::Texture1D || targetInternal == TextureTarget::TextureRectangle || + if (targetInternal == TextureTarget::Texture1D || + targetInternal == TextureTarget::TextureRectangle || targetInternal == TextureTarget::Texture2DMultisampleArray || - targetInternal == TextureTarget::Texture1DArray || targetInternal == TextureTarget::Texture3D || + targetInternal == TextureTarget::Texture1DArray || targetInternal == TextureTarget::Texture2DMultisample || targetInternal == TextureTarget::Texture2DArray) { MGLOG_E(" Texture target %s is not supported, skipping.", @@ -385,13 +386,35 @@ namespace MobileGL::MG_Backend::DirectGLES { errorLopper.Clear(); MG_External::GLES::glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - MG_External::GLES::glTexImage2D(glUploadTarget, static_cast(level), glInternalFormat, + // TODO: handle more texture types + switch (uploadTarget) { + case TextureUploadTarget::Texture2D: + case TextureUploadTarget::CubeMapPositiveX: + case TextureUploadTarget::CubeMapNegativeX: + case TextureUploadTarget::CubeMapPositiveY: + case TextureUploadTarget::CubeMapNegativeY: + case TextureUploadTarget::CubeMapPositiveZ: + case TextureUploadTarget::CubeMapNegativeZ: + { + MG_External::GLES::glTexImage2D(glUploadTarget, static_cast(level), glInternalFormat, static_cast(levelTexelSize.x()), static_cast(levelTexelSize.y()), 0, glFormat, glType, pData); - - // TODO: handle more texture types - + break; + } + case TextureUploadTarget::Texture3D: { + MG_External::GLES::glTexImage3D(glUploadTarget, static_cast(level), glInternalFormat, + static_cast(levelTexelSize.x()), + static_cast(levelTexelSize.y()), + static_cast(levelTexelSize.z()), + 0, glFormat, + glType, pData); + break; + } + default: { + MGLOG_E("Unhandled texture upload target %s", MG_Util::ConvertTextureUploadTargetToString(uploadTarget).c_str()); + } + } MGLOG_D("Regenerated mipmap level %d for texture with ID: %u", level, m_backendTextureId); textureMipmapObject->MarkStorageDirty(uploadTarget, level, false); }