wgpu_hal

Struct BufferBinding

Source
pub struct BufferBinding<'a, B: DynBuffer + ?Sized> {
    pub(crate) buffer: &'a B,
    pub offset: BufferAddress,
    pub size: Option<BufferSize>,
}
Expand description

A region of a buffer made visible to shaders via a BindGroup.

§Construction

The recommended way to construct a BufferBinding is using the binding method on a wgpu-core Buffer, which will validate the binding size against the buffer size. A new_unchecked constructor is also provided for cases where direct construction is necessary.

§Accessible region

wgpu_hal guarantees that shaders compiled with ShaderModuleDescriptor::runtime_checks set to true cannot read or write data via this binding outside the accessible region of a buffer:

Note that this guarantee is stricter than WGSL’s requirements for out-of-bounds accesses, as WGSL allows them to return values from elsewhere in the buffer. But this guarantee is necessary anyway, to permit wgpu-core to avoid clearing uninitialized regions of buffers that will never be read by the application before they are overwritten. This optimization consults bind group buffer binding regions to determine which parts of which buffers shaders might observe. This optimization is only sound if shader access is bounds-checked.

§Zero-length bindings

Some back ends cannot tolerate zero-length regions; for example, see VUID-VkDescriptorBufferInfo-offset-00340 and VUID-VkDescriptorBufferInfo-range-00341, or the documentation for GLES’s glBindBufferRange. This documentation previously stated that a BufferBinding must have offset strictly less than the size of the buffer, but this restriction was not honored elsewhere in the code, so has been removed. However, it remains the case that some backends do not support zero-length bindings, so additional logic is needed somewhere to handle this properly. See #3170.

Fields§

§buffer: &'a B

The buffer being bound.

This is not fully pub to prevent direct construction of BufferBindings, while still allowing public read access to the offset and size properties.

§offset: BufferAddress

The offset at which the bound region starts.

This must be less or equal to the size of the buffer.

§size: Option<BufferSize>

The size of the region bound, in bytes.

If None, the region extends from offset to the end of the buffer. Given the restrictions on offset, this means that the size is always greater than zero.

Implementations§

Source§

impl<'a> BufferBinding<'a, dyn DynBuffer>

Source

pub fn expect_downcast<B: DynBuffer>(self) -> BufferBinding<'a, B>

Source§

impl<'a, B: DynBuffer + ?Sized> BufferBinding<'a, B>

Source

pub fn new_unchecked<S: Into<Option<NonZeroU64>>>( buffer: &'a B, offset: BufferAddress, size: S, ) -> Self

Construct a BufferBinding with the given contents.

When possible, use the binding method on a wgpu-core Buffer instead of this method. Buffer::binding validates the size of the binding against the size of the buffer.

It is more difficult to provide a validating constructor here, due to not having direct access to the size of a DynBuffer.

SAFETY: The caller is responsible for ensuring that a binding of size bytes starting at offset is contained within the buffer.

The S type parameter is a temporary convenience to allow callers to pass a zero size. When the zero-size binding issue is resolved, the argument should just match the type of the member. TODO(https://github.com/gfx-rs/wgpu/issues/3170): remove the parameter

Trait Implementations§

Source§

impl<B: DynBuffer + ?Sized> Clone for BufferBinding<'_, B>

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a, B: Debug + DynBuffer + ?Sized> Debug for BufferBinding<'a, B>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, B> Freeze for BufferBinding<'a, B>
where B: ?Sized,

§

impl<'a, B> RefUnwindSafe for BufferBinding<'a, B>
where B: RefUnwindSafe + ?Sized,

§

impl<'a, B> Send for BufferBinding<'a, B>
where B: ?Sized,

§

impl<'a, B> Sync for BufferBinding<'a, B>
where B: ?Sized,

§

impl<'a, B> Unpin for BufferBinding<'a, B>
where B: ?Sized,

§

impl<'a, B> UnwindSafe for BufferBinding<'a, B>
where B: RefUnwindSafe + ?Sized,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,