Fix validation and glsl parsing of ldexp (#2449)

Fixes #1908.
This commit is contained in:
Fredrik Fornwall
2023-09-01 18:44:48 +02:00
committed by GitHub
parent 0491d39232
commit f49314dbbd
10 changed files with 160 additions and 95 deletions

View File

@@ -1014,7 +1014,7 @@ impl super::Validator {
));
}
}
Mf::Modf | Mf::Frexp | Mf::Ldexp => {
Mf::Modf | Mf::Frexp => {
let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {
(Some(ty1), None, None) => ty1,
_ => return Err(ExpressionError::WrongArgumentCount(fun)),
@@ -1049,6 +1049,41 @@ impl super::Validator {
));
}
}
Mf::Ldexp => {
let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {
(Some(ty1), None, None) => ty1,
_ => return Err(ExpressionError::WrongArgumentCount(fun)),
};
let size0 = match *arg_ty {
Ti::Scalar {
kind: Sk::Float, ..
} => None,
Ti::Vector {
kind: Sk::Float,
size,
..
} => Some(size),
_ => {
return Err(ExpressionError::InvalidArgumentType(fun, 0, arg));
}
};
let good = match *arg1_ty {
Ti::Scalar { kind: Sk::Sint, .. } if size0.is_none() => true,
Ti::Vector {
size,
kind: Sk::Sint,
..
} if Some(size) == size0 => true,
_ => false,
};
if !good {
return Err(ExpressionError::InvalidArgumentType(
fun,
1,
arg1.unwrap(),
));
}
}
Mf::Dot => {
let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) {
(Some(ty1), None, None) => ty1,