From e3fc4fedecdbe9f091258729a76dcfd0e9e69db6 Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Wed, 16 Oct 2024 00:50:33 +0200 Subject: [PATCH] backends/drm: set removed flag on removed output modes, and use it in output configuration store --- src/backends/drm/drm_output.cpp | 3 +-- src/core/output.cpp | 5 +++++ src/core/output.h | 5 ++++- src/outputconfigurationstore.cpp | 5 +++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index f22d912443..e713cd3c0f 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -233,10 +233,9 @@ void DrmOutput::updateConnectorProperties() if (!next.currentMode) { // some mode needs to be set next.currentMode = next.modes.constFirst(); - m_pipeline->setMode(std::static_pointer_cast(next.currentMode)); - m_pipeline->applyPendingChanges(); } if (!next.modes.contains(next.currentMode)) { + next.currentMode->setRemoved(); next.modes.push_front(next.currentMode); } diff --git a/src/core/output.cpp b/src/core/output.cpp index e61a9371f7..baefe594e4 100644 --- a/src/core/output.cpp +++ b/src/core/output.cpp @@ -62,6 +62,11 @@ OutputMode::Flags OutputMode::flags() const return m_flags; } +void OutputMode::setRemoved() +{ + m_flags |= OutputMode::Flag::Removed; +} + OutputTransform::Kind OutputTransform::kind() const { return m_kind; diff --git a/src/core/output.h b/src/core/output.h index a38022c3e0..91daf17b50 100644 --- a/src/core/output.h +++ b/src/core/output.h @@ -110,6 +110,7 @@ public: enum class Flag : uint { Preferred = 0x1, Generated = 0x2, + Removed = 0x4, }; Q_DECLARE_FLAGS(Flags, Flag) @@ -120,10 +121,12 @@ public: uint32_t refreshRate() const; Flags flags() const; + void setRemoved(); + private: const QSize m_size; const uint32_t m_refreshRate; - const Flags m_flags; + Flags m_flags; }; /** diff --git a/src/outputconfigurationstore.cpp b/src/outputconfigurationstore.cpp index edb21d8ae1..9c074e3b23 100644 --- a/src/outputconfigurationstore.cpp +++ b/src/outputconfigurationstore.cpp @@ -304,7 +304,7 @@ std::pair> OutputConfigurationStore::setupT && mode->refreshRate() == state.mode->refreshRate; }); std::optional> mode = modeIt == modes.end() ? std::nullopt : std::optional(*modeIt); - if (!mode.has_value()) { + if (!mode.has_value() || !*mode || ((*mode)->flags() & OutputMode::Flag::Removed)) { mode = chooseMode(output); } *ret.changeSet(output) = OutputChangeSet{ @@ -481,7 +481,8 @@ std::shared_ptr OutputConfigurationStore::chooseMode(Output *output) // some displays advertise bigger modes than their native resolution // to avoid that, take the preferred mode into account, which is usually the native one const auto preferred = std::find_if(modes.begin(), modes.end(), [](const auto &mode) { - return mode->flags() & OutputMode::Flag::Preferred; + return (mode->flags() & OutputMode::Flag::Preferred) + && !(mode->flags() & OutputMode::Flag::Removed); }); if (preferred != modes.end()) { // some high refresh rate displays advertise a 60Hz mode as preferred for compatibility reasons