Files
tubestation/dom/webgpu/RenderBundleEncoder.h
Brad Werth f3e24d843c Bug 1925398 Part 1: Restore WebGPU encoder cycle collection, fix Cleanup(). r=teoxoy
Cleanup() should not call End(), because doing so exposes us to timing
dependencies on the cycle collection. Specifically, as noted in the
patches for Bug 1907457, cycle collection of encoders and their
resources could result in the resource getting destructed before the
encoder. Bug 1907457 "fixed" that by allowing cycles. This patch instead
fixes it by changing encoder Cleanup() to just tidy up resources and not
attempt to complete the work of the encoder by passing it to wgpu.

This also removes mUsedTextureViews from the RenderBundleEncoder, as it
is unused. RenderBundleEncoders have no reliance on TextureViews.

Differential Revision: https://phabricator.services.mozilla.com/D226200
2024-10-23 22:15:23 +00:00

76 lines
2.6 KiB
C++

/* -*- 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_RenderBundleEncoder_H_
#define GPU_RenderBundleEncoder_H_
#include "mozilla/dom/TypedArray.h"
#include "ObjectModel.h"
namespace mozilla::webgpu {
namespace ffi {
struct WGPURenderBundleEncoder;
} // namespace ffi
class Device;
class RenderBundle;
struct ffiWGPURenderBundleEncoderDeleter {
void operator()(ffi::WGPURenderBundleEncoder*);
};
class RenderBundleEncoder final : public ObjectBase, public ChildOf<Device> {
public:
GPU_DECL_CYCLE_COLLECTION(RenderBundleEncoder)
GPU_DECL_JS_WRAP(RenderBundleEncoder)
RenderBundleEncoder(Device* const aParent, WebGPUChild* const aBridge,
const dom::GPURenderBundleEncoderDescriptor& aDesc);
private:
~RenderBundleEncoder();
void Cleanup();
std::unique_ptr<ffi::WGPURenderBundleEncoder,
ffiWGPURenderBundleEncoderDeleter>
mEncoder;
// keep all the used objects alive while the encoder is finished
nsTArray<RefPtr<const BindGroup>> mUsedBindGroups;
nsTArray<RefPtr<const Buffer>> mUsedBuffers;
nsTArray<RefPtr<const RenderPipeline>> mUsedPipelines;
public:
// programmable pass encoder
void SetBindGroup(uint32_t aSlot, BindGroup* const aBindGroup,
const dom::Sequence<uint32_t>& aDynamicOffsets);
// render encoder base
void SetPipeline(const RenderPipeline& aPipeline);
void SetIndexBuffer(const Buffer& aBuffer,
const dom::GPUIndexFormat& aIndexFormat, uint64_t aOffset,
uint64_t aSize);
void SetVertexBuffer(uint32_t aSlot, const Buffer& aBuffer, uint64_t aOffset,
uint64_t aSize);
void Draw(uint32_t aVertexCount, uint32_t aInstanceCount,
uint32_t aFirstVertex, uint32_t aFirstInstance);
void DrawIndexed(uint32_t aIndexCount, uint32_t aInstanceCount,
uint32_t aFirstIndex, int32_t aBaseVertex,
uint32_t aFirstInstance);
void DrawIndirect(const Buffer& aIndirectBuffer, uint64_t aIndirectOffset);
void DrawIndexedIndirect(const Buffer& aIndirectBuffer,
uint64_t aIndirectOffset);
void PushDebugGroup(const nsAString& aString);
void PopDebugGroup();
void InsertDebugMarker(const nsAString& aString);
// self
already_AddRefed<RenderBundle> Finish(
const dom::GPURenderBundleDescriptor& aDesc);
};
} // namespace mozilla::webgpu
#endif // GPU_RenderBundleEncoder_H_