From b56448483652f3faf51105ac4056c1e6f8978327 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Fri, 13 Jun 2025 18:18:54 +0200 Subject: [PATCH 1/2] monitor: retry after monitor modesetting fails retries up to 4 times --- src/helpers/Monitor.cpp | 7 +++++++ src/helpers/Monitor.hpp | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index c2f1ab5b9..088f08129 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -452,6 +452,9 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { force = true; } + if (m_failedModeRetries > 0 /* 0 = success */ && m_failedModeRetries < 5 /* Arbitrary number I chose as reasonable */) + force = true; + // Check if the rule isn't already applied // TODO: clean this up lol if (!force && DELTALESSTHAN(m_pixelSize.x, RULE->resolution.x, 1) /* ↓ */ @@ -696,9 +699,13 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { if (!success) { Debug::log(ERR, "Monitor {} has NO FALLBACK MODES, and an INVALID one was requested: {:X0}@{:.2f}Hz", m_name, RULE->resolution, RULE->refreshRate); + m_failedModeRetries = 1; + g_pEventLoopManager->doLater([] { g_pConfigManager->m_wantsMonitorReload = true; }); return true; } + m_failedModeRetries = 0; + m_vrrActive = m_output->state->state().adaptiveSync // disabled here, will be tested in CConfigManager::ensureVRR() || m_createdByUser; // wayland backend doesn't allow for disabling adaptive_sync diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 4dc4ad881..f2443584c 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -119,8 +119,9 @@ class CMonitor { std::optional m_forceSize; SP m_currentMode; SP m_cursorSwapchain; - uint32_t m_drmFormat = DRM_FORMAT_INVALID; - uint32_t m_prevDrmFormat = DRM_FORMAT_INVALID; + uint32_t m_drmFormat = DRM_FORMAT_INVALID; + uint32_t m_prevDrmFormat = DRM_FORMAT_INVALID; + uint32_t m_failedModeRetries = 0; bool m_dpmsStatus = true; bool m_vrrActive = false; // this can be TRUE even if VRR is not active in the case that this display does not support it. From 4d8f43accd936620905f434488f9accaba059966 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Tue, 17 Jun 2025 20:53:47 +0200 Subject: [PATCH 2/2] oopes --- src/helpers/Monitor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 088f08129..19811be70 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -699,7 +699,7 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { if (!success) { Debug::log(ERR, "Monitor {} has NO FALLBACK MODES, and an INVALID one was requested: {:X0}@{:.2f}Hz", m_name, RULE->resolution, RULE->refreshRate); - m_failedModeRetries = 1; + m_failedModeRetries++; g_pEventLoopManager->doLater([] { g_pConfigManager->m_wantsMonitorReload = true; }); return true; }