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