Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions tests/tests/wgpu-gpu/timestamp_normalization/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,5 @@ fn process_shader(ctx: TestingContext, inputs: &[u8], entry_point_src: &str) ->

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

let value = pulldown_buffer.get_mapped_range(..).to_vec();

value
pulldown_buffer.get_mapped_range(..).to_vec()
}
59 changes: 32 additions & 27 deletions wgpu/src/api/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ impl Buffer {
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
///
/// [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()
}

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

Expand Down Expand Up @@ -518,11 +515,13 @@ impl<'a> BufferSlice<'a> {
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
///
/// [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 range = self.buffer.inner.get_mapped_range(self.offset..end);
BufferView {
slice: *self,
buffer: self.buffer.clone(),
size: self.size,
offset: self.offset,
inner: range,
}
}
Expand All @@ -544,11 +543,13 @@ impl<'a> BufferSlice<'a> {
/// - If you try to create overlapping views of a buffer, mutable or otherwise.
///
/// [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 range = self.buffer.inner.get_mapped_range(self.offset..end);
BufferViewMut {
slice: *self,
buffer: self.buffer.clone(),
size: self.size,
offset: self.offset,
inner: range,
readable: self.buffer.usage.contains(BufferUsages::MAP_READ),
}
Expand Down Expand Up @@ -725,13 +726,16 @@ static_assertions::assert_impl_all!(MapMode: Send, Sync);
/// [map]: Buffer#mapping-buffers
/// [`map_async`]: BufferSlice::map_async
#[derive(Debug)]
pub struct BufferView<'a> {
slice: BufferSlice<'a>,
pub struct BufferView {
// `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
buffer: Buffer,
offset: BufferAddress,
size: BufferSize,
inner: dispatch::DispatchBufferMappedRange,
}

#[cfg(webgpu)]
impl BufferView<'_> {
impl BufferView {
/// 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
/// the Rust / wasm heap.
Expand All @@ -740,7 +744,7 @@ impl BufferView<'_> {
}
}

impl core::ops::Deref for BufferView<'_> {
impl core::ops::Deref for BufferView {
type Target = [u8];

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

impl AsRef<[u8]> for BufferView<'_> {
impl AsRef<[u8]> for BufferView {
#[inline]
fn as_ref(&self) -> &[u8] {
self.inner.slice()
Expand All @@ -775,20 +779,23 @@ impl AsRef<[u8]> for BufferView<'_> {
///
/// [map]: Buffer#mapping-buffers
#[derive(Debug)]
pub struct BufferViewMut<'a> {
slice: BufferSlice<'a>,
pub struct BufferViewMut {
// `buffer, offset, size` are similar to `BufferSlice`, except that they own the buffer.
buffer: Buffer,
offset: BufferAddress,
size: BufferSize,
inner: dispatch::DispatchBufferMappedRange,
readable: bool,
}

impl AsMut<[u8]> for BufferViewMut<'_> {
impl AsMut<[u8]> for BufferViewMut {
#[inline]
fn as_mut(&mut self) -> &mut [u8] {
self.inner.slice_mut()
}
}

impl Deref for BufferViewMut<'_> {
impl Deref for BufferViewMut {
type Target = [u8];

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

impl DerefMut for BufferViewMut<'_> {
impl DerefMut for BufferViewMut {
fn deref_mut(&mut self) -> &mut Self::Target {
self.inner.slice_mut()
}
}

impl Drop for BufferView<'_> {
impl Drop for BufferView {
fn drop(&mut self) {
self.slice
.buffer
self.buffer
.map_context
.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) {
self.slice
.buffer
self.buffer
.map_context
.lock()
.remove(self.slice.offset, self.slice.size);
.remove(self.offset, self.size);
}
}

Expand Down
2 changes: 1 addition & 1 deletion wgpu/src/util/belt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl StagingBelt {
offset: BufferAddress,
size: BufferSize,
device: &Device,
) -> BufferViewMut<'_> {
) -> BufferViewMut {
let slice_of_belt = self.allocate(
size,
const { BufferSize::new(crate::COPY_BUFFER_ALIGNMENT).unwrap() },
Expand Down
Loading