pub struct EntitySpecializationTickPair {
pub system_tick: Tick,
pub material_instances_tick: Tick,
}Expand description
Ticks that specify the last time an entity’s pipeline was specialized.
We need two different types of ticks here for a subtle reason. First, we
need the Self::system_tick, which maps to Bevy’s SystemChangeTick,
because that’s what we use in specialize_material_meshes to check
whether pipelines need specialization. But we also need
Self::material_instances_tick, which maps to the
RenderMaterialInstances::current_change_tick. That’s because the latter
only changes once per frame, which is a guarantee we need to handle the
following case:
-
The app removes material A from a mesh and replaces it with material B. Both A and B are of different
Materialtypes entirely. -
extract_entities_needs_specializationruns for material B and marks the mesh as up to date by recording the current tick. -
sweep_entities_needing_specializationruns for material A and checks to ensure it’s safe to remove theEntitySpecializationTickPairfor the mesh from theEntitySpecializationTicks. To do this, it needs to know whetherextract_entities_needs_specializationfor some different material (in this case, material B) ran earlier in the frame and updated the change tick, and to skip removing theEntitySpecializationTickPairif so. It can’t reliably use theSelf::system_tickto determine this because theSystemChangeTickcan be updated multiple times in the same frame. Instead, it needs a type of tick that’s updated only once per frame, after all materials’ versions ofsweep_entities_needing_specializationhave run. TheRenderMaterialInstancestick satisfies this criterion, and so that’s whatsweep_entities_needing_specializationuses.
Fields§
§system_tick: TickThe standard Bevy system tick.
material_instances_tick: TickThe tick in RenderMaterialInstances, which is updated in
late_sweep_material_instances.
Trait Implementations§
Source§impl Clone for EntitySpecializationTickPair
impl Clone for EntitySpecializationTickPair
Source§fn clone(&self) -> EntitySpecializationTickPair
fn clone(&self) -> EntitySpecializationTickPair
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EntitySpecializationTickPair
impl Debug for EntitySpecializationTickPair
impl Copy for EntitySpecializationTickPair
Auto Trait Implementations§
impl Freeze for EntitySpecializationTickPair
impl RefUnwindSafe for EntitySpecializationTickPair
impl Send for EntitySpecializationTickPair
impl Sync for EntitySpecializationTickPair
impl Unpin for EntitySpecializationTickPair
impl UnwindSafe for EntitySpecializationTickPair
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSend for T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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