Commit 5191311d authored by Fredrik Höglund's avatar Fredrik Höglund
Browse files

[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's avatarFredrik Höglund <fredrik@kde.org>
parent 0a9c2547
......@@ -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);
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment