summaryrefslogtreecommitdiff
path: root/src/protocols/DRMSyncobj.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocols/DRMSyncobj.cpp')
-rw-r--r--src/protocols/DRMSyncobj.cpp21
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 = {};
});
}