mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
Avoid panic when requesting to unmap a buffer that is pending mapping
This commit is contained in:
parent
c3a18c3d8b
commit
c82a3a77d2
@ -698,6 +698,8 @@ impl<B: GfxBackend> LifetimeTracker<B> {
|
||||
resource::BufferMapState::Idle,
|
||||
) {
|
||||
resource::BufferMapState::Waiting(pending_mapping) => pending_mapping,
|
||||
// Mapping cancelled
|
||||
resource::BufferMapState::Idle => continue,
|
||||
_ => panic!("No pending mapping."),
|
||||
};
|
||||
let status = if mapping.range.start != mapping.range.end {
|
||||
|
||||
@ -4560,10 +4560,10 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn buffer_unmap<B: GfxBackend>(
|
||||
fn buffer_unmap_inner<B: GfxBackend>(
|
||||
&self,
|
||||
buffer_id: id::BufferId,
|
||||
) -> Result<(), resource::BufferAccessError> {
|
||||
) -> Result<Option<BufferMapPendingCallback>, resource::BufferAccessError> {
|
||||
span!(_guard, INFO, "Device::buffer_unmap");
|
||||
|
||||
let hub = B::hub(self);
|
||||
@ -4645,7 +4645,9 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
||||
resource::BufferMapState::Idle => {
|
||||
return Err(resource::BufferAccessError::NotMapped);
|
||||
}
|
||||
resource::BufferMapState::Waiting(_) => {}
|
||||
resource::BufferMapState::Waiting(pending) => {
|
||||
return Ok(Some((pending.op, resource::BufferMapAsyncStatus::Aborted)));
|
||||
}
|
||||
resource::BufferMapState::Active {
|
||||
ptr,
|
||||
sub_range,
|
||||
@ -4671,6 +4673,15 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
||||
unmap_buffer(&device.raw, buffer)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
pub fn buffer_unmap<B: GfxBackend>(
|
||||
&self,
|
||||
buffer_id: id::BufferId,
|
||||
) -> Result<(), resource::BufferAccessError> {
|
||||
self.buffer_unmap_inner::<B>(buffer_id)
|
||||
//Note: outside inner function so no locks are held when calling the callback
|
||||
.map(|pending_callback| fire_map_callbacks(pending_callback.into_iter()))
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,6 +76,7 @@ bitflags::bitflags! {
|
||||
pub enum BufferMapAsyncStatus {
|
||||
Success,
|
||||
Error,
|
||||
Aborted,
|
||||
Unknown,
|
||||
ContextLost,
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user