backends/drm: set removed flag on removed output modes, and use it in output configuration store

wilder/Plasma/6.3
Xaver Hugl 1 year ago
parent 36526f3374
commit e3fc4fedec
  1. 3
      src/backends/drm/drm_output.cpp
  2. 5
      src/core/output.cpp
  3. 5
      src/core/output.h
  4. 5
      src/outputconfigurationstore.cpp

@ -233,10 +233,9 @@ void DrmOutput::updateConnectorProperties()
if (!next.currentMode) { if (!next.currentMode) {
// some mode needs to be set // some mode needs to be set
next.currentMode = next.modes.constFirst(); next.currentMode = next.modes.constFirst();
m_pipeline->setMode(std::static_pointer_cast<DrmConnectorMode>(next.currentMode));
m_pipeline->applyPendingChanges();
} }
if (!next.modes.contains(next.currentMode)) { if (!next.modes.contains(next.currentMode)) {
next.currentMode->setRemoved();
next.modes.push_front(next.currentMode); next.modes.push_front(next.currentMode);
} }

@ -62,6 +62,11 @@ OutputMode::Flags OutputMode::flags() const
return m_flags; return m_flags;
} }
void OutputMode::setRemoved()
{
m_flags |= OutputMode::Flag::Removed;
}
OutputTransform::Kind OutputTransform::kind() const OutputTransform::Kind OutputTransform::kind() const
{ {
return m_kind; return m_kind;

@ -110,6 +110,7 @@ public:
enum class Flag : uint { enum class Flag : uint {
Preferred = 0x1, Preferred = 0x1,
Generated = 0x2, Generated = 0x2,
Removed = 0x4,
}; };
Q_DECLARE_FLAGS(Flags, Flag) Q_DECLARE_FLAGS(Flags, Flag)
@ -120,10 +121,12 @@ public:
uint32_t refreshRate() const; uint32_t refreshRate() const;
Flags flags() const; Flags flags() const;
void setRemoved();
private: private:
const QSize m_size; const QSize m_size;
const uint32_t m_refreshRate; const uint32_t m_refreshRate;
const Flags m_flags; Flags m_flags;
}; };
/** /**

@ -304,7 +304,7 @@ std::pair<OutputConfiguration, QList<Output *>> OutputConfigurationStore::setupT
&& mode->refreshRate() == state.mode->refreshRate; && mode->refreshRate() == state.mode->refreshRate;
}); });
std::optional<std::shared_ptr<OutputMode>> mode = modeIt == modes.end() ? std::nullopt : std::optional(*modeIt); std::optional<std::shared_ptr<OutputMode>> 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); mode = chooseMode(output);
} }
*ret.changeSet(output) = OutputChangeSet{ *ret.changeSet(output) = OutputChangeSet{
@ -481,7 +481,8 @@ std::shared_ptr<OutputMode> OutputConfigurationStore::chooseMode(Output *output)
// some displays advertise bigger modes than their native resolution // some displays advertise bigger modes than their native resolution
// to avoid that, take the preferred mode into account, which is usually the native one // 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) { 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()) { if (preferred != modes.end()) {
// some high refresh rate displays advertise a 60Hz mode as preferred for compatibility reasons // some high refresh rate displays advertise a 60Hz mode as preferred for compatibility reasons

Loading…
Cancel
Save