From 79c35d0164471cea7328a036bf6456c7e0c0bbf8 Mon Sep 17 00:00:00 2001 From: Casian Andrei Date: Mon, 17 Jun 2013 19:19:32 +0300 Subject: [PATCH] Enable color correction only after successfuly contacting KolorManager Prevents the possiblity of using shaders modified for color correction without valid data from KolorManager. If that happened, everthing blacked out. Now the color correction shaders are enabled only after successfuly contacting KolorManager. The issue was highlighted after ab7e228d. BUG: 321217 --- libkwineffects/kwinglcolorcorrection.cpp | 32 ++++++++++++++++++++---- libkwineffects/kwinglcolorcorrection_p.h | 1 + libkwineffects/kwinglutils.h | 1 + scene_opengl.cpp | 6 +---- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/libkwineffects/kwinglcolorcorrection.cpp b/libkwineffects/kwinglcolorcorrection.cpp index 42bc5febd9..8da67f551a 100644 --- a/libkwineffects/kwinglcolorcorrection.cpp +++ b/libkwineffects/kwinglcolorcorrection.cpp @@ -260,6 +260,7 @@ ColorCorrectionPrivate::ColorCorrectionPrivate(ColorCorrection *parent) : QObject(parent) , m_enabled(false) , m_hasError(false) + , m_duringEnablingPhase(false) , m_ccTextureUnit(-1) , m_dummyCCTexture(0) , m_lastOutput(-1) @@ -313,13 +314,20 @@ bool ColorCorrection::setEnabled(bool enabled) if (enabled) { // Update all profiles and regions d->m_csi->update(); + kDebug(1212) << "color correction will be enabled after contacting KolorManager"; + d->m_duringEnablingPhase = true; + // d->m_enabled will be set to true in colorServerUpdateSucceededSlot() } else { d->deleteCCTextures(); + d->m_enabled = false; + GLShader::sColorCorrect = false; + kDebug(1212) << "color correction has been disabled"; + + // Reload all shaders + ShaderManager::cleanup(); + ShaderManager::instance(); } - d->m_enabled = enabled; - GLShader::sColorCorrect = enabled; - kDebug(1212) << enabled; return true; } @@ -665,6 +673,18 @@ void ColorCorrectionPrivate::colorServerUpdateSucceededSlot() // Force the color correction textures to be recreated deleteCCTextures(); + // If this is reached after enabling color correction using ColorCorrection::setEnabled(true) + if (m_duringEnablingPhase) { + m_duringEnablingPhase = false; + m_enabled = true; + GLShader::sColorCorrect = true; + kDebug(1212) << "Color correction has been enabled"; + + // Reload all shaders + ShaderManager::cleanup(); + ShaderManager::instance(); + } + emit q->changed(); } @@ -672,9 +692,11 @@ void ColorCorrectionPrivate::colorServerUpdateFailedSlot() { Q_Q(ColorCorrection); - kError(1212) << "Update of color profiles failed"; + m_duringEnablingPhase = false; - q->setEnabled(false); + kError(1212) << "Update of color profiles failed"; + m_hasError = true; + emit q->errorOccured(); } } // KWin namespace diff --git a/libkwineffects/kwinglcolorcorrection_p.h b/libkwineffects/kwinglcolorcorrection_p.h index 50a274f769..7e77bb2513 100644 --- a/libkwineffects/kwinglcolorcorrection_p.h +++ b/libkwineffects/kwinglcolorcorrection_p.h @@ -92,6 +92,7 @@ public slots: public: bool m_enabled; bool m_hasError; + bool m_duringEnablingPhase; int m_ccTextureUnit; ColorServerInterface *m_csi; diff --git a/libkwineffects/kwinglutils.h b/libkwineffects/kwinglutils.h index 0010438f45..0687e6dec7 100644 --- a/libkwineffects/kwinglutils.h +++ b/libkwineffects/kwinglutils.h @@ -237,6 +237,7 @@ private: static bool sColorCorrect; friend class ColorCorrection; + friend class ColorCorrectionPrivate; friend class ShaderManager; }; diff --git a/scene_opengl.cpp b/scene_opengl.cpp index f2088a3252..b19206133c 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -764,11 +764,7 @@ ColorCorrection *SceneOpenGL2::colorCorrection() void SceneOpenGL2::slotColorCorrectedChanged() { - if (m_colorCorrection->setEnabled(options->isColorCorrected())) { - // Reload all shaders - ShaderManager::cleanup(); - ShaderManager::instance(); - } + m_colorCorrection->setEnabled(options->isColorCorrected()); }