dawn/node: Remove native::Adapter from GPUAdapter

This CL removes the need to store native::Adapter from
GPUAdapter and also uses RequestDevice instead of CreateDevice.

Bug: 347047627
Change-Id: I82c3835ccfd87cda4a0d4cfb1d3a0241dc7c5f8e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/220474
Commit-Queue: Fr <beaufort.francois@gmail.com>
Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/src/dawn/node/binding/GPU.cpp b/src/dawn/node/binding/GPU.cpp
index cb43ea2..c991b4d 100644
--- a/src/dawn/node/binding/GPU.cpp
+++ b/src/dawn/node/binding/GPU.cpp
@@ -231,23 +231,23 @@
         deviceName = *f;
     }
 
-    dawn::native::Adapter* nativeAdapter = nullptr;
-    AdapterInfo* nativeAdapterInfo = nullptr;
-    for (uint32_t i = 0; i < nativeAdapters.size(); ++i) {
+    wgpu::Adapter* adapter = nullptr;
+    AdapterInfo* adapterInfo = nullptr;
+    for (auto& a : adapters) {
         wgpu::AdapterInfo info;
-        adapters[i].GetInfo(&info);
+        a.GetInfo(&info);
 
         if (!deviceName.empty() &&
             std::string_view(info.device).find(deviceName) == std::string::npos) {
             continue;
         }
 
-        nativeAdapter = &nativeAdapters[i];
-        nativeAdapterInfo = &info;
+        adapter = &a;
+        adapterInfo = &info;
         break;
     }
 
-    if (!nativeAdapter) {
+    if (!adapter) {
         std::stringstream msg;
         if (!forceBackend.empty() || deviceName.empty()) {
             msg << "no adapter ";
@@ -275,10 +275,10 @@
     }
 
     if (flags_.Get("verbose")) {
-        std::cout << "using GPU adapter: " << nativeAdapterInfo->device << "\n";
+        std::cout << "using GPU adapter: " << adapterInfo->device << "\n";
     }
 
-    auto gpuAdapter = GPUAdapter::Create<GPUAdapter>(env, *nativeAdapter, flags_, async_);
+    auto gpuAdapter = GPUAdapter::Create<GPUAdapter>(env, *adapter, flags_, async_);
     promise.Resolve(std::optional<interop::Interface<interop::GPUAdapter>>(gpuAdapter));
     return promise;
 }
diff --git a/src/dawn/node/binding/GPUAdapter.cpp b/src/dawn/node/binding/GPUAdapter.cpp
index b6bac8c..1a74fdc 100644
--- a/src/dawn/node/binding/GPUAdapter.cpp
+++ b/src/dawn/node/binding/GPUAdapter.cpp
@@ -86,10 +86,10 @@
 // wgpu::bindings::GPUAdapter
 // TODO(crbug.com/dawn/1133): This is a stub implementation. Properly implement.
 ////////////////////////////////////////////////////////////////////////////////
-GPUAdapter::GPUAdapter(dawn::native::Adapter a,
+GPUAdapter::GPUAdapter(wgpu::Adapter adapter,
                        const Flags& flags,
                        std::shared_ptr<AsyncRunner> async)
-    : nativeAdapter_(a), adapter_(a.Get()), flags_(flags), async_(async) {}
+    : adapter_(adapter), flags_(flags), async_(async) {}
 
 interop::Interface<interop::GPUSupportedFeatures> GPUAdapter::getFeatures(Napi::Env env) {
     wgpu::SupportedFeatures features{};
@@ -208,7 +208,9 @@
         return {env, interop::kUnusedPromise};
     }
 
-    interop::Promise<interop::Interface<interop::GPUDevice>> promise(env, PROMISE_INFO);
+    auto ctx = std::make_unique<AsyncContext<interop::Interface<interop::GPUDevice>>>(
+        env, PROMISE_INFO, async_);
+    auto promise = ctx->promise;
 
     wgpu::RequiredLimits limits;
 #define COPY_LIMIT(LIMIT)                                                                        \
@@ -276,21 +278,28 @@
     DawnTogglesDescriptor deviceTogglesDesc = togglesLoader.GetDescriptor();
     desc.nextInChain = &deviceTogglesDesc;
 
-    auto wgpu_device = nativeAdapter_.CreateDevice(&desc);
-    if (wgpu_device == nullptr) {
-        promise.Reject(binding::Errors::OperationError(env, "failed to create device"));
-        return promise;
-    }
+    std::unique_ptr<GPUDevice> gpu_device;
+    adapter_.RequestDevice(
+        &desc, wgpu::CallbackMode::AllowSpontaneous,
+        [ctx = std::move(ctx), desc, device_lost_promise, this, &gpu_device](
+            wgpu::RequestDeviceStatus status, wgpu::Device wgpu_device, wgpu::StringView message) {
+            switch (status) {
+                case wgpu::RequestDeviceStatus::Success:
+                    gpu_device = std::make_unique<GPUDevice>(ctx->env, desc, wgpu_device,
+                                                             device_lost_promise, async_);
+                    if (!valid_) {
+                        gpu_device->ForceLoss(wgpu::DeviceLostReason::Unknown,
+                                              "Device was marked as lost due to a stale adapter.");
+                    }
+                    valid_ = false;
 
-    auto gpu_device =
-        std::make_unique<GPUDevice>(env, desc, wgpu_device, device_lost_promise, async_);
-    if (!valid_) {
-        gpu_device->ForceLoss(wgpu::DeviceLostReason::Unknown,
-                              "Device was marked as lost due to a stale adapter.");
-    }
-    valid_ = false;
-
-    promise.Resolve(interop::GPUDevice::Bind(env, std::move(gpu_device)));
+                    ctx->promise.Resolve(interop::GPUDevice::Bind(ctx->env, std::move(gpu_device)));
+                    break;
+                default:
+                    ctx->promise.Reject(Errors::OperationError(ctx->env, std::string(message)));
+                    break;
+            }
+        });
     return promise;
 }
 
diff --git a/src/dawn/node/binding/GPUAdapter.h b/src/dawn/node/binding/GPUAdapter.h
index e2c801a..aa70b04 100644
--- a/src/dawn/node/binding/GPUAdapter.h
+++ b/src/dawn/node/binding/GPUAdapter.h
@@ -32,7 +32,6 @@
 
 #include <memory>
 
-#include "dawn/native/DawnNative.h"
 #include "src/dawn/node/binding/AsyncRunner.h"
 #include "src/dawn/node/interop/NodeAPI.h"
 #include "src/dawn/node/interop/WebGPU.h"
@@ -40,10 +39,10 @@
 namespace wgpu::binding {
 class Flags;
 
-// GPUAdapter is an implementation of interop::GPUAdapter that wraps a dawn::native::Adapter.
+// GPUAdapter is an implementation of interop::GPUAdapter that wraps a wgpu::Adapter.
 class GPUAdapter final : public interop::GPUAdapter {
   public:
-    GPUAdapter(dawn::native::Adapter a, const Flags& flags, std::shared_ptr<AsyncRunner> async);
+    GPUAdapter(wgpu::Adapter adapter, const Flags& flags, std::shared_ptr<AsyncRunner> async);
 
     // interop::GPUAdapter interface compliance
     interop::Promise<interop::Interface<interop::GPUDevice>> requestDevice(
@@ -56,8 +55,6 @@
     bool getIsCompatibilityMode(Napi::Env) override;
 
   private:
-    // TODO(347047627): Remove nativeAdapter_ once we don't use CreateDevice.
-    dawn::native::Adapter nativeAdapter_;
     wgpu::Adapter adapter_;
     const Flags& flags_;
     std::shared_ptr<AsyncRunner> async_;