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); } 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)