1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
9 #include "ObjectModel.h"
10 #include "nsTHashSet.h"
11 #include "mozilla/MozPromise.h"
12 #include "mozilla/RefPtr.h"
13 #include "mozilla/WeakPtr.h"
14 #include "mozilla/webgpu/WebGPUTypes.h"
15 #include "mozilla/webgpu/PWebGPUTypes.h"
16 #include "mozilla/webrender/WebRenderAPI.h"
17 #include "mozilla/DOMEventTargetHelper.h"
24 struct GPUExtent3DDict
;
26 struct GPUBufferDescriptor
;
27 struct GPUTextureDescriptor
;
28 struct GPUSamplerDescriptor
;
29 struct GPUBindGroupLayoutDescriptor
;
30 struct GPUPipelineLayoutDescriptor
;
31 struct GPUBindGroupDescriptor
;
32 struct GPUBlendStateDescriptor
;
33 struct GPUDepthStencilStateDescriptor
;
34 struct GPUInputStateDescriptor
;
35 struct GPUShaderModuleDescriptor
;
36 struct GPUAttachmentStateDescriptor
;
37 struct GPUComputePipelineDescriptor
;
38 struct GPURenderBundleEncoderDescriptor
;
39 struct GPURenderPipelineDescriptor
;
40 struct GPUCommandEncoderDescriptor
;
41 struct GPUCanvasConfiguration
;
43 class EventHandlerNonNull
;
47 class GPUBufferOrGPUTexture
;
48 enum class GPUDeviceLostReason
: uint8_t;
49 enum class GPUErrorFilter
: uint8_t;
50 enum class GPUFeatureName
: uint8_t;
54 enum class ResponseRejectReason
;
63 class BindGroupLayout
;
66 class ComputePipeline
;
71 class RenderBundleEncoder
;
75 class SupportedFeatures
;
76 class SupportedLimits
;
80 using MappingPromise
=
81 MozPromise
<BufferMapResult
, ipc::ResponseRejectReason
, true>;
83 class Device final
: public DOMEventTargetHelper
, public SupportsWeakPtr
{
85 NS_DECL_ISUPPORTS_INHERITED
86 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Device
, DOMEventTargetHelper
)
87 GPU_DECL_JS_WRAP(Device
)
90 RefPtr
<SupportedFeatures
> mFeatures
;
91 RefPtr
<SupportedLimits
> mLimits
;
93 static CheckedInt
<uint32_t> BufferStrideWithMask(
94 const gfx::IntSize
& aSize
, const gfx::SurfaceFormat
& aFormat
);
96 explicit Device(Adapter
* const aParent
, RawId aId
, const ffi::WGPULimits
&);
98 RefPtr
<WebGPUChild
> GetBridge();
99 already_AddRefed
<Texture
> InitSwapChain(
100 const dom::GPUCanvasConfiguration
* const aConfig
,
101 const layers::RemoteTextureOwnerId aOwnerId
,
102 bool aUseExternalTextureInSwapChain
, gfx::SurfaceFormat aFormat
,
103 gfx::IntSize aCanvasSize
);
104 bool CheckNewWarning(const nsACString
& aMessage
);
106 void CleanupUnregisteredInParent();
108 void GenerateValidationError(const nsCString
& aMessage
);
109 void TrackBuffer(Buffer
* aBuffer
);
110 void UntrackBuffer(Buffer
* aBuffer
);
113 bool IsBridgeAlive() const;
115 RawId
GetId() const { return mId
; }
121 RefPtr
<WebGPUChild
> mBridge
;
124 RefPtr
<dom::Promise
> mLostPromise
;
125 RefPtr
<Queue
> mQueue
;
126 nsTHashSet
<nsCString
> mKnownWarnings
;
127 nsTHashSet
<Buffer
*> mTrackedBuffers
;
130 void GetLabel(nsAString
& aValue
) const;
131 void SetLabel(const nsAString
& aLabel
);
132 dom::Promise
* GetLost(ErrorResult
& aRv
);
133 void ResolveLost(Maybe
<dom::GPUDeviceLostReason
> aReason
,
134 const nsAString
& aMessage
);
136 const RefPtr
<SupportedFeatures
>& Features() const { return mFeatures
; }
137 const RefPtr
<SupportedLimits
>& Limits() const { return mLimits
; }
138 const RefPtr
<Queue
>& GetQueue() const { return mQueue
; }
140 already_AddRefed
<Buffer
> CreateBuffer(const dom::GPUBufferDescriptor
& aDesc
,
143 already_AddRefed
<Texture
> CreateTextureForSwapChain(
144 const dom::GPUCanvasConfiguration
* const aConfig
,
145 const gfx::IntSize
& aCanvasSize
,
146 const layers::RemoteTextureOwnerId aOwnerId
);
147 already_AddRefed
<Texture
> CreateTexture(
148 const dom::GPUTextureDescriptor
& aDesc
);
149 already_AddRefed
<Texture
> CreateTexture(
150 const dom::GPUTextureDescriptor
& aDesc
,
151 Maybe
<layers::RemoteTextureOwnerId
> aOwnerId
);
152 already_AddRefed
<Sampler
> CreateSampler(
153 const dom::GPUSamplerDescriptor
& aDesc
);
155 already_AddRefed
<CommandEncoder
> CreateCommandEncoder(
156 const dom::GPUCommandEncoderDescriptor
& aDesc
);
157 already_AddRefed
<RenderBundleEncoder
> CreateRenderBundleEncoder(
158 const dom::GPURenderBundleEncoderDescriptor
& aDesc
);
160 already_AddRefed
<BindGroupLayout
> CreateBindGroupLayout(
161 const dom::GPUBindGroupLayoutDescriptor
& aDesc
);
162 already_AddRefed
<PipelineLayout
> CreatePipelineLayout(
163 const dom::GPUPipelineLayoutDescriptor
& aDesc
);
164 already_AddRefed
<BindGroup
> CreateBindGroup(
165 const dom::GPUBindGroupDescriptor
& aDesc
);
167 MOZ_CAN_RUN_SCRIPT already_AddRefed
<ShaderModule
> CreateShaderModule(
168 JSContext
* aCx
, const dom::GPUShaderModuleDescriptor
& aDesc
,
170 already_AddRefed
<ComputePipeline
> CreateComputePipeline(
171 const dom::GPUComputePipelineDescriptor
& aDesc
);
172 already_AddRefed
<RenderPipeline
> CreateRenderPipeline(
173 const dom::GPURenderPipelineDescriptor
& aDesc
);
174 already_AddRefed
<dom::Promise
> CreateComputePipelineAsync(
175 const dom::GPUComputePipelineDescriptor
& aDesc
, ErrorResult
& aRv
);
176 already_AddRefed
<dom::Promise
> CreateRenderPipelineAsync(
177 const dom::GPURenderPipelineDescriptor
& aDesc
, ErrorResult
& aRv
);
179 void PushErrorScope(const dom::GPUErrorFilter
& aFilter
);
180 already_AddRefed
<dom::Promise
> PopErrorScope(ErrorResult
& aRv
);
184 IMPL_EVENT_HANDLER(uncapturederror
)
187 } // namespace webgpu
188 } // namespace mozilla
190 #endif // GPU_DEVICE_H_