backends/drm: force a modeset when connectors are unplugged

And turn off unused CRTCs with legacy

BUG: 478476
wilder/Plasma/6.2
Xaver Hugl 2 years ago
parent d69331d186
commit 9ea6f311ea
  1. 12
      src/backends/drm/drm_gpu.cpp
  2. 1
      src/backends/drm/drm_gpu.h
  3. 2
      src/backends/drm/drm_pipeline.cpp
  4. 2
      src/backends/drm/drm_pipeline.h
  5. 7
      src/backends/drm/drm_pipeline_legacy.cpp

@ -578,6 +578,8 @@ void DrmGpu::removeOutput(DrmOutput *output)
m_drmOutputs.removeOne(output);
Q_EMIT outputRemoved(output);
output->unref();
// force a modeset to make sure unused objects are cleaned up
m_forceModeset = true;
}
DrmBackend *DrmGpu::platform() const
@ -740,9 +742,9 @@ bool DrmGpu::isActive() const
bool DrmGpu::needsModeset() const
{
return std::any_of(m_pipelines.constBegin(), m_pipelines.constEnd(), [](const auto &pipeline) {
return pipeline->needsModeset();
});
return m_forceModeset || std::any_of(m_pipelines.constBegin(), m_pipelines.constEnd(), [](const auto &pipeline) {
return pipeline->needsModeset();
});
}
bool DrmGpu::maybeModeset()
@ -771,6 +773,7 @@ bool DrmGpu::maybeModeset()
}
}
}
m_forceModeset = false;
if (err == DrmPipeline::Error::None) {
return true;
} else {
@ -783,9 +786,6 @@ bool DrmGpu::maybeModeset()
QList<DrmObject *> DrmGpu::unusedObjects() const
{
if (!m_atomicModeSetting) {
return {};
}
QList<DrmObject *> ret = m_allObjects;
for (const auto &pipeline : m_pipelines) {
ret.removeOne(pipeline->connector());

@ -143,6 +143,7 @@ private:
bool m_asyncPageflipSupported = false;
bool m_isRemoved = false;
bool m_isActive = true;
bool m_forceModeset = false;
clockid_t m_presentationClock;
gbm_device *m_gbmDevice;
FileDescriptor m_gbmFd;

@ -118,7 +118,7 @@ DrmPipeline::Error DrmPipeline::commitPipelines(const QList<DrmPipeline *> &pipe
if (pipelines[0]->gpu()->atomicModeSetting()) {
return commitPipelinesAtomic(pipelines, mode, unusedObjects);
} else {
return commitPipelinesLegacy(pipelines, mode);
return commitPipelinesLegacy(pipelines, mode, unusedObjects);
}
}

@ -153,7 +153,7 @@ private:
Error legacyModeset();
Error applyPendingChangesLegacy();
bool setCursorLegacy();
static Error commitPipelinesLegacy(const QList<DrmPipeline *> &pipelines, CommitMode mode);
static Error commitPipelinesLegacy(const QList<DrmPipeline *> &pipelines, CommitMode mode, const QList<DrmObject *> &unusedObjects);
// atomic modesetting only
Error prepareAtomicCommit(DrmAtomicCommit *commit, CommitMode mode);

@ -57,7 +57,7 @@ DrmPipeline::Error DrmPipeline::legacyModeset()
return Error::None;
}
DrmPipeline::Error DrmPipeline::commitPipelinesLegacy(const QList<DrmPipeline *> &pipelines, CommitMode mode)
DrmPipeline::Error DrmPipeline::commitPipelinesLegacy(const QList<DrmPipeline *> &pipelines, CommitMode mode, const QList<DrmObject *> &unusedObjects)
{
Error err = Error::None;
for (const auto &pipeline : pipelines) {
@ -79,6 +79,11 @@ DrmPipeline::Error DrmPipeline::commitPipelinesLegacy(const QList<DrmPipeline *>
pipeline->pageFlipped(std::chrono::steady_clock::now().time_since_epoch(), PageflipType::Normal, PresentationMode::VSync);
}
}
for (const auto &obj : unusedObjects) {
if (auto crtc = dynamic_cast<DrmCrtc *>(obj)) {
drmModeSetCrtc(pipelines.front()->gpu()->fd(), crtc->id(), 0, 0, 0, nullptr, 0, nullptr);
}
}
}
return err;
}

Loading…
Cancel
Save