diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index a9b5c842..776fefb1 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -791,6 +791,9 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("%s: Backend depth", __func__); MG_External::GLES::glTexImage2D(target, level, (GLint)internalformat, width, height, border, format, type, nullptr); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); FramebufferImpl::BackendFramebufferBindingProtector drawFboProtector(GL_DRAW_FRAMEBUFFER); FramebufferImpl::BackendFramebufferBindingProtector readFboProtector(GL_READ_FRAMEBUFFER); errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { diff --git a/MobileGL/MG_Backend/DirectGLES/Utils.cpp b/MobileGL/MG_Backend/DirectGLES/Utils.cpp index c1811be6..87ced594 100644 --- a/MobileGL/MG_Backend/DirectGLES/Utils.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Utils.cpp @@ -73,7 +73,7 @@ namespace MobileGL::MG_Backend::DirectGLES { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif MG_Util::TextureFormatProcessor::NormalizePixelFormat(MG_Util::ConvertTextureInternalFormatToGLEnum(internalFormat), outInternalFormat, - outType, outFormat); + outFormat, outType); } } // namespace TextureImpl diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index 3a663bf0..2fe6833e 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -612,24 +612,26 @@ namespace MobileGL { void TexImage2D_State(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { - MGLOG_D( - "%s called with target: %s, level: %d, internalformat: %s, width: %d, height: %d, " - "border: %d, format: %s, type: %s (%u), pixels: %p", __func__, - MG_Util::ConvertTextureUploadTargetToString(MG_Util::ConvertGLEnumToTextureUploadTarget(target)).c_str(), - level, - MG_Util::ConvertTextureInternalFormatToString( - MG_Util::ConvertGLEnumToTextureInternalFormat(internalformat)).c_str(), - width, height, border, - MG_Util::ConvertTextureInputFormatToString(MG_Util::ConvertGLEnumToTextureInputFormat(format)).c_str(), - MG_Util::ConvertTexturePixelDataTypeToString(MG_Util::ConvertGLEnumToTexturePixelDataType(type)).c_str(), - type, pixels); // ======================= Converting ================================ TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target); TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); TextureInputFormat textureInputFormat = MG_Util::ConvertGLEnumToTextureInputFormat(format); TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type); TextureInternalFormat textureInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalformat); - + MGLOG_D( + "%s called with target: %s (%s), level: %d, internalformat: %s (%s), width: %d, height: %d, " + "border: %d, format: %s (%s), type: %s (%s), pixels: %p", __func__, + MG_Util::ConvertTextureUploadTargetToString(textureUploadingTarget).c_str(), + MG_Util::ConvertGLEnumToString(target).c_str(), + level, + MG_Util::ConvertTextureInternalFormatToString(textureInternalFormat).c_str(), + MG_Util::ConvertGLEnumToString(internalformat).c_str(), + width, height, border, + MG_Util::ConvertTextureInputFormatToString(textureInputFormat).c_str(), + MG_Util::ConvertGLEnumToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(texturePixelDataType).c_str(), + MG_Util::ConvertGLEnumToString(type).c_str(), + pixels); // ===================== Error Checking ============================== if (!TextureImpl::ValidateTexturePixelDataType(texturePixelDataType)) return; if (!TextureImpl::ValidateTextureInputFormat(textureInputFormat)) return; @@ -654,6 +656,7 @@ namespace MobileGL { // indicated by type. // ======================= Processing ================================ + textureInternalFormat = MG_Util::ConvertInternalFormatToSized(textureInternalFormat, textureInputFormat, texturePixelDataType); SharedPtr textureObject = nullptr; Bool isProxy = TextureImpl::IsProxyTextureTarget(textureUploadingTarget); if (isProxy) { diff --git a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp index d2e42649..903f15c7 100644 --- a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp +++ b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp @@ -6,6 +6,7 @@ // End of Source File Header #include "TextureEnumConverter.h" +#include "MG_Util/Converters/MGToStr/TextureEnumConverter.h" namespace MobileGL { namespace MG_Util { @@ -50,5 +51,145 @@ namespace MobileGL { return TextureTarget::Unknown; } } + + TextureInternalFormat ConvertInternalFormatToSized(TextureInternalFormat internalformat, TextureInputFormat format, TexturePixelDataType type) { + switch (internalformat) { + case TextureInternalFormat::R8: + case TextureInternalFormat::R8Snorm: + case TextureInternalFormat::R16: + case TextureInternalFormat::R16Snorm: + case TextureInternalFormat::RG8: + case TextureInternalFormat::RG8Snorm: + case TextureInternalFormat::RG16: + case TextureInternalFormat::RG16Snorm: + case TextureInternalFormat::R3G3B2: + case TextureInternalFormat::RGB4: + case TextureInternalFormat::RGB5: + case TextureInternalFormat::RGB8: + case TextureInternalFormat::RGB8Snorm: + case TextureInternalFormat::RGB10: + case TextureInternalFormat::RGB12: + case TextureInternalFormat::RGB16Snorm: + case TextureInternalFormat::RGBA2: + case TextureInternalFormat::RGBA4: + case TextureInternalFormat::RGB5A1: + case TextureInternalFormat::RGBA8: + case TextureInternalFormat::RGBA8Snorm: + case TextureInternalFormat::RGB10A2: + case TextureInternalFormat::RGB10A2UI: + case TextureInternalFormat::RGBA12: + case TextureInternalFormat::RGBA16: + case TextureInternalFormat::SRGB8: + case TextureInternalFormat::SRGB8Alpha8: + case TextureInternalFormat::R16F: + case TextureInternalFormat::RG16F: + case TextureInternalFormat::RGB16F: + case TextureInternalFormat::RGBA16F: + case TextureInternalFormat::R32F: + case TextureInternalFormat::RG32F: + case TextureInternalFormat::RGB32F: + case TextureInternalFormat::RGBA32F: + case TextureInternalFormat::R11FG11FB10F: + case TextureInternalFormat::RGB9E5: + case TextureInternalFormat::R8I: + case TextureInternalFormat::R8UI: + case TextureInternalFormat::R16I: + case TextureInternalFormat::R16UI: + case TextureInternalFormat::R32I: + case TextureInternalFormat::R32UI: + case TextureInternalFormat::RG8I: + case TextureInternalFormat::RG8UI: + case TextureInternalFormat::RG16I: + case TextureInternalFormat::RG16UI: + case TextureInternalFormat::RG32I: + case TextureInternalFormat::RG32UI: + case TextureInternalFormat::RGB8I: + case TextureInternalFormat::RGB8UI: + case TextureInternalFormat::RGB16I: + case TextureInternalFormat::RGB16UI: + case TextureInternalFormat::RGB32I: + case TextureInternalFormat::RGB32UI: + case TextureInternalFormat::RGBA8I: + case TextureInternalFormat::RGBA8UI: + case TextureInternalFormat::RGBA16I: + case TextureInternalFormat::RGBA16UI: + case TextureInternalFormat::RGBA32I: + case TextureInternalFormat::RGBA32UI: + case TextureInternalFormat::DepthComponent16: + case TextureInternalFormat::DepthComponent24: + case TextureInternalFormat::DepthComponent32: // not a standard format in OpenGL core profile + case TextureInternalFormat::DepthComponent32F: + case TextureInternalFormat::Depth24Stencil8: + case TextureInternalFormat::Depth32FStencil8: + return internalformat; + // probably we should assume unorm here? + case TextureInternalFormat::RGBA: { + switch (type) { + case TexturePixelDataType::UnsignedByte: + return TextureInternalFormat::RGBA8; + case TexturePixelDataType::UnsignedShort: + return TextureInternalFormat::RGBA16; + default: + MGLOG_W("%s: Can't infer sized internal format from internalformat=%s, format=%s, type=%s, returning original.", + __func__, + MG_Util::ConvertTextureInternalFormatToString(internalformat).c_str(), + MG_Util::ConvertTextureInputFormatToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(type).c_str()); + return internalformat; + } + } + case TextureInternalFormat::RGB: { + switch (type) { + case TexturePixelDataType::UnsignedByte: + return TextureInternalFormat::RGB8; + default: + MGLOG_W("%s: Can't infer sized internal format from internalformat=%s, format=%s, type=%s, returning original.", + __func__, + MG_Util::ConvertTextureInternalFormatToString(internalformat).c_str(), + MG_Util::ConvertTextureInputFormatToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(type).c_str()); + return internalformat; + } + } + case TextureInternalFormat::RG: { + switch (type) { + case TexturePixelDataType::UnsignedByte: + return TextureInternalFormat::RG8; + case TexturePixelDataType::UnsignedShort: + return TextureInternalFormat::RG16; + default: + MGLOG_W("%s: Can't infer sized internal format from internalformat=%s, format=%s, type=%s, returning original.", + __func__, + MG_Util::ConvertTextureInternalFormatToString(internalformat).c_str(), + MG_Util::ConvertTextureInputFormatToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(type).c_str()); + return internalformat; + } + } + case TextureInternalFormat::Red: { + switch (type) { + case TexturePixelDataType::UnsignedByte: + return TextureInternalFormat::R8; + case TexturePixelDataType::UnsignedShort: + return TextureInternalFormat::R16; + default: + MGLOG_W("%s: Can't infer sized internal format from internalformat=%s, format=%s, type=%s, returning original.", + __func__, + MG_Util::ConvertTextureInternalFormatToString(internalformat).c_str(), + MG_Util::ConvertTextureInputFormatToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(type).c_str()); + return internalformat; + } + } + default: { + MGLOG_W("%s: Can't infer sized internal format from internalformat=%s, format=%s, type=%s, returning original.", + __func__, + MG_Util::ConvertTextureInternalFormatToString(internalformat).c_str(), + MG_Util::ConvertTextureInputFormatToString(format).c_str(), + MG_Util::ConvertTexturePixelDataTypeToString(type).c_str()); + return internalformat; + } + } + } } // namespace MG_Util } // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.h b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.h index 438420ed..8543f994 100644 --- a/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.h +++ b/MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.h @@ -12,5 +12,6 @@ namespace MobileGL { namespace MG_Util { TextureTarget ConvertTextureUploadTargetToTextureTarget(TextureUploadTarget target); + TextureInternalFormat ConvertInternalFormatToSized(TextureInternalFormat internalformat, TextureInputFormat format, TexturePixelDataType type); } // namespace MG_Util } // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_Util/Metrics/TextureMetrics.cpp b/MobileGL/MG_Util/Metrics/TextureMetrics.cpp index 381666ef..45994100 100644 --- a/MobileGL/MG_Util/Metrics/TextureMetrics.cpp +++ b/MobileGL/MG_Util/Metrics/TextureMetrics.cpp @@ -14,7 +14,6 @@ namespace MobileGL { SizeT GetSizedInternalFormatSizeInBytes(TextureInternalFormat internal) { switch (internal) { case TextureInternalFormat::R8: - case TextureInternalFormat::Red: case TextureInternalFormat::R8Snorm: case TextureInternalFormat::R8I: case TextureInternalFormat::R8UI: diff --git a/MobileGL/MG_Util/Texture/TextureFormatProcessor.cpp b/MobileGL/MG_Util/Texture/TextureFormatProcessor.cpp index f3c7b288..05f17d9c 100644 --- a/MobileGL/MG_Util/Texture/TextureFormatProcessor.cpp +++ b/MobileGL/MG_Util/Texture/TextureFormatProcessor.cpp @@ -9,8 +9,7 @@ #include "MG_Util/Converters/GLToStr/GLEnumConverter.h" namespace MobileGL::MG_Util::TextureFormatProcessor { - void NormalizePixelFormat(GLenum internalFormat, GLenum* outInternalFormat, GLenum* outType, - GLenum* outFormat) { + void NormalizePixelFormat(GLenum internalFormat, GLenum* outInternalFormat, GLenum* outFormat, GLenum* outType) { #ifdef TRACY_ENABLE ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif diff --git a/MobileGL/MG_Util/Texture/TextureFormatProcessor.h b/MobileGL/MG_Util/Texture/TextureFormatProcessor.h index 7d733fc7..7f8d4976 100644 --- a/MobileGL/MG_Util/Texture/TextureFormatProcessor.h +++ b/MobileGL/MG_Util/Texture/TextureFormatProcessor.h @@ -9,5 +9,5 @@ #include namespace MobileGL::MG_Util::TextureFormatProcessor { - void NormalizePixelFormat(GLenum internalFormat, GLenum* outInternalFormat, GLenum* outType, GLenum* outFormat); + void NormalizePixelFormat(GLenum internalFormat, GLenum* outInternalFormat, GLenum* outFormat, GLenum* outType); } // namespace MobileGL::MG_Util::TextureFormatProcessor \ No newline at end of file