From c3755d77ef356790a1f3194bf17698108e6c11b6 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 13 Dec 2025 21:28:04 +0800 Subject: [PATCH] [Feat] (MG_Impl/Texture): implement `GL_TEXTURE_SWIZZLE_RGBA` --- .../MG_Impl/GLImpl/Texture/GL_Texture.cpp | 177 ++++++++++++++---- .../GLState/TextureState/TextureObject.cpp | 3 + .../GLState/TextureState/TextureObject.h | 2 + 3 files changed, 142 insertions(+), 40 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index 031a447a..b81b013e 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -20,6 +20,24 @@ namespace MobileGL { namespace MG_Impl::GLImpl { + SharedPtr GetTextureObjectByTarget(TextureUploadTarget textureUploadingTarget, TextureTarget textureTarget) { + SharedPtr textureObject = nullptr; + if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { + textureObject = + TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); + } else { + auto activeUnit = + MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); + textureObject = bindingSlot.GetBoundObject(); + } + + if (!TextureImpl::ValidateTextureObject(textureObject)) + return nullptr; + + return textureObject; + } + void TexSubImage3D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { // TODO: implement @@ -147,18 +165,10 @@ namespace MobileGL { TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = - TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = - MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } - - if (!TextureImpl::ValidateTextureObject(textureObject)) return; + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; switch (pname) { case GL_TEXTURE_MAG_FILTER: @@ -193,12 +203,6 @@ namespace MobileGL { textureObject->SetSwizzleParam(swizzleParam, swizzleValue); break; } - case GL_TEXTURE_SWIZZLE_RGBA: - // Not supported in this function - break; - case GL_TEXTURE_BORDER_COLOR: - // Not supported in this function - break; case GL_TEXTURE_WRAP_S: textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param)); break; @@ -215,6 +219,10 @@ namespace MobileGL { textureObject->GetSamplerObject()->SetSamplerCompareFunc( MG_Util::ConvertGLEnumToSamplerCompareFunc(param)); break; + case GL_TEXTURE_SWIZZLE_RGBA: + // Not supported in this function + case GL_TEXTURE_BORDER_COLOR: + // Not supported in this function default: MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "TexParameteri_State", @@ -229,18 +237,10 @@ namespace MobileGL { TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); // ======================= Processing ================================ - SharedPtr textureObject = nullptr; - if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) { - textureObject = - TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget); - } else { - auto activeUnit = - MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); - auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget); - textureObject = bindingSlot.GetBoundObject(); - } - - if (!TextureImpl::ValidateTextureObject(textureObject)) return; + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; switch (pname) { case GL_TEXTURE_MAG_FILTER: @@ -275,12 +275,6 @@ namespace MobileGL { textureObject->SetSwizzleParam(swizzleParam, swizzleValue); break; } - case GL_TEXTURE_SWIZZLE_RGBA: - // Not supported in this function - break; - case GL_TEXTURE_BORDER_COLOR: - // Not supported in this function - break; case GL_TEXTURE_WRAP_S: textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param)); break; @@ -297,6 +291,10 @@ namespace MobileGL { textureObject->GetSamplerObject()->SetSamplerCompareFunc( MG_Util::ConvertGLEnumToSamplerCompareFunc(param)); break; + case GL_TEXTURE_SWIZZLE_RGBA: + // Not supported in this function + case GL_TEXTURE_BORDER_COLOR: + // Not supported in this function default: MG_State::pGLContext->RecordError( ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "TexParameteri_State", @@ -310,11 +308,40 @@ namespace MobileGL { void TexParameterfv_State(GLenum target, GLenum pname, const GLfloat * params) { switch (pname) { case GL_TEXTURE_BORDER_COLOR: { + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; THROW_UNIMPL_EXCEPTION; break; } case GL_TEXTURE_SWIZZLE_RGBA: { - THROW_UNIMPL_EXCEPTION; + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; + + Vec4 swizzleParams; + for (int i = 0; i < 4; i++) { + swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast(params[i])); + if (TextureSwizzleParam::Unknown == swizzleParams[i]) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, + "`params` is not valid.")); + return; + } + } + textureObject->SetSwizzleParamRGBA(swizzleParams); break; } default: @@ -326,11 +353,41 @@ namespace MobileGL { void TexParameteriv_State(GLenum target, GLenum pname, const GLint * params) { switch (pname) { case GL_TEXTURE_BORDER_COLOR: { + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; + THROW_UNIMPL_EXCEPTION; break; } case GL_TEXTURE_SWIZZLE_RGBA: { - THROW_UNIMPL_EXCEPTION; + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; + + Vec4 swizzleParams; + for (int i = 0; i < 4; i++) { + swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast(params[i])); + if (TextureSwizzleParam::Unknown == swizzleParams[i]) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, + "`params` is not valid.")); + return; + } + } + textureObject->SetSwizzleParamRGBA(swizzleParams); break; } default: @@ -346,7 +403,27 @@ namespace MobileGL { break; } case GL_TEXTURE_SWIZZLE_RGBA: { - THROW_UNIMPL_EXCEPTION; + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; + + Vec4 swizzleParams; + for (int i = 0; i < 4; i++) { + swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast(params[i])); + if (TextureSwizzleParam::Unknown == swizzleParams[i]) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, + "`params` is not valid.")); + return; + } + } + textureObject->SetSwizzleParamRGBA(swizzleParams); break; } default: @@ -362,7 +439,27 @@ namespace MobileGL { break; } case GL_TEXTURE_SWIZZLE_RGBA: { - THROW_UNIMPL_EXCEPTION; + // ======================= Converting ================================ + TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + + // ======================= Processing ================================ + SharedPtr textureObject = + GetTextureObjectByTarget(textureUploadingTarget, textureTarget); + if (!textureObject) + return; + + Vec4 swizzleParams; + for (int i = 0; i < 4; i++) { + swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast(params[i])); + if (TextureSwizzleParam::Unknown == swizzleParams[i]) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, + "`params` is not valid.")); + return; + } + } + textureObject->SetSwizzleParamRGBA(swizzleParams); break; } default: diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp index dd5cdb88..98219968 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp @@ -91,6 +91,9 @@ namespace MobileGL { break; } } + void TextureObjectBase::SetSwizzleParamRGBA(const Vec4& values) { + m_swizzleParams = values; + } const UintVec2& TextureObjectBase::GetLevelRange() const { return m_levelRange; diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.h b/MobileGL/MG_State/GLState/TextureState/TextureObject.h index 236114a9..0d83409e 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.h @@ -28,6 +28,7 @@ namespace MobileGL { virtual void SetBorderColor(const FloatVec4& color) = 0; virtual TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const = 0; virtual void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) = 0; + virtual void SetSwizzleParamRGBA(const Vec4& values) = 0; virtual const Vec4& GetAllSwizzleParams() const = 0; virtual const UintVec2& GetLevelRange() const = 0; virtual void SetBaseLevel(Uint baseLevel) = 0; @@ -54,6 +55,7 @@ namespace MobileGL { TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const override; const Vec4& GetAllSwizzleParams() const override; void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) override; + void SetSwizzleParamRGBA(const Vec4& values) override; const UintVec2& GetLevelRange() const override; void SetBaseLevel(Uint baseLevel) override; void SetMaxLevel(Uint maxLevel) override;