dawn::wire::client::ReturnToAPI take a Ref<T>&& to match dawn::native

Bug: 344963953
Change-Id: I9808c875fc62ae6ee22e70fd75c52ca4e9fac994
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/197196
Auto-Submit: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/generator/templates/dawn/wire/client/ApiProcs.cpp b/generator/templates/dawn/wire/client/ApiProcs.cpp
index 45a8510..5a28ecd 100644
--- a/generator/templates/dawn/wire/client/ApiProcs.cpp
+++ b/generator/templates/dawn/wire/client/ApiProcs.cpp
@@ -30,6 +30,7 @@
 #include <string>
 #include <type_traits>
 #include <vector>
+#include <utility>
 
 #include "dawn/wire/client/Client.h"
 #include "dawn/wire/client/webgpu.h"
diff --git a/src/dawn/wire/client/Adapter.cpp b/src/dawn/wire/client/Adapter.cpp
index 68b9ebd..ad02eab 100644
--- a/src/dawn/wire/client/Adapter.cpp
+++ b/src/dawn/wire/client/Adapter.cpp
@@ -85,12 +85,16 @@
 
         // Callback needs to happen before device lost handling to ensure resolution order.
         if (mCallback) {
+            Ref<Device> device = mDevice;
             mCallback(mStatus,
-                      mStatus == WGPURequestDeviceStatus_Success ? ReturnToAPI(mDevice) : nullptr,
+                      mStatus == WGPURequestDeviceStatus_Success ? ReturnToAPI(std::move(device))
+                                                                 : nullptr,
                       mMessage ? mMessage->c_str() : nullptr, mUserdata1.ExtractAsDangling());
         } else if (mCallback2) {
+            Ref<Device> device = mDevice;
             mCallback2(mStatus,
-                       mStatus == WGPURequestDeviceStatus_Success ? ReturnToAPI(mDevice) : nullptr,
+                       mStatus == WGPURequestDeviceStatus_Success ? ReturnToAPI(std::move(device))
+                                                                  : nullptr,
                        mMessage ? mMessage->c_str() : nullptr, mUserdata1.ExtractAsDangling(),
                        mUserdata2.ExtractAsDangling());
         }
diff --git a/src/dawn/wire/client/Client.cpp b/src/dawn/wire/client/Client.cpp
index 35c2aed..b9b8e29 100644
--- a/src/dawn/wire/client/Client.cpp
+++ b/src/dawn/wire/client/Client.cpp
@@ -105,7 +105,7 @@
     ReservedBuffer result;
     result.handle = buffer->GetWireHandle();
     result.deviceHandle = FromAPI(device)->GetWireHandle();
-    result.buffer = ReturnToAPI(buffer);
+    result.buffer = ReturnToAPI(std::move(buffer));
     return result;
 }
 
@@ -115,7 +115,7 @@
     ReservedTexture result;
     result.handle = texture->GetWireHandle();
     result.deviceHandle = FromAPI(device)->GetWireHandle();
-    result.texture = ReturnToAPI(texture);
+    result.texture = ReturnToAPI(std::move(texture));
     return result;
 }
 
@@ -126,7 +126,7 @@
     ReservedSwapChain result;
     result.handle = swapChain->GetWireHandle();
     result.deviceHandle = FromAPI(device)->GetWireHandle();
-    result.swapchain = ReturnToAPI(swapChain);
+    result.swapchain = ReturnToAPI(std::move(swapChain));
     return result;
 }
 
@@ -142,7 +142,7 @@
 
     ReservedInstance result;
     result.handle = instance->GetWireHandle();
-    result.instance = ReturnToAPI(instance);
+    result.instance = ReturnToAPI(std::move(instance));
     return result;
 }
 
diff --git a/src/dawn/wire/client/Device.cpp b/src/dawn/wire/client/Device.cpp
index 6c2f64d..527f358 100644
--- a/src/dawn/wire/client/Device.cpp
+++ b/src/dawn/wire/client/Device.cpp
@@ -128,10 +128,11 @@
             mMessage = "A valid external Instance reference no longer exists.";
         }
 
-        mCallback(
-            mStatus,
-            mStatus == WGPUCreatePipelineAsyncStatus_Success ? ReturnToAPI(mPipeline) : nullptr,
-            mMessage ? mMessage->c_str() : nullptr, userdata1, userdata2);
+        mCallback(mStatus,
+                  mStatus == WGPUCreatePipelineAsyncStatus_Success
+                      ? ReturnToAPI(std::move(mPipeline))
+                      : nullptr,
+                  mMessage ? mMessage->c_str() : nullptr, userdata1, userdata2);
     }
 
     using Callback = decltype(std::declval<CallbackInfo>().callback);
