struct Function {
signature: Option<Instruction>,
parameters: Vec<FunctionArgument>,
variables: FastHashMap<Handle<LocalVariable>, LocalVariable>,
force_loop_bounding_vars: Vec<LocalVariable>,
spilled_composites: FastIndexMap<Handle<Expression>, LocalVariable>,
spilled_accesses: HandleSet<Expression>,
access_uses: FastHashMap<Handle<Expression>, usize>,
blocks: Vec<TerminatedBlock>,
entry_point_context: Option<EntryPointContext>,
}
Fields§
§signature: Option<Instruction>
§parameters: Vec<FunctionArgument>
§variables: FastHashMap<Handle<LocalVariable>, LocalVariable>
§force_loop_bounding_vars: Vec<LocalVariable>
List of local variables used as a counters to ensure that all loops are bounded.
spilled_composites: FastIndexMap<Handle<Expression>, LocalVariable>
A map from a Naga expression to the temporary SPIR-V variable we have spilled its value to, if any.
Naga IR lets us apply Access
expressions to expressions whose value
is an array or matrix—not a pointer to such—but SPIR-V doesn’t have
instructions that can do the same. So when we encounter such code, we
spill the expression’s value to a generated temporary variable. That, we
can obtain a pointer to, and then use an OpAccessChain
instruction to
do whatever series of Access
and AccessIndex
operations we need
(with bounds checks). Finally, we generate an OpLoad
to get the final
value.
spilled_accesses: HandleSet<Expression>
A set of expressions that are either in spilled_composites
or refer
to some component/element of such.
access_uses: FastHashMap<Handle<Expression>, usize>
A map taking each expression to the number of Access
and
AccessIndex
expressions that uses it as a base value. If an
expression has no entry, its count is zero: it is never used as a
Access
or AccessIndex
base.
We use this, together with ExpressionInfo::ref_count
, to recognize
the tips of chains of Access
and AccessIndex
expressions that
access spilled values — expressions in spilled_composites
. We
defer generating code for the chain until we reach its tip, so we can
handle it with a single instruction.
blocks: Vec<TerminatedBlock>
§entry_point_context: Option<EntryPointContext>