naga::back::spv

Struct Function

Source
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>

Implementations§

Source§

impl Function

Source

pub(super) fn to_words(&self, sink: &mut impl Extend<Word>)

Source§

impl Function

Source

fn consume(&mut self, block: Block, termination: Instruction)

Source

fn parameter_id(&self, index: u32) -> Word

Trait Implementations§

Source§

impl Default for Function

Source§

fn default() -> Function

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.