From 8618a8a2078d00edcf126a40db7ed5219cfd0cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20S=C3=B8holm?= Date: Mon, 2 Nov 2020 23:08:02 +0100 Subject: [PATCH] [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. --- src/back/glsl.rs | 1 + src/proc/interface.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/back/glsl.rs b/src/back/glsl.rs index 52122cedba..29e677eaea 100644 --- a/src/back/glsl.rs +++ b/src/back/glsl.rs @@ -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, diff --git a/src/proc/interface.rs b/src/proc/interface.rs index 670f2da506..ca20d1958b 100644 --- a/src/proc/interface.rs +++ b/src/proc/interface.rs @@ -2,6 +2,7 @@ use crate::arena::{Arena, Handle}; pub struct Interface<'a, T> { pub expressions: &'a Arena, + pub local_variables: &'a Arena, 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);