Skip to content

Commit f04b3b0

Browse files
authored
Remove lifetime from BufferSlice, BufferView, BufferViewMut (#8046)
1 parent b9f66e7 commit f04b3b0

File tree

3 files changed

+34
-31
lines changed

3 files changed

+34
-31
lines changed

tests/tests/wgpu-gpu/timestamp_normalization/utils.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,5 @@ fn process_shader(ctx: TestingContext, inputs: &[u8], entry_point_src: &str) ->
282282

283283
ctx.device.poll(wgpu::PollType::Wait).unwrap();
284284

285-
let value = pulldown_buffer.get_mapped_range(..).to_vec();
286-
287-
value
285+
pulldown_buffer.get_mapped_range(..).to_vec()
288286
}

wgpu/src/api/buffer.rs

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ impl Buffer {
354354
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
355355
///
356356
/// [mapped]: Buffer#mapping-buffers
357-
pub fn get_mapped_range<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferView<'_> {
357+
pub fn get_mapped_range<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferView {
358358
self.slice(bounds).get_mapped_range()
359359
}
360360

@@ -377,10 +377,7 @@ impl Buffer {
377377
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
378378
///
379379
/// [mapped]: Buffer#mapping-buffers
380-
pub fn get_mapped_range_mut<S: RangeBounds<BufferAddress>>(
381-
&self,
382-
bounds: S,
383-
) -> BufferViewMut<'_> {
380+
pub fn get_mapped_range_mut<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferViewMut {
384381
self.slice(bounds).get_mapped_range_mut()
385382
}
386383

@@ -518,11 +515,13 @@ impl<'a> BufferSlice<'a> {
518515
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
519516
///
520517
/// [mapped]: Buffer#mapping-buffers
521-
pub fn get_mapped_range(&self) -> BufferView<'a> {
518+
pub fn get_mapped_range(&self) -> BufferView {
522519
let end = self.buffer.map_context.lock().add(self.offset, self.size);
523520
let range = self.buffer.inner.get_mapped_range(self.offset..end);
524521
BufferView {
525-
slice: *self,
522+
buffer: self.buffer.clone(),
523+
size: self.size,
524+
offset: self.offset,
526525
inner: range,
527526
}
528527
}
@@ -544,11 +543,13 @@ impl<'a> BufferSlice<'a> {
544543
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
545544
///
546545
/// [mapped]: Buffer#mapping-buffers
547-
pub fn get_mapped_range_mut(&self) -> BufferViewMut<'a> {
546+
pub fn get_mapped_range_mut(&self) -> BufferViewMut {
548547
let end = self.buffer.map_context.lock().add(self.offset, self.size);
549548
let range = self.buffer.inner.get_mapped_range(self.offset..end);
550549
BufferViewMut {
551-
slice: *self,
550+
buffer: self.buffer.clone(),
551+
size: self.size,
552+
offset: self.offset,
552553
inner: range,
553554
readable: self.buffer.usage.contains(BufferUsages::MAP_READ),
554555
}
@@ -725,13 +726,16 @@ static_assertions::assert_impl_all!(MapMode: Send, Sync);
725726
/// [map]: Buffer#mapping-buffers
726727
/// [`map_async`]: BufferSlice::map_async
727728
#[derive(Debug)]
728-
pub struct BufferView<'a> {
729-
slice: BufferSlice<'a>,
729+
pub struct BufferView {
730+
// `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
731+
buffer: Buffer,
732+
offset: BufferAddress,
733+
size: BufferSize,
730734
inner: dispatch::DispatchBufferMappedRange,
731735
}
732736

733737
#[cfg(webgpu)]
734-
impl BufferView<'_> {
738+
impl BufferView {
735739
/// Provides the same data as dereferencing the view, but as a `Uint8Array` in js.
736740
/// This can be MUCH faster than dereferencing the view which copies the data into
737741
/// the Rust / wasm heap.
@@ -740,7 +744,7 @@ impl BufferView<'_> {
740744
}
741745
}
742746

743-
impl core::ops::Deref for BufferView<'_> {
747+
impl core::ops::Deref for BufferView {
744748
type Target = [u8];
745749

746750
#[inline]
@@ -749,7 +753,7 @@ impl core::ops::Deref for BufferView<'_> {
749753
}
750754
}
751755

752-
impl AsRef<[u8]> for BufferView<'_> {
756+
impl AsRef<[u8]> for BufferView {
753757
#[inline]
754758
fn as_ref(&self) -> &[u8] {
755759
self.inner.slice()
@@ -775,20 +779,23 @@ impl AsRef<[u8]> for BufferView<'_> {
775779
///
776780
/// [map]: Buffer#mapping-buffers
777781
#[derive(Debug)]
778-
pub struct BufferViewMut<'a> {
779-
slice: BufferSlice<'a>,
782+
pub struct BufferViewMut {
783+
// `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
784+
buffer: Buffer,
785+
offset: BufferAddress,
786+
size: BufferSize,
780787
inner: dispatch::DispatchBufferMappedRange,
781788
readable: bool,
782789
}
783790

784-
impl AsMut<[u8]> for BufferViewMut<'_> {
791+
impl AsMut<[u8]> for BufferViewMut {
785792
#[inline]
786793
fn as_mut(&mut self) -> &mut [u8] {
787794
self.inner.slice_mut()
788795
}
789796
}
790797

791-
impl Deref for BufferViewMut<'_> {
798+
impl Deref for BufferViewMut {
792799
type Target = [u8];
793800

794801
fn deref(&self) -> &Self::Target {
@@ -800,29 +807,27 @@ impl Deref for BufferViewMut<'_> {
800807
}
801808
}
802809

803-
impl DerefMut for BufferViewMut<'_> {
810+
impl DerefMut for BufferViewMut {
804811
fn deref_mut(&mut self) -> &mut Self::Target {
805812
self.inner.slice_mut()
806813
}
807814
}
808815

809-
impl Drop for BufferView<'_> {
816+
impl Drop for BufferView {
810817
fn drop(&mut self) {
811-
self.slice
812-
.buffer
818+
self.buffer
813819
.map_context
814820
.lock()
815-
.remove(self.slice.offset, self.slice.size);
821+
.remove(self.offset, self.size);
816822
}
817823
}
818824

819-
impl Drop for BufferViewMut<'_> {
825+
impl Drop for BufferViewMut {
820826
fn drop(&mut self) {
821-
self.slice
822-
.buffer
827+
self.buffer
823828
.map_context
824829
.lock()
825-
.remove(self.slice.offset, self.slice.size);
830+
.remove(self.offset, self.size);
826831
}
827832
}
828833

wgpu/src/util/belt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl StagingBelt {
7777
offset: BufferAddress,
7878
size: BufferSize,
7979
device: &Device,
80-
) -> BufferViewMut<'_> {
80+
) -> BufferViewMut {
8181
let slice_of_belt = self.allocate(
8282
size,
8383
const { BufferSize::new(crate::COPY_BUFFER_ALIGNMENT).unwrap() },

0 commit comments

Comments
 (0)