From 5191311d36fbbbe51a3c137f36148a662a099963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Sat, 29 Jun 2019 13:03:23 +0200 Subject: [PATCH] [effects/blur] Disable sRGB when the framebuffer is linear MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disable sRGB rendering when the color encoding of the default framebuffer is linear. BUG: 408594 FIXED-IN: 5.16.3 Differential Revision: https://phabricator.kde.org/D22153 Signed-off-by: Fredrik Höglund --- effects/blur/blur.cpp | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/effects/blur/blur.cpp b/effects/blur/blur.cpp index f1a0b54217..02670ffa90 100644 --- a/effects/blur/blur.cpp +++ b/effects/blur/blur.cpp @@ -126,7 +126,30 @@ void BlurEffect::updateTexture() m_renderTargets.reserve(m_downSampleIterations + 2); m_renderTextures.reserve(m_downSampleIterations + 2); - const GLenum textureFormat = GLPlatform::instance()->isGLES() ? GL_RGBA8 : GL_SRGB8_ALPHA8; + GLenum textureFormat = GL_RGBA8; + + // Check the color encoding of the default framebuffer + if (!GLPlatform::instance()->isGLES()) { + GLuint prevFbo = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, reinterpret_cast(&prevFbo)); + + if (prevFbo != 0) { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + } + + GLenum colorEncoding = GL_LINEAR; + glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_BACK_LEFT, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, + reinterpret_cast(&colorEncoding)); + + if (prevFbo != 0) { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevFbo); + } + + if (colorEncoding == GL_SRGB) { + textureFormat = GL_SRGB8_ALPHA8; + } + } for (int i = 0; i <= m_downSampleIterations; i++) { m_renderTextures.append(GLTexture(textureFormat, effects->virtualScreenSize() / (1 << i))); @@ -643,7 +666,7 @@ void BlurEffect::doBlur(const QRegion& shape, const QRect& screen, const float o const QRegion expandedBlurRegion = expand(shape) & expand(screen); - const bool isGLES = GLPlatform::instance()->isGLES(); + const bool useSRGB = m_renderTextures.first().internalFormat() == GL_SRGB8_ALPHA8; // Upload geometry for the down and upsample iterations GLVertexBuffer *vbo = GLVertexBuffer::streamingBuffer(); @@ -668,7 +691,7 @@ void BlurEffect::doBlur(const QRegion& shape, const QRect& screen, const float o if (isDock) { m_renderTargets.last()->blitFromFramebuffer(sourceRect, destRect); - if (!isGLES) { + if (useSRGB) { glEnable(GL_FRAMEBUFFER_SRGB); } @@ -676,7 +699,7 @@ void BlurEffect::doBlur(const QRegion& shape, const QRect& screen, const float o } else { m_renderTargets.first()->blitFromFramebuffer(sourceRect, destRect); - if (!isGLES) { + if (useSRGB) { glEnable(GL_FRAMEBUFFER_SRGB); } @@ -703,7 +726,7 @@ void BlurEffect::doBlur(const QRegion& shape, const QRect& screen, const float o upscaleRenderToScreen(vbo, blurRectCount * (m_downSampleIterations + 1), shape.rectCount() * 6, screenProjection, windowRect.topLeft()); - if (!isGLES) { + if (useSRGB) { glDisable(GL_FRAMEBUFFER_SRGB); }