Skip to main content

MaterialBindGroupAllocator

Enum MaterialBindGroupAllocator 

Source
pub enum MaterialBindGroupAllocator {
    Bindless(Box<MaterialBindGroupBindlessAllocator>),
    NonBindless(Box<MaterialBindGroupNonBindlessAllocator>),
}
Expand description

The allocator that manages a specific material.

Variants§

§

Bindless(Box<MaterialBindGroupBindlessAllocator>)

The allocator used when the material is bindless.

§

NonBindless(Box<MaterialBindGroupNonBindlessAllocator>)

The allocator used when the material is non-bindless.

Implementations§

Source§

impl MaterialBindGroupAllocator

Source

pub fn new( render_device: &RenderDevice, label: &'static str, bindless_descriptor: Option<BindlessDescriptor>, bind_group_layout: BindGroupLayoutDescriptor, slab_capacity: Option<BindlessSlabResourceLimit>, ) -> MaterialBindGroupAllocator

Creates a new MaterialBindGroupAllocator managing the data for a single material.

Source

pub fn get(&self, group: MaterialBindGroupIndex) -> Option<MaterialSlab<'_>>

Returns the slab with the given index, if one exists.

Source

pub fn allocate_unprepared( &mut self, unprepared_bind_group: &mut BindGroupBuilder, bind_group_layout: &BindGroupLayoutDescriptor, ) -> MaterialBindingId

Allocates the resources within a BindGroupBuilder and returns the resulting binding ID.

This method should generally be preferred over Self::allocate_prepared, because this method supports both bindless and non-bindless bind groups. Only use Self::allocate_prepared if you need to prepare the bind group yourself.

Source

pub fn allocate_prepared( &mut self, prepared_bind_group: PreparedBindGroup, bind_group_layout: BindGroupLayoutDescriptor, ) -> MaterialBindingId

Places a pre-prepared bind group into a slab.

For bindless materials, the allocator internally manages the bind groups, so calling this method will panic if this is a bindless allocator. Only non-bindless allocators support this method.

It’s generally preferred to use Self::allocate_unprepared, because that method supports both bindless and non-bindless allocators. Only use this method if you need to prepare the bind group yourself.

Source

pub fn free(&mut self, material_binding_id: MaterialBindingId)

Deallocates the material with the given binding ID.

Any resources that are no longer referenced are removed from the slab.

Source

pub fn try_update_data( &mut self, existing_binding_id: MaterialBindingId, unprepared_bind_group: &mut BindGroupBuilder, ) -> bool

Attempts to replace the given existing_binding_id with a new material, without actually reallocating any GPU resources.

That is, if the given unprepared_bind_group represents exactly the same GPU resource bindings as the already-allocated material, this method updates the POD only and returns true. Otherwise, if the supplied bind group represents different resources, this method returns false.

This is an optional fast path to handle POD-only material changes. If this method returns false, then the caller should call Self::free and Self::allocate_unprepared to reallocate the GPU resources.

Source

pub fn prepare_bind_groups( &mut self, render_device: &RenderDevice, pipeline_cache: &PipelineCache, fallback_bindless_resources: &FallbackBindlessResources, fallback_image: &FallbackImage, fallback_buffer: &FallbackBuffer, shader_buffer_assets: &RenderAssets<GpuShaderBuffer>, changed_shader_buffers: &RenderChangedShaderBuffers, )

Recreates any bind groups corresponding to slabs that have been modified since last calling MaterialBindGroupAllocator::prepare_bind_groups.

Source

pub fn write_buffers( &mut self, render_device: &RenderDevice, render_queue: &RenderQueue, )

Uploads the contents of all buffers that this MaterialBindGroupAllocator manages to the GPU.

Non-bindless allocators don’t currently manage any buffers, so this method only has an effect for bindless allocators.

Source

pub fn slab_count(&self) -> usize

Get number of allocated slabs for bindless material, returns 0 if it is Self::NonBindless.

Source

pub fn slabs_size(&self) -> usize

Get total size of slabs allocated for bindless material, returns 0 if it is Self::NonBindless.

Source

pub fn allocations(&self) -> u64

Get number of bindless material allocations in slabs, returns 0 if it is Self::NonBindless.

Auto Trait Implementations§

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, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

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

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

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.
Source§

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

Source§

impl<T> WasmNotSendSync for T

Source§

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

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more