Skip to content

Commit 347d902

Browse files
committed
introduce FlushedStagingBuffer
1 parent 2f282cd commit 347d902

File tree

2 files changed

+46
-34
lines changed

2 files changed

+46
-34
lines changed

wgpu-core/src/device/queue.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use crate::{
1717
lock::RwLockWriteGuard,
1818
resource::{
1919
Buffer, BufferAccessError, BufferMapState, DestroyedBuffer, DestroyedResourceError,
20-
DestroyedTexture, Labeled, ParentDevice, ResourceErrorIdent, StagingBuffer, Texture,
21-
TextureInner, Trackable,
20+
DestroyedTexture, FlushedStagingBuffer, Labeled, ParentDevice, ResourceErrorIdent,
21+
StagingBuffer, Texture, TextureInner, Trackable,
2222
},
2323
resource_log,
2424
track::{self, Tracker, TrackerIndex},
@@ -136,7 +136,7 @@ pub struct WrappedSubmissionIndex {
136136
/// submission, to be freed when it completes
137137
#[derive(Debug)]
138138
pub enum TempResource<A: HalApi> {
139-
StagingBuffer(StagingBuffer<A>),
139+
StagingBuffer(FlushedStagingBuffer<A>),
140140
DestroyedBuffer(DestroyedBuffer<A>),
141141
DestroyedTexture(DestroyedTexture<A>),
142142
}
@@ -256,7 +256,7 @@ impl<A: HalApi> PendingWrites<A> {
256256
self.temp_resources.push(resource);
257257
}
258258

259-
pub fn consume(&mut self, buffer: StagingBuffer<A>) {
259+
pub fn consume(&mut self, buffer: FlushedStagingBuffer<A>) {
260260
self.temp_resources
261261
.push(TempResource::StagingBuffer(buffer));
262262
}
@@ -409,15 +409,15 @@ impl Global {
409409
let mut pending_writes = device.pending_writes.lock();
410410
let pending_writes = pending_writes.as_mut().unwrap();
411411

412-
unsafe {
412+
let staging_buffer = unsafe {
413413
profiling::scope!("copy");
414414
ptr::copy_nonoverlapping(
415415
data.as_ptr(),
416416
staging_buffer_ptr.as_ptr(),
417417
data_size.get() as usize,
418418
);
419-
staging_buffer.flush();
420-
}
419+
staging_buffer.flush()
420+
};
421421

422422
let result = self.queue_write_staging_buffer_impl(
423423
&queue,
@@ -487,7 +487,7 @@ impl Global {
487487
// user. Platform validation requires that the staging buffer always
488488
// be freed, even if an error occurs. All paths from here must call
489489
// `device.pending_writes.consume`.
490-
unsafe { staging_buffer.flush() };
490+
let staging_buffer = unsafe { staging_buffer.flush() };
491491

492492
let result = self.queue_write_staging_buffer_impl(
493493
&queue,
@@ -552,7 +552,7 @@ impl Global {
552552
queue: &Arc<Queue<A>>,
553553
device: &Arc<Device<A>>,
554554
pending_writes: &mut PendingWrites<A>,
555-
staging_buffer: &StagingBuffer<A>,
555+
staging_buffer: &FlushedStagingBuffer<A>,
556556
buffer_id: id::BufferId,
557557
buffer_offset: u64,
558558
) -> Result<(), QueueWriteError> {
@@ -814,7 +814,7 @@ impl Global {
814814
}
815815
}
816816

817-
unsafe { staging_buffer.flush() };
817+
let staging_buffer = unsafe { staging_buffer.flush() };
818818

819819
let regions = (0..array_layer_count).map(|rel_array_layer| {
820820
let mut texture_base = dst_base.clone();

wgpu-core/src/resource.rs

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ impl<A: HalApi> Buffer<A> {
672672
let mut pending_writes = device.pending_writes.lock();
673673
let pending_writes = pending_writes.as_mut().unwrap();
674674

675-
unsafe { staging_buffer.flush() };
675+
let staging_buffer = unsafe { staging_buffer.flush() };
676676

677677
self.use_at(device.active_submission_index.load(Ordering::Relaxed) + 1);
678678
let region = wgt::BufferSize::new(self.size).map(|size| hal::BufferCopy {
@@ -853,7 +853,7 @@ impl<A: HalApi> Drop for DestroyedBuffer<A> {
853853
/// [`Device::pending_writes`]: crate::device::Device
854854
#[derive(Debug)]
855855
pub struct StagingBuffer<A: HalApi> {
856-
raw: ManuallyDrop<A::Buffer>,
856+
raw: A::Buffer,
857857
device: Arc<Device<A>>,
858858
pub(crate) size: wgt::BufferSize,
859859
is_coherent: bool,
@@ -873,11 +873,11 @@ impl<A: HalApi> StagingBuffer<A> {
873873
memory_flags: hal::MemoryFlags::TRANSIENT,
874874
};
875875

876-
let buffer = unsafe { device.raw().create_buffer(&stage_desc)? };
877-
let mapping = unsafe { device.raw().map_buffer(&buffer, 0..size.get()) }?;
876+
let raw = unsafe { device.raw().create_buffer(&stage_desc)? };
877+
let mapping = unsafe { device.raw().map_buffer(&raw, 0..size.get()) }?;
878878

879879
let staging_buffer = StagingBuffer {
880-
raw: ManuallyDrop::new(buffer),
880+
raw,
881881
device: device.clone(),
882882
size,
883883
is_coherent: mapping.is_coherent,
@@ -886,40 +886,52 @@ impl<A: HalApi> StagingBuffer<A> {
886886
Ok((staging_buffer, mapping.ptr))
887887
}
888888

889-
pub(crate) fn raw(&self) -> &A::Buffer {
890-
&self.raw
891-
}
892-
893-
pub(crate) unsafe fn flush(&self) {
889+
pub(crate) fn flush(self) -> FlushedStagingBuffer<A> {
894890
use hal::Device;
895891
let device = self.device.raw();
896892
if !self.is_coherent {
897-
unsafe { device.flush_mapped_ranges(self.raw(), iter::once(0..self.size.get())) };
893+
unsafe { device.flush_mapped_ranges(&self.raw, iter::once(0..self.size.get())) };
894+
}
895+
unsafe { device.unmap_buffer(&self.raw) };
896+
897+
let StagingBuffer {
898+
raw, device, size, ..
899+
} = self;
900+
901+
FlushedStagingBuffer {
902+
raw: ManuallyDrop::new(raw),
903+
device,
904+
size,
898905
}
899-
unsafe { device.unmap_buffer(self.raw()) };
900906
}
901907
}
902908

903-
impl<A: HalApi> Drop for StagingBuffer<A> {
909+
crate::impl_resource_type!(StagingBuffer);
910+
crate::impl_storage_item!(StagingBuffer);
911+
912+
#[derive(Debug)]
913+
pub struct FlushedStagingBuffer<A: HalApi> {
914+
raw: ManuallyDrop<A::Buffer>,
915+
device: Arc<Device<A>>,
916+
pub(crate) size: wgt::BufferSize,
917+
}
918+
919+
impl<A: HalApi> FlushedStagingBuffer<A> {
920+
pub(crate) fn raw(&self) -> &A::Buffer {
921+
&self.raw
922+
}
923+
}
924+
925+
impl<A: HalApi> Drop for FlushedStagingBuffer<A> {
904926
fn drop(&mut self) {
905927
use hal::Device;
906-
resource_log!("Destroy raw {}", self.error_ident());
928+
resource_log!("Destroy raw StagingBuffer");
907929
// SAFETY: We are in the Drop impl and we don't use self.raw anymore after this point.
908930
let raw = unsafe { ManuallyDrop::take(&mut self.raw) };
909931
unsafe { self.device.raw().destroy_buffer(raw) };
910932
}
911933
}
912934

913-
crate::impl_resource_type!(StagingBuffer);
914-
// TODO: add label
915-
impl<A: HalApi> Labeled for StagingBuffer<A> {
916-
fn label(&self) -> &str {
917-
""
918-
}
919-
}
920-
crate::impl_parent_device!(StagingBuffer);
921-
crate::impl_storage_item!(StagingBuffer);
922-
923935
pub type TextureDescriptor<'a> = wgt::TextureDescriptor<Label<'a>, Vec<wgt::TextureFormat>>;
924936

925937
#[derive(Debug)]

0 commit comments

Comments
 (0)