backends/drm: initialize layers earlier

With how layers are initialized before this commit, the atomic commit in
DrmOutput::updateModes can cause segfaults.
This commit is contained in:
Xaver Hugl 2022-04-29 21:53:20 +02:00
parent 87e72506b8
commit d50c9b8cb6

View file

@ -274,19 +274,21 @@ bool DrmGpu::updateOutputs()
if (conn->isConnected() && updateSuccess) {
if (conn->isNonDesktop() ? !findLeaseOutput(conn->id()) : !findOutput(conn->id())) {
qCDebug(KWIN_DRM, "New %soutput on GPU %s: %s", conn->isNonDesktop() ? "non-desktop " : "", qPrintable(m_devNode), qPrintable(conn->modelName()));
m_pipelines << conn->pipeline();
const auto pipeline = conn->pipeline();
m_pipelines << pipeline;
if (conn->isNonDesktop()) {
conn->pipeline()->setActive(false);
conn->pipeline()->applyPendingChanges();
auto leaseOutput = new DrmLeaseOutput(conn->pipeline(), m_leaseDevice);
auto leaseOutput = new DrmLeaseOutput(pipeline, m_leaseDevice);
m_leaseOutputs << leaseOutput;
} else {
auto output = new DrmOutput(conn->pipeline());
auto output = new DrmOutput(pipeline);
m_drmOutputs << output;
m_outputs << output;
addedOutputs << output;
Q_EMIT outputAdded(output);
}
pipeline->setLayer(m_platform->renderBackend()->createDrmPipelineLayer(pipeline));
pipeline->setActive(!conn->isNonDesktop());
pipeline->applyPendingChanges();
}
} else if (auto output = findOutput(conn->id())) {
removeOutput(output);
@ -314,12 +316,6 @@ bool DrmGpu::updateOutputs()
plane->updateProperties();
}
for (const auto &pipeline : qAsConst(m_pipelines)) {
if (!pipeline->layer()) {
pipeline->setLayer(m_platform->renderBackend()->createDrmPipelineLayer(pipeline));
pipeline->applyPendingChanges();
}
}
if (testPendingConfiguration()) {
for (const auto &pipeline : qAsConst(m_pipelines)) {
pipeline->applyPendingChanges();