From 0cd04bd666665bfdeafc0f55a93e532cd8978827 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Wed, 26 Mar 2025 15:11:19 +0000 Subject: surfacestate: track and apply updated state fixes #9729 --- src/protocols/DRMSyncobj.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/protocols/DRMSyncobj.cpp') diff --git a/src/protocols/DRMSyncobj.cpp b/src/protocols/DRMSyncobj.cpp index 5238d1fb..0a4ca439 100644 --- a/src/protocols/DRMSyncobj.cpp +++ b/src/protocols/DRMSyncobj.cpp @@ -75,20 +75,22 @@ CDRMSyncobjSurfaceResource::CDRMSyncobjSurfaceResource(UPevents.precommit.registerListener([this](std::any d) { - if (!surface->pending.buffer && surface->pending.newBuffer && !surface->pending.texture) { + const bool PENDING_HAS_NEW_BUFFER = surface->pending.updated & SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_BUFFER; + + if (!surface->pending.buffer && PENDING_HAS_NEW_BUFFER && !surface->pending.texture) { removeAllWaiters(); surface->commitPendingState(surface->pending); return; // null buffer attached. } - if (!surface->pending.buffer && !surface->pending.newBuffer && surface->current.buffer) { + if (!surface->pending.buffer && !PENDING_HAS_NEW_BUFFER && surface->current.buffer) { surface->current.bufferDamage.clear(); surface->current.damage.clear(); surface->commitPendingState(surface->current); return; // no new buffer, but we still have current around and a commit happend, commit current again. } - if (!surface->pending.buffer && !surface->pending.newBuffer && !surface->current.buffer) { + if (!surface->pending.buffer && !PENDING_HAS_NEW_BUFFER && !surface->current.buffer) { surface->commitPendingState(surface->pending); // no pending buffer, no current buffer. probably first commit return; } @@ -109,7 +111,8 @@ CDRMSyncobjSurfaceResource::CDRMSyncobjSurfaceResource(UP(surface->pending)); surface->pending.damage.clear(); surface->pending.bufferDamage.clear(); - surface->pending.newBuffer = false; + surface->pending.updated &= ~SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_BUFFER; + surface->pending.updated &= ~SSurfaceState::eUpdatedProperties::SURFACE_UPDATED_DAMAGE; surface->pending.buffer.reset(); state->buffer->buffer->syncReleaser = state->buffer->release->createSyncRelease(); -- cgit v1.2.3