struct Function {
signature: Option<Instruction>,
parameters: Vec<FunctionArgument>,
variables: FastHashMap<Handle<LocalVariable>, 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>
§spilled_composites: FastIndexMap<Handle<Expression>, LocalVariable>
A map taking an expression that yields a composite value (array, matrix)
to the temporary variables we have spilled it to, if any. Spilling
allows us to render an arbitrary chain of Access
and AccessIndex
expressions as an OpAccessChain
and an OpLoad
(plus bounds checks).
This supports dynamic indexing of by-value arrays and matrices, which
SPIR-V does not.
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>