@@ -495,7 +496,8 @@
         client->SerializeCommand(cmd);
     }
 
-    return ReturnToAPI(mQueue);
+    Ref<Queue> queue = mQueue;
+    return ReturnToAPI(std::move(queue));
 }
 
 template <typename Event, typename Cmd, typename CallbackInfo, typename Descriptor>
diff --git a/src/dawn/wire/client/Instance.cpp b/src/dawn/wire/client/Instance.cpp
index 3689139..f322d0d 100644
--- a/src/dawn/wire/client/Instance.cpp
+++ b/src/dawn/wire/client/Instance.cpp
@@ -100,14 +100,16 @@
 
         if (mCallback) {
             mCallback(mStatus,
-                      mStatus == WGPURequestAdapterStatus_Success ? ReturnToAPI(mAdapter) : nullptr,
+                      mStatus == WGPURequestAdapterStatus_Success ? ReturnToAPI(std::move(mAdapter))
+                                                                  : nullptr,
                       mMessage ? mMessage->c_str() : nullptr, mUserdata1.ExtractAsDangling());
         } else {
-            mCallback2(
-                mStatus,
-                mStatus == WGPURequestAdapterStatus_Success ? ReturnToAPI(mAdapter) : nullptr,
-                mMessage ? mMessage->c_str() : nullptr, mUserdata1.ExtractAsDangling(),
-                mUserdata2.ExtractAsDangling());
+            mCallback2(mStatus,
+                       mStatus == WGPURequestAdapterStatus_Success
+                           ? ReturnToAPI(std::move(mAdapter))
+                           : nullptr,
+                       mMessage ? mMessage->c_str() : nullptr, mUserdata1.ExtractAsDangling(),
+                       mUserdata2.ExtractAsDangling());
         }
     }
 
diff --git a/src/dawn/wire/client/ObjectBase.h b/src/dawn/wire/client/ObjectBase.h
index 467e9a2..99121a6 100644
--- a/src/dawn/wire/client/ObjectBase.h
+++ b/src/dawn/wire/client/ObjectBase.h
@@ -112,7 +112,7 @@
 };
 
 template <typename T>
-auto ReturnToAPI(Ref<T> r) {
+auto ReturnToAPI(Ref<T>&& r) {
     return ToAPI(r.Detach());
 }
 
diff --git a/src/dawn/wire/client/Surface.cpp b/src/dawn/wire/client/Surface.cpp
index 00d5f8d..d43cefd 100644
--- a/src/dawn/wire/client/Surface.cpp
+++ b/src/dawn/wire/client/Surface.cpp
@@ -27,6 +27,8 @@
 
 #include "dawn/wire/client/Surface.h"
 
+#include <utility>
+
 #include "dawn/common/Log.h"
 #include "dawn/common/Platform.h"
 #include "dawn/wire/client/Client.h"
@@ -85,7 +87,7 @@
     // cmd.result = texture->GetWireHandle(); // TODO(dawn:2320): Feed surfaceTexture to cmd
     wireClient->SerializeCommand(cmd);
 
-    surfaceTexture->texture = ReturnToAPI(texture);
+    surfaceTexture->texture = ReturnToAPI(std::move(texture));
 }
 
 }  // namespace dawn::wire::client
diff --git a/src/dawn/wire/client/SwapChain.cpp b/src/dawn/wire/client/SwapChain.cpp
index b0691d0..4eb4970 100644
--- a/src/dawn/wire/client/SwapChain.cpp
+++ b/src/dawn/wire/client/SwapChain.cpp
@@ -27,6 +27,8 @@
 
 #include "dawn/wire/client/SwapChain.h"
 
+#include <utility>
+
 #include "dawn/wire/client/Client.h"
 #include "dawn/wire/client/Device.h"
 #include "dawn/wire/client/Texture.h"
@@ -62,7 +64,7 @@
     cmd.result = texture->GetWireHandle();
     wireClient->SerializeCommand(cmd);
 
-    return ReturnToAPI(texture);
+    return ReturnToAPI(std::move(texture));
 }
 
 }  // namespace dawn::wire::client