Bug 1865364 - Ensure a buffer's ID can't be zero. r=webgpu-reviewers,ErichDonGubler

Differential Revision: https://phabricator.services.mozilla.com/D193920
This commit is contained in:
Nicolas Silva
2023-11-22 10:57:58 +00:00
parent 4ea5b3990a
commit d369f1e328
6 changed files with 17 additions and 30 deletions

View File

@@ -58,19 +58,18 @@ Buffer::~Buffer() {
already_AddRefed<Buffer> Buffer::Create(Device* aDevice, RawId aDeviceId,
const dom::GPUBufferDescriptor& aDesc,
ErrorResult& aRv) {
if (aDevice->IsLost()) {
// Create and return an invalid Buffer. This Buffer will have id 0 and
// won't be sent in any messages to the parent.
RefPtr<Buffer> buffer = new Buffer(aDevice, 0, aDesc.mSize, 0,
ipc::WritableSharedMemoryMapping());
RefPtr<WebGPUChild> actor = aDevice->GetBridge();
RawId bufferId =
ffi::wgpu_client_make_buffer_id(actor->GetClient(), aDeviceId);
// Track the invalid Buffer to ensure that ::Drop can untrack it later.
aDevice->TrackBuffer(buffer.get());
if (!aDevice->IsBridgeAlive()) {
// Create and return an invalid Buffer.
RefPtr<Buffer> buffer = new Buffer(aDevice, bufferId, aDesc.mSize, 0,
ipc::WritableSharedMemoryMapping());
buffer->mValid = false;
return buffer.forget();
}
RefPtr<WebGPUChild> actor = aDevice->GetBridge();
auto handle = ipc::UnsafeSharedMemoryHandle();
auto mapping = ipc::WritableSharedMemoryMapping();
@@ -119,10 +118,10 @@ already_AddRefed<Buffer> Buffer::Create(Device* aDevice, RawId aDeviceId,
return nullptr;
}
RawId id = actor->DeviceCreateBuffer(aDeviceId, aDesc, std::move(handle));
actor->SendDeviceCreateBuffer(aDeviceId, bufferId, aDesc, std::move(handle));
RefPtr<Buffer> buffer =
new Buffer(aDevice, id, aDesc.mSize, aDesc.mUsage, std::move(mapping));
RefPtr<Buffer> buffer = new Buffer(aDevice, bufferId, aDesc.mSize,
aDesc.mUsage, std::move(mapping));
buffer->SetLabel(aDesc.mLabel);
if (aDesc.mMappedAtCreation) {
@@ -159,7 +158,7 @@ void Buffer::Drop() {
GetDevice().UntrackBuffer(this);
if (GetDevice().IsBridgeAlive() && mId) {
if (GetDevice().IsBridgeAlive()) {
GetDevice().GetBridge()->SendBufferDrop(mId);
}
}

View File

@@ -44,7 +44,7 @@ parent:
async CommandEncoderAction(RawId selfId, RawId aDeviceId, ByteBuf buf);
async BumpImplicitBindGroupLayout(RawId pipelineId, bool isCompute, uint32_t index, RawId assignId);
async CreateBuffer(RawId deviceId, RawId bufferId, GPUBufferDescriptor desc, UnsafeSharedMemoryHandle shm);
async DeviceCreateBuffer(RawId deviceId, RawId bufferId, GPUBufferDescriptor desc, UnsafeSharedMemoryHandle shm);
async InstanceRequestAdapter(GPURequestAdapterOptions options, RawId[] ids) returns (ByteBuf byteBuf);
async AdapterRequestDevice(RawId selfId, ByteBuf buf, RawId newId) returns (bool success);

View File

@@ -292,16 +292,6 @@ Maybe<DeviceRequest> WebGPUChild::AdapterRequestDevice(
return Some(std::move(request));
}
RawId WebGPUChild::DeviceCreateBuffer(RawId aSelfId,
const dom::GPUBufferDescriptor& aDesc,
ipc::UnsafeSharedMemoryHandle&& aShmem) {
RawId bufferId = ffi::wgpu_client_make_buffer_id(mClient.get(), aSelfId);
if (!SendCreateBuffer(aSelfId, bufferId, aDesc, std::move(aShmem))) {
MOZ_CRASH("IPC failure");
}
return bufferId;
}
RawId WebGPUChild::DeviceCreateTexture(
RawId aSelfId, const dom::GPUTextureDescriptor& aDesc,
Maybe<layers::RemoteTextureOwnerId> aOwnerId) {

View File

@@ -64,8 +64,6 @@ class WebGPUChild final : public PWebGPUChild, public SupportsWeakPtr {
const dom::GPURequestAdapterOptions& aOptions);
Maybe<DeviceRequest> AdapterRequestDevice(RawId aSelfId,
const ffi::WGPUDeviceDescriptor&);
RawId DeviceCreateBuffer(RawId aSelfId, const dom::GPUBufferDescriptor& aDesc,
ipc::UnsafeSharedMemoryHandle&& aShmem);
RawId DeviceCreateTexture(RawId aSelfId,
const dom::GPUTextureDescriptor& aDesc,
Maybe<layers::RemoteTextureOwnerId> aOwnerId);

View File

@@ -466,7 +466,7 @@ WebGPUParent::BufferMapData* WebGPUParent::GetBufferMapData(RawId aBufferId) {
return &iter->second;
}
ipc::IPCResult WebGPUParent::RecvCreateBuffer(
ipc::IPCResult WebGPUParent::RecvDeviceCreateBuffer(
RawId aDeviceId, RawId aBufferId, dom::GPUBufferDescriptor&& aDesc,
ipc::UnsafeSharedMemoryHandle&& aShmem) {
webgpu::StringHelper label(aDesc.mLabel);

View File

@@ -56,9 +56,9 @@ class WebGPUParent final : public PWebGPUParent {
ipc::IPCResult RecvAdapterDrop(RawId aAdapterId);
ipc::IPCResult RecvDeviceDestroy(RawId aDeviceId);
ipc::IPCResult RecvDeviceDrop(RawId aDeviceId);
ipc::IPCResult RecvCreateBuffer(RawId aDeviceId, RawId aBufferId,
dom::GPUBufferDescriptor&& aDesc,
ipc::UnsafeSharedMemoryHandle&& aShmem);
ipc::IPCResult RecvDeviceCreateBuffer(RawId aDeviceId, RawId aBufferId,
dom::GPUBufferDescriptor&& aDesc,
ipc::UnsafeSharedMemoryHandle&& aShmem);
ipc::IPCResult RecvBufferMap(RawId aBufferId, uint32_t aMode,
uint64_t aOffset, uint64_t size,
BufferMapResolver&& aResolver);