From de674e087a1910f30dba9f2a3b184071ef86be1c Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Mon, 27 Sep 2021 18:18:31 +0200 Subject: [PATCH] platforms/drm: make failure of findWorkingCombination less severe While findWorkingCombination should never fail, in the case it does KWin should not crash. To achieve that simply restore the old config in case of failure. CCBUG: 439873 --- src/plugins/platforms/drm/drm_gpu.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/drm/drm_gpu.cpp b/src/plugins/platforms/drm/drm_gpu.cpp index e2d316618b..3ecf2a2110 100644 --- a/src/plugins/platforms/drm/drm_gpu.cpp +++ b/src/plugins/platforms/drm/drm_gpu.cpp @@ -280,10 +280,11 @@ bool DrmGpu::updateOutputs() plane->updateProperties(); } - // delete current pipelines of active outputs + // stash away current pipelines of active outputs + QMap oldPipelines; for (const auto &output : qAsConst(m_drmOutputs)) { m_pipelines.removeOne(output->pipeline()); - delete output->pipeline(); + oldPipelines.insert(output, output->pipeline()); output->setPipeline(nullptr); } @@ -304,7 +305,18 @@ bool DrmGpu::updateOutputs() planes.removeOne(output->pipeline()->primaryPlane()); } } - const auto config = findWorkingCombination({}, connectors, crtcs, planes); + auto config = findWorkingCombination({}, connectors, crtcs, planes); + if (config.isEmpty() && !connectors.isEmpty()) { + qCCritical(KWIN_DRM) << "DrmGpu::findWorkingCombination failed to find any functional combinations! Reverting to the old configuration!"; + for (auto it = oldPipelines.begin(); it != oldPipelines.end(); it++) { + it.value()->setOutput(it.key()); + config << it.value(); + } + } else { + for (const auto &pipeline : qAsConst(oldPipelines)) { + delete pipeline; + } + } m_pipelines << config; for (const auto &pipeline : config) {