mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Add MathFunction::Refract
This commit is contained in:
committed by
Dzmitry Malyshau
parent
4a5ff9a053
commit
33003d8ea2
@@ -1941,6 +1941,7 @@ impl<'a, W: Write> Writer<'a, W> {
|
||||
Mf::Normalize => "normalize",
|
||||
Mf::FaceForward => "faceforward",
|
||||
Mf::Reflect => "reflect",
|
||||
Mf::Refract => "refract",
|
||||
// computational
|
||||
Mf::Sign => "sign",
|
||||
Mf::Fma => "fma",
|
||||
|
||||
@@ -1023,6 +1023,7 @@ impl<W: Write> Writer<W> {
|
||||
Mf::Normalize => "normalize",
|
||||
Mf::FaceForward => "faceforward",
|
||||
Mf::Reflect => "reflect",
|
||||
Mf::Refract => "refract",
|
||||
// computational
|
||||
Mf::Sign => "sign",
|
||||
Mf::Fma => "fma",
|
||||
|
||||
@@ -1821,6 +1821,7 @@ impl Writer {
|
||||
Mf::Normalize => MathOp::Ext(spirv::GLOp::Normalize),
|
||||
Mf::FaceForward => MathOp::Ext(spirv::GLOp::FaceForward),
|
||||
Mf::Reflect => MathOp::Ext(spirv::GLOp::Reflect),
|
||||
Mf::Refract => MathOp::Ext(spirv::GLOp::Refract),
|
||||
// exponent
|
||||
Mf::Exp => MathOp::Ext(spirv::GLOp::Exp),
|
||||
Mf::Exp2 => MathOp::Ext(spirv::GLOp::Exp2),
|
||||
|
||||
@@ -1737,6 +1737,7 @@ impl<I: Iterator<Item = u32>> Parser<I> {
|
||||
Glo::Normalize => Mf::Normalize,
|
||||
Glo::FaceForward => Mf::FaceForward,
|
||||
Glo::Reflect => Mf::Reflect,
|
||||
Glo::Refract => Mf::Refract,
|
||||
_ => return Err(Error::UnsupportedExtInst(inst_id)),
|
||||
};
|
||||
|
||||
|
||||
@@ -630,6 +630,7 @@ pub enum MathFunction {
|
||||
Normalize,
|
||||
FaceForward,
|
||||
Reflect,
|
||||
Refract,
|
||||
// computational
|
||||
Sign,
|
||||
Fma,
|
||||
|
||||
@@ -150,6 +150,7 @@ impl super::MathFunction {
|
||||
Self::Normalize => 1,
|
||||
Self::FaceForward => 3,
|
||||
Self::Reflect => 2,
|
||||
Self::Refract => 3,
|
||||
// computational
|
||||
Self::Sign => 1,
|
||||
Self::Fma => 3,
|
||||
|
||||
@@ -561,7 +561,8 @@ impl<'a> ResolveContext<'a> {
|
||||
},
|
||||
Mf::Normalize |
|
||||
Mf::FaceForward |
|
||||
Mf::Reflect => res_arg.clone(),
|
||||
Mf::Reflect |
|
||||
Mf::Refract => res_arg.clone(),
|
||||
// computational
|
||||
Mf::Sign |
|
||||
Mf::Fma |
|
||||
|
||||
@@ -964,6 +964,47 @@ impl super::Validator {
|
||||
));
|
||||
}
|
||||
}
|
||||
Mf::Refract => {
|
||||
let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty) {
|
||||
(Some(ty1), Some(ty2)) => (ty1, ty2),
|
||||
_ => return Err(ExpressionError::WrongArgumentCount(fun)),
|
||||
};
|
||||
|
||||
match *arg_ty {
|
||||
Ti::Vector {
|
||||
kind: Sk::Float, ..
|
||||
} => {}
|
||||
_ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)),
|
||||
}
|
||||
|
||||
if arg1_ty != arg_ty {
|
||||
return Err(ExpressionError::InvalidArgumentType(
|
||||
fun,
|
||||
1,
|
||||
arg1.unwrap(),
|
||||
));
|
||||
}
|
||||
|
||||
match (arg_ty, arg2_ty) {
|
||||
(
|
||||
&Ti::Vector {
|
||||
width: vector_width,
|
||||
..
|
||||
},
|
||||
&Ti::Scalar {
|
||||
width: scalar_width,
|
||||
kind: Sk::Float,
|
||||
},
|
||||
) if vector_width == scalar_width => {}
|
||||
_ => {
|
||||
return Err(ExpressionError::InvalidArgumentType(
|
||||
fun,
|
||||
2,
|
||||
arg2.unwrap(),
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
Mf::Normalize => {
|
||||
if arg1_ty.is_some() | arg2_ty.is_some() {
|
||||
return Err(ExpressionError::WrongArgumentCount(fun));
|
||||
|
||||
Reference in New Issue
Block a user