mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 16:37:08 +00:00
dawn_wire: Correctly handle buffer state changes on Destroy()
The server didn't take intercept the destroy() call which meant the buffer could be unmapped by dawn_native without the status updated in ServerBuffer. This caused crash when a subsequent UpdateMappedData command was handled and tried to write into the mapped buffer. The client needs to also track destroy() otherwise it could sent an UpdateMappedData to a destroyed buffer which is a fatal error. Tests are added that cover the client-server interaction for this, but the pattern that the following is unfortunately not tested directly against the wire server: - CreateBufferMapped - Destroy - UpdateMappedData Bug: chromium:1068466 Change-Id: If5185d4a8a81cd5f6bb41c9888a18c44c14b2de4 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/18961 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
9d2de1d6d4
commit
36cd17488a
@@ -31,6 +31,19 @@ namespace dawn_wire { namespace server {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Server::PreHandleBufferDestroy(const BufferDestroyCmd& cmd) {
|
||||
// Destroying a buffer does an implicit unmapping.
|
||||
auto* buffer = BufferObjects().Get(cmd.selfId);
|
||||
DAWN_ASSERT(buffer != nullptr);
|
||||
|
||||
// The buffer was destroyed. Clear the Read/WriteHandle.
|
||||
buffer->readHandle = nullptr;
|
||||
buffer->writeHandle = nullptr;
|
||||
buffer->mapWriteState = BufferMapWriteState::Unmapped;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Server::DoBufferMapAsync(ObjectId bufferId,
|
||||
uint32_t requestSerial,
|
||||
bool isWrite,
|
||||
|
||||
Reference in New Issue
Block a user