diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 4f4e9a7b4..a9763685b 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -620,6 +620,7 @@ void CMonitor::applyCMType(NCMType::eCMType cmType, NTransferFunction::eTF cmSdr if (oldImageDescription != m_imageDescription) { if (PROTO::colorManagement) PROTO::colorManagement->onMonitorImageDescriptionChanged(m_self); + m_blurFBDirty = true; } } @@ -2063,6 +2064,20 @@ bool CMonitor::attemptDirectScanout() { return true; } +void CMonitor::handleDSleave() { + Log::logger->log(Log::DEBUG, "Left a direct scanout."); + m_lastScanout.reset(); + m_previousFSWindow.reset(); // recalc fs settings + m_directScanoutIsActive = false; + + // reset DRM format, but only if needed since it might modeset + if (m_output->state->state().drmFormat != m_prevDrmFormat) + m_output->state->setFormat(m_prevDrmFormat); + + m_drmFormat = m_prevDrmFormat; + m_blurFBDirty = true; +} + bool CMonitor::canAttemptDirectScanoutFast() const { return !m_solitaryClient.expired() || !m_lastScanout.expired() || m_directScanoutIsActive; } diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 8d26be45b..4758481f4 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -326,6 +326,7 @@ class CMonitor { bool updateTearing(); uint16_t isDSBlocked(bool full = false); bool attemptDirectScanout(); + void handleDSleave(); bool canAttemptDirectScanoutFast() const; bool isMultiGPU(); void setCTM(const Mat3x3& ctm); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 20282315b..8cda1437b 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1974,18 +1974,8 @@ void IHyprRenderer::renderMonitor(PHLMONITOR pMonitor, bool commit) { } handleFullscreenSettings(pMonitor); return; - } else if (!pMonitor->m_lastScanout.expired() || pMonitor->m_directScanoutIsActive) { - Log::logger->log(Log::DEBUG, "Left a direct scanout."); - pMonitor->m_lastScanout.reset(); - pMonitor->m_previousFSWindow.reset(); // recalc fs settings - pMonitor->m_directScanoutIsActive = false; - - // reset DRM format, but only if needed since it might modeset - if (pMonitor->m_output->state->state().drmFormat != pMonitor->m_prevDrmFormat) - pMonitor->m_output->state->setFormat(pMonitor->m_prevDrmFormat); - - pMonitor->m_drmFormat = pMonitor->m_prevDrmFormat; - } + } else if (!pMonitor->m_lastScanout.expired() || pMonitor->m_directScanoutIsActive) + pMonitor->handleDSleave(); } Event::bus()->m_events.render.pre.emit(pMonitor);