From b9844ed7c10e1474c9785f6bfabce3396a261d1b Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 16 Jul 2026 03:35:50 -0400 Subject: [PATCH] [Fix] (MG_Util/Texture): infer RGBA8 for packed RGBA uploads (cherry picked from commit 1146188ed4852217c392639826262d7c27db5b70) --- MobileGL/MG_Test/Texture/TextureTest.cpp | 51 +++++++++++++++++++ .../MGToMG/TextureEnumConverter.cpp | 2 + 2 files changed, 53 insertions(+) diff --git a/MobileGL/MG_Test/Texture/TextureTest.cpp b/MobileGL/MG_Test/Texture/TextureTest.cpp index 462e30c9..d22a09f2 100644 --- a/MobileGL/MG_Test/Texture/TextureTest.cpp +++ b/MobileGL/MG_Test/Texture/TextureTest.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include using namespace MobileGL; @@ -368,6 +369,56 @@ TEST_F(TextureTest, BoundTexSubImage2DUnpacksPackedBgra8888RevToRgba8) { EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR); } +TEST_F(TextureTest, UnsizedRgbaInfersRgba8ForPacked8888Types) { + EXPECT_EQ(MG_Util::ConvertInternalFormatToSized(TextureInternalFormat::RGBA, TextureInputFormat::BGRA, + TexturePixelDataType::UnsignedInt8888), + TextureInternalFormat::RGBA8); + EXPECT_EQ(MG_Util::ConvertInternalFormatToSized(TextureInternalFormat::RGBA, TextureInputFormat::BGRA, + TexturePixelDataType::UnsignedInt8888Rev), + TextureInternalFormat::RGBA8); +} + +TEST_F(TextureTest, BoundTexImageAndSubImage2DUseInferredRgba8ForPackedBgra8888Rev) { + GLuint texture = 0; + MG_Impl::GLImpl::GenTextures(1, &texture); + MG_Impl::GLImpl::BindTexture(GL_TEXTURE_2D, texture); + + const Uint8 initialPixels[] = { + 10, 20, 30, 40, + 50, 60, 70, 80, + }; + MG_Impl::GLImpl::TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 1, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + initialPixels); + + const auto textureObject = MG_State::pGLContext->GetTextureObject(texture); + EXPECT_EQ(textureObject->GetFormat(), TextureInternalFormat::RGBA8); + const auto* stored = GetBoundTexture2DLevelBytes(texture); + const Uint8 expectedInitial[] = { + 30, 20, 10, 40, + 70, 60, 50, 80, + }; + for (SizeT i = 0; i < sizeof(expectedInitial); ++i) { + EXPECT_EQ(stored[i], expectedInitial[i]) << "initial byte " << i; + } + + const Uint8 updatedPixels[] = { + 90, 100, 110, 120, + 130, 140, 150, 160, + }; + MG_Impl::GLImpl::TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 1, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + updatedPixels); + + stored = GetBoundTexture2DLevelBytes(texture); + const Uint8 expectedUpdated[] = { + 110, 100, 90, 120, + 150, 140, 130, 160, + }; + for (SizeT i = 0; i < sizeof(expectedUpdated); ++i) { + EXPECT_EQ(stored[i], expectedUpdated[i]) << "updated byte " << i; + } + EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR); +} + TEST_F(TextureTest, BoundTexSubImage2DUnpacksPackedRgba8888ToRgba8) { GLuint texture = 0; MG_Impl::GLImpl::GenTextures(1, &texture); diff --git a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp index 62b953fd..3fe452b2 100644 --- a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp +++ b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp @@ -129,6 +129,8 @@ namespace MobileGL { case TextureInternalFormat::RGBA: { switch (type) { case TexturePixelDataType::UnsignedByte: + case TexturePixelDataType::UnsignedInt8888: + case TexturePixelDataType::UnsignedInt8888Rev: return TextureInternalFormat::RGBA8; case TexturePixelDataType::UnsignedShort: return TextureInternalFormat::RGBA16;