syncobj: wait for deadline instead of available

avoids slow apps from lagging the desktop
This commit is contained in:
Vaxry 2024-08-31 18:32:57 +02:00
parent 10d7219807
commit cf6a1716ae

View file

@ -58,8 +58,8 @@ CDRMSyncobjSurfaceResource::CDRMSyncobjSurfaceResource(SP<CWpLinuxDrmSyncobjSurf
if (!pending.acquireTimeline) if (!pending.acquireTimeline)
return; return;
// wait for the acquire timeline to materialize // wait for the buffer to be released by the gpu before sending a commit to avoid lagging the desktop
auto materialized = pending.acquireTimeline->timeline->check(pending.acquirePoint, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE); auto materialized = pending.acquireTimeline->timeline->check(pending.acquirePoint, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE);
if (!materialized.has_value()) { if (!materialized.has_value()) {
LOGM(ERR, "Failed to check the acquire timeline"); LOGM(ERR, "Failed to check the acquire timeline");
resource->noMemory(); resource->noMemory();
@ -70,7 +70,7 @@ CDRMSyncobjSurfaceResource::CDRMSyncobjSurfaceResource(SP<CWpLinuxDrmSyncobjSurf
return; return;
surface->lockPendingState(); surface->lockPendingState();
pending.acquireTimeline->timeline->addWaiter([this]() { surface->unlockPendingState(); }, pending.acquirePoint, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE); pending.acquireTimeline->timeline->addWaiter([this]() { surface->unlockPendingState(); }, pending.acquirePoint, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE);
}); });
listeners.surfaceCommit = surface->events.roleCommit.registerListener([this](std::any d) { listeners.surfaceCommit = surface->events.roleCommit.registerListener([this](std::any d) {