[effects/blur] Disable sRGB when the framebuffer is linear

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 <fredrik@kde.org>
remotes/origin/alexeymin/automatic-backend-selection
Fredrik Höglund 7 years ago
parent 0a9c254769
commit 5191311d36
  1. 33
      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<GLint *>(&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<GLint *>(&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);
}

Loading…
Cancel
Save