From 5d7d2234c809eb1a2ed004f195e57765d75f9f23 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Fri, 17 Nov 2023 14:23:20 -0800 Subject: [PATCH] [naga] Let constant evaluation of `As` preserve `Splat` expressions. When asked to evaluate an `Expression::As` cast applied to a `Splat` expression, change `ConstantEvaluator::cast` to preserve the `Splat`, rather than expanding it out to a `Compose` expression. --- naga/src/proc/constant_evaluator.rs | 26 ++++++++++++++++++- .../wgsl/900-implicit-conversions.frag.wgsl | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/naga/src/proc/constant_evaluator.rs b/naga/src/proc/constant_evaluator.rs index b9247b3c85..6adc97ac3e 100644 --- a/naga/src/proc/constant_evaluator.rs +++ b/naga/src/proc/constant_evaluator.rs @@ -863,6 +863,22 @@ impl<'a> ConstantEvaluator<'a> { } } + /// Lower [`ZeroValue`] expressions to [`Literal`] and [`Compose`] expressions. + /// + /// [`ZeroValue`]: Expression::ZeroValue + /// [`Literal`]: Expression::Literal + /// [`Compose`]: Expression::Compose + fn eval_zero_value( + &mut self, + expr: Handle, + span: Span, + ) -> Result, ConstantEvaluatorError> { + match self.expressions[expr] { + Expression::ZeroValue(ty) => self.eval_zero_value_impl(ty, span), + _ => Ok(expr), + } + } + /// Lower [`ZeroValue`] expressions to [`Literal`] and [`Compose`] expressions. /// /// [`ZeroValue`]: Expression::ZeroValue @@ -953,7 +969,7 @@ impl<'a> ConstantEvaluator<'a> { ) -> Result, ConstantEvaluatorError> { use crate::Scalar as Sc; - let expr = self.eval_zero_value_and_splat(expr, span)?; + let expr = self.eval_zero_value(expr, span)?; let expr = match self.expressions[expr] { Expression::Literal(literal) => { @@ -1022,6 +1038,14 @@ impl<'a> ConstantEvaluator<'a> { Expression::Compose { ty, components } } + Expression::Splat { size, value } => { + let value_span = self.expressions.get_span(value); + let cast_value = self.cast(value, target, value_span)?; + Expression::Splat { + size, + value: cast_value, + } + } _ => return Err(ConstantEvaluatorError::InvalidCastArg), }; diff --git a/naga/tests/out/wgsl/900-implicit-conversions.frag.wgsl b/naga/tests/out/wgsl/900-implicit-conversions.frag.wgsl index dc4855efa5..9f8620fdda 100644 --- a/naga/tests/out/wgsl/900-implicit-conversions.frag.wgsl +++ b/naga/tests/out/wgsl/900-implicit-conversions.frag.wgsl @@ -57,7 +57,7 @@ fn implicit_dims_3(v_6: vec4) { fn main_1() { exact_1(1); implicit(1.0); - implicit_dims_2(vec3(1.0, 1.0, 1.0)); + implicit_dims_2(vec3(1.0)); return; }