diff --git a/src/backends/drm/drm_egl_layer.cpp b/src/backends/drm/drm_egl_layer.cpp index 4c7ff4db68..d63ca022e9 100644 --- a/src/backends/drm/drm_egl_layer.cpp +++ b/src/backends/drm/drm_egl_layer.cpp @@ -160,11 +160,6 @@ std::shared_ptr EglGbmLayer::currentBuffer() const return m_scanoutBuffer ? m_scanoutBuffer : m_surface.currentBuffer(); } -bool EglGbmLayer::hasDirectScanoutBuffer() const -{ - return m_scanoutBuffer != nullptr; -} - void EglGbmLayer::releaseBuffers() { m_scanoutBuffer.reset(); diff --git a/src/backends/drm/drm_egl_layer.h b/src/backends/drm/drm_egl_layer.h index f98f74f515..016b43461b 100644 --- a/src/backends/drm/drm_egl_layer.h +++ b/src/backends/drm/drm_egl_layer.h @@ -33,7 +33,6 @@ public: bool scanout(SurfaceItem *surfaceItem) override; bool checkTestBuffer() override; std::shared_ptr currentBuffer() const override; - bool hasDirectScanoutBuffer() const override; QRegion currentDamage() const override; std::shared_ptr texture() const override; ColorDescription colorDescription() const; diff --git a/src/backends/drm/drm_layer.cpp b/src/backends/drm/drm_layer.cpp index ee7463f738..4c6e65afd5 100644 --- a/src/backends/drm/drm_layer.cpp +++ b/src/backends/drm/drm_layer.cpp @@ -31,9 +31,4 @@ DrmPipelineLayer::DrmPipelineLayer(DrmPipeline *pipeline) : m_pipeline(pipeline) { } - -bool DrmPipelineLayer::hasDirectScanoutBuffer() const -{ - return false; -} } diff --git a/src/backends/drm/drm_layer.h b/src/backends/drm/drm_layer.h index ad279cf9e4..5fcc52ba88 100644 --- a/src/backends/drm/drm_layer.h +++ b/src/backends/drm/drm_layer.h @@ -38,7 +38,6 @@ public: virtual bool checkTestBuffer() = 0; virtual std::shared_ptr currentBuffer() const = 0; - virtual bool hasDirectScanoutBuffer() const; protected: DrmPipeline *const m_pipeline; diff --git a/src/backends/drm/drm_pipeline.cpp b/src/backends/drm/drm_pipeline.cpp index 52036237d8..4e7ba5921b 100644 --- a/src/backends/drm/drm_pipeline.cpp +++ b/src/backends/drm/drm_pipeline.cpp @@ -70,7 +70,11 @@ bool DrmPipeline::testScanout() } // no other way to test than to do it. // As we only have a maximum of one test per scanout cycle, this is fine - return presentLegacy() == Error::None; + const bool ret = presentLegacy() == Error::None; + if (ret) { + m_didLegacyScanoutHack = true; + } + return ret; } } @@ -98,8 +102,9 @@ DrmPipeline::Error DrmPipeline::present() m_commitThread->addCommit(std::move(primaryPlaneUpdate)); return Error::None; } else { - if (m_primaryLayer->hasDirectScanoutBuffer()) { + if (m_didLegacyScanoutHack) { // already presented + m_didLegacyScanoutHack = false; return Error::None; } return presentLegacy(); diff --git a/src/backends/drm/drm_pipeline.h b/src/backends/drm/drm_pipeline.h index 5ba6aa240a..2f50ca3786 100644 --- a/src/backends/drm/drm_pipeline.h +++ b/src/backends/drm/drm_pipeline.h @@ -167,6 +167,7 @@ private: DrmConnector *m_connector = nullptr; bool m_modesetPresentPending = false; + bool m_didLegacyScanoutHack = false; struct State {