diff options
| author | Visal Vijay <150381094+B2krobbery@users.noreply.github.com> | 2026-04-14 22:54:44 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-14 18:24:44 +0100 |
| commit | 88f3e7e9d519ae704cab78548c6f6bf02a0b0841 (patch) | |
| tree | 3f0cfbf5bb0003c4224553588ca96b2f5f2bb86a /src/helpers/Monitor.cpp | |
| parent | e539d21174211dad3fa5f8f5e8496bb7e5c7baf2 (diff) | |
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
Diffstat (limited to 'src/helpers/Monitor.cpp')
| -rw-r--r-- | src/helpers/Monitor.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 6e88357e..bff57c7e 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>(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<Aquamarine::SOutputMode>& mode) { + m_owner->m_output->state->setMode(mode); + updateSwapchain(); +} + +void CMonitorState::applyCustomModeWithSwapchain(const SP<Aquamarine::SOutputMode>& mode) { + m_owner->m_output->state->setCustomMode(mode); + updateSwapchain(); +} bool CMonitor::needsACopyFB() { return !m_mirrors.empty() || Screenshare::mgr()->isOutputBeingSSd(m_self.lock()); |
