mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
Remove lifetime from BufferSlice, BufferView, BufferViewMut (#8046)
This commit is contained in:
parent
b9f66e77e5
commit
f04b3b020f
@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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() },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user