From 1a6864639a41e6628754aba1075af2b9b57cdf59 Mon Sep 17 00:00:00 2001 From: Yixue Wang Date: Tue, 24 Dec 2024 15:20:08 +0800 Subject: [PATCH 1/2] fix: texture from surface buffer failed Use client buffer's source as surface buffer. Client buffer is not complete, and might fail to get texture when the source buffer is a shm buffer. --- src/server/kernel/wsurface.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/server/kernel/wsurface.cpp b/src/server/kernel/wsurface.cpp index 4004ed2b7..f1565b584 100644 --- a/src/server/kernel/wsurface.cpp +++ b/src/server/kernel/wsurface.cpp @@ -116,20 +116,11 @@ void WSurfacePrivate::updateOutputs() void WSurfacePrivate::setBuffer(qw_buffer *newBuffer) { - if (buffer) { - if (auto clientBuffer = qw_client_buffer::get(*buffer)) { - Q_ASSERT(clientBuffer->handle()->n_ignore_locks > 0); - clientBuffer->handle()->n_ignore_locks--; - } - } - if (newBuffer) { - if (auto clientBuffer = qw_client_buffer::get(*newBuffer)) { - clientBuffer->handle()->n_ignore_locks++; - } - - newBuffer->lock(); - buffer.reset(newBuffer); + auto clientBuffer = qw_client_buffer::get(*newBuffer); + auto sourceBuffer = clientBuffer ? qw_buffer::from(clientBuffer->handle()->source) : newBuffer; + sourceBuffer->lock(); + buffer.reset(sourceBuffer); } else { buffer.reset(nullptr); } From 971a80303b86b856ed25b4d536d288c1831c4f4e Mon Sep 17 00:00:00 2001 From: Yixue Wang Date: Tue, 24 Dec 2024 15:27:36 +0800 Subject: [PATCH 2/2] feat: keep last non-null buffer for content Keep last non-null buffer for WSurfaceItemContent until explicitly destroyed. --- src/server/qtquick/wsurfaceitem.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/qtquick/wsurfaceitem.cpp b/src/server/qtquick/wsurfaceitem.cpp index c42711817..dd6bd0fcd 100644 --- a/src/server/qtquick/wsurfaceitem.cpp +++ b/src/server/qtquick/wsurfaceitem.cpp @@ -195,6 +195,11 @@ class Q_DECL_HIDDEN WSurfaceItemContentPrivate: public QQuickItemPrivate Q_ASSERT(!updateTextureConnection); updateTextureConnection = surface->safeConnect(&WSurface::bufferChanged, q, [q, this] { + // WSurfaceItemContent is for displaying content. When buffer is null, the surface is unmapped. + // There is no need for WSurfaceItemContent to reset its buffer to null. It should keep the last + // non-null buffer until explicitly destroyed. So we directly return when surface's buffer is null. + if (!surface->buffer() && dontCacheLastBuffer) + return; if (!live) { pendingBuffer.reset(surface->buffer()); if (pendingBuffer)