Make a convenience cpp method for WaitAny with one future

When one future is waited on, there is no need for FutureWaitInfo.
FutureWaitInfo tells you which futures completed when the application
passed a list of futures. But when the list is only one element,
WaitStatus::Success always means that the future completed.

When waiting on just one future, this is much more convenient than
creating the extra struct.

Bug: none
Change-Id: I75b722511a8025a5c1d9229380a5a1618d21a0a8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/193701
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/generator/templates/api_cpp.h b/generator/templates/api_cpp.h
index 63e097d..9d440fb 100644
--- a/generator/templates/api_cpp.h
+++ b/generator/templates/api_cpp.h
@@ -481,6 +481,10 @@
             {% endif %}
         {% endfor %}
 
+        {% if CppType == "Instance" %}
+            inline wgpu::WaitStatus WaitAny(wgpu::Future f, uint64_t timeout);
+        {% endif %}
+
       private:
         friend ObjectBase<{{CppType}}, {{CType}}>;
         static inline void {{c_prefix}}AddRef({{CType}} handle);
@@ -657,6 +661,14 @@
             {{render_cpp_method_impl(type, method)}}
         {% endif %}
     {% endfor %}
+
+    {% if CppType == "Instance" %}
+        wgpu::WaitStatus Instance::WaitAny(wgpu::Future f, uint64_t timeout) {
+            wgpu::FutureWaitInfo waitInfo { f };
+            return WaitAny(1, &waitInfo, timeout);
+        }
+    {% endif %}
+
     void {{CppType}}::{{c_prefix}}AddRef({{CType}} handle) {
         if (handle != nullptr) {
             {{as_cMethodNamespaced(type.name, Name("add ref"), c_namespace)}}(handle);
diff --git a/src/dawn/samples/SampleUtils.cpp b/src/dawn/samples/SampleUtils.cpp
index b08c1a3..07f11bd 100644
--- a/src/dawn/samples/SampleUtils.cpp
+++ b/src/dawn/samples/SampleUtils.cpp
@@ -164,20 +164,20 @@
     }
 
     wgpu::Adapter adapter;
-    wgpu::FutureWaitInfo adapterFuture = {};
-    adapterFuture.future = instance.RequestAdapter(
-        &options, {nullptr, wgpu::CallbackMode::WaitAnyOnly,
-                   [](WGPURequestAdapterStatus status, WGPUAdapter adapter, const char* message,
-                      void* userdata) {
-                       if (status != WGPURequestAdapterStatus_Success) {
-                           dawn::ErrorLog() << "Failed to get an adapter:" << message;
-                           return;
-                       }
-                       *static_cast<wgpu::Adapter*>(userdata) = wgpu::Adapter::Acquire(adapter);
-                   },
-                   &adapter});
-    instance.WaitAny(1, &adapterFuture, UINT64_MAX);
-    DAWN_ASSERT(adapterFuture.completed);
+    instance.WaitAny(
+        instance.RequestAdapter(&options, {nullptr, wgpu::CallbackMode::WaitAnyOnly,
+                                           [](WGPURequestAdapterStatus status, WGPUAdapter adapter,
+                                              const char* message, void* userdata) {
+                                               if (status != WGPURequestAdapterStatus_Success) {
+                                                   dawn::ErrorLog()
+                                                       << "Failed to get an adapter:" << message;
+                                                   return;
+                                               }
+                                               *static_cast<wgpu::Adapter*>(userdata) =
+                                                   wgpu::Adapter::Acquire(adapter);
+                                           },
+                                           &adapter}),
+        UINT64_MAX);
 
     if (adapter == nullptr) {
         return wgpu::Device();
@@ -194,20 +194,20 @@
                                          PrintDeviceLoss, nullptr};
 
     wgpu::Device device;
-    wgpu::FutureWaitInfo deviceFuture = {};
-    deviceFuture.future = adapter.RequestDevice(
-        &deviceDesc, {nullptr, wgpu::CallbackMode::WaitAnyOnly,
-                      [](WGPURequestDeviceStatus status, WGPUDevice device, const char* message,
-                         void* userdata) {
-                          if (status != WGPURequestDeviceStatus_Success) {
-                              dawn::ErrorLog() << "Failed to get an device:" << message;
-                              return;
-                          }
-                          *static_cast<wgpu::Device*>(userdata) = wgpu::Device::Acquire(device);
-                      },
-                      &device});
-    instance.WaitAny(1, &deviceFuture, UINT64_MAX);
-    DAWN_ASSERT(deviceFuture.completed);
+    instance.WaitAny(
+        adapter.RequestDevice(&deviceDesc, {nullptr, wgpu::CallbackMode::WaitAnyOnly,
+                                            [](WGPURequestDeviceStatus status, WGPUDevice device,
+                                               const char* message, void* userdata) {
+                                                if (status != WGPURequestDeviceStatus_Success) {
+                                                    dawn::ErrorLog()
+                                                        << "Failed to get an device:" << message;
+                                                    return;
+                                                }
+                                                *static_cast<wgpu::Device*>(userdata) =
+                                                    wgpu::Device::Acquire(device);
+                                            },
+                                            &device}),
+        UINT64_MAX);
 
     if (device == nullptr) {
         return wgpu::Device();
diff --git a/src/dawn/tests/DawnTest.cpp b/src/dawn/tests/DawnTest.cpp
index fdfe569..4840b3a 100644
--- a/src/dawn/tests/DawnTest.cpp
+++ b/src/dawn/tests/DawnTest.cpp
@@ -1650,9 +1650,11 @@
         MockCppCallback<void (*)(wgpu::MapAsyncStatus, const char*)> mockCb;
         EXPECT_CALL(mockCb, Call(wgpu::MapAsyncStatus::Success, _)).Times(1);
 
-        wgpu::FutureWaitInfo waitInfo = {buffer.MapAsync(
-            mapMode, offset, size, wgpu::CallbackMode::WaitAnyOnly, mockCb.Callback())};
-        ASSERT_EQ(instance.WaitAny(1, &waitInfo, UINT64_MAX), wgpu::WaitStatus::Success);
+        ASSERT_EQ(
+            instance.WaitAny(buffer.MapAsync(mapMode, offset, size, wgpu::CallbackMode::WaitAnyOnly,
+                                             mockCb.Callback()),
+                             UINT64_MAX),
+            wgpu::WaitStatus::Success);
     } else {
         bool done = false;
         buffer.MapAsync(mapMode, offset, size, wgpu::CallbackMode::AllowProcessEvents,
diff --git a/src/dawn/tests/end2end/EventTests.cpp b/src/dawn/tests/end2end/EventTests.cpp
index 28e215b..fc5f8af 100644
--- a/src/dawn/tests/end2end/EventTests.cpp
+++ b/src/dawn/tests/end2end/EventTests.cpp
@@ -506,9 +506,10 @@
     }
 
     for (uint64_t timeout : {uint64_t(1), uint64_t(0), UINT64_MAX}) {
-        wgpu::FutureWaitInfo info{device2.GetQueue().OnSubmittedWorkDone(
-            wgpu::CallbackMode::WaitAnyOnly, [](wgpu::QueueWorkDoneStatus) {})};
-        wgpu::WaitStatus status = instance2.WaitAny(1, &info, timeout);
+        wgpu::WaitStatus status = instance2.WaitAny(
+            device2.GetQueue().OnSubmittedWorkDone(wgpu::CallbackMode::WaitAnyOnly,
+                                                   [](wgpu::QueueWorkDoneStatus) {}),
+            timeout);
         if (timeout == 0) {
             ASSERT_TRUE(status == wgpu::WaitStatus::Success ||
                         status == wgpu::WaitStatus::TimedOut);
diff --git a/src/dawn/tests/end2end/MultithreadTests.cpp b/src/dawn/tests/end2end/MultithreadTests.cpp
index 7bbb0ec..8c920b0 100644
--- a/src/dawn/tests/end2end/MultithreadTests.cpp
+++ b/src/dawn/tests/end2end/MultithreadTests.cpp
@@ -206,14 +206,15 @@
         wgpu::Buffer buffer =
             CreateBuffer(kSize, wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc);
 
-        wgpu::FutureWaitInfo waitInfo = {
-            buffer.MapAsync(wgpu::MapMode::Write, 0, kSize, wgpu::CallbackMode::AllowProcessEvents,
-                            [](wgpu::MapAsyncStatus status, const char*) {
-                                ASSERT_EQ(status, wgpu::MapAsyncStatus::Success);
-                            })};
-
         // Wait for the mapping to complete
-        ASSERT_EQ(instance.WaitAny(1, &waitInfo, UINT64_MAX), wgpu::WaitStatus::Success);
+        ASSERT_EQ(instance.WaitAny(buffer.MapAsync(wgpu::MapMode::Write, 0, kSize,
+                                                   wgpu::CallbackMode::AllowProcessEvents,
+                                                   [](wgpu::MapAsyncStatus status, const char*) {
+                                                       ASSERT_EQ(status,
+                                                                 wgpu::MapAsyncStatus::Success);
+                                                   }),
+                                   UINT64_MAX),
+                  wgpu::WaitStatus::Success);
 
         // Buffer is mapped, write into it and unmap .
         memcpy(buffer.GetMappedRange(0, kSize), myData.data(), kSize);