diff --git a/abstract_output.h b/abstract_output.h --- a/abstract_output.h +++ b/abstract_output.h @@ -45,6 +45,10 @@ namespace KWin { +namespace ColorCorrect { +struct GammaRamp; +} + /** * Generic output representation in a Wayland session **/ @@ -90,6 +94,14 @@ return m_waylandOutput; } + virtual int getGammaRampSize() const { + return 0; + } + virtual bool setGammaRamp(const ColorCorrect::GammaRamp &gamma) { + Q_UNUSED(gamma); + return false; + } + protected: QPointer changes() const { return m_changeset; diff --git a/colorcorrection/manager.cpp b/colorcorrection/manager.cpp --- a/colorcorrection/manager.cpp +++ b/colorcorrection/manager.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -509,10 +510,10 @@ void Manager::commitGammaRamps(int temperature) { - int nscreens = Screens::self()->count(); + const auto outs = kwinApp()->platform()->outputs(); - for (int screen = 0; screen < nscreens; screen++) { - int rampsize = kwinApp()->platform()->gammaRampSize(screen); + for (auto *o : outs) { + int rampsize = o->getGammaRampSize(); GammaRamp ramp(rampsize); /* @@ -542,13 +543,13 @@ ramp.blue[i] = (double)ramp.blue[i] / (UINT16_MAX+1) * whitePoint[2] * (UINT16_MAX+1); } - if (kwinApp()->platform()->setGammaRamp(screen, ramp)) { + if (o->setGammaRamp(ramp)) { m_currentTemp = temperature; m_failedCommitAttempts = 0; } else { m_failedCommitAttempts++; if (m_failedCommitAttempts < 10) { - qCWarning(KWIN_COLORCORRECTION).nospace() << "Committing Gamma Ramp failed for screen " << screen << + qCWarning(KWIN_COLORCORRECTION).nospace() << "Committing Gamma Ramp failed for output " << o->name() << ". Trying " << (10 - m_failedCommitAttempts) << " times more."; } else { // TODO: On multi monitor setups we could try to rollback earlier changes for already commited outputs diff --git a/platform.h b/platform.h --- a/platform.h +++ b/platform.h @@ -42,7 +42,6 @@ { namespace ColorCorrect { class Manager; -struct GammaRamp; } class AbstractOutput; @@ -413,16 +412,6 @@ return m_colorCorrect; } - virtual int gammaRampSize(int screen) const { - Q_UNUSED(screen); - return 0; - } - virtual bool setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) { - Q_UNUSED(screen); - Q_UNUSED(gamma); - return false; - } - // outputs with connections (org_kde_kwin_outputdevice) virtual Outputs outputs() const { return Outputs(); diff --git a/plugins/platforms/drm/drm_backend.h b/plugins/platforms/drm/drm_backend.h --- a/plugins/platforms/drm/drm_backend.h +++ b/plugins/platforms/drm/drm_backend.h @@ -56,10 +56,6 @@ namespace KWin { -namespace ColorCorrect { -struct GammaRamp; -} - class Udev; class UdevMonitor; @@ -128,8 +124,6 @@ gbm_device *gbmDevice() const { return m_gbmDevice; } - int gammaRampSize(int screen) const override; - bool setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) override; QVector supportedCompositors() const override; diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -31,7 +31,6 @@ #include "screens_drm.h" #include "udev.h" #include "wayland_server.h" -#include #if HAVE_GBM #include "egl_gbm_backend.h" #include @@ -780,22 +779,6 @@ #endif } -int DrmBackend::gammaRampSize(int screen) const -{ - if (m_outputs.size() <= screen) { - return 0; - } - return m_outputs.at(screen)->m_crtc->getGammaRampSize(); -} - -bool DrmBackend::setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) -{ - if (m_outputs.size() <= screen) { - return false; - } - return m_outputs.at(screen)->m_crtc->setGammaRamp(gamma); -} - QString DrmBackend::supportInformation() const { QString supportInfo; diff --git a/plugins/platforms/drm/drm_object_crtc.h b/plugins/platforms/drm/drm_object_crtc.h --- a/plugins/platforms/drm/drm_object_crtc.h +++ b/plugins/platforms/drm/drm_object_crtc.h @@ -70,7 +70,7 @@ int getGammaRampSize() const { return m_gammaRampSize; } - bool setGammaRamp(ColorCorrect::GammaRamp &gamma); + bool setGammaRamp(const ColorCorrect::GammaRamp &gamma); private: int m_resIndex; diff --git a/plugins/platforms/drm/drm_object_crtc.cpp b/plugins/platforms/drm/drm_object_crtc.cpp --- a/plugins/platforms/drm/drm_object_crtc.cpp +++ b/plugins/platforms/drm/drm_object_crtc.cpp @@ -112,7 +112,7 @@ return false; } -bool DrmCrtc::setGammaRamp(ColorCorrect::GammaRamp &gamma) { +bool DrmCrtc::setGammaRamp(const ColorCorrect::GammaRamp &gamma) { bool isError = drmModeCrtcSetGamma(m_backend->fd(), m_id, gamma.size, gamma.red, gamma.green, gamma.blue); return !isError; diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -140,6 +140,9 @@ void transform(KWayland::Server::OutputDeviceInterface::Transform transform); void automaticRotation(); + int getGammaRampSize() const override; + bool setGammaRamp(const ColorCorrect::GammaRamp &gamma) override; + DrmBackend *m_backend; DrmConnector *m_conn = nullptr; DrmCrtc *m_crtc = nullptr; diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -1282,4 +1282,14 @@ emit screens()->changed(); } +int DrmOutput::getGammaRampSize() const +{ + return m_crtc->getGammaRampSize(); +} + +bool DrmOutput::setGammaRamp(const ColorCorrect::GammaRamp &gamma) +{ + return m_crtc->setGammaRamp(gamma); +} + } diff --git a/plugins/platforms/virtual/virtual_backend.h b/plugins/platforms/virtual/virtual_backend.h --- a/plugins/platforms/virtual/virtual_backend.h +++ b/plugins/platforms/virtual/virtual_backend.h @@ -72,8 +72,6 @@ void setGbmDevice(gbm_device *device) { m_gbmDevice = device; } - virtual int gammaRampSize(int screen) const override; - virtual bool setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) override; QVector supportedCompositors() const override { return QVector{OpenGLCompositing, QPainterCompositing}; diff --git a/plugins/platforms/virtual/virtual_backend.cpp b/plugins/platforms/virtual/virtual_backend.cpp --- a/plugins/platforms/virtual/virtual_backend.cpp +++ b/plugins/platforms/virtual/virtual_backend.cpp @@ -148,13 +148,4 @@ emit virtualOutputsSet(countChanged); } -int VirtualBackend::gammaRampSize(int screen) const { - return m_outputs[screen]->m_gammaSize; -} - -bool VirtualBackend::setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) { - Q_UNUSED(gamma); - return m_outputs[screen]->m_gammaResult; -} - } diff --git a/plugins/platforms/virtual/virtual_output.h b/plugins/platforms/virtual/virtual_output.h --- a/plugins/platforms/virtual/virtual_output.h +++ b/plugins/platforms/virtual/virtual_output.h @@ -41,6 +41,14 @@ void setGeometry(const QRect &geo); + int getGammaRampSize() const override { + return m_gammaSize; + } + bool setGammaRamp(const ColorCorrect::GammaRamp &gamma) override { + Q_UNUSED(gamma); + return m_gammaResult; + } + private: Q_DISABLE_COPY(VirtualOutput); friend class VirtualBackend;