summaryrefslogtreecommitdiff
path: root/src/helpers/sync/SyncTimeline.cpp
diff options
context:
space:
mode:
authorIkalco <73481042+ikalco@users.noreply.github.com>2025-04-15 18:02:31 -0500
committerGitHub <noreply@github.com>2025-04-16 01:02:31 +0200
commit0e521788bcc414c9cf81648d3167757d83deb60f (patch)
treebe5ff6f3773144f0f8af57969c3b1bd7eb350e74 /src/helpers/sync/SyncTimeline.cpp
parentffd6cf65e40a7140e82dc6e076c90b5119d41a54 (diff)
core: wait for dmabuf readiness (#9806)
* add doOnReadable to event loop manager * move syncTimeline addWaiter to doOnReadable * wait on dmabuf buffers to be readable * don't over synchronize in scanout, also give present feedback on same buffer commit
Diffstat (limited to 'src/helpers/sync/SyncTimeline.cpp')
-rw-r--r--src/helpers/sync/SyncTimeline.cpp72
1 files changed, 2 insertions, 70 deletions
diff --git a/src/helpers/sync/SyncTimeline.cpp b/src/helpers/sync/SyncTimeline.cpp
index 9f5f5a8a..edb2b190 100644
--- a/src/helpers/sync/SyncTimeline.cpp
+++ b/src/helpers/sync/SyncTimeline.cpp
@@ -34,13 +34,6 @@ SP<CSyncTimeline> CSyncTimeline::create(int drmFD_, CFileDescriptor&& drmSyncobj
}
CSyncTimeline::~CSyncTimeline() {
- for (auto& w : waiters) {
- if (w->source) {
- wl_event_source_remove(w->source);
- w->source = nullptr;
- }
- }
-
if (handle == 0)
return;
@@ -64,34 +57,8 @@ std::optional<bool> CSyncTimeline::check(uint64_t point, uint32_t flags) {
return ret == 0;
}
-static int handleWaiterFD(int fd, uint32_t mask, void* data) {
- auto waiter = (CSyncTimeline::SWaiter*)data;
-
- if (mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR)) {
- Debug::log(ERR, "handleWaiterFD: eventfd error");
- return 0;
- }
-
- if (mask & WL_EVENT_READABLE) {
- uint64_t value = 0;
- if (read(fd, &value, sizeof(value)) <= 0)
- Debug::log(ERR, "handleWaiterFD: failed to read from eventfd");
- }
-
- wl_event_source_remove(waiter->source);
- waiter->source = nullptr;
-
- if (waiter->fn)
- waiter->fn();
-
- if (waiter->timeline)
- waiter->timeline->removeWaiter(waiter);
-
- return 0;
-}
-
bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags) {
- CFileDescriptor eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
+ auto eventFd = CFileDescriptor(eventfd(0, EFD_CLOEXEC));
if (!eventFd.isValid()) {
Debug::log(ERR, "CSyncTimeline::addWaiter: failed to acquire an eventfd");
@@ -103,46 +70,11 @@ bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t poin
return false;
}
- if (eventFd.isReadable()) {
- waiter();
- return true;
- }
-
- auto w = makeShared<SWaiter>();
- w->fn = waiter;
- w->timeline = self;
- w->eventFd = std::move(eventFd);
-
- w->source = wl_event_loop_add_fd(g_pEventLoopManager->m_sWayland.loop, w->eventFd.get(), WL_EVENT_READABLE, ::handleWaiterFD, w.get());
- if (!w->source) {
- Debug::log(ERR, "CSyncTimeline::addWaiter: wl_event_loop_add_fd failed");
- return false;
- }
-
- waiters.emplace_back(w);
+ g_pEventLoopManager->doOnReadable(std::move(eventFd), waiter);
return true;
}
-void CSyncTimeline::removeWaiter(SWaiter* w) {
- if (w->source) {
- wl_event_source_remove(w->source);
- w->source = nullptr;
- }
- std::erase_if(waiters, [w](const auto& e) { return e.get() == w; });
-}
-
-void CSyncTimeline::removeAllWaiters() {
- for (auto& w : waiters) {
- if (w->source) {
- wl_event_source_remove(w->source);
- w->source = nullptr;
- }
- }
-
- waiters.clear();
-}
-
CFileDescriptor CSyncTimeline::exportAsSyncFileFD(uint64_t src) {
int sync = -1;