From 45a5d8844b36404334301f5da6e75f1a345e0c80 Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Fri, 10 Jan 2025 13:45:30 +0000 Subject: [PATCH] plugins/screencast: call ItemRenderer::begin/endFrame The OpenGL renderer references the explicit sync release points for client buffers during rendering, and releases them in endFrame. If endFrame never gets called though (for example because we're doing direct scanout) then the release points never get signaled, and the client very quickly runs out of buffers to use and freezes. BUG: 495287 (cherry picked from commit b1031ea63eaa8c9bf5c70157d1b6bf8eb0f5a74a) Co-authored-by: Xaver Hugl --- src/plugins/screencast/windowscreencastsource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/screencast/windowscreencastsource.cpp b/src/plugins/screencast/windowscreencastsource.cpp index 24ef92aad7b..b396eed46f9 100644 --- a/src/plugins/screencast/windowscreencastsource.cpp +++ b/src/plugins/screencast/windowscreencastsource.cpp @@ -75,11 +75,11 @@ void WindowScreenCastSource::render(GLFramebuffer *target) RenderTarget renderTarget(target); RenderViewport viewport(m_window->clientGeometry(), 1, renderTarget); - GLFramebuffer::pushFramebuffer(target); + Compositor::self()->scene()->renderer()->beginFrame(renderTarget, viewport); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); Compositor::self()->scene()->renderer()->renderItem(renderTarget, viewport, m_window->windowItem(), Scene::PAINT_WINDOW_TRANSFORMED, infiniteRegion(), WindowPaintData{}); - GLFramebuffer::popFramebuffer(); + Compositor::self()->scene()->renderer()->endFrame(); } std::chrono::nanoseconds WindowScreenCastSource::clock() const -- GitLab