Files
firefox/dom/webgpu/CommandEncoder.cpp
T

70 lines
2.2 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/. */
#include "mozilla/dom/WebGPUBinding.h"
#include "CommandEncoder.h"
#include "CommandBuffer.h"
#include "ComputePassEncoder.h"
#include "Device.h"
namespace mozilla {
namespace webgpu {
GPU_IMPL_CYCLE_COLLECTION(CommandEncoder, mParent, mBridge)
GPU_IMPL_JS_WRAP(CommandEncoder)
CommandEncoder::CommandEncoder(Device* const aParent,
WebGPUChild* const aBridge, RawId aId)
: ChildOf(aParent), mBridge(aBridge), mId(aId) {}
CommandEncoder::~CommandEncoder() { Cleanup(); }
void CommandEncoder::Cleanup() {
if (mValid && mParent) {
mValid = false;
mParent->DestroyCommandEncoder(mId);
}
}
already_AddRefed<ComputePassEncoder> CommandEncoder::BeginComputePass(
const dom::GPUComputePassDescriptor& aDesc) {
RefPtr<ComputePassEncoder> pass = new ComputePassEncoder(this, aDesc);
return pass.forget();
}
void CommandEncoder::EndComputePass(Span<const uint8_t> aData,
ErrorResult& aRv) {
if (!mValid) {
return aRv.ThrowDOMException(NS_ERROR_DOM_INVALID_STATE_ERR,
"Command encoder is not valid");
}
ipc::Shmem shmem;
if (!mBridge->AllocShmem(aData.Length(), ipc::Shmem::SharedMemory::TYPE_BASIC,
&shmem)) {
return aRv.ThrowDOMException(
NS_ERROR_DOM_ABORT_ERR,
nsPrintfCString("Unable to allocate shmem of size %zu",
aData.Length()));
}
memcpy(shmem.get<uint8_t>(), aData.data(), aData.Length());
mBridge->SendCommandEncoderRunComputePass(mId, std::move(shmem));
}
already_AddRefed<CommandBuffer> CommandEncoder::Finish(
const dom::GPUCommandBufferDescriptor& aDesc) {
RawId id = 0;
if (mValid) {
mValid = false;
id = mBridge->CommandEncoderFinish(mId, aDesc);
}
RefPtr<CommandBuffer> comb = new CommandBuffer(mParent, id);
return comb.forget();
}
} // namespace webgpu
} // namespace mozilla