// Copyright 2021 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_DAWN_NODE_BINDING_GPUDEVICE_H_ #define SRC_DAWN_NODE_BINDING_GPUDEVICE_H_ #include "dawn/webgpu_cpp.h" #include "src/dawn/node/binding/AsyncRunner.h" #include "src/dawn/node/interop/Napi.h" #include "src/dawn/node/interop/WebGPU.h" namespace wgpu::binding { // GPUDevice is an implementation of interop::GPUDevice that wraps a wgpu::Device. class GPUDevice final : public interop::GPUDevice { public: GPUDevice(Napi::Env env, wgpu::Device device); ~GPUDevice(); // interop::GPUDevice interface compliance interop::Interface getFeatures(Napi::Env) override; interop::Interface getLimits(Napi::Env) override; interop::Interface getQueue(Napi::Env env) override; void destroy(Napi::Env) override; interop::Interface createBuffer( Napi::Env env, interop::GPUBufferDescriptor descriptor) override; interop::Interface createTexture( Napi::Env, interop::GPUTextureDescriptor descriptor) override; interop::Interface createSampler( Napi::Env, interop::GPUSamplerDescriptor descriptor) override; interop::Interface importExternalTexture( Napi::Env, interop::GPUExternalTextureDescriptor descriptor) override; interop::Interface createBindGroupLayout( Napi::Env, interop::GPUBindGroupLayoutDescriptor descriptor) override; interop::Interface createPipelineLayout( Napi::Env, interop::GPUPipelineLayoutDescriptor descriptor) override; interop::Interface createBindGroup( Napi::Env, interop::GPUBindGroupDescriptor descriptor) override; interop::Interface createShaderModule( Napi::Env, interop::GPUShaderModuleDescriptor descriptor) override; interop::Interface createComputePipeline( Napi::Env, interop::GPUComputePipelineDescriptor descriptor) override; interop::Interface createRenderPipeline( Napi::Env, interop::GPURenderPipelineDescriptor descriptor) override; interop::Promise> createComputePipelineAsync(Napi::Env env, interop::GPUComputePipelineDescriptor descriptor) override; interop::Promise> createRenderPipelineAsync( Napi::Env env, interop::GPURenderPipelineDescriptor descriptor) override; interop::Interface createCommandEncoder( Napi::Env env, interop::GPUCommandEncoderDescriptor descriptor) override; interop::Interface createRenderBundleEncoder( Napi::Env, interop::GPURenderBundleEncoderDescriptor descriptor) override; interop::Interface createQuerySet( Napi::Env, interop::GPUQuerySetDescriptor descriptor) override; interop::Promise> getLost( Napi::Env env) override; void pushErrorScope(Napi::Env, interop::GPUErrorFilter filter) override; interop::Promise> popErrorScope(Napi::Env env) override; std::variant getLabel(Napi::Env) override; void setLabel(Napi::Env, std::variant value) override; interop::Interface getOnuncapturederror(Napi::Env) override; void setOnuncapturederror(Napi::Env, interop::Interface value) override; void addEventListener( Napi::Env, std::string type, std::optional> callback, std::optional> options) override; void removeEventListener( Napi::Env, std::string type, std::optional> callback, std::optional> options) override; bool dispatchEvent(Napi::Env, interop::Interface event) override; private: void QueueTick(); Napi::Env env_; wgpu::Device device_; std::shared_ptr async_; // This promise's JS object lives as long as the device because it is stored in .lost // of the wrapper JS object. interop::Promise> lost_promise_; }; } // namespace wgpu::binding #endif // SRC_DAWN_NODE_BINDING_GPUDEVICE_H_