From 75fc52febe72b5f0131321aebffb87e83a6c57d9 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 29 Nov 2025 01:31:41 +0800 Subject: [PATCH] [Feat] (MG_State/TextureState): Stubs for unimplemented texture types. --- .../GLState/TextureState/TextureObject.cpp | 18 ++++--- .../GLState/TextureState/TextureObject.h | 3 +- .../GLState/TextureState/TextureObject1D.cpp | 9 ++-- .../GLState/TextureState/TextureObject1D.h | 13 +++-- .../GLState/TextureState/TextureObject2D.cpp | 9 ++-- .../GLState/TextureState/TextureObject2D.h | 13 +++-- .../TextureState/TextureObject2DCube.cpp | 41 ++++++-------- .../TextureState/TextureObject2DCube.h | 22 ++++---- .../GLState/TextureState/TextureObject3D.cpp | 9 ++-- .../GLState/TextureState/TextureObject3D.h | 13 +++-- .../GLState/TextureState/TextureObjectStubs.h | 53 +++++++++++++++++++ .../GLState/TextureState/TextureState.cpp | 42 +++++++++++---- .../GLState/TextureState/TextureUnit.cpp | 1 - .../GLState/TextureState/TextureUnit.h | 3 +- 14 files changed, 159 insertions(+), 90 deletions(-) create mode 100644 MobileGL/MG_State/GLState/TextureState/TextureObjectStubs.h diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp index 1cd2017f..fbb2a8e7 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp @@ -104,27 +104,32 @@ namespace MobileGL { return m_textureStorage.GetLevelCount(); } - const IntVec3 TextureObjectWithOneMipmap::GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const { + const IntVec3 TextureObjectWithOneMipmap::GetMipmapTexelSize(TextureUploadTarget target, + Uint mipmapLevel) const { return m_textureStorage.GetTexelSize(GetIndexOfTextureUploadTarget(target), mipmapLevel); } - const SizeT TextureObjectWithOneMipmap::GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const { + const SizeT TextureObjectWithOneMipmap::GetMipmapByteSize(TextureUploadTarget target, + Uint mipmapLevel) const { return m_textureStorage.GetByteSize(GetIndexOfTextureUploadTarget(target), mipmapLevel); } void TextureObjectWithOneMipmap::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, - MipmapInput input) { + MipmapInput input) { m_textureStorage.AllocateLevel(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input); } + void TextureObjectWithOneMipmap::UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, - DataPtr input) { + DataPtr input) { m_textureStorage.UpdateSubData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input); } + void* TextureObjectWithOneMipmap::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) { return m_textureStorage.MapData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel); } - void TextureObjectWithOneMipmap::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) { + void TextureObjectWithOneMipmap::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, + bool dirty) { m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty); } @@ -140,8 +145,7 @@ namespace MobileGL { } Bool TextureObjectWithOneMipmap::IsComplete() const { - if (!TextureObjectBase::IsComplete()) - return false; + if (!TextureObjectBase::IsComplete()) return false; SizeT levelCount = m_textureStorage.GetLevelCount(); if (levelCount == 0) { diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.h b/MobileGL/MG_State/GLState/TextureState/TextureObject.h index 60a0052f..096c3e05 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.h @@ -83,7 +83,7 @@ namespace MobileGL { UintVec2 m_levelRange = {0, 1000}; }; - class TextureObjectWithOneMipmap: public TextureObjectBase { + class TextureObjectWithOneMipmap : public TextureObjectBase { public: TextureObjectWithOneMipmap(TextureTarget target, Uint externalIndex): TextureObjectBase(target, externalIndex) {} virtual ~TextureObjectWithOneMipmap() = default; @@ -99,6 +99,7 @@ namespace MobileGL { IntVec3 GetBaseSize() const override; Bool IsComplete() const override; + protected: TextureStorage<1> m_textureStorage; }; diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject1D.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject1D.cpp index 14370304..eae3556b 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject1D.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject1D.cpp @@ -7,10 +7,11 @@ namespace MobileGL { : TextureObjectWithOneMipmap(TextureTarget::Texture1D, externalIndex) {} Uint TextureObject1D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const { - MOBILEGL_ASSERT(target == TextureUploadTarget::Texture1D || target == TextureUploadTarget::ProxyTexture1D, + MOBILEGL_ASSERT(target == TextureUploadTarget::Texture1D || + target == TextureUploadTarget::ProxyTexture1D, "Invalid TextureUploadTarget!"); return 0; } - } - } -} \ No newline at end of file + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject1D.h b/MobileGL/MG_State/GLState/TextureState/TextureObject1D.h index f930693a..5a873f12 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject1D.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject1D.h @@ -7,13 +7,12 @@ namespace MobileGL { class TextureObject1D : public TextureObjectWithOneMipmap { public: explicit TextureObject1D(Uint externalIndex); - const Vector& GetUploadTargets() const override { - return m_uploadTargets; - } + const Vector& GetUploadTargets() const override { return m_uploadTargets; } + protected: Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override; - const Vector m_uploadTargets {TextureUploadTarget::Texture1D}; + const Vector m_uploadTargets{TextureUploadTarget::Texture1D}; }; - } - } -} + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject2D.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject2D.cpp index 68d0ca3a..fd96a8ba 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject2D.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject2D.cpp @@ -7,10 +7,11 @@ namespace MobileGL { : TextureObjectWithOneMipmap(TextureTarget::Texture2D, externalIndex) {} Uint TextureObject2D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const { - MOBILEGL_ASSERT(target == TextureUploadTarget::Texture2D || target == TextureUploadTarget::ProxyTexture2D, + MOBILEGL_ASSERT(target == TextureUploadTarget::Texture2D || + target == TextureUploadTarget::ProxyTexture2D, "Invalid TextureUploadTarget!"); return 0; } - } - } -} \ No newline at end of file + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject2D.h b/MobileGL/MG_State/GLState/TextureState/TextureObject2D.h index 1cb3d040..11b814e3 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject2D.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject2D.h @@ -7,13 +7,12 @@ namespace MobileGL { class TextureObject2D : public TextureObjectWithOneMipmap { public: explicit TextureObject2D(Uint externalIndex); - const Vector& GetUploadTargets() const override { - return m_uploadTargets; - } + const Vector& GetUploadTargets() const override { return m_uploadTargets; } + protected: Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override; - const Vector m_uploadTargets {TextureUploadTarget::Texture2D}; + const Vector m_uploadTargets{TextureUploadTarget::Texture2D}; }; - } - } -} + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.cpp index e5bd6db7..e1b7fd10 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.cpp @@ -12,45 +12,39 @@ namespace MobileGL { return m_textureStorage.GetLevelCount(); } - const IntVec3 TextureObject2DCube::GetMipmapTexelSize(TextureUploadTarget target, - Uint mipmapLevel) const { + const IntVec3 TextureObject2DCube::GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const { return m_textureStorage.GetTexelSize(GetIndexOfTextureUploadTarget(target), mipmapLevel); } - const SizeT TextureObject2DCube::GetMipmapByteSize(TextureUploadTarget target, - Uint mipmapLevel) const { + const SizeT TextureObject2DCube::GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const { return m_textureStorage.GetByteSize(GetIndexOfTextureUploadTarget(target), mipmapLevel); } - void - TextureObject2DCube::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, - MipmapInput input) { + void TextureObject2DCube::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, + MipmapInput input) { m_textureStorage.AllocateLevel(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input); } - void TextureObject2DCube::UpdateMipmapSubData(TextureUploadTarget uploadTarget, - Uint mipmapLevel, DataPtr input) { + void TextureObject2DCube::UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, + DataPtr input) { m_textureStorage.UpdateSubData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input); } - void * - TextureObject2DCube::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) { + void* TextureObject2DCube::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) { return m_textureStorage.MapData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel); } - void TextureObject2DCube::MarkStorageDirty(TextureUploadTarget uploadTarget, - Uint mipmapLevel, bool dirty) { + void TextureObject2DCube::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) { m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty); } - bool TextureObject2DCube::IsStorageDirty(TextureUploadTarget uploadTarget, - Uint mipmapLevel) const { + bool TextureObject2DCube::IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const { return m_textureStorage.IsDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel); } - Uint - TextureObject2DCube::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const { - MOBILEGL_ASSERT(TextureUploadTarget::CubeMapPositiveX <= target && target <= TextureUploadTarget::ProxyCubeMap, + Uint TextureObject2DCube::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const { + MOBILEGL_ASSERT(TextureUploadTarget::CubeMapPositiveX <= target && + target <= TextureUploadTarget::ProxyCubeMap, "Invalid TextureUploadTarget!"); return (Uint)target - (Uint)TextureUploadTarget::CubeMapPositiveX; } @@ -63,8 +57,7 @@ namespace MobileGL { } Bool TextureObject2DCube::IsComplete() const { - if (!TextureObjectBase::IsComplete()) - return false; + if (!TextureObjectBase::IsComplete()) return false; SizeT levelCount = m_textureStorage.GetLevelCount(); if (levelCount == 0) { @@ -73,7 +66,7 @@ namespace MobileGL { for (SizeT t = 0; t < 6; ++t) { for (SizeT i = 0; i < levelCount; ++i) { - const auto &levelSize = m_textureStorage.GetTexelSize(t, i); + const auto& levelSize = m_textureStorage.GetTexelSize(t, i); if (levelSize.x() <= 0 || levelSize.y() <= 0 || levelSize.z() <= 0) { return false; } @@ -83,6 +76,6 @@ namespace MobileGL { // TODO: add more completeness checks based on texture type and mipmap levels return true; } - } - } -} + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.h b/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.h index 2ed668a4..08f603ba 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.h @@ -8,9 +8,7 @@ namespace MobileGL { public: explicit TextureObject2DCube(Uint externalIndex); - const Vector& GetUploadTargets() const override { - return m_uploadTargets; - } + const Vector& GetUploadTargets() const override { return m_uploadTargets; } Uint GetMipmapLevelCount() const override; const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const override; @@ -23,18 +21,16 @@ namespace MobileGL { IntVec3 GetBaseSize() const override; Bool IsComplete() const override; + protected: Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override; TextureStorage<6> m_textureStorage; - const Vector m_uploadTargets { - TextureUploadTarget::CubeMapPositiveX, - TextureUploadTarget::CubeMapNegativeX, - TextureUploadTarget::CubeMapPositiveY, - TextureUploadTarget::CubeMapNegativeY, - TextureUploadTarget::CubeMapPositiveZ, - TextureUploadTarget::CubeMapNegativeZ, + const Vector m_uploadTargets{ + TextureUploadTarget::CubeMapPositiveX, TextureUploadTarget::CubeMapNegativeX, + TextureUploadTarget::CubeMapPositiveY, TextureUploadTarget::CubeMapNegativeY, + TextureUploadTarget::CubeMapPositiveZ, TextureUploadTarget::CubeMapNegativeZ, }; }; - } - } -} + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject3D.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject3D.cpp index e5b43dd0..f32f2557 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject3D.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject3D.cpp @@ -7,10 +7,11 @@ namespace MobileGL { : TextureObjectWithOneMipmap(TextureTarget::Texture3D, externalIndex) {} Uint TextureObject3D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const { - MOBILEGL_ASSERT(target == TextureUploadTarget::Texture3D || target == TextureUploadTarget::ProxyTexture3D, + MOBILEGL_ASSERT(target == TextureUploadTarget::Texture3D || + target == TextureUploadTarget::ProxyTexture3D, "Invalid TextureUploadTarget!"); return 0; } - } - } -} \ No newline at end of file + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject3D.h b/MobileGL/MG_State/GLState/TextureState/TextureObject3D.h index e1a87d50..98b0c973 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject3D.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject3D.h @@ -7,13 +7,12 @@ namespace MobileGL { class TextureObject3D : public TextureObjectWithOneMipmap { public: explicit TextureObject3D(Uint externalIndex); - const Vector& GetUploadTargets() const override { - return m_uploadTargets; - } + const Vector& GetUploadTargets() const override { return m_uploadTargets; } + protected: Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override; - const Vector m_uploadTargets {TextureUploadTarget::Texture3D}; + const Vector m_uploadTargets{TextureUploadTarget::Texture3D}; }; - } - } -} + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObjectStubs.h b/MobileGL/MG_State/GLState/TextureState/TextureObjectStubs.h new file mode 100644 index 00000000..541b5be6 --- /dev/null +++ b/MobileGL/MG_State/GLState/TextureState/TextureObjectStubs.h @@ -0,0 +1,53 @@ +#pragma once +#include "MG_State/GLState/TextureState/TextureEnum.h" +#include "TextureObject.h" + +namespace MobileGL { + namespace MG_State { + namespace GLState { + /* These texture types are not yet implemented: + * TextureRectangle, + * Texture2DMultisample, + * TextureBuffer, + * Texture1DArray, + * Texture2DArray, + * TextureCubeMapArray, + * Texture2DMultisampleArray + */ +#define STUB_TEXTURE_OBJECT_CLASS_DEFINITION(className, texTarget, uploadTargets) \ + class className : public TextureObjectWithOneMipmap { \ + public: \ + explicit className(Uint externalIndex) : TextureObjectWithOneMipmap(texTarget, externalIndex) {} \ + const Vector& GetUploadTargets() const override { return m_uploadTargets; } \ + \ + protected: \ + Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override { return 0; } \ + const Vector m_uploadTargets = uploadTargets; \ + }; + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObjectRectangle, TextureTarget::TextureRectangle, + {TextureUploadTarget::TextureRectangle}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObject2DMultisample, TextureTarget::Texture2DMultisample, + {TextureUploadTarget::Texture2DMultisample}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObjectBuffer, TextureTarget::TextureBuffer, + {TextureUploadTarget::Unknown}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObject1DArray, TextureTarget::Texture1DArray, + {TextureUploadTarget::Texture1DArray}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObject2DArray, TextureTarget::Texture2DArray, + {TextureUploadTarget::Texture2D}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObjectCubeMapArray, TextureTarget::TextureCubeMapArray, + {TextureUploadTarget::CubeMapArray}); + + STUB_TEXTURE_OBJECT_CLASS_DEFINITION(TextureObject2DMultisampleArray, + TextureTarget::Texture2DMultisampleArray, + {TextureUploadTarget::Texture2DMultisampleArray}); +#undef STUB_TEXTURE_OBJECT_CLASS_DEFINITION + + } // namespace GLState + } // namespace MG_State +} // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/TextureState/TextureState.cpp b/MobileGL/MG_State/GLState/TextureState/TextureState.cpp index ef54482b..c479c7a9 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureState.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureState.cpp @@ -1,10 +1,12 @@ #include "TextureState.h" -#include "MG_State/GLState/TextureState/TextureObject.h" -#include "MG_State/GLState/TextureState/TextureObject1D.h" -#include "MG_State/GLState/TextureState/TextureObject2D.h" -#include "MG_State/GLState/TextureState/TextureObject3D.h" -#include "MG_Util/Types.h" +#include "Defines.h" +#include "TextureEnum.h" +#include "TextureObject.h" +#include "TextureObject1D.h" +#include "TextureObject2D.h" +#include "TextureObject3D.h" #include "TextureObject2DCube.h" +#include "TextureObjectStubs.h" namespace MobileGL { namespace MG_State { @@ -44,8 +46,31 @@ namespace MobileGL { case TextureTarget::Texture3D: textureObject = MakeShared(index); break; + + // These texture types are stubbed: + case TextureTarget::TextureRectangle: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DMultisample: + textureObject = MakeShared(index); + break; + case TextureTarget::TextureBuffer: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture1DArray: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DArray: + textureObject = MakeShared(index); + break; + case TextureTarget::TextureCubeMapArray: + textureObject = MakeShared(index); + break; + case TextureTarget::Texture2DMultisampleArray: + textureObject = MakeShared(index); + break; default: - // TODO: implement more texture types + MOBILEGL_ASSERT(false, "Unimplemented texture type when creating texture object!: %d", (int)target); return nullptr; } @@ -72,9 +97,8 @@ namespace MobileGL { } TextureUnit& TextureState::GetUnitObject(Int unit) { - if (unit < 0 || unit >= MAX_TEXTURE_IMAGE_UNITS) { - THROW_EXCEPTION("Active texture unit is out of range"); - } + MOBILEGL_ASSERT(unit >= 0 && unit < MAX_TEXTURE_IMAGE_UNITS, "Texture unit is out of range: %d > %d", + unit, MAX_TEXTURE_IMAGE_UNITS - 1); return m_textureUnits[unit]; } diff --git a/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp b/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp index 5b9dba82..c7600561 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp @@ -1,5 +1,4 @@ #include "TextureUnit.h" -#include "MG_Util/Types.h" namespace MobileGL { namespace MG_State { diff --git a/MobileGL/MG_State/GLState/TextureState/TextureUnit.h b/MobileGL/MG_State/GLState/TextureState/TextureUnit.h index a4d9a043..1ffa254a 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureUnit.h +++ b/MobileGL/MG_State/GLState/TextureState/TextureUnit.h @@ -1,7 +1,6 @@ #pragma once #include -#include "MG_State/GLState/SamplerState/SamplerObject.h" -#include "MG_Util/Types.h" +#include #include "TextureObject.h" namespace MobileGL {