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/. */
6 #ifndef GPU_RenderBundleEncoder_H_
7 #define GPU_RenderBundleEncoder_H_
9 #include "mozilla/dom/TypedArray.h"
10 #include "ObjectModel.h"
12 namespace mozilla::webgpu
{
14 struct WGPURenderBundleEncoder
;
20 struct ffiWGPURenderBundleEncoderDeleter
{
21 void operator()(ffi::WGPURenderBundleEncoder
*);
24 class RenderBundleEncoder final
: public ObjectBase
, public ChildOf
<Device
> {
26 GPU_DECL_CYCLE_COLLECTION(RenderBundleEncoder
)
27 GPU_DECL_JS_WRAP(RenderBundleEncoder
)
29 RenderBundleEncoder(Device
* const aParent
, WebGPUChild
* const aBridge
,
30 const dom::GPURenderBundleEncoderDescriptor
& aDesc
);
33 ~RenderBundleEncoder();
36 std::unique_ptr
<ffi::WGPURenderBundleEncoder
, ffiWGPURenderBundleEncoderDeleter
> mEncoder
;
37 // keep all the used objects alive while the encoder is finished
38 nsTArray
<RefPtr
<const BindGroup
>> mUsedBindGroups
;
39 nsTArray
<RefPtr
<const Buffer
>> mUsedBuffers
;
40 nsTArray
<RefPtr
<const RenderPipeline
>> mUsedPipelines
;
41 nsTArray
<RefPtr
<const TextureView
>> mUsedTextureViews
;
44 // programmable pass encoder
45 void SetBindGroup(uint32_t aSlot
, const BindGroup
& aBindGroup
,
46 const dom::Sequence
<uint32_t>& aDynamicOffsets
);
47 // render encoder base
48 void SetPipeline(const RenderPipeline
& aPipeline
);
49 void SetIndexBuffer(const Buffer
& aBuffer
,
50 const dom::GPUIndexFormat
& aIndexFormat
, uint64_t aOffset
,
52 void SetVertexBuffer(uint32_t aSlot
, const Buffer
& aBuffer
, uint64_t aOffset
,
54 void Draw(uint32_t aVertexCount
, uint32_t aInstanceCount
,
55 uint32_t aFirstVertex
, uint32_t aFirstInstance
);
56 void DrawIndexed(uint32_t aIndexCount
, uint32_t aInstanceCount
,
57 uint32_t aFirstIndex
, int32_t aBaseVertex
,
58 uint32_t aFirstInstance
);
59 void DrawIndirect(const Buffer
& aIndirectBuffer
, uint64_t aIndirectOffset
);
60 void DrawIndexedIndirect(const Buffer
& aIndirectBuffer
,
61 uint64_t aIndirectOffset
);
63 void PushDebugGroup(const nsAString
& aString
);
65 void InsertDebugMarker(const nsAString
& aString
);
68 already_AddRefed
<RenderBundle
> Finish(
69 const dom::GPURenderBundleDescriptor
& aDesc
);
72 } // namespace mozilla::webgpu
74 #endif // GPU_RenderBundleEncoder_H_