diff --git a/CMakeLists.txt b/CMakeLists.txt index 132c42332c..d120c7f499 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,7 +350,6 @@ add_feature_info("prctl/procctl tracing control" "Required for disallowing ptrace on kwin_wayland process") check_include_file("sys/sysmacros.h" HAVE_SYS_SYSMACROS_H) -configure_file(config-kwin.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kwin.h ) check_include_file("linux/vt.h" HAVE_LINUX_VT_H) add_feature_info("linux/vt.h" @@ -366,6 +365,8 @@ add_feature_info("SCHED_RESET_ON_FORK" HAVE_SCHED_RESET_ON_FORK "Required for running kwin_wayland with real-time scheduling") +configure_file(config-kwin.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kwin.h ) + ########### global ############### set(kwin_effects_dbus_xml ${CMAKE_CURRENT_SOURCE_DIR}/org.kde.kwin.Effects.xml) 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); }