Struct BoundsCheckPolicies
pub struct BoundsCheckPolicies {
pub index: BoundsCheckPolicy,
pub buffer: BoundsCheckPolicy,
pub image_load: BoundsCheckPolicy,
pub binding_array: BoundsCheckPolicy,
}unstable-wgpu-26 only.Expand description
Policies for injecting bounds checks during code generation.
Fields§
§index: BoundsCheckPolicyHow should the generated code handle array, vector, or matrix indices that are out of range?
buffer: BoundsCheckPolicyHow should the generated code handle array, vector, or matrix indices
that are out of range, when those values live in a GlobalVariable in
the Storage or Uniform address spaces?
Some graphics hardware provides “robust buffer access”, a feature that
ensures that using a pointer cannot access memory outside the ‘buffer’
that it was derived from. In Naga terms, this means that the hardware
ensures that pointers computed by applying Access and
AccessIndex expressions to a GlobalVariable whose space is
Storage or Uniform will never read or write memory outside that
global variable.
When hardware offers such a feature, it is probably undesirable to have Naga inject bounds checking code for such accesses, since the hardware can probably provide the same protection more efficiently. However, bounds checks are still needed on accesses to indexable values that do not live in buffers, like local variables.
So, this option provides a separate policy that applies only to accesses
to storage and uniform globals. When depending on hardware bounds
checking, this policy can be Unchecked to avoid unnecessary overhead.
When special hardware support is not available, this should probably be
the same as index_bounds_check_policy.
image_load: BoundsCheckPolicyHow should the generated code handle image texel loads that are out of range?
This controls the behavior of ImageLoad expressions when a coordinate,
texture array index, level of detail, or multisampled sample number is out of range.
There is no corresponding policy for ImageStore statements. All the
platforms we support already discard out-of-bounds image stores,
effectively implementing the “skip write” part of ReadZeroSkipWrite.
binding_array: BoundsCheckPolicyHow should the generated code handle binding array indexes that are out of bounds.
Implementations§
§impl BoundsCheckPolicies
impl BoundsCheckPolicies
pub fn choose_policy(
&self,
base: Handle<Expression>,
types: &UniqueArena<Type>,
info: &FunctionInfo,
) -> BoundsCheckPolicy
pub fn choose_policy( &self, base: Handle<Expression>, types: &UniqueArena<Type>, info: &FunctionInfo, ) -> BoundsCheckPolicy
Determine which policy applies to base.
base is the “base” expression (the expression being indexed) of a Access
and AccessIndex expression. This is either a pointer, a value, being directly
indexed, or a binding array.
See the documentation for BoundsCheckPolicy for details about
when each policy applies.
pub fn contains(&self, policy: BoundsCheckPolicy) -> bool
pub fn contains(&self, policy: BoundsCheckPolicy) -> bool
Return true if any of self’s policies are policy.
Trait Implementations§
§impl Clone for BoundsCheckPolicies
impl Clone for BoundsCheckPolicies
§fn clone(&self) -> BoundsCheckPolicies
fn clone(&self) -> BoundsCheckPolicies
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for BoundsCheckPolicies
impl Debug for BoundsCheckPolicies
§impl Default for BoundsCheckPolicies
impl Default for BoundsCheckPolicies
§fn default() -> BoundsCheckPolicies
fn default() -> BoundsCheckPolicies
§impl Hash for BoundsCheckPolicies
impl Hash for BoundsCheckPolicies
§impl PartialEq for BoundsCheckPolicies
impl PartialEq for BoundsCheckPolicies
impl Copy for BoundsCheckPolicies
impl Eq for BoundsCheckPolicies
impl StructuralPartialEq for BoundsCheckPolicies
Auto Trait Implementations§
impl Freeze for BoundsCheckPolicies
impl RefUnwindSafe for BoundsCheckPolicies
impl Send for BoundsCheckPolicies
impl Sync for BoundsCheckPolicies
impl Unpin for BoundsCheckPolicies
impl UnwindSafe for BoundsCheckPolicies
Blanket Implementations§
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,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§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>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§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>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§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.§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.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.