diff --git a/wgpu-core/src/device/queue.rs b/wgpu-core/src/device/queue.rs index 093aa571b..36bff29bb 100644 --- a/wgpu-core/src/device/queue.rs +++ b/wgpu-core/src/device/queue.rs @@ -256,7 +256,7 @@ impl PendingWrites { self.temp_resources.push(resource); } - fn consume(&mut self, buffer: StagingBuffer) { + pub fn consume(&mut self, buffer: StagingBuffer) { self.temp_resources .push(TempResource::StagingBuffer(buffer)); } diff --git a/wgpu-core/src/resource.rs b/wgpu-core/src/resource.rs index 08941d6a2..794b219a9 100644 --- a/wgpu-core/src/resource.rs +++ b/wgpu-core/src/resource.rs @@ -669,12 +669,12 @@ impl Buffer { } let _ = ptr; - if !staging_buffer.is_coherent { - unsafe { - device - .raw() - .flush_mapped_ranges(staging_buffer.raw(), iter::once(0..self.size)); - } + let mut pending_writes = device.pending_writes.lock(); + let pending_writes = pending_writes.as_mut().unwrap(); + + if let Err(e) = unsafe { staging_buffer.flush() } { + pending_writes.consume(staging_buffer); + return Err(e.into()); } self.use_at(device.active_submission_index.load(Ordering::Relaxed) + 1); @@ -691,8 +691,6 @@ impl Buffer { buffer: raw_buf, usage: hal::BufferUses::empty()..hal::BufferUses::COPY_DST, }; - let mut pending_writes = device.pending_writes.lock(); - let pending_writes = pending_writes.as_mut().unwrap(); let encoder = pending_writes.activate(); unsafe { encoder.transition_buffers( @@ -706,7 +704,7 @@ impl Buffer { ); } } - pending_writes.consume_temp(queue::TempResource::StagingBuffer(staging_buffer)); + pending_writes.consume(staging_buffer); pending_writes.insert_buffer(self); } BufferMapState::Idle => { @@ -866,7 +864,7 @@ pub struct StagingBuffer { raw: ManuallyDrop, device: Arc>, pub(crate) size: wgt::BufferSize, - pub(crate) is_coherent: bool, + is_coherent: bool, } impl StagingBuffer {