Struct naga::valid::FunctionInfo
source · pub struct FunctionInfo {
flags: ValidationFlags,
pub available_stages: ShaderStages,
pub uniformity: Uniformity,
pub may_kill: bool,
pub sampling_set: FastHashSet<SamplingKey>,
global_uses: Box<[GlobalUse]>,
expressions: Box<[ExpressionInfo]>,
sampling: FastHashSet<Sampling>,
pub dual_source_blending: bool,
diagnostic_filter_leaf: Option<Handle<DiagnosticFilterNode>>,
}
Fields§
§flags: ValidationFlags
Validation flags.
available_stages: ShaderStages
Set of shader stages where calling this function is valid.
uniformity: Uniformity
Uniformity characteristics.
may_kill: bool
Function may kill the invocation.
sampling_set: FastHashSet<SamplingKey>
All pairs of (texture, sampler) globals that may be used together in sampling operations by this function and its callees. This includes pairings that arise when this function passes textures and samplers as arguments to its callees.
This table does not include uses of textures and samplers passed as arguments to this function itself, since we do not know which globals those will be. However, this table is exhaustive when computed for an entry point function: entry points never receive textures or samplers as arguments, so all an entry point’s sampling can be reported in terms of globals.
The GLSL back end uses this table to construct reflection info that clients need to construct texture-combined sampler values.
global_uses: Box<[GlobalUse]>
How this function and its callees use this module’s globals.
This is indexed by Handle<GlobalVariable>
indices. However,
FunctionInfo
implements std::ops::Index<Handle<GlobalVariable>>
,
so you can simply index this struct with a global handle to retrieve
its usage information.
expressions: Box<[ExpressionInfo]>
Information about each expression in this function’s body.
This is indexed by Handle<Expression>
indices. However, FunctionInfo
implements std::ops::Index<Handle<Expression>>
, so you can simply
index this struct with an expression handle to retrieve its
ExpressionInfo
.
sampling: FastHashSet<Sampling>
All (texture, sampler) pairs that may be used together in sampling operations by this function and its callees, whether they are accessed as globals or passed as arguments.
Participants are represented by GlobalVariable
handles whenever
possible, and otherwise by indices of this function’s arguments.
When analyzing a function call, we combine this data about the callee
with the actual arguments being passed to produce the callers’ own
sampling_set
and sampling
tables.
dual_source_blending: bool
Indicates that the function is using dual source blending.
diagnostic_filter_leaf: Option<Handle<DiagnosticFilterNode>>
The leaf of all module-wide diagnostic filter rules tree parsed from directives in this module.
See DiagnosticFilterNode
for details on how the tree is represented and used in
validation.
Implementations§
source§impl FunctionInfo
impl FunctionInfo
pub const fn global_variable_count(&self) -> usize
pub const fn expression_count(&self) -> usize
pub fn dominates_global_use(&self, other: &Self) -> bool
source§impl FunctionInfo
impl FunctionInfo
sourcefn add_ref_impl(
&mut self,
expr: Handle<Expression>,
global_use: GlobalUse,
) -> Option<Handle<Expression>>
fn add_ref_impl( &mut self, expr: Handle<Expression>, global_use: GlobalUse, ) -> Option<Handle<Expression>>
Record a use of expr
of the sort given by global_use
.
Bump expr
’s reference count, and return its uniformity.
If expr
is a pointer to a global variable, or some part of
a global variable, add global_use
to that global’s set of
uses.
sourcefn add_ref(&mut self, expr: Handle<Expression>) -> Option<Handle<Expression>>
fn add_ref(&mut self, expr: Handle<Expression>) -> Option<Handle<Expression>>
Record a use of expr
for its value.
This is used for almost all expression references. Anything
that writes to the value expr
points to, or otherwise wants
contribute flags other than GlobalUse::READ
, should use
add_ref_impl
directly.
sourcefn add_assignable_ref(
&mut self,
expr: Handle<Expression>,
assignable_global: &mut Option<Handle<GlobalVariable>>,
) -> Option<Handle<Expression>>
fn add_assignable_ref( &mut self, expr: Handle<Expression>, assignable_global: &mut Option<Handle<GlobalVariable>>, ) -> Option<Handle<Expression>>
Record a use of expr
, and indicate which global variable it
refers to, if any.
Bump expr
’s reference count, and return its uniformity.
If expr
is a pointer to a global variable, or some part
thereof, store that global in *assignable_global
. Leave the
global’s uses unchanged.
This is used to determine the assignable_global
for
Access
and AccessIndex
expressions that ultimately
refer to a global variable. Those expressions don’t contribute
any usage to the global themselves; that depends on how other
expressions use them.
sourcefn process_call(
&mut self,
callee: &Self,
arguments: &[Handle<Expression>],
expression_arena: &Arena<Expression>,
) -> Result<FunctionUniformity, WithSpan<FunctionError>>
fn process_call( &mut self, callee: &Self, arguments: &[Handle<Expression>], expression_arena: &Arena<Expression>, ) -> Result<FunctionUniformity, WithSpan<FunctionError>>
Inherit information from a called function.
sourcefn process_expression(
&mut self,
handle: Handle<Expression>,
expression_arena: &Arena<Expression>,
other_functions: &[FunctionInfo],
resolve_context: &ResolveContext<'_>,
capabilities: Capabilities,
) -> Result<(), ExpressionError>
fn process_expression( &mut self, handle: Handle<Expression>, expression_arena: &Arena<Expression>, other_functions: &[FunctionInfo], resolve_context: &ResolveContext<'_>, capabilities: Capabilities, ) -> Result<(), ExpressionError>
Compute the ExpressionInfo
for handle
.
Replace the dummy entry in self.expressions
for handle
with a real ExpressionInfo
value describing that expression.
This function is called as part of a forward sweep through the arena, so we can assume that all earlier expressions in the arena already have valid info. Since expressions only depend on earlier expressions, this includes all our subexpressions.
Adjust the reference counts on all expressions we use.
Also populate the sampling_set
, sampling
and
global_uses
fields of self
.
sourcefn process_block(
&mut self,
statements: &Block,
other_functions: &[FunctionInfo],
disruptor: Option<UniformityDisruptor>,
expression_arena: &Arena<Expression>,
diagnostic_filter_arena: &Arena<DiagnosticFilterNode>,
) -> Result<FunctionUniformity, WithSpan<FunctionError>>
fn process_block( &mut self, statements: &Block, other_functions: &[FunctionInfo], disruptor: Option<UniformityDisruptor>, expression_arena: &Arena<Expression>, diagnostic_filter_arena: &Arena<DiagnosticFilterNode>, ) -> Result<FunctionUniformity, WithSpan<FunctionError>>
Analyzes the uniformity requirements of a block (as a sequence of statements). Returns the uniformity characteristics at the function level, i.e. whether or not the function requires to be called in uniform control flow, and whether the produced result is not disrupting the control flow.
The parent control flow is uniform if disruptor.is_none()
.
Returns a NonUniformControlFlow
error if any of the expressions in the block
require uniformity, but the current flow is non-uniform.
Trait Implementations§
source§impl Clone for FunctionInfo
impl Clone for FunctionInfo
source§fn clone(&self) -> FunctionInfo
fn clone(&self) -> FunctionInfo
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for FunctionInfo
impl Debug for FunctionInfo
source§impl Index<Handle<Expression>> for FunctionInfo
impl Index<Handle<Expression>> for FunctionInfo
source§type Output = ExpressionInfo
type Output = ExpressionInfo
source§fn index(&self, handle: Handle<Expression>) -> &ExpressionInfo
fn index(&self, handle: Handle<Expression>) -> &ExpressionInfo
container[index]
) operation. Read moreAuto Trait Implementations§
impl Freeze for FunctionInfo
impl RefUnwindSafe for FunctionInfo
impl Send for FunctionInfo
impl Sync for FunctionInfo
impl Unpin for FunctionInfo
impl UnwindSafe for FunctionInfo
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
)