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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user