Struct naga::proc::index::BoundsCheckPolicies
source · pub struct BoundsCheckPolicies {
pub index: BoundsCheckPolicy,
pub buffer: BoundsCheckPolicy,
pub image_load: BoundsCheckPolicy,
pub binding_array: BoundsCheckPolicy,
}
Expand description
Policies for injecting bounds checks during code generation.
Fields§
§index: BoundsCheckPolicy
How should the generated code handle array, vector, or matrix indices that are out of range?
buffer: BoundsCheckPolicy
How 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: BoundsCheckPolicy
How 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: BoundsCheckPolicy
How should the generated code handle binding array indexes that are out of bounds.
Implementations§
source§impl BoundsCheckPolicies
impl BoundsCheckPolicies
sourcepub 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.
sourcepub 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§
source§impl Clone for BoundsCheckPolicies
impl Clone for BoundsCheckPolicies
source§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 moresource§impl Debug for BoundsCheckPolicies
impl Debug for BoundsCheckPolicies
source§impl Default for BoundsCheckPolicies
impl Default for BoundsCheckPolicies
source§fn default() -> BoundsCheckPolicies
fn default() -> BoundsCheckPolicies
source§impl Hash for BoundsCheckPolicies
impl Hash for BoundsCheckPolicies
source§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,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.