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>