From 88f3e7e9d519ae704cab78548c6f6bf02a0b0841 Mon Sep 17 00:00:00 2001 From: Visal Vijay <150381094+B2krobbery@users.noreply.github.com> Date: Tue, 14 Apr 2026 22:54:44 +0530 Subject: [PATCH] monitor: ensure swapchain is updated before mode test (#14065) * monitor: ensure swapchain is updated before mode test * monitor: ensure swapchain update via helper for all mode set paths * monitor: fix formatting * monitor: move swapchain helper to CMonitorState * monitor: move swapchain helper to CMonitorState --- src/helpers/Monitor.cpp | 17 +++++++++++++---- src/helpers/Monitor.hpp | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 6e88357ef..bff57c7ed 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -827,7 +827,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force) std::string modeStr = std::format("{:X0}@{:.2f}Hz", mode->pixelSize, mode->refreshRate / 1000.f); if (mode->modeInfo.has_value() && mode->modeInfo->type == DRM_MODE_TYPE_USERDEF) { - m_output->state->setCustomMode(mode); + m_state.applyCustomModeWithSwapchain(mode); if (!m_state.test()) { Log::logger->log(Log::ERR, "Monitor {}: REJECTED custom mode {}!", m_name, modeStr); @@ -836,7 +836,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force) m_customDrmMode = mode->modeInfo.value(); } else { - m_output->state->setMode(mode); + m_state.applyModeWithSwapchain(mode); if (!m_state.test()) { Log::logger->log(Log::ERR, "Monitor {}: REJECTED available mode {}!", m_name, modeStr); @@ -870,7 +870,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force) auto mode = makeShared(Aquamarine::SOutputMode{.pixelSize = RULE->m_resolution, .refreshRate = refreshRate}); std::string modeStr = std::format("{:X0}@{:.2f}Hz", mode->pixelSize, mode->refreshRate / 1000.f); - m_output->state->setCustomMode(mode); + m_state.applyCustomModeWithSwapchain(mode); if (m_state.test()) { Log::logger->log(Log::DEBUG, "Monitor {}: requested {}, using custom mode {}", m_name, requestedStr, modeStr); @@ -888,7 +888,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force) // try any of the modes if none of the above work if (!success) { for (auto const& mode : m_output->modes) { - m_output->state->setMode(mode); + m_state.applyModeWithSwapchain(mode); if (!m_state.test()) continue; @@ -2478,6 +2478,15 @@ bool CMonitorState::updateSwapchain() { options.size = MODE->pixelSize; return m_owner->m_output->swapchain->reconfigure(options); } +void CMonitorState::applyModeWithSwapchain(const SP& mode) { + m_owner->m_output->state->setMode(mode); + updateSwapchain(); +} + +void CMonitorState::applyCustomModeWithSwapchain(const SP& mode) { + m_owner->m_output->state->setCustomMode(mode); + updateSwapchain(); +} bool CMonitor::needsACopyFB() { return !m_mirrors.empty() || Screenshare::mgr()->isOutputBeingSSd(m_self.lock()); diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 12a5de6b2..74fe676b5 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -92,6 +92,8 @@ class CMonitorState { bool commit(); bool test(); bool updateSwapchain(); + void applyModeWithSwapchain(const SP& mode); + void applyCustomModeWithSwapchain(const SP& mode); private: void ensureBufferPresent();