diff options
Diffstat (limited to 'src/protocols/DRMSyncobj.cpp')
| -rw-r--r-- | src/protocols/DRMSyncobj.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/protocols/DRMSyncobj.cpp b/src/protocols/DRMSyncobj.cpp index 0896b904..40869c0d 100644 --- a/src/protocols/DRMSyncobj.cpp +++ b/src/protocols/DRMSyncobj.cpp @@ -74,38 +74,39 @@ CDRMSyncobjSurfaceResource::CDRMSyncobjSurfaceResource(UP<CWpLinuxDrmSyncobjSurf m_pendingRelease = {timeline->m_timeline, (sc<uint64_t>(hi) << 32) | sc<uint64_t>(lo)}; }); - m_listeners.surfacePrecommit = m_surface->m_events.precommit.listen([this] { - if (!m_surface->m_pending.updated.bits.buffer || !m_surface->m_pending.buffer) { + m_listeners.surfaceStateCommit = m_surface->m_events.stateCommit.listen([this](auto state) { + if (!state->updated.bits.buffer || !state->buffer) { if (m_pendingAcquire.timeline() || m_pendingRelease.timeline()) { m_resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_BUFFER, "Missing buffer"); - m_surface->m_pending.rejected = true; + state->rejected = true; } return; } if (!m_pendingAcquire.timeline()) { m_resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_ACQUIRE_POINT, "Missing acquire timeline"); - m_surface->m_pending.rejected = true; + state->rejected = true; return; } if (!m_pendingRelease.timeline()) { m_resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_RELEASE_POINT, "Missing release timeline"); - m_surface->m_pending.rejected = true; + state->rejected = true; return; } if (m_pendingAcquire.timeline() == m_pendingRelease.timeline() && m_pendingAcquire.point() >= m_pendingRelease.point()) { m_resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_CONFLICTING_POINTS, "Acquire and release points are on the same timeline, and acquire >= release"); - m_surface->m_pending.rejected = true; + state->rejected = true; return; } - m_surface->m_pending.updated.bits.acquire = true; - m_surface->m_pending.acquire = m_pendingAcquire; - m_pendingAcquire = {}; + state->updated.bits.acquire = true; + state->acquire = m_pendingAcquire; + m_surface->m_stateQueue.lock(state, LOCK_REASON_FENCE); + m_pendingAcquire = {}; - m_surface->m_pending.buffer->addReleasePoint(m_pendingRelease); + state->buffer->addReleasePoint(m_pendingRelease); m_pendingRelease = {}; }); } |
