From c0debbee9ff231fff1836a3a19087b0cd02c8edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 25 Jul 2026 20:26:24 -0300 Subject: [PATCH] Rollback to fix rendering. --- .../fontrendering/eepp-subpixel-text.webp | Bin 0 -> 8384 bytes include/eepp/graphics/renderer/renderer.hpp | 2 -- include/eepp/graphics/renderer/renderergl.hpp | 2 ++ .../graphics/renderer/rendererglshader.hpp | 2 -- src/eepp/graphics/renderer/renderer.cpp | 12 +------- src/eepp/graphics/renderer/renderergl.cpp | 13 +++++++-- src/eepp/graphics/renderer/renderergl3.cpp | 7 ++++- src/eepp/graphics/renderer/renderergl3cp.cpp | 7 ++++- src/eepp/graphics/renderer/renderergles2.cpp | 7 ++++- .../graphics/renderer/rendererglshader.cpp | 27 +++++------------- src/eepp/graphics/text.cpp | 17 ++++------- src/tests/unit_tests/fontrendering_tests.cpp | 14 +++++++-- 12 files changed, 56 insertions(+), 54 deletions(-) create mode 100644 bin/assets/fontrendering/eepp-subpixel-text.webp diff --git a/bin/assets/fontrendering/eepp-subpixel-text.webp b/bin/assets/fontrendering/eepp-subpixel-text.webp new file mode 100644 index 0000000000000000000000000000000000000000..85bbb729ad99ab7801ba86701fd4eb924e32419b GIT binary patch literal 8384 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 ITm=C59~GTp^Z)<= literal 0 HcmV?d00001 diff --git a/include/eepp/graphics/renderer/renderer.hpp b/include/eepp/graphics/renderer/renderer.hpp index fdda462b9..55aeb3f0b 100644 --- a/include/eepp/graphics/renderer/renderer.hpp +++ b/include/eepp/graphics/renderer/renderer.hpp @@ -362,8 +362,6 @@ class EE_API Renderer { void waitForIdle(); protected: - static const Vector3ff& textureColorChannel( Int32 mode ); - static Renderer* sSingleton; enum RendererStateFlags { diff --git a/include/eepp/graphics/renderer/renderergl.hpp b/include/eepp/graphics/renderer/renderergl.hpp index f3d2a9da0..231e6aa9b 100644 --- a/include/eepp/graphics/renderer/renderergl.hpp +++ b/include/eepp/graphics/renderer/renderergl.hpp @@ -14,6 +14,8 @@ class EE_API RendererGL : public Renderer { ~RendererGL(); + void init(); + GraphicsLibraryVersion version(); std::string versionStr(); diff --git a/include/eepp/graphics/renderer/rendererglshader.hpp b/include/eepp/graphics/renderer/rendererglshader.hpp index 9b6f0622b..0d19f8baa 100644 --- a/include/eepp/graphics/renderer/rendererglshader.hpp +++ b/include/eepp/graphics/renderer/rendererglshader.hpp @@ -64,8 +64,6 @@ class EE_API RendererGLShader : public Renderer { int mTextureColorMode_id; int mTextureColorChannel_id; Int32 mTextureColorMode; - ShaderProgram* mTextureColorPreviousShader; - bool mUsingTextureColorFallbackShader; unsigned int mCurrentMode; ShaderProgram* mCurShader; ShaderProgram* mShaderPrev; diff --git a/src/eepp/graphics/renderer/renderer.cpp b/src/eepp/graphics/renderer/renderer.cpp index fc66f95e2..31f77763e 100644 --- a/src/eepp/graphics/renderer/renderer.cpp +++ b/src/eepp/graphics/renderer/renderer.cpp @@ -483,8 +483,7 @@ bool Renderer::drawSubpixelArrays( unsigned int mode, int first, int count ) { Uint8 previousColorMask[4]; getColorMask( previousColorMask ); for ( Int32 channel = 0; channel < 3; ++channel ) { - if ( channel != 0 ) - setTextureColorMode( channel + 1 ); + setTextureColorMode( channel + 1 ); colorMask( channel == 0 && previousColorMask[0], channel == 1 && previousColorMask[1], channel == 2 && previousColorMask[2], 0 ); drawArrays( mode, first, count ); @@ -590,15 +589,6 @@ bool Renderer::setTextureColorMode( Int32 ) { return false; } -const Vector3ff& Renderer::textureColorChannel( Int32 mode ) { - static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, - { 1.f, 0.f, 0.f }, - { 0.f, 1.f, 0.f }, - { 0.f, 0.f, 1.f }, - { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; - return channels[mode]; -} - bool Renderer::isLineSmooth() { return BitOp::readBitKey( &mStateFlags, RSF_LINE_SMOOTH ); } diff --git a/src/eepp/graphics/renderer/renderergl.cpp b/src/eepp/graphics/renderer/renderergl.cpp index 76b0b544f..45cae505b 100644 --- a/src/eepp/graphics/renderer/renderergl.cpp +++ b/src/eepp/graphics/renderer/renderergl.cpp @@ -61,6 +61,10 @@ RendererGL::RendererGL() { RendererGL::~RendererGL() {} +void RendererGL::init() { + Renderer::init(); +} + bool RendererGL::ensureSubpixelShader() { #ifndef EE_GLES1 if ( mSubpixelShader ) @@ -117,8 +121,6 @@ bool RendererGL::setTextureColorMode( Int32 mode ) { #ifdef EE_GLES1 return false; #else - if ( mode < 0 || mode > 4 ) - return false; if ( mode != 0 && !ensureSubpixelShader() ) return false; if ( !mSubpixelShader || !mSubpixelShader->isValid() || mSubpixelChannelLoc == -1 ) @@ -134,7 +136,12 @@ bool RendererGL::setTextureColorMode( Int32 mode ) { Renderer::setShader( mSubpixelShader.get() ); mUsingSubpixelShader = true; } - mSubpixelShader->setUniform( mSubpixelChannelLoc, textureColorChannel( mode ) ); + static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, + { 1.f, 0.f, 0.f }, + { 0.f, 1.f, 0.f }, + { 0.f, 0.f, 1.f }, + { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; + mSubpixelShader->setUniform( mSubpixelChannelLoc, channels[mode] ); return true; #endif } diff --git a/src/eepp/graphics/renderer/renderergl3.cpp b/src/eepp/graphics/renderer/renderergl3.cpp index 2d3235a5a..9d40dee25 100644 --- a/src/eepp/graphics/renderer/renderergl3.cpp +++ b/src/eepp/graphics/renderer/renderergl3.cpp @@ -173,7 +173,12 @@ void RendererGL3::setShader( ShaderProgram* Shader ) { if ( mTextureColorMode_id != -1 ) mCurShader->setUniform( mTextureColorMode_id, mTextureColorMode ); if ( mTextureColorChannel_id != -1 && mTextureColorMode != 0 ) { - mCurShader->setUniform( mTextureColorChannel_id, textureColorChannel( mTextureColorMode ) ); + static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, + { 1.f, 0.f, 0.f }, + { 0.f, 1.f, 0.f }, + { 0.f, 0.f, 1.f }, + { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; + mCurShader->setUniform( mTextureColorChannel_id, channels[mTextureColorMode] ); } if ( -1 != mAttribsLoc[EEGL_VERTEX_ARRAY] ) diff --git a/src/eepp/graphics/renderer/renderergl3cp.cpp b/src/eepp/graphics/renderer/renderergl3cp.cpp index e22ef6687..8bbe6e405 100644 --- a/src/eepp/graphics/renderer/renderergl3cp.cpp +++ b/src/eepp/graphics/renderer/renderergl3cp.cpp @@ -200,7 +200,12 @@ void RendererGL3CP::setShader( ShaderProgram* Shader ) { if ( mTextureColorMode_id != -1 ) mCurShader->setUniform( mTextureColorMode_id, mTextureColorMode ); if ( mTextureColorChannel_id != -1 && mTextureColorMode != 0 ) { - mCurShader->setUniform( mTextureColorChannel_id, textureColorChannel( mTextureColorMode ) ); + static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, + { 1.f, 0.f, 0.f }, + { 0.f, 1.f, 0.f }, + { 0.f, 0.f, 1.f }, + { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; + mCurShader->setUniform( mTextureColorChannel_id, channels[mTextureColorMode] ); } if ( -1 != mAttribsLoc[EEGL_VERTEX_ARRAY] ) diff --git a/src/eepp/graphics/renderer/renderergles2.cpp b/src/eepp/graphics/renderer/renderergles2.cpp index 6a96f9621..3f0c38bb1 100644 --- a/src/eepp/graphics/renderer/renderergles2.cpp +++ b/src/eepp/graphics/renderer/renderergles2.cpp @@ -227,7 +227,12 @@ void RendererGLES2::setShader( ShaderProgram* Shader ) { if ( mTextureColorMode_id != -1 ) mCurShader->setUniform( mTextureColorMode_id, mTextureColorMode ); if ( mTextureColorChannel_id != -1 && mTextureColorMode != 0 ) { - mCurShader->setUniform( mTextureColorChannel_id, textureColorChannel( mTextureColorMode ) ); + static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, + { 1.f, 0.f, 0.f }, + { 0.f, 1.f, 0.f }, + { 0.f, 0.f, 1.f }, + { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; + mCurShader->setUniform( mTextureColorChannel_id, channels[mTextureColorMode] ); } if ( -1 != mAttribsLoc[EEGL_VERTEX_ARRAY] ) diff --git a/src/eepp/graphics/renderer/rendererglshader.cpp b/src/eepp/graphics/renderer/rendererglshader.cpp index 2ffe8ee9c..5fca99084 100644 --- a/src/eepp/graphics/renderer/rendererglshader.cpp +++ b/src/eepp/graphics/renderer/rendererglshader.cpp @@ -11,8 +11,6 @@ RendererGLShader::RendererGLShader() : mTextureColorMode_id( -1 ), mTextureColorChannel_id( -1 ), mTextureColorMode( 0 ), - mTextureColorPreviousShader( nullptr ), - mUsingTextureColorFallbackShader( false ), mCurrentMode( 0 ), mCurShader( NULL ), mShaderPrev( NULL ) { @@ -27,31 +25,20 @@ RendererGLShader::~RendererGLShader() { } bool RendererGLShader::setTextureColorMode( Int32 mode ) { - if ( mode < 0 || mode > 4 ) + if ( mTextureColorMode_id == -1 ) return false; - if ( mode != 0 && ( mTextureColorMode_id == -1 || mTextureColorChannel_id == -1 ) ) { - mTextureColorPreviousShader = mCurShader; - setShader( static_cast( nullptr ) ); - if ( mTextureColorMode_id == -1 || mTextureColorChannel_id == -1 ) { - setShader( mTextureColorPreviousShader ); - mTextureColorPreviousShader = nullptr; - return false; - } - mUsingTextureColorFallbackShader = true; - } if ( mTextureColorMode != mode ) { mTextureColorMode = mode; mCurShader->setUniform( mTextureColorMode_id, mode ); if ( mTextureColorChannel_id != -1 ) { - mCurShader->setUniform( mTextureColorChannel_id, textureColorChannel( mode ) ); + static const Vector3ff channels[] = { { 0.f, 0.f, 0.f }, + { 1.f, 0.f, 0.f }, + { 0.f, 1.f, 0.f }, + { 0.f, 0.f, 1.f }, + { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } }; + mCurShader->setUniform( mTextureColorChannel_id, channels[mode] ); } } - if ( mode == 0 && mUsingTextureColorFallbackShader ) { - ShaderProgram* previousShader = mTextureColorPreviousShader; - mTextureColorPreviousShader = nullptr; - mUsingTextureColorFallbackShader = false; - setShader( previousShader ); - } return true; } diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 8c2e2cb82..de2a820e3 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -1732,7 +1732,8 @@ void Text::draw( const Float& X, const Float& Y, const Vector2f& scale, const Fl return; unsigned int numvert = mVertices.size(); - const bool containsSubpixel = !mRenderModes.empty(); + const bool containsSubpixel = std::find( mRenderModes.begin(), mRenderModes.end(), + GlyphRenderMode::Subpixel ) != mRenderModes.end(); const Float drawX = containsSubpixel && rotation == 0.f && scale == 1.f ? std::trunc( X ) : X; const Float drawY = containsSubpixel && rotation == 0.f && scale == 1.f ? std::trunc( Y ) : Y; @@ -2681,9 +2682,8 @@ void Text::setFillColor( const std::vector& colors ) { // Add an underline or strikethrough line to the vertex array void Text::addLine( std::vector& vertices, Float lineLength, Float lineTop, Float offset, Float thickness, Float outlineThickness, Int32 centerDiffX ) { - auto& renderModes = &vertices == &mOutlineVertices ? mOutlineRenderModes : mRenderModes; - if ( !renderModes.empty() ) - renderModes.push_back( GlyphRenderMode::Mask ); + ( &vertices == &mOutlineVertices ? mOutlineRenderModes : mRenderModes ) + .push_back( GlyphRenderMode::Mask ); Float top = std::floor( lineTop + offset - ( thickness / 2 ) + 0.5f ); Float bottom = top + std::floor( thickness + 0.5f ); Float u1 = 0; @@ -2759,13 +2759,8 @@ void Text::addLine( std::vector& vertices, Float lineLength, Float void Text::addGlyphQuad( std::vector& vertices, Vector2f position, const EE::Graphics::Glyph& glyph, Float italic, Float outlineThickness, Int32 centerDiffX ) { - auto& renderModes = &vertices == &mOutlineVertices ? mOutlineRenderModes : mRenderModes; - if ( glyph.renderMode == GlyphRenderMode::Subpixel && renderModes.empty() ) - renderModes.resize( vertices.size() / GLi->quadVertex(), GlyphRenderMode::Mask ); - if ( !renderModes.empty() ) - renderModes.push_back( glyph.renderMode == GlyphRenderMode::Subpixel - ? GlyphRenderMode::Subpixel - : GlyphRenderMode::Mask ); + ( &vertices == &mOutlineVertices ? mOutlineRenderModes : mRenderModes ) + .push_back( glyph.renderMode ); if ( glyph.renderMode == GlyphRenderMode::Subpixel ) position = position.trunc(); Float padding = 1.0; diff --git a/src/tests/unit_tests/fontrendering_tests.cpp b/src/tests/unit_tests/fontrendering_tests.cpp index e5fd66d04..c69cecfb5 100644 --- a/src/tests/unit_tests/fontrendering_tests.cpp +++ b/src/tests/unit_tests/fontrendering_tests.cpp @@ -77,7 +77,7 @@ UTEST( FontRendering, glyphAdvanceDoesNotCreateTexturePages ) { UTEST( FontRendering, subpixelCoverageCompositesPerChannel ) { UIApplication app( - WindowSettings( 360, 120, "eepp - Subpixel Text Test", WindowStyle::Default, + WindowSettings( 360, 220, "eepp - Subpixel Text Test", WindowStyle::Default, WindowBackend::Default, 32 ), UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1 ) ); ResourceScope& scope = *app.getUI()->getResourceScope(); @@ -103,7 +103,16 @@ UTEST( FontRendering, subpixelCoverageCompositesPerChannel ) { Text retained( "Subpixel retained", font.get(), 28 ); retained.setFillColor( Color::Black ); - retained.draw( 8.f, 60.f ); + retained.draw( 8.f, 52.f ); + + Primitives primitives; + primitives.setColor( Color( 40, 42, 54 ) ); + primitives.drawRectangle( Rectf( Vector2f( 0.f, 110.f ), Sizef( 360.f, 110.f ) ) ); + const Color lightText( 248, 248, 242 ); + Text::draw( String( "Subpixel static light" ), { 8.f, 114.f }, font.get(), 28, lightText ); + retained.setString( "Subpixel retained light" ); + retained.setFillColor( lightText ); + retained.draw( 8.f, 162.f ); Image image = window->getFrontBufferImage(); auto hasColoredCoverage = [&image]( Uint32 top, Uint32 bottom ) { @@ -122,6 +131,7 @@ UTEST( FontRendering, subpixelCoverageCompositesPerChannel ) { "Static text lost independent LCD channel coverage" ); EXPECT_TRUE_MSG( hasColoredCoverage( image.getHeight() / 2, image.getHeight() ), "Retained text lost independent LCD channel coverage" ); + compareImages( utest_state, utest_result, window, "eepp-subpixel-text" ); FrameBufferUniquePtr frameBuffer = FrameBuffer::New( 240, 48, false, false, false, 4, window ); ASSERT_TRUE( frameBuffer && frameBuffer->created() );