[ir] Make the interface visitor traverse local variable initializers

Otherwise the backends will panic on e.g. `vec4 local = Global;` if the global
isn't used anywere else in the function.
This commit is contained in:
Kristoffer Søholm
2020-11-02 23:08:02 +01:00
committed by Dzmitry Malyshau
parent a89191c234
commit 8618a8a207
2 changed files with 10 additions and 1 deletions

View File

@@ -1811,6 +1811,7 @@ fn collect_texture_mapping<'a>(
for func in functions {
let mut interface = Interface {
expressions: &func.expressions,
local_variables: &func.local_variables,
visitor: TextureMappingVisitor {
expressions: &func.expressions,
map: &mut mappings,

View File

@@ -2,6 +2,7 @@ use crate::arena::{Arena, Handle};
pub struct Interface<'a, T> {
pub expressions: &'a Arena<crate::Expression>,
pub local_variables: &'a Arena<crate::LocalVariable>,
pub visitor: T,
}
@@ -36,7 +37,13 @@ where
self.traverse_expr(comp);
}
}
E::FunctionParameter(_) | E::GlobalVariable(_) | E::LocalVariable(_) => {}
E::FunctionParameter(_) | E::GlobalVariable(_) => {}
E::LocalVariable(var) => {
let var = &self.local_variables[var];
if let Some(init) = var.init {
self.traverse_expr(init);
}
}
E::Load { pointer } => {
self.traverse_expr(pointer);
}
@@ -201,6 +208,7 @@ impl crate::Function {
let mut io = Interface {
expressions: &self.expressions,
local_variables: &self.local_variables,
visitor: GlobalUseVisitor(&mut self.global_usage),
};
io.traverse(&self.body);