diff --git a/src/back/glsl.rs b/src/back/glsl.rs index c3003dccaf..cbb8fd26ac 100644 --- a/src/back/glsl.rs +++ b/src/back/glsl.rs @@ -1042,6 +1042,10 @@ fn write_expression<'a, 'b>( .join(","), )) } + Expression::ArrayLength(expr) => { + let base = write_expression(&builder.expressions[expr], module, builder)?; + Cow::Owned(format!("uint({}.length())", base)) + } }) } diff --git a/src/lib.rs b/src/lib.rs index 2b65d8ac81..4cded46cac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -635,6 +635,8 @@ pub enum Expression { origin: FunctionOrigin, arguments: Vec>, }, + /// Get dynamic array length. + ArrayLength(Handle), } /// A code block is just a vector of statements. diff --git a/src/proc/interface.rs b/src/proc/interface.rs index ff4290c192..8e1f5666ce 100644 --- a/src/proc/interface.rs +++ b/src/proc/interface.rs @@ -100,6 +100,9 @@ where self.traverse_expr(argument); } } + E::ArrayLength(expr) => { + self.traverse_expr(expr); + } } } diff --git a/src/proc/typifier.rs b/src/proc/typifier.rs index 787c8adacf..461bfa1bbd 100644 --- a/src/proc/typifier.rs +++ b/src/proc/typifier.rs @@ -262,6 +262,10 @@ impl Typifier { .ok_or(ResolveError::FunctionReturnsVoid)?; Resolution::Handle(ty) } + crate::Expression::ArrayLength(_) => Resolution::Value(crate::TypeInner::Scalar { + kind: crate::ScalarKind::Uint, + width: 4, + }), }) }