[dawn][emscripten] Fixes WaitAny(timeout=0) on repeated futures.
- When polling on an already completed future, the EventManager
was not properly setting that it completed something resulting
in false positive timeouts.
Change-Id: I83aff9b303c6d72b843f09d7b0ee5303d60a1876
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/255736
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Auto-Submit: Loko Kung <lokokung@google.com>
diff --git a/src/emdawnwebgpu/tests/FuturesTests.cpp b/src/emdawnwebgpu/tests/FuturesTests.cpp
index 76dced1..837a072 100644
--- a/src/emdawnwebgpu/tests/FuturesTests.cpp
+++ b/src/emdawnwebgpu/tests/FuturesTests.cpp
@@ -80,6 +80,22 @@
wgpu::Instance instance;
};
+// Test that waiting for a future that is already complete will indicate that it is completed.
+TEST_F(InstanceLevelTests, WaitAnySameFuture) {
+ wgpu::RequestAdapterStatus status;
+ auto future = instance.RequestAdapter(
+ nullptr, wgpu::CallbackMode::AllowSpontaneous,
+ [&status](wgpu::RequestAdapterStatus s, wgpu::Adapter, wgpu::StringView) { status = s; });
+
+ // First wait should succeed.
+ EXPECT_EQ(instance.WaitAny(future, UINT64_MAX), wgpu::WaitStatus::Success);
+ EXPECT_EQ(status, wgpu::RequestAdapterStatus::Success);
+
+ // Repeated wait should also all succeed.
+ EXPECT_EQ(instance.WaitAny(future, UINT64_MAX), wgpu::WaitStatus::Success);
+ EXPECT_EQ(instance.WaitAny(future, 0), wgpu::WaitStatus::Success);
+}
+
TEST_F(InstanceLevelTests, RequestAdapter) {
EXPECT_NE(RequestAdapter(), nullptr);
}
diff --git a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
index 721a1e1..ae1ab59 100644
--- a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
+++ b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
@@ -620,6 +620,7 @@
auto eventIt = mEvents.find(futureId);
if (eventIt == mEvents.end()) {
infos[i].completed = true;
+ anyCompleted = true;
continue;
}