From 2b628ea412442f8628b6b3e3b6e754f653d83792 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 29 Nov 2021 12:48:32 +0200 Subject: [PATCH] backends/drm: Mark frame failed if presenting null buffer If eglSwapBuffers() fails, there won't be a buffer and so we need to mark the frame as failed. Otherwise, the screen can be frozen. eglSwapBuffers() can fail if some effect calls makeOpenGLContext() between RenderBackend::beginFrame() and RenderBackend::endFrame(), which is the case with the zoom effect. It can set wrong draw surface in ZoomEffect::recreateTexture() BUG: 445412 --- src/backends/drm/drm_output.cpp | 1 + src/backends/drm/drm_pipeline.cpp | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index fb563a8d0e..e3f7576a24 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -372,6 +372,7 @@ bool DrmOutput::needsSoftwareTransformation() const bool DrmOutput::present(const QSharedPointer &buffer, QRegion damagedRegion) { if (!buffer || buffer->bufferId() == 0) { + presentFailed(); return false; } RenderLoopPrivate *renderLoopPrivate = RenderLoopPrivate::get(m_renderLoop); diff --git a/src/backends/drm/drm_pipeline.cpp b/src/backends/drm/drm_pipeline.cpp index 9a166cdb5d..843cc72094 100644 --- a/src/backends/drm/drm_pipeline.cpp +++ b/src/backends/drm/drm_pipeline.cpp @@ -47,12 +47,7 @@ DrmPipeline::~DrmPipeline() bool DrmPipeline::present(const QSharedPointer &buffer) { Q_ASSERT(pending.crtc); - if (!buffer) { - if (m_output) { - m_output->presentFailed(); - } - return false; - } + Q_ASSERT(buffer); m_primaryBuffer = buffer; auto buf = dynamic_cast(buffer.data()); // with direct scanout disallow modesets, calling presentFailed() and logging warnings