diff options
Diffstat (limited to '')
-rw-r--r-- | dom/webgpu/Device.h | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/dom/webgpu/Device.h b/dom/webgpu/Device.h new file mode 100644 index 0000000000..a0744c6805 --- /dev/null +++ b/dom/webgpu/Device.h @@ -0,0 +1,171 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef GPU_DEVICE_H_ +#define GPU_DEVICE_H_ + +#include "ObjectModel.h" +#include "nsTHashSet.h" +#include "mozilla/MozPromise.h" +#include "mozilla/RefPtr.h" +#include "mozilla/WeakPtr.h" +#include "mozilla/webgpu/WebGPUTypes.h" +#include "mozilla/webgpu/PWebGPUTypes.h" +#include "mozilla/webrender/WebRenderAPI.h" +#include "mozilla/DOMEventTargetHelper.h" + +namespace mozilla { +namespace dom { +struct GPUExtensions; +struct GPUFeatures; +struct GPULimits; +struct GPUExtent3DDict; + +struct GPUBufferDescriptor; +struct GPUTextureDescriptor; +struct GPUSamplerDescriptor; +struct GPUBindGroupLayoutDescriptor; +struct GPUPipelineLayoutDescriptor; +struct GPUBindGroupDescriptor; +struct GPUBlendStateDescriptor; +struct GPUDepthStencilStateDescriptor; +struct GPUInputStateDescriptor; +struct GPUShaderModuleDescriptor; +struct GPUAttachmentStateDescriptor; +struct GPUComputePipelineDescriptor; +struct GPURenderBundleEncoderDescriptor; +struct GPURenderPipelineDescriptor; +struct GPUCommandEncoderDescriptor; +struct GPUCanvasConfiguration; + +class EventHandlerNonNull; +class Promise; +template <typename T> +class Sequence; +class GPUBufferOrGPUTexture; +enum class GPUErrorFilter : uint8_t; +enum class GPUFeatureName : uint8_t; +class GPULogCallback; +} // namespace dom +namespace ipc { +enum class ResponseRejectReason; +} // namespace ipc + +namespace webgpu { +namespace ffi { +struct WGPULimits; +} +class Adapter; +class BindGroup; +class BindGroupLayout; +class Buffer; +class CommandEncoder; +class ComputePipeline; +class Fence; +class InputState; +class PipelineLayout; +class Queue; +class RenderBundleEncoder; +class RenderPipeline; +class Sampler; +class ShaderModule; +class SupportedFeatures; +class SupportedLimits; +class Texture; +class WebGPUChild; + +using MappingPromise = + MozPromise<BufferMapResult, ipc::ResponseRejectReason, true>; + +class Device final : public DOMEventTargetHelper, public SupportsWeakPtr { + public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Device, DOMEventTargetHelper) + GPU_DECL_JS_WRAP(Device) + + const RawId mId; + RefPtr<SupportedFeatures> mFeatures; + RefPtr<SupportedLimits> mLimits; + + explicit Device(Adapter* const aParent, RawId aId, + UniquePtr<ffi::WGPULimits> aRawLimits); + + RefPtr<WebGPUChild> GetBridge(); + already_AddRefed<Texture> InitSwapChain( + const dom::GPUCanvasConfiguration& aDesc, + const layers::RemoteTextureOwnerId aOwnerId, gfx::SurfaceFormat aFormat, + gfx::IntSize aDefaultSize); + bool CheckNewWarning(const nsACString& aMessage); + + void CleanupUnregisteredInParent(); + + void GenerateError(const nsCString& aMessage); + + bool IsLost() const; + + private: + ~Device(); + void Cleanup(); + + RefPtr<WebGPUChild> mBridge; + bool mValid = true; + nsString mLabel; + RefPtr<dom::Promise> mLostPromise; + RefPtr<Queue> mQueue; + nsTHashSet<nsCString> mKnownWarnings; + + public: + void GetLabel(nsAString& aValue) const; + void SetLabel(const nsAString& aLabel); + dom::Promise* GetLost(ErrorResult& aRv); + dom::Promise* MaybeGetLost() const { return mLostPromise; } + + const RefPtr<SupportedFeatures>& Features() const { return mFeatures; } + const RefPtr<SupportedLimits>& Limits() const { return mLimits; } + const RefPtr<Queue>& GetQueue() const { return mQueue; } + + already_AddRefed<Buffer> CreateBuffer(const dom::GPUBufferDescriptor& aDesc, + ErrorResult& aRv); + + already_AddRefed<Texture> CreateTexture( + const dom::GPUTextureDescriptor& aDesc); + already_AddRefed<Sampler> CreateSampler( + const dom::GPUSamplerDescriptor& aDesc); + + already_AddRefed<CommandEncoder> CreateCommandEncoder( + const dom::GPUCommandEncoderDescriptor& aDesc); + already_AddRefed<RenderBundleEncoder> CreateRenderBundleEncoder( + const dom::GPURenderBundleEncoderDescriptor& aDesc); + + already_AddRefed<BindGroupLayout> CreateBindGroupLayout( + const dom::GPUBindGroupLayoutDescriptor& aDesc); + already_AddRefed<PipelineLayout> CreatePipelineLayout( + const dom::GPUPipelineLayoutDescriptor& aDesc); + already_AddRefed<BindGroup> CreateBindGroup( + const dom::GPUBindGroupDescriptor& aDesc); + + MOZ_CAN_RUN_SCRIPT already_AddRefed<ShaderModule> CreateShaderModule( + JSContext* aCx, const dom::GPUShaderModuleDescriptor& aDesc); + already_AddRefed<ComputePipeline> CreateComputePipeline( + const dom::GPUComputePipelineDescriptor& aDesc); + already_AddRefed<RenderPipeline> CreateRenderPipeline( + const dom::GPURenderPipelineDescriptor& aDesc); + already_AddRefed<dom::Promise> CreateComputePipelineAsync( + const dom::GPUComputePipelineDescriptor& aDesc, ErrorResult& aRv); + already_AddRefed<dom::Promise> CreateRenderPipelineAsync( + const dom::GPURenderPipelineDescriptor& aDesc, ErrorResult& aRv); + + void PushErrorScope(const dom::GPUErrorFilter& aFilter); + already_AddRefed<dom::Promise> PopErrorScope(ErrorResult& aRv); + + void Destroy(); + + IMPL_EVENT_HANDLER(uncapturederror) +}; + +} // namespace webgpu +} // namespace mozilla + +#endif // GPU_DEVICE_H_ |