Skip to content

Commit 4d285d8

Browse files
committed
remove the Mutex around StagingBuffer's internal buffer
1 parent a0c185a commit 4d285d8

File tree

3 files changed

+27
-36
lines changed

3 files changed

+27
-36
lines changed

wgpu-core/src/device/queue.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
hal_label,
1515
id::{self, QueueId},
1616
init_tracker::{has_copy_partial_init_tracker_coverage, TextureInitRange},
17-
lock::{rank, Mutex, RwLockWriteGuard},
17+
lock::RwLockWriteGuard,
1818
resource::{
1919
Buffer, BufferAccessError, BufferMapState, DestroyedBuffer, DestroyedResourceError,
2020
DestroyedTexture, Labeled, ParentDevice, ResourceErrorIdent, StagingBuffer, Texture,
@@ -29,7 +29,8 @@ use hal::{CommandEncoder as _, Device as _, Queue as _};
2929
use smallvec::SmallVec;
3030

3131
use std::{
32-
iter, mem,
32+
iter,
33+
mem::{self, ManuallyDrop},
3334
ptr::{self, NonNull},
3435
sync::{atomic::Ordering, Arc},
3536
};
@@ -329,7 +330,7 @@ pub(crate) fn prepare_staging_buffer<A: HalApi>(
329330
let mapping = unsafe { device.raw().map_buffer(&buffer, 0..size.get()) }?;
330331

331332
let staging_buffer = StagingBuffer {
332-
raw: Mutex::new(rank::STAGING_BUFFER_RAW, Some(buffer)),
333+
raw: ManuallyDrop::new(buffer),
333334
device: device.clone(),
334335
size,
335336
is_coherent: mapping.is_coherent,
@@ -341,14 +342,9 @@ pub(crate) fn prepare_staging_buffer<A: HalApi>(
341342
impl<A: HalApi> StagingBuffer<A> {
342343
unsafe fn flush(&self, device: &A::Device) -> Result<(), DeviceError> {
343344
if !self.is_coherent {
344-
unsafe {
345-
device.flush_mapped_ranges(
346-
self.raw.lock().as_ref().unwrap(),
347-
iter::once(0..self.size.get()),
348-
)
349-
};
345+
unsafe { device.flush_mapped_ranges(self.raw(), iter::once(0..self.size.get())) };
350346
}
351-
unsafe { device.unmap_buffer(self.raw.lock().as_ref().unwrap())? };
347+
unsafe { device.unmap_buffer(self.raw())? };
352348
Ok(())
353349
}
354350
}
@@ -630,20 +626,15 @@ impl Global {
630626
dst_offset: buffer_offset,
631627
size: staging_buffer.size,
632628
};
633-
let inner_buffer = staging_buffer.raw.lock();
634629
let barriers = iter::once(hal::BufferBarrier {
635-
buffer: inner_buffer.as_ref().unwrap(),
630+
buffer: staging_buffer.raw(),
636631
usage: hal::BufferUses::MAP_WRITE..hal::BufferUses::COPY_SRC,
637632
})
638633
.chain(transition.map(|pending| pending.into_hal(&dst, &snatch_guard)));
639634
let encoder = pending_writes.activate();
640635
unsafe {
641636
encoder.transition_buffers(barriers);
642-
encoder.copy_buffer_to_buffer(
643-
inner_buffer.as_ref().unwrap(),
644-
dst_raw,
645-
iter::once(region),
646-
);
637+
encoder.copy_buffer_to_buffer(staging_buffer.raw(), dst_raw, iter::once(region));
647638
}
648639

649640
pending_writes.insert_buffer(&dst);
@@ -890,9 +881,8 @@ impl Global {
890881
});
891882

892883
{
893-
let inner_buffer = staging_buffer.raw.lock();
894884
let barrier = hal::BufferBarrier {
895-
buffer: inner_buffer.as_ref().unwrap(),
885+
buffer: staging_buffer.raw(),
896886
usage: hal::BufferUses::MAP_WRITE..hal::BufferUses::COPY_SRC,
897887
};
898888

@@ -904,7 +894,7 @@ impl Global {
904894
unsafe {
905895
encoder.transition_textures(transition.map(|pending| pending.into_hal(dst_raw)));
906896
encoder.transition_buffers(iter::once(barrier));
907-
encoder.copy_buffer_to_texture(inner_buffer.as_ref().unwrap(), dst_raw, regions);
897+
encoder.copy_buffer_to_texture(staging_buffer.raw(), dst_raw, regions);
908898
}
909899
}
910900

wgpu-core/src/lock/rank.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ define_lock_ranks! {
143143
rank RENDER_BUNDLE_SCOPE_QUERY_SETS "RenderBundleScope::query_sets" followed by { }
144144
rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
145145
rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
146-
rank STAGING_BUFFER_RAW "StagingBuffer::raw" followed by { }
147146
rank STATELESS_BIND_GROUP_STATE_RESOURCES "StatelessBindGroupState::resources" followed by { }
148147
rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
149148
rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }

wgpu-core/src/resource.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ use thiserror::Error;
2424
use std::{
2525
borrow::Borrow,
2626
fmt::Debug,
27-
iter, mem,
27+
iter,
28+
mem::{self, ManuallyDrop},
2829
ops::Range,
2930
ptr::NonNull,
3031
sync::{
@@ -668,13 +669,11 @@ impl<A: HalApi> Buffer<A> {
668669
}
669670
let _ = ptr;
670671

671-
let raw_staging_buffer_guard = staging_buffer.raw.lock();
672-
let raw_staging_buffer = raw_staging_buffer_guard.as_ref().unwrap();
673672
if !staging_buffer.is_coherent {
674673
unsafe {
675674
device
676675
.raw()
677-
.flush_mapped_ranges(raw_staging_buffer, iter::once(0..self.size));
676+
.flush_mapped_ranges(staging_buffer.raw(), iter::once(0..self.size));
678677
}
679678
}
680679

@@ -685,7 +684,7 @@ impl<A: HalApi> Buffer<A> {
685684
size,
686685
});
687686
let transition_src = hal::BufferBarrier {
688-
buffer: raw_staging_buffer,
687+
buffer: staging_buffer.raw(),
689688
usage: hal::BufferUses::MAP_WRITE..hal::BufferUses::COPY_SRC,
690689
};
691690
let transition_dst = hal::BufferBarrier {
@@ -701,13 +700,12 @@ impl<A: HalApi> Buffer<A> {
701700
);
702701
if self.size > 0 {
703702
encoder.copy_buffer_to_buffer(
704-
raw_staging_buffer,
703+
staging_buffer.raw(),
705704
raw_buf,
706705
region.into_iter(),
707706
);
708707
}
709708
}
710-
drop(raw_staging_buffer_guard);
711709
pending_writes.consume_temp(queue::TempResource::StagingBuffer(staging_buffer));
712710
pending_writes.insert_buffer(self);
713711
}
@@ -865,21 +863,25 @@ impl<A: HalApi> Drop for DestroyedBuffer<A> {
865863
/// [`Device::pending_writes`]: crate::device::Device
866864
#[derive(Debug)]
867865
pub struct StagingBuffer<A: HalApi> {
868-
pub(crate) raw: Mutex<Option<A::Buffer>>,
866+
pub(crate) raw: ManuallyDrop<A::Buffer>,
869867
pub(crate) device: Arc<Device<A>>,
870868
pub(crate) size: wgt::BufferSize,
871869
pub(crate) is_coherent: bool,
872870
}
873871

872+
impl<A: HalApi> StagingBuffer<A> {
873+
pub(crate) fn raw(&self) -> &A::Buffer {
874+
&self.raw
875+
}
876+
}
877+
874878
impl<A: HalApi> Drop for StagingBuffer<A> {
875879
fn drop(&mut self) {
876-
if let Some(raw) = self.raw.lock().take() {
877-
resource_log!("Destroy raw {}", self.error_ident());
878-
unsafe {
879-
use hal::Device;
880-
self.device.raw().destroy_buffer(raw);
881-
}
882-
}
880+
use hal::Device;
881+
resource_log!("Destroy raw {}", self.error_ident());
882+
// SAFETY: We are in the Drop impl and we don't use self.raw anymore after this point.
883+
let raw = unsafe { ManuallyDrop::take(&mut self.raw) };
884+
unsafe { self.device.raw().destroy_buffer(raw) };
883885
}
884886
}
885887

0 commit comments

Comments
 (0)