[Feat] (MG_State/TextureObject): implement GetIndexOfTextureUploadTarget()

This commit is contained in:
2025-11-25 14:14:05 +08:00
parent 1a997ae8d4
commit 352df37b91
11 changed files with 36 additions and 8 deletions
@@ -20,7 +20,9 @@ namespace MobileGL {
// Don't tinker with order in this enum // Don't tinker with order in this enum
// it is used in TextureStorage // it is used in TextureStorage
enum class TextureUploadTarget { enum class TextureUploadTarget {
Texture1D,
Texture2D, Texture2D,
Texture3D,
ProxyTexture2D, ProxyTexture2D,
Texture1DArray, Texture1DArray,
ProxyTexture1DArray, ProxyTexture1DArray,
@@ -15,34 +15,34 @@ namespace MobileGL {
} }
const IntVec3 TextureObjectBase::GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const { const IntVec3 TextureObjectBase::GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const {
return m_textureStorage.GetTexelSize(0, mipmapLevel); return m_textureStorage.GetTexelSize(GetIndexOfTextureUploadTarget(target), mipmapLevel);
} }
const SizeT TextureObjectBase::GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const { const SizeT TextureObjectBase::GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const {
return m_textureStorage.GetByteSize(0, mipmapLevel); return m_textureStorage.GetByteSize(GetIndexOfTextureUploadTarget(target), mipmapLevel);
} }
void TextureObjectBase::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, void TextureObjectBase::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel,
MipmapInput input) { MipmapInput input) {
// don't care target, index always 0 // don't care target, index always 0
m_textureStorage.AllocateLevel(0, mipmapLevel, input); m_textureStorage.AllocateLevel(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
} }
void TextureObjectBase::UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, void TextureObjectBase::UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel,
DataPtr input) { DataPtr input) {
// ditto // ditto
m_textureStorage.UpdateSubData(0, mipmapLevel, input); m_textureStorage.UpdateSubData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
} }
void* TextureObjectBase::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) { void* TextureObjectBase::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) {
return m_textureStorage.MapData(0, mipmapLevel); return m_textureStorage.MapData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel);
} }
void TextureObjectBase::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) { void TextureObjectBase::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) {
// ditto // ditto
m_textureStorage.MarkDirty(0, mipmapLevel, dirty); m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty);
} }
bool TextureObjectBase::IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const { bool TextureObjectBase::IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const {
return m_textureStorage.IsDirty(0, mipmapLevel); return m_textureStorage.IsDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel);
} }
// void TextureObjectBase::SetMipmapLevel(const MipmapLevelInput& level) { // void TextureObjectBase::SetMipmapLevel(const MipmapLevelInput& level) {
@@ -71,6 +71,8 @@ namespace MobileGL {
virtual const UintVec2& GetLevelRange() const = 0; virtual const UintVec2& GetLevelRange() const = 0;
virtual void SetBaseLevel(Uint baseLevel) = 0; virtual void SetBaseLevel(Uint baseLevel) = 0;
virtual void SetMaxLevel(Uint maxLevel) = 0; virtual void SetMaxLevel(Uint maxLevel) = 0;
protected:
virtual Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const = 0;
}; };
class TextureObjectBase : public ITextureObject { class TextureObjectBase : public ITextureObject {
@@ -6,6 +6,11 @@ namespace MobileGL {
TextureObject1D::TextureObject1D(Uint externalIndex) TextureObject1D::TextureObject1D(Uint externalIndex)
: TextureObjectBase(TextureTarget::Texture1D, externalIndex) {} : TextureObjectBase(TextureTarget::Texture1D, externalIndex) {}
Uint TextureObject1D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const {
MOBILEGL_ASSERT(target == TextureUploadTarget::Texture1D, "Invalid TextureUploadTarget!");
return 0;
}
// void TextureObject1D::SetMipmapImpl(const MipmapLevelInput& level) { // void TextureObject1D::SetMipmapImpl(const MipmapLevelInput& level) {
// if (level.size.x() > 0) { // if (level.size.x() > 0) {
// m_mipmaps.push_back(MipmapLevelInternal(level)); // m_mipmaps.push_back(MipmapLevelInternal(level));
@@ -10,6 +10,7 @@ namespace MobileGL {
protected: protected:
// void SetMipmapImpl(const MipmapLevelInput& level) override; // void SetMipmapImpl(const MipmapLevelInput& level) override;
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
}; };
} }
} }
@@ -6,6 +6,10 @@ namespace MobileGL {
TextureObject2D::TextureObject2D(Uint externalIndex) TextureObject2D::TextureObject2D(Uint externalIndex)
: TextureObjectBase(TextureTarget::Texture2D, externalIndex) {} : TextureObjectBase(TextureTarget::Texture2D, externalIndex) {}
Uint TextureObject2D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const {
MOBILEGL_ASSERT(target == TextureUploadTarget::Texture1D, "Invalid TextureUploadTarget!");
return 0;
}
// void TextureObject2D::SetMipmapImpl(const MipmapLevelInput& level) { // void TextureObject2D::SetMipmapImpl(const MipmapLevelInput& level) {
// if (level.size.x() > 0 && level.size.y() > 0) { // if (level.size.x() > 0 && level.size.y() > 0) {
// m_mipmaps.push_back(MipmapLevelInternal(level)); // m_mipmaps.push_back(MipmapLevelInternal(level));
@@ -9,6 +9,7 @@ namespace MobileGL {
explicit TextureObject2D(Uint externalIndex); explicit TextureObject2D(Uint externalIndex);
protected: protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
// void SetMipmapImpl(const MipmapLevelInput& level) override; // void SetMipmapImpl(const MipmapLevelInput& level) override;
}; };
} }
@@ -6,6 +6,10 @@ namespace MobileGL {
TextureObject3D::TextureObject3D(Uint externalIndex) TextureObject3D::TextureObject3D(Uint externalIndex)
: TextureObjectBase(TextureTarget::Texture3D, externalIndex) {} : TextureObjectBase(TextureTarget::Texture3D, externalIndex) {}
Uint TextureObject3D::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const {
MOBILEGL_ASSERT(target == TextureUploadTarget::Texture3D, "Invalid TextureUploadTarget!");
return 0;
}
// void TextureObject3D::SetMipmapImpl(const MipmapLevelInput& level) { // void TextureObject3D::SetMipmapImpl(const MipmapLevelInput& level) {
// if (level.size.x() > 0 && level.size.y() > 0 && level.size.z() > 0) { // if (level.size.x() > 0 && level.size.y() > 0 && level.size.z() > 0) {
// m_mipmaps.push_back(MipmapLevelInternal(level)); // m_mipmaps.push_back(MipmapLevelInternal(level));
@@ -9,6 +9,7 @@ namespace MobileGL {
explicit TextureObject3D(Uint externalIndex); explicit TextureObject3D(Uint externalIndex);
protected: protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
// void SetMipmapImpl(const MipmapLevelInput& level) override; // void SetMipmapImpl(const MipmapLevelInput& level) override;
}; };
} }
@@ -278,9 +278,13 @@ namespace MobileGL {
TextureUploadTarget ConvertGLEnumToTextureUploadTarget(GLenum target) { TextureUploadTarget ConvertGLEnumToTextureUploadTarget(GLenum target) {
switch (target) { switch (target) {
case GL_TEXTURE_1D:
return TextureUploadTarget::Texture1D;
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
return TextureUploadTarget::Texture2D; return TextureUploadTarget::Texture2D;
case GL_PROXY_TEXTURE_2D: case GL_TEXTURE_3D:
return TextureUploadTarget::Texture3D;
case GL_PROXY_TEXTURE_2D:
return TextureUploadTarget::ProxyTexture2D; return TextureUploadTarget::ProxyTexture2D;
case GL_TEXTURE_1D_ARRAY: case GL_TEXTURE_1D_ARRAY:
return TextureUploadTarget::Texture1DArray; return TextureUploadTarget::Texture1DArray;
@@ -274,6 +274,10 @@ namespace MobileGL {
switch (target) { switch (target) {
case TextureUploadTarget::Texture2D: case TextureUploadTarget::Texture2D:
return GL_TEXTURE_2D; return GL_TEXTURE_2D;
case TextureUploadTarget::Texture1D:
return GL_TEXTURE_1D;
case TextureUploadTarget::Texture3D:
return GL_TEXTURE_3D;
case TextureUploadTarget::ProxyTexture2D: case TextureUploadTarget::ProxyTexture2D:
return GL_PROXY_TEXTURE_2D; return GL_PROXY_TEXTURE_2D;
case TextureUploadTarget::Texture1DArray: case TextureUploadTarget::Texture1DArray: