Bubble up potential errors during buffer.unmap().
Bug: dawn:1336 Change-Id: I715904874311349b4e996665dccc9d2d31959717 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/122022 Reviewed-by: Austin Eng <enga@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Loko Kung <lokokung@google.com>
This commit is contained in:
parent
c2683a9459
commit
f93f7ae8b1
|
@ -268,7 +268,7 @@ MaybeError BlitRG8ToDepth16Unorm(DeviceBase* device,
|
||||||
static_cast<uint32_t*>(paramsBuffer->GetMappedRange(0, bufferDesc.size));
|
static_cast<uint32_t*>(paramsBuffer->GetMappedRange(0, bufferDesc.size));
|
||||||
params[0] = dst.origin.x;
|
params[0] = dst.origin.x;
|
||||||
params[1] = dst.origin.y;
|
params[1] = dst.origin.y;
|
||||||
paramsBuffer->Unmap();
|
DAWN_TRY(paramsBuffer->Unmap());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<BindGroupBase> bindGroup;
|
Ref<BindGroupBase> bindGroup;
|
||||||
|
@ -357,7 +357,7 @@ MaybeError BlitR8ToStencil(DeviceBase* device,
|
||||||
uint32_t* params = static_cast<uint32_t*>(paramsBuffer->GetMappedRange(0, bufferDesc.size));
|
uint32_t* params = static_cast<uint32_t*>(paramsBuffer->GetMappedRange(0, bufferDesc.size));
|
||||||
params[0] = dst.origin.x;
|
params[0] = dst.origin.x;
|
||||||
params[1] = dst.origin.y;
|
params[1] = dst.origin.y;
|
||||||
paramsBuffer->Unmap();
|
DAWN_TRY(paramsBuffer->Unmap());
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each layer, blit the stencil data.
|
// For each layer, blit the stencil data.
|
||||||
|
|
|
@ -506,29 +506,36 @@ void BufferBase::APIUnmap() {
|
||||||
if (GetDevice()->ConsumedError(ValidateUnmap(), "calling %s.Unmap().", this)) {
|
if (GetDevice()->ConsumedError(ValidateUnmap(), "calling %s.Unmap().", this)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Unmap();
|
if (GetDevice()->ConsumedError(Unmap(), "calling %s.Unmap().", this)) {
|
||||||
}
|
|
||||||
|
|
||||||
void BufferBase::Unmap() {
|
|
||||||
if (mState == BufferState::Destroyed) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MaybeError BufferBase::Unmap() {
|
||||||
|
if (mState == BufferState::Destroyed) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure writes are now visibile to the GPU if we used a staging buffer.
|
||||||
|
if (mState == BufferState::MappedAtCreation && mStagingBuffer != nullptr) {
|
||||||
|
DAWN_TRY(CopyFromStagingBuffer());
|
||||||
|
}
|
||||||
UnmapInternal(WGPUBufferMapAsyncStatus_UnmappedBeforeCallback).Call();
|
UnmapInternal(WGPUBufferMapAsyncStatus_UnmappedBeforeCallback).Call();
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferBase::PendingMappingCallback BufferBase::UnmapInternal(
|
BufferBase::PendingMappingCallback BufferBase::UnmapInternal(
|
||||||
WGPUBufferMapAsyncStatus callbackStatus) {
|
WGPUBufferMapAsyncStatus callbackStatus) {
|
||||||
PendingMappingCallback toCall;
|
PendingMappingCallback toCall;
|
||||||
|
|
||||||
|
// Unmaps resources on the backend and returns the callback.
|
||||||
if (mState == BufferState::PendingMap) {
|
if (mState == BufferState::PendingMap) {
|
||||||
toCall = WillCallMappingCallback(mLastMapID, callbackStatus);
|
toCall = WillCallMappingCallback(mLastMapID, callbackStatus);
|
||||||
UnmapImpl();
|
UnmapImpl();
|
||||||
} else if (mState == BufferState::Mapped) {
|
} else if (mState == BufferState::Mapped) {
|
||||||
UnmapImpl();
|
UnmapImpl();
|
||||||
} else if (mState == BufferState::MappedAtCreation) {
|
} else if (mState == BufferState::MappedAtCreation) {
|
||||||
if (mStagingBuffer != nullptr) {
|
if (!IsError() && mSize != 0 && IsCPUWritableAtCreation()) {
|
||||||
GetDevice()->ConsumedError(CopyFromStagingBuffer());
|
|
||||||
} else if (mSize != 0) {
|
|
||||||
UnmapImpl();
|
UnmapImpl();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ class BufferBase : public ApiObjectBase {
|
||||||
|
|
||||||
virtual void* GetMappedPointer() = 0;
|
virtual void* GetMappedPointer() = 0;
|
||||||
void* GetMappedRange(size_t offset, size_t size, bool writable = true);
|
void* GetMappedRange(size_t offset, size_t size, bool writable = true);
|
||||||
void Unmap();
|
MaybeError Unmap();
|
||||||
|
|
||||||
// Dawn API
|
// Dawn API
|
||||||
void APIMapAsync(wgpu::MapMode mode,
|
void APIMapAsync(wgpu::MapMode mode,
|
||||||
|
|
|
@ -498,7 +498,7 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
|
||||||
|
|
||||||
// Fill the buffer with clear color
|
// Fill the buffer with clear color
|
||||||
memset(srcBuffer->GetMappedRange(0, bufferSize), clearColor, bufferSize);
|
memset(srcBuffer->GetMappedRange(0, bufferSize), clearColor, bufferSize);
|
||||||
srcBuffer->Unmap();
|
DAWN_TRY(srcBuffer->Unmap());
|
||||||
|
|
||||||
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, srcBuffer->GetHandle());
|
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, srcBuffer->GetHandle());
|
||||||
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
|
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
|
||||||
|
|
|
@ -53,7 +53,7 @@ ResultOrError<Ref<BufferBase>> CreateBufferFromData(DeviceBase* device,
|
||||||
Ref<BufferBase> buffer;
|
Ref<BufferBase> buffer;
|
||||||
DAWN_TRY_ASSIGN(buffer, device->CreateBuffer(&descriptor));
|
DAWN_TRY_ASSIGN(buffer, device->CreateBuffer(&descriptor));
|
||||||
memcpy(buffer->GetMappedRange(0, size), data, size);
|
memcpy(buffer->GetMappedRange(0, size), data, size);
|
||||||
buffer->Unmap();
|
DAWN_TRY(buffer->Unmap());
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue