summaryrefslogtreecommitdiffstats
path: root/dom/canvas/WebGLSync.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-15 03:35:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-15 03:35:49 +0000
commitd8bbc7858622b6d9c278469aab701ca0b609cddf (patch)
treeeff41dc61d9f714852212739e6b3738b82a2af87 /dom/canvas/WebGLSync.cpp
parentReleasing progress-linux version 125.0.3-1~progress7.99u1. (diff)
downloadfirefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.tar.xz
firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.zip
Merging upstream version 126.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/WebGLSync.cpp')
-rw-r--r--dom/canvas/WebGLSync.cpp35
1 files changed, 32 insertions, 3 deletions
diff --git a/dom/canvas/WebGLSync.cpp b/dom/canvas/WebGLSync.cpp
index e4b196ab04..6a8e9403f7 100644
--- a/dom/canvas/WebGLSync.cpp
+++ b/dom/canvas/WebGLSync.cpp
@@ -23,10 +23,39 @@ WebGLSync::~WebGLSync() {
mContext->gl->fDeleteSync(mGLName);
}
-void WebGLSync::MarkSignaled() const {
- if (mContext->mCompletedFenceId < mFenceId) {
- mContext->mCompletedFenceId = mFenceId;
+ClientWaitSyncResult WebGLSync::ClientWaitSync(const GLbitfield flags,
+ const GLuint64 timeout) {
+ if (!mContext) return ClientWaitSyncResult::WAIT_FAILED;
+ if (IsKnownComplete()) return ClientWaitSyncResult::ALREADY_SIGNALED;
+
+ auto ret = ClientWaitSyncResult::WAIT_FAILED;
+ bool newlyComplete = false;
+ const auto status = static_cast<ClientWaitSyncResult>(
+ mContext->gl->fClientWaitSync(mGLName, 0, 0));
+ switch (status) {
+ case ClientWaitSyncResult::TIMEOUT_EXPIRED: // Poll() -> false
+ case ClientWaitSyncResult::WAIT_FAILED: // Error
+ ret = status;
+ break;
+ case ClientWaitSyncResult::CONDITION_SATISFIED: // Should never happen, but
+ // tolerate it.
+ case ClientWaitSyncResult::ALREADY_SIGNALED: // Poll() -> true
+ newlyComplete = true;
+ ret = status;
+ break;
+ }
+
+ if (newlyComplete) {
+ if (mContext->mCompletedFenceId < mFenceId) {
+ mContext->mCompletedFenceId = mFenceId;
+ }
+ MOZ_RELEASE_ASSERT(mOnCompleteTasks);
+ for (const auto& task : *mOnCompleteTasks) {
+ (*task)();
+ }
+ mOnCompleteTasks = {};
}
+ return ret;
}
} // namespace mozilla