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_;