diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -237,6 +237,11 @@ ); m_drmId = device->sysNum(); queryResources(); + if (m_outputs.isEmpty()) { + qCWarning(KWIN_DRM) << "No outputs, cannot render, will terminate now"; + emit initFailed(); + return; + } // setup udevMonitor if (m_udevMonitor) { @@ -315,7 +320,11 @@ drmOutput->m_mode = connector->modes[0]; } drmOutput->m_connector = connector->connector_id; - drmOutput->init(connector.data()); + if (!drmOutput->init(connector.data())) { + qCWarning(KWIN_DRM) << "Failed to create output for connector " << connector->connector_id; + delete drmOutput; + continue; + } qCDebug(KWIN_DRM) << "Found new output with uuid" << drmOutput->uuid(); connectedOutputs << drmOutput; } @@ -339,7 +348,9 @@ } m_outputs = connectedOutputs; readOutputsConfiguration(); - emit screensQueried(); + if (!m_outputs.isEmpty()) { + emit screensQueried(); + } } void DrmBackend::readOutputsConfiguration() diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -61,9 +61,9 @@ void moveCursor(const QPoint &globalPos); bool present(DrmBuffer *buffer); void pageFlipped(); - void init(drmModeConnector *connector); + bool init(drmModeConnector *connector); void restoreSaved(); - void blank(); + bool blank(); /** * This sets the changes and tests them against the DRM output diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -180,13 +180,15 @@ } } -void DrmOutput::init(drmModeConnector *connector) +bool DrmOutput::init(drmModeConnector *connector) { initEdid(connector); initDpms(connector); initUuid(); m_savedCrtc.reset(drmModeGetCrtc(m_backend->fd(), m_crtcId)); - blank(); + if (!blank()) { + return false; + } setDpms(DpmsMode::On); if (!m_waylandOutput.isNull()) { delete m_waylandOutput.data(); @@ -287,6 +289,7 @@ m_waylandOutput->create(); qCDebug(KWIN_DRM) << "Created OutputDevice"; m_waylandOutputDevice->create(); + return true; } void DrmOutput::initUuid() @@ -318,14 +321,17 @@ && qstrcmp(mode->name, m_mode.name) == 0; } -void DrmOutput::blank() +bool DrmOutput::blank() { if (!m_blackBuffer) { m_blackBuffer = m_backend->createBuffer(size()); - m_blackBuffer->map(); + if (!m_blackBuffer->map()) { + cleanupBlackBuffer(); + return false; + } m_blackBuffer->image()->fill(Qt::black); } - setMode(m_blackBuffer); + return setMode(m_blackBuffer); } bool DrmOutput::setMode(DrmBuffer *buffer)