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) {
// some mode needs to be set
next.currentMode = next.modes.constFirst();
m_pipeline->setMode(std::static_pointer_cast<DrmConnectorMode>(next.currentMode));
m_pipeline->applyPendingChanges();
}
if (!next.modes.contains(next.currentMode)) {
next.currentMode->setRemoved();
next.modes.push_front(next.currentMode);
}

@ -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;

@ -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;
};
/**

@ -304,7 +304,7 @@ std::pair<OutputConfiguration, QList<Output *>> OutputConfigurationStore::setupT
&& mode->refreshRate() == state.mode->refreshRate;
});
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);
}
*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
// 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

Loading…
Cancel
Save