Remove lifetime from BufferSlice, BufferView, BufferViewMut (#8046)

This commit is contained in:
sagudev 2025-08-10 11:15:36 +02:00 committed by GitHub
parent b9f66e77e5
commit f04b3b020f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 31 deletions

View File

@ -282,7 +282,5 @@ fn process_shader(ctx: TestingContext, inputs: &[u8], entry_point_src: &str) ->
ctx.device.poll(wgpu::PollType::Wait).unwrap(); ctx.device.poll(wgpu::PollType::Wait).unwrap();
let value = pulldown_buffer.get_mapped_range(..).to_vec(); pulldown_buffer.get_mapped_range(..).to_vec()
value
} }

View File

@ -354,7 +354,7 @@ impl Buffer {
/// - If you try to create overlapping views of a buffer, mutable or otherwise. /// - If you try to create overlapping views of a buffer, mutable or otherwise.
/// ///
/// [mapped]: Buffer#mapping-buffers /// [mapped]: Buffer#mapping-buffers
pub fn get_mapped_range<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferView<'_> { pub fn get_mapped_range<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferView {
self.slice(bounds).get_mapped_range() self.slice(bounds).get_mapped_range()
} }
@ -377,10 +377,7 @@ impl Buffer {
/// - If you try to create overlapping views of a buffer, mutable or otherwise. /// - If you try to create overlapping views of a buffer, mutable or otherwise.
/// ///
/// [mapped]: Buffer#mapping-buffers /// [mapped]: Buffer#mapping-buffers
pub fn get_mapped_range_mut<S: RangeBounds<BufferAddress>>( pub fn get_mapped_range_mut<S: RangeBounds<BufferAddress>>(&self, bounds: S) -> BufferViewMut {
&self,
bounds: S,
) -> BufferViewMut<'_> {
self.slice(bounds).get_mapped_range_mut() self.slice(bounds).get_mapped_range_mut()
} }
@ -518,11 +515,13 @@ impl<'a> BufferSlice<'a> {
/// - If you try to create overlapping views of a buffer, mutable or otherwise. /// - If you try to create overlapping views of a buffer, mutable or otherwise.
/// ///
/// [mapped]: Buffer#mapping-buffers /// [mapped]: Buffer#mapping-buffers
pub fn get_mapped_range(&self) -> BufferView<'a> { pub fn get_mapped_range(&self) -> BufferView {
let end = self.buffer.map_context.lock().add(self.offset, self.size); let end = self.buffer.map_context.lock().add(self.offset, self.size);
let range = self.buffer.inner.get_mapped_range(self.offset..end); let range = self.buffer.inner.get_mapped_range(self.offset..end);
BufferView { BufferView {
slice: *self, buffer: self.buffer.clone(),
size: self.size,
offset: self.offset,
inner: range, inner: range,
} }
} }
@ -544,11 +543,13 @@ impl<'a> BufferSlice<'a> {
/// - If you try to create overlapping views of a buffer, mutable or otherwise. /// - If you try to create overlapping views of a buffer, mutable or otherwise.
/// ///
/// [mapped]: Buffer#mapping-buffers /// [mapped]: Buffer#mapping-buffers
pub fn get_mapped_range_mut(&self) -> BufferViewMut<'a> { pub fn get_mapped_range_mut(&self) -> BufferViewMut {
let end = self.buffer.map_context.lock().add(self.offset, self.size); let end = self.buffer.map_context.lock().add(self.offset, self.size);
let range = self.buffer.inner.get_mapped_range(self.offset..end); let range = self.buffer.inner.get_mapped_range(self.offset..end);
BufferViewMut { BufferViewMut {
slice: *self, buffer: self.buffer.clone(),
size: self.size,
offset: self.offset,
inner: range, inner: range,
readable: self.buffer.usage.contains(BufferUsages::MAP_READ), readable: self.buffer.usage.contains(BufferUsages::MAP_READ),
} }
@ -725,13 +726,16 @@ static_assertions::assert_impl_all!(MapMode: Send, Sync);
/// [map]: Buffer#mapping-buffers /// [map]: Buffer#mapping-buffers
/// [`map_async`]: BufferSlice::map_async /// [`map_async`]: BufferSlice::map_async
#[derive(Debug)] #[derive(Debug)]
pub struct BufferView<'a> { pub struct BufferView {
slice: BufferSlice<'a>, // `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
buffer: Buffer,
offset: BufferAddress,
size: BufferSize,
inner: dispatch::DispatchBufferMappedRange, inner: dispatch::DispatchBufferMappedRange,
} }
#[cfg(webgpu)] #[cfg(webgpu)]
impl BufferView<'_> { impl BufferView {
/// Provides the same data as dereferencing the view, but as a `Uint8Array` in js. /// Provides the same data as dereferencing the view, but as a `Uint8Array` in js.
/// This can be MUCH faster than dereferencing the view which copies the data into /// This can be MUCH faster than dereferencing the view which copies the data into
/// the Rust / wasm heap. /// the Rust / wasm heap.
@ -740,7 +744,7 @@ impl BufferView<'_> {
} }
} }
impl core::ops::Deref for BufferView<'_> { impl core::ops::Deref for BufferView {
type Target = [u8]; type Target = [u8];
#[inline] #[inline]
@ -749,7 +753,7 @@ impl core::ops::Deref for BufferView<'_> {
} }
} }
impl AsRef<[u8]> for BufferView<'_> { impl AsRef<[u8]> for BufferView {
#[inline] #[inline]
fn as_ref(&self) -> &[u8] { fn as_ref(&self) -> &[u8] {
self.inner.slice() self.inner.slice()
@ -775,20 +779,23 @@ impl AsRef<[u8]> for BufferView<'_> {
/// ///
/// [map]: Buffer#mapping-buffers /// [map]: Buffer#mapping-buffers
#[derive(Debug)] #[derive(Debug)]
pub struct BufferViewMut<'a> { pub struct BufferViewMut {
slice: BufferSlice<'a>, // `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
buffer: Buffer,
offset: BufferAddress,
size: BufferSize,
inner: dispatch::DispatchBufferMappedRange, inner: dispatch::DispatchBufferMappedRange,
readable: bool, readable: bool,
} }
impl AsMut<[u8]> for BufferViewMut<'_> { impl AsMut<[u8]> for BufferViewMut {
#[inline] #[inline]
fn as_mut(&mut self) -> &mut [u8] { fn as_mut(&mut self) -> &mut [u8] {
self.inner.slice_mut() self.inner.slice_mut()
} }
} }
impl Deref for BufferViewMut<'_> { impl Deref for BufferViewMut {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
@ -800,29 +807,27 @@ impl Deref for BufferViewMut<'_> {
} }
} }
impl DerefMut for BufferViewMut<'_> { impl DerefMut for BufferViewMut {
fn deref_mut(&mut self) -> &mut Self::Target { fn deref_mut(&mut self) -> &mut Self::Target {
self.inner.slice_mut() self.inner.slice_mut()
} }
} }
impl Drop for BufferView<'_> { impl Drop for BufferView {
fn drop(&mut self) { fn drop(&mut self) {
self.slice self.buffer
.buffer
.map_context .map_context
.lock() .lock()
.remove(self.slice.offset, self.slice.size); .remove(self.offset, self.size);
} }
} }
impl Drop for BufferViewMut<'_> { impl Drop for BufferViewMut {
fn drop(&mut self) { fn drop(&mut self) {
self.slice self.buffer
.buffer
.map_context .map_context
.lock() .lock()
.remove(self.slice.offset, self.slice.size); .remove(self.offset, self.size);
} }
} }

View File

@ -77,7 +77,7 @@ impl StagingBelt {
offset: BufferAddress, offset: BufferAddress,
size: BufferSize, size: BufferSize,
device: &Device, device: &Device,
) -> BufferViewMut<'_> { ) -> BufferViewMut {
let slice_of_belt = self.allocate( let slice_of_belt = self.allocate(
size, size,
const { BufferSize::new(crate::COPY_BUFFER_ALIGNMENT).unwrap() }, const { BufferSize::new(crate::COPY_BUFFER_ALIGNMENT).unwrap() },