Skip to content

Commit 4417c0a

Browse files
WIP: constant evaluation for select
1 parent a9e93f9 commit 4417c0a

1 file changed

Lines changed: 42 additions & 3 deletions

File tree

naga/src/proc/constant_evaluator.rs

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,8 @@ pub enum ConstantEvaluatorError {
563563
RuntimeExpr,
564564
#[error("Unexpected override-expression")]
565565
OverrideExpr,
566+
#[error("Expected boolean expression for condition argument of `select`")]
567+
SelectConditionNotABool,
566568
}
567569

568570
impl<'a> ConstantEvaluator<'a> {
@@ -904,9 +906,46 @@ impl<'a> ConstantEvaluator<'a> {
904906
)),
905907
}
906908
}
907-
Expression::Select { .. } => Err(ConstantEvaluatorError::NotImplemented(
908-
"select built-in function".into(),
909-
)),
909+
Expression::Select {
910+
reject,
911+
accept,
912+
condition,
913+
} => {
914+
std::eprintln!("lolwat");
915+
let val_arg = |this: &mut Self, expr| {
916+
let expr = this.check_and_get(expr)?;
917+
this.eval_zero_value_and_splat(expr, span)
918+
};
919+
920+
let reject = val_arg(self, reject)?;
921+
let Some(reject_scalar) = (match std::dbg!(&self.expressions[reject]) {
922+
&Expression::Literal(lit) => Some(lit.scalar()),
923+
&Expression::Compose { ty, .. } => std::dbg!(&self.types[ty].inner)
924+
.vector_size_and_scalar()
925+
.map(|(_size, scalar)| scalar),
926+
_ => None,
927+
}) else {
928+
return Err(ConstantEvaluatorError::InvalidMathArg);
929+
};
930+
931+
let reject = self.cast(reject, std::dbg!(reject_scalar), span)?;
932+
let accept = {
933+
let accept = val_arg(self, accept)?;
934+
self.cast(accept, reject_scalar, span)?
935+
};
936+
let condition = self.check_and_get(condition)?;
937+
let condition = match &self.expressions[condition] {
938+
&Expression::Literal(Literal::Bool(bool)) => bool,
939+
_ => return Err(ConstantEvaluatorError::SelectConditionNotABool),
940+
};
941+
component_wise_scalar!(self, span, [reject, accept], |reject, accept| {
942+
if condition {
943+
Ok([accept])
944+
} else {
945+
Ok([reject])
946+
}
947+
})
948+
}
910949
Expression::Relational { fun, argument } => {
911950
let argument = self.check_and_get(argument)?;
912951
self.relational(fun, argument, span)

0 commit comments

Comments
 (0)