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>>,
pub mesh_shader_info: FunctionMeshShaderInfo,
}Fields§
§flags: ValidationFlagsValidation flags.
available_stages: ShaderStagesSet of shader stages where calling this function is valid.
uniformity: UniformityUniformity characteristics.
may_kill: boolFunction 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 core::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 core::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: boolIndicates 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.
mesh_shader_info: FunctionMeshShaderInfoMesh shader info for this function and its callees.
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.
Sourcepub(super) fn insert_global_use(
&mut self,
global_use: GlobalUse,
global: Handle<GlobalVariable>,
)
pub(super) fn insert_global_use( &mut self, global_use: GlobalUse, global: Handle<GlobalVariable>, )
Note an entry point’s use of global not recorded by ModuleInfo::process_function.
Most global variable usage should be recorded via add_ref_impl in the process
of expression behavior analysis by ModuleInfo::process_function. But that code
has no access to entrypoint-specific information, so interface analysis uses this
function to record global uses there (like task shader payloads).
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.
Sourcefn try_update_mesh_vertex_type(
&mut self,
ty: Handle<Type>,
value: Handle<Expression>,
) -> Result<(), WithSpan<FunctionError>>
fn try_update_mesh_vertex_type( &mut self, ty: Handle<Type>, value: Handle<Expression>, ) -> Result<(), WithSpan<FunctionError>>
Note the type of value passed to SetVertex.
Record that this function passed a value of type ty as the second
argument to the SetVertex builtin function. All calls to
SetVertex must pass the same type, and this must match the
function’s vertex_output_type.
Sourcefn try_update_mesh_primitive_type(
&mut self,
ty: Handle<Type>,
value: Handle<Expression>,
) -> Result<(), WithSpan<FunctionError>>
fn try_update_mesh_primitive_type( &mut self, ty: Handle<Type>, value: Handle<Expression>, ) -> Result<(), WithSpan<FunctionError>>
Note the type of value passed to SetPrimitive.
Record that this function passed a value of type ty as the second
argument to the SetPrimitive builtin function. All calls to
SetPrimitive must pass the same type, and this must match the
function’s primitive_output_type.
Sourcefn try_update_mesh_info(
&mut self,
callee: &FunctionMeshShaderInfo,
) -> Result<(), WithSpan<FunctionError>>
fn try_update_mesh_info( &mut self, callee: &FunctionMeshShaderInfo, ) -> Result<(), WithSpan<FunctionError>>
Update this function’s mesh shader info, given that it calls callee.
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<'de> Deserialize<'de> for FunctionInfo
impl<'de> Deserialize<'de> for FunctionInfo
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
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 more