tint: remove ConstEval::current_source member and pass down source through function calls
Bug: tint:1581 Bug: tint:1751 Change-Id: I4dea92d4b67d39559ce65f45144215e56b6a3e9a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/110724 Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
893316014a
commit
72551392e8
|
@ -39,7 +39,6 @@
|
|||
#include "src/tint/utils/bitcast.h"
|
||||
#include "src/tint/utils/compiler_macros.h"
|
||||
#include "src/tint/utils/map.h"
|
||||
#include "src/tint/utils/scoped_assignment.h"
|
||||
#include "src/tint/utils/transform.h"
|
||||
|
||||
using namespace tint::number_suffixes; // NOLINT
|
||||
|
@ -651,13 +650,13 @@ ImplResult TransformBinaryElements(ProgramBuilder& builder,
|
|||
ConstEval::ConstEval(ProgramBuilder& b) : builder(b) {}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Add(NumberT a, NumberT b) {
|
||||
utils::Result<NumberT> ConstEval::Add(const Source& source, NumberT a, NumberT b) {
|
||||
NumberT result;
|
||||
if constexpr (IsAbstract<NumberT> || IsFloatingPoint<NumberT>) {
|
||||
if (auto r = CheckedAdd(a, b)) {
|
||||
result = r->value;
|
||||
} else {
|
||||
AddError(OverflowErrorMessage(a, "+", b), *current_source);
|
||||
AddError(OverflowErrorMessage(a, "+", b), source);
|
||||
return utils::Failure;
|
||||
}
|
||||
} else {
|
||||
|
@ -677,13 +676,13 @@ utils::Result<NumberT> ConstEval::Add(NumberT a, NumberT b) {
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Sub(NumberT a, NumberT b) {
|
||||
utils::Result<NumberT> ConstEval::Sub(const Source& source, NumberT a, NumberT b) {
|
||||
NumberT result;
|
||||
if constexpr (IsAbstract<NumberT> || IsFloatingPoint<NumberT>) {
|
||||
if (auto r = CheckedSub(a, b)) {
|
||||
result = r->value;
|
||||
} else {
|
||||
AddError(OverflowErrorMessage(a, "-", b), *current_source);
|
||||
AddError(OverflowErrorMessage(a, "-", b), source);
|
||||
return utils::Failure;
|
||||
}
|
||||
} else {
|
||||
|
@ -703,7 +702,7 @@ utils::Result<NumberT> ConstEval::Sub(NumberT a, NumberT b) {
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Mul(NumberT a, NumberT b) {
|
||||
utils::Result<NumberT> ConstEval::Mul(const Source& source, NumberT a, NumberT b) {
|
||||
using T = UnwrapNumber<NumberT>;
|
||||
NumberT result;
|
||||
if constexpr (IsAbstract<NumberT> || IsFloatingPoint<NumberT>) {
|
||||
|
@ -711,7 +710,7 @@ utils::Result<NumberT> ConstEval::Mul(NumberT a, NumberT b) {
|
|||
if (auto r = CheckedMul(a, b)) {
|
||||
result = r->value;
|
||||
} else {
|
||||
AddError(OverflowErrorMessage(a, "*", b), *current_source);
|
||||
AddError(OverflowErrorMessage(a, "*", b), source);
|
||||
return utils::Failure;
|
||||
}
|
||||
} else {
|
||||
|
@ -730,14 +729,14 @@ utils::Result<NumberT> ConstEval::Mul(NumberT a, NumberT b) {
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Div(NumberT a, NumberT b) {
|
||||
utils::Result<NumberT> ConstEval::Div(const Source& source, NumberT a, NumberT b) {
|
||||
NumberT result;
|
||||
if constexpr (IsAbstract<NumberT> || IsFloatingPoint<NumberT>) {
|
||||
// Check for over/underflow for abstract values
|
||||
if (auto r = CheckedDiv(a, b)) {
|
||||
result = r->value;
|
||||
} else {
|
||||
AddError(OverflowErrorMessage(a, "/", b), *current_source);
|
||||
AddError(OverflowErrorMessage(a, "/", b), source);
|
||||
return utils::Failure;
|
||||
}
|
||||
} else {
|
||||
|
@ -765,16 +764,20 @@ utils::Result<NumberT> ConstEval::Div(NumberT a, NumberT b) {
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Dot2(NumberT a1, NumberT a2, NumberT b1, NumberT b2) {
|
||||
auto r1 = Mul(a1, b1);
|
||||
utils::Result<NumberT> ConstEval::Dot2(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT b1,
|
||||
NumberT b2) {
|
||||
auto r1 = Mul(source, a1, b1);
|
||||
if (!r1) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r2 = Mul(a2, b2);
|
||||
auto r2 = Mul(source, a2, b2);
|
||||
if (!r2) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r = Add(r1.Get(), r2.Get());
|
||||
auto r = Add(source, r1.Get(), r2.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
|
@ -782,29 +785,30 @@ utils::Result<NumberT> ConstEval::Dot2(NumberT a1, NumberT a2, NumberT b1, Numbe
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Dot3(NumberT a1,
|
||||
utils::Result<NumberT> ConstEval::Dot3(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT a3,
|
||||
NumberT b1,
|
||||
NumberT b2,
|
||||
NumberT b3) {
|
||||
auto r1 = Mul(a1, b1);
|
||||
auto r1 = Mul(source, a1, b1);
|
||||
if (!r1) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r2 = Mul(a2, b2);
|
||||
auto r2 = Mul(source, a2, b2);
|
||||
if (!r2) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r3 = Mul(a3, b3);
|
||||
auto r3 = Mul(source, a3, b3);
|
||||
if (!r3) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r = Add(r1.Get(), r2.Get());
|
||||
auto r = Add(source, r1.Get(), r2.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
r = Add(r.Get(), r3.Get());
|
||||
r = Add(source, r.Get(), r3.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
|
@ -812,7 +816,8 @@ utils::Result<NumberT> ConstEval::Dot3(NumberT a1,
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Dot4(NumberT a1,
|
||||
utils::Result<NumberT> ConstEval::Dot4(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT a3,
|
||||
NumberT a4,
|
||||
|
@ -820,31 +825,31 @@ utils::Result<NumberT> ConstEval::Dot4(NumberT a1,
|
|||
NumberT b2,
|
||||
NumberT b3,
|
||||
NumberT b4) {
|
||||
auto r1 = Mul(a1, b1);
|
||||
auto r1 = Mul(source, a1, b1);
|
||||
if (!r1) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r2 = Mul(a2, b2);
|
||||
auto r2 = Mul(source, a2, b2);
|
||||
if (!r2) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r3 = Mul(a3, b3);
|
||||
auto r3 = Mul(source, a3, b3);
|
||||
if (!r3) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r4 = Mul(a4, b4);
|
||||
auto r4 = Mul(source, a4, b4);
|
||||
if (!r4) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r = Add(r1.Get(), r2.Get());
|
||||
auto r = Add(source, r1.Get(), r2.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
r = Add(r.Get(), r3.Get());
|
||||
r = Add(source, r.Get(), r3.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
r = Add(r.Get(), r4.Get());
|
||||
r = Add(source, r.Get(), r4.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
|
@ -852,16 +857,20 @@ utils::Result<NumberT> ConstEval::Dot4(NumberT a1,
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Det2(NumberT a1, NumberT a2, NumberT b1, NumberT b2) {
|
||||
auto r1 = Mul(a1, b2);
|
||||
utils::Result<NumberT> ConstEval::Det2(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT b1,
|
||||
NumberT b2) {
|
||||
auto r1 = Mul(source, a1, b2);
|
||||
if (!r1) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r2 = Mul(b1, a2);
|
||||
auto r2 = Mul(source, b1, a2);
|
||||
if (!r2) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto r = Sub(r1.Get(), r2.Get());
|
||||
auto r = Sub(source, r1.Get(), r2.Get());
|
||||
if (!r) {
|
||||
return utils::Failure;
|
||||
}
|
||||
|
@ -869,86 +878,86 @@ utils::Result<NumberT> ConstEval::Det2(NumberT a1, NumberT a2, NumberT b1, Numbe
|
|||
}
|
||||
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> ConstEval::Clamp(NumberT e, NumberT low, NumberT high) {
|
||||
utils::Result<NumberT> ConstEval::Clamp(const Source&, NumberT e, NumberT low, NumberT high) {
|
||||
return NumberT{std::min(std::max(e, low), high)};
|
||||
}
|
||||
|
||||
auto ConstEval::ClampFunc(const sem::Type* elem_ty) {
|
||||
auto ConstEval::ClampFunc(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto e, auto low, auto high) -> ImplResult {
|
||||
if (auto r = Clamp(e, low, high)) {
|
||||
if (auto r = Clamp(source, e, low, high)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::AddFunc(const sem::Type* elem_ty) {
|
||||
auto ConstEval::AddFunc(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2) -> ImplResult {
|
||||
if (auto r = Add(a1, a2)) {
|
||||
if (auto r = Add(source, a1, a2)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::SubFunc(const sem::Type* elem_ty) {
|
||||
auto ConstEval::SubFunc(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2) -> ImplResult {
|
||||
if (auto r = Sub(a1, a2)) {
|
||||
if (auto r = Sub(source, a1, a2)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::MulFunc(const sem::Type* elem_ty) {
|
||||
auto ConstEval::MulFunc(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2) -> ImplResult {
|
||||
if (auto r = Mul(a1, a2)) {
|
||||
if (auto r = Mul(source, a1, a2)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::DivFunc(const sem::Type* elem_ty) {
|
||||
auto ConstEval::DivFunc(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2) -> ImplResult {
|
||||
if (auto r = Div(a1, a2)) {
|
||||
if (auto r = Div(source, a1, a2)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::Dot2Func(const sem::Type* elem_ty) {
|
||||
auto ConstEval::Dot2Func(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2, auto b1, auto b2) -> ImplResult {
|
||||
if (auto r = Dot2(a1, a2, b1, b2)) {
|
||||
if (auto r = Dot2(source, a1, a2, b1, b2)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::Dot3Func(const sem::Type* elem_ty) {
|
||||
auto ConstEval::Dot3Func(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a1, auto a2, auto a3, auto b1, auto b2, auto b3) -> ImplResult {
|
||||
if (auto r = Dot3(a1, a2, a3, b1, b2, b3)) {
|
||||
if (auto r = Dot3(source, a1, a2, a3, b1, b2, b3)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::Dot4Func(const sem::Type* elem_ty) {
|
||||
auto ConstEval::Dot4Func(const Source& source, const sem::Type* elem_ty) {
|
||||
return
|
||||
[=](auto a1, auto a2, auto a3, auto a4, auto b1, auto b2, auto b3, auto b4) -> ImplResult {
|
||||
if (auto r = Dot4(a1, a2, a3, a4, b1, b2, b3, b4)) {
|
||||
if (auto r = Dot4(source, a1, a2, a3, a4, b1, b2, b3, b4)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
};
|
||||
}
|
||||
|
||||
auto ConstEval::Det2Func(const sem::Type* elem_ty) {
|
||||
auto ConstEval::Det2Func(const Source& source, const sem::Type* elem_ty) {
|
||||
return [=](auto a, auto b, auto c, auto d) -> ImplResult {
|
||||
if (auto r = Det2(a, b, c, d)) {
|
||||
if (auto r = Det2(source, a, b, c, d)) {
|
||||
return CreateElement(builder, elem_ty, r.Get());
|
||||
}
|
||||
return utils::Failure;
|
||||
|
@ -1205,9 +1214,8 @@ ConstEval::Result ConstEval::OpNot(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpPlus(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1) {
|
||||
return Dispatch_fia_fiu32_f16(AddFunc(c0->Type()), c0, c1);
|
||||
return Dispatch_fia_fiu32_f16(AddFunc(source, c0->Type()), c0, c1);
|
||||
};
|
||||
|
||||
return TransformBinaryElements(builder, ty, transform, args[0], args[1]);
|
||||
|
@ -1216,9 +1224,8 @@ ConstEval::Result ConstEval::OpPlus(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpMinus(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1) {
|
||||
return Dispatch_fia_fiu32_f16(SubFunc(c0->Type()), c0, c1);
|
||||
return Dispatch_fia_fiu32_f16(SubFunc(source, c0->Type()), c0, c1);
|
||||
};
|
||||
|
||||
return TransformBinaryElements(builder, ty, transform, args[0], args[1]);
|
||||
|
@ -1227,9 +1234,8 @@ ConstEval::Result ConstEval::OpMinus(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpMultiply(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1) {
|
||||
return Dispatch_fia_fiu32_f16(MulFunc(c0->Type()), c0, c1);
|
||||
return Dispatch_fia_fiu32_f16(MulFunc(source, c0->Type()), c0, c1);
|
||||
};
|
||||
|
||||
return TransformBinaryElements(builder, ty, transform, args[0], args[1]);
|
||||
|
@ -1238,7 +1244,6 @@ ConstEval::Result ConstEval::OpMultiply(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpMultiplyMatVec(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto* mat_ty = args[0]->Type()->As<sem::Matrix>();
|
||||
auto* vec_ty = args[1]->Type()->As<sem::Vector>();
|
||||
auto* elem_ty = vec_ty->type();
|
||||
|
@ -1247,29 +1252,29 @@ ConstEval::Result ConstEval::OpMultiplyMatVec(const sem::Type* ty,
|
|||
ImplResult result;
|
||||
switch (mat_ty->columns()) {
|
||||
case 2:
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
v->Index(0), //
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
v->Index(0), //
|
||||
v->Index(1));
|
||||
break;
|
||||
case 3:
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
m->Index(2)->Index(row), //
|
||||
v->Index(0), //
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(source, elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
m->Index(2)->Index(row), //
|
||||
v->Index(0), //
|
||||
v->Index(1), v->Index(2));
|
||||
break;
|
||||
case 4:
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
m->Index(2)->Index(row), //
|
||||
m->Index(3)->Index(row), //
|
||||
v->Index(0), //
|
||||
v->Index(1), //
|
||||
v->Index(2), //
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(source, elem_ty), //
|
||||
m->Index(0)->Index(row), //
|
||||
m->Index(1)->Index(row), //
|
||||
m->Index(2)->Index(row), //
|
||||
m->Index(3)->Index(row), //
|
||||
v->Index(0), //
|
||||
v->Index(1), //
|
||||
v->Index(2), //
|
||||
v->Index(3));
|
||||
break;
|
||||
}
|
||||
|
@ -1289,7 +1294,6 @@ ConstEval::Result ConstEval::OpMultiplyMatVec(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpMultiplyVecMat(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto* vec_ty = args[0]->Type()->As<sem::Vector>();
|
||||
auto* mat_ty = args[1]->Type()->As<sem::Matrix>();
|
||||
auto* elem_ty = vec_ty->type();
|
||||
|
@ -1298,30 +1302,30 @@ ConstEval::Result ConstEval::OpMultiplyVecMat(const sem::Type* ty,
|
|||
ImplResult result;
|
||||
switch (mat_ty->rows()) {
|
||||
case 2:
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
v->Index(0), //
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
v->Index(0), //
|
||||
v->Index(1));
|
||||
break;
|
||||
case 3:
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(source, elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
m->Index(col)->Index(2),
|
||||
v->Index(0), //
|
||||
v->Index(1), //
|
||||
v->Index(2));
|
||||
break;
|
||||
case 4:
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
m->Index(col)->Index(2), //
|
||||
m->Index(col)->Index(3), //
|
||||
v->Index(0), //
|
||||
v->Index(1), //
|
||||
v->Index(2), //
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(source, elem_ty), //
|
||||
m->Index(col)->Index(0), //
|
||||
m->Index(col)->Index(1), //
|
||||
m->Index(col)->Index(2), //
|
||||
m->Index(col)->Index(3), //
|
||||
v->Index(0), //
|
||||
v->Index(1), //
|
||||
v->Index(2), //
|
||||
v->Index(3));
|
||||
}
|
||||
return result;
|
||||
|
@ -1341,7 +1345,6 @@ ConstEval::Result ConstEval::OpMultiplyVecMat(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpMultiplyMatMat(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto* mat1 = args[0];
|
||||
auto* mat2 = args[1];
|
||||
auto* mat1_ty = mat1->Type()->As<sem::Matrix>();
|
||||
|
@ -1355,30 +1358,30 @@ ConstEval::Result ConstEval::OpMultiplyMatMat(const sem::Type* ty,
|
|||
ImplResult result;
|
||||
switch (mat1_ty->columns()) {
|
||||
case 2:
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m2e(0, col), //
|
||||
result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m2e(0, col), //
|
||||
m2e(1, col));
|
||||
break;
|
||||
case 3:
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m1e(row, 2), //
|
||||
m2e(0, col), //
|
||||
m2e(1, col), //
|
||||
result = Dispatch_fa_f32_f16(Dot3Func(source, elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m1e(row, 2), //
|
||||
m2e(0, col), //
|
||||
m2e(1, col), //
|
||||
m2e(2, col));
|
||||
break;
|
||||
case 4:
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m1e(row, 2), //
|
||||
m1e(row, 3), //
|
||||
m2e(0, col), //
|
||||
m2e(1, col), //
|
||||
m2e(2, col), //
|
||||
result = Dispatch_fa_f32_f16(Dot4Func(source, elem_ty), //
|
||||
m1e(row, 0), //
|
||||
m1e(row, 1), //
|
||||
m1e(row, 2), //
|
||||
m1e(row, 3), //
|
||||
m2e(0, col), //
|
||||
m2e(1, col), //
|
||||
m2e(2, col), //
|
||||
m2e(3, col));
|
||||
break;
|
||||
}
|
||||
|
@ -1406,9 +1409,8 @@ ConstEval::Result ConstEval::OpMultiplyMatMat(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::OpDivide(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1) {
|
||||
return Dispatch_fia_fiu32_f16(DivFunc(c0->Type()), c0, c1);
|
||||
return Dispatch_fia_fiu32_f16(DivFunc(source, c0->Type()), c0, c1);
|
||||
};
|
||||
|
||||
return TransformBinaryElements(builder, ty, transform, args[0], args[1]);
|
||||
|
@ -1803,10 +1805,10 @@ ConstEval::Result ConstEval::ceil(const sem::Type* ty,
|
|||
|
||||
ConstEval::Result ConstEval::clamp(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source&) {
|
||||
const Source& source) {
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1,
|
||||
const sem::Constant* c2) {
|
||||
return Dispatch_fia_fiu32_f16(ClampFunc(c0->Type()), c0, c1, c2);
|
||||
return Dispatch_fia_fiu32_f16(ClampFunc(source, c0->Type()), c0, c1, c2);
|
||||
};
|
||||
return TransformElements(builder, ty, transform, args[0], args[1], args[2]);
|
||||
}
|
||||
|
@ -1894,7 +1896,6 @@ ConstEval::Result ConstEval::countTrailingZeros(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::cross(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
auto* u = args[0];
|
||||
auto* v = args[1];
|
||||
auto* elem_ty = u->Type()->As<sem::Vector>()->type();
|
||||
|
@ -1918,15 +1919,15 @@ ConstEval::Result ConstEval::cross(const sem::Type* ty,
|
|||
auto* v1 = v->Index(1);
|
||||
auto* v2 = v->Index(2);
|
||||
|
||||
auto x = Dispatch_fa_f32_f16(Det2Func(elem_ty), u1, u2, v1, v2);
|
||||
auto x = Dispatch_fa_f32_f16(Det2Func(source, elem_ty), u1, u2, v1, v2);
|
||||
if (!x) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto y = Dispatch_fa_f32_f16(Det2Func(elem_ty), v0, v2, u0, u2);
|
||||
auto y = Dispatch_fa_f32_f16(Det2Func(source, elem_ty), v0, v2, u0, u2);
|
||||
if (!y) {
|
||||
return utils::Failure;
|
||||
}
|
||||
auto z = Dispatch_fa_f32_f16(Det2Func(elem_ty), u0, u1, v0, v1);
|
||||
auto z = Dispatch_fa_f32_f16(Det2Func(source, elem_ty), u0, u1, v0, v1);
|
||||
if (!z) {
|
||||
return utils::Failure;
|
||||
}
|
||||
|
@ -2178,9 +2179,9 @@ ConstEval::Result ConstEval::pack2x16float(const sem::Type* ty,
|
|||
|
||||
ConstEval::Result ConstEval::pack2x16snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source&) {
|
||||
const Source& source) {
|
||||
auto calc = [&](f32 val) -> u32 {
|
||||
auto clamped = Clamp(val, f32(-1.0f), f32(1.0f)).Get();
|
||||
auto clamped = Clamp(source, val, f32(-1.0f), f32(1.0f)).Get();
|
||||
return u32(utils::Bitcast<uint16_t>(
|
||||
static_cast<int16_t>(std::floor(0.5f + (32767.0f * clamped)))));
|
||||
};
|
||||
|
@ -2195,9 +2196,9 @@ ConstEval::Result ConstEval::pack2x16snorm(const sem::Type* ty,
|
|||
|
||||
ConstEval::Result ConstEval::pack2x16unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source&) {
|
||||
const Source& source) {
|
||||
auto calc = [&](f32 val) -> u32 {
|
||||
auto clamped = Clamp(val, f32(0.0f), f32(1.0f)).Get();
|
||||
auto clamped = Clamp(source, val, f32(0.0f), f32(1.0f)).Get();
|
||||
return u32{std::floor(0.5f + (65535.0f * clamped))};
|
||||
};
|
||||
|
||||
|
@ -2211,9 +2212,9 @@ ConstEval::Result ConstEval::pack2x16unorm(const sem::Type* ty,
|
|||
|
||||
ConstEval::Result ConstEval::pack4x8snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source&) {
|
||||
const Source& source) {
|
||||
auto calc = [&](f32 val) -> u32 {
|
||||
auto clamped = Clamp(val, f32(-1.0f), f32(1.0f)).Get();
|
||||
auto clamped = Clamp(source, val, f32(-1.0f), f32(1.0f)).Get();
|
||||
return u32(
|
||||
utils::Bitcast<uint8_t>(static_cast<int8_t>(std::floor(0.5f + (127.0f * clamped)))));
|
||||
};
|
||||
|
@ -2231,9 +2232,9 @@ ConstEval::Result ConstEval::pack4x8snorm(const sem::Type* ty,
|
|||
|
||||
ConstEval::Result ConstEval::pack4x8unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source&) {
|
||||
const Source& source) {
|
||||
auto calc = [&](f32 val) -> u32 {
|
||||
auto clamped = Clamp(val, f32(0.0f), f32(1.0f)).Get();
|
||||
auto clamped = Clamp(source, val, f32(0.0f), f32(1.0f)).Get();
|
||||
return u32{std::floor(0.5f + (255.0f * clamped))};
|
||||
};
|
||||
|
||||
|
@ -2405,8 +2406,6 @@ ConstEval::Result ConstEval::sinh(const sem::Type* ty,
|
|||
ConstEval::Result ConstEval::smoothstep(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
const Source& source) {
|
||||
TINT_SCOPED_ASSIGNMENT(current_source, &source);
|
||||
|
||||
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1,
|
||||
const sem::Constant* c2) {
|
||||
auto create = [&](auto low, auto high, auto x) -> ImplResult {
|
||||
|
@ -2418,33 +2417,33 @@ ConstEval::Result ConstEval::smoothstep(const sem::Type* ty,
|
|||
};
|
||||
|
||||
// t = clamp((x - low) / (high - low), 0.0, 1.0)
|
||||
auto x_minus_low = Sub(x, low);
|
||||
auto high_minus_low = Sub(high, low);
|
||||
auto x_minus_low = Sub(source, x, low);
|
||||
auto high_minus_low = Sub(source, high, low);
|
||||
if (!x_minus_low || !high_minus_low) {
|
||||
return err();
|
||||
}
|
||||
|
||||
auto div = Div(x_minus_low.Get(), high_minus_low.Get());
|
||||
auto div = Div(source, x_minus_low.Get(), high_minus_low.Get());
|
||||
if (!div) {
|
||||
return err();
|
||||
}
|
||||
|
||||
auto clamp = Clamp(div.Get(), NumberT(0), NumberT(1));
|
||||
auto clamp = Clamp(source, div.Get(), NumberT(0), NumberT(1));
|
||||
auto t = clamp.Get();
|
||||
|
||||
// result = t * t * (3.0 - 2.0 * t)
|
||||
auto t_times_t = Mul(t, t);
|
||||
auto t_times_2 = Mul(NumberT(2), t);
|
||||
auto t_times_t = Mul(source, t, t);
|
||||
auto t_times_2 = Mul(source, NumberT(2), t);
|
||||
if (!t_times_t || !t_times_2) {
|
||||
return err();
|
||||
}
|
||||
|
||||
auto three_minus_t_times_2 = Sub(NumberT(3), t_times_2.Get());
|
||||
auto three_minus_t_times_2 = Sub(source, NumberT(3), t_times_2.Get());
|
||||
if (!three_minus_t_times_2) {
|
||||
return err();
|
||||
}
|
||||
|
||||
auto result = Mul(t_times_t.Get(), three_minus_t_times_2.Get());
|
||||
auto result = Mul(source, t_times_t.Get(), three_minus_t_times_2.Get());
|
||||
if (!result) {
|
||||
return err();
|
||||
}
|
||||
|
|
|
@ -105,7 +105,7 @@ class ConstEval {
|
|||
/// Convert the `value` to `target_type`
|
||||
/// @param ty the result type
|
||||
/// @param value the value being converted
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the converted value, or null if the value cannot be calculated
|
||||
Result Convert(const sem::Type* ty, const sem::Constant* value, const Source& source);
|
||||
|
||||
|
@ -116,7 +116,7 @@ class ConstEval {
|
|||
/// Type conversion
|
||||
/// @param ty the result type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the converted value, or null if the value cannot be calculated
|
||||
Result Conv(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -125,7 +125,7 @@ class ConstEval {
|
|||
/// Zero value type initializer
|
||||
/// @param ty the result type
|
||||
/// @param args the input arguments (no arguments provided)
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result Zero(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -134,7 +134,7 @@ class ConstEval {
|
|||
/// Identity value type initializer
|
||||
/// @param ty the result type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result Identity(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -143,7 +143,7 @@ class ConstEval {
|
|||
/// Vector splat initializer
|
||||
/// @param ty the vector type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result VecSplat(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -152,7 +152,7 @@ class ConstEval {
|
|||
/// Vector initializer using scalars
|
||||
/// @param ty the vector type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result VecInitS(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -161,7 +161,7 @@ class ConstEval {
|
|||
/// Vector initializer using a mix of scalars and smaller vectors
|
||||
/// @param ty the vector type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result VecInitM(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -170,7 +170,7 @@ class ConstEval {
|
|||
/// Matrix initializer using scalar values
|
||||
/// @param ty the matrix type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result MatInitS(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -179,7 +179,7 @@ class ConstEval {
|
|||
/// Matrix initializer using column vectors
|
||||
/// @param ty the matrix type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the constructed value, or null if the value cannot be calculated
|
||||
Result MatInitV(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -192,7 +192,7 @@ class ConstEval {
|
|||
/// Complement operator '~'
|
||||
/// @param ty the integer type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpComplement(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -201,7 +201,7 @@ class ConstEval {
|
|||
/// Unary minus operator '-'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpUnaryMinus(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -210,7 +210,7 @@ class ConstEval {
|
|||
/// Unary not operator '!'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpNot(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -223,7 +223,7 @@ class ConstEval {
|
|||
/// Plus operator '+'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpPlus(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -232,7 +232,7 @@ class ConstEval {
|
|||
/// Minus operator '-'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpMinus(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -241,7 +241,7 @@ class ConstEval {
|
|||
/// Multiply operator '*' for the same type on the LHS and RHS
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpMultiply(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -250,7 +250,7 @@ class ConstEval {
|
|||
/// Multiply operator '*' for matCxR<T> * vecC<T>
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpMultiplyMatVec(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -259,7 +259,7 @@ class ConstEval {
|
|||
/// Multiply operator '*' for vecR<T> * matCxR<T>
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpMultiplyVecMat(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -268,7 +268,7 @@ class ConstEval {
|
|||
/// Multiply operator '*' for matKxR<T> * matCxK<T>
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpMultiplyMatMat(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -277,7 +277,7 @@ class ConstEval {
|
|||
/// Divide operator '/'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpDivide(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -286,7 +286,7 @@ class ConstEval {
|
|||
/// Equality operator '=='
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpEqual(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -295,7 +295,7 @@ class ConstEval {
|
|||
/// Inequality operator '!='
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpNotEqual(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -304,7 +304,7 @@ class ConstEval {
|
|||
/// Less than operator '<'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpLessThan(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -313,7 +313,7 @@ class ConstEval {
|
|||
/// Greater than operator '>'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpGreaterThan(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -322,7 +322,7 @@ class ConstEval {
|
|||
/// Less than or equal operator '<='
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpLessThanEqual(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -331,7 +331,7 @@ class ConstEval {
|
|||
/// Greater than or equal operator '>='
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpGreaterThanEqual(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -340,7 +340,7 @@ class ConstEval {
|
|||
/// Bitwise and operator '&'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpAnd(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -349,7 +349,7 @@ class ConstEval {
|
|||
/// Bitwise or operator '|'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpOr(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -358,7 +358,7 @@ class ConstEval {
|
|||
/// Bitwise xor operator '^'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpXor(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -367,7 +367,7 @@ class ConstEval {
|
|||
/// Bitwise shift left operator '<<'
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result OpShiftLeft(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -380,7 +380,7 @@ class ConstEval {
|
|||
/// abs builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result abs(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -389,7 +389,7 @@ class ConstEval {
|
|||
/// acos builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result acos(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -398,7 +398,7 @@ class ConstEval {
|
|||
/// acosh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result acosh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -407,7 +407,7 @@ class ConstEval {
|
|||
/// all builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result all(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -416,7 +416,7 @@ class ConstEval {
|
|||
/// any builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result any(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -425,7 +425,7 @@ class ConstEval {
|
|||
/// asin builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result asin(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -434,7 +434,7 @@ class ConstEval {
|
|||
/// asinh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result asinh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -443,7 +443,7 @@ class ConstEval {
|
|||
/// atan builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result atan(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -452,7 +452,7 @@ class ConstEval {
|
|||
/// atanh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result atanh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -461,7 +461,7 @@ class ConstEval {
|
|||
/// atan2 builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result atan2(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -470,7 +470,7 @@ class ConstEval {
|
|||
/// ceil builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result ceil(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -479,7 +479,7 @@ class ConstEval {
|
|||
/// clamp builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result clamp(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -488,7 +488,7 @@ class ConstEval {
|
|||
/// cos builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result cos(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -497,7 +497,7 @@ class ConstEval {
|
|||
/// cosh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result cosh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -506,7 +506,7 @@ class ConstEval {
|
|||
/// countLeadingZeros builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result countLeadingZeros(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -515,7 +515,7 @@ class ConstEval {
|
|||
/// countOneBits builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result countOneBits(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -524,7 +524,7 @@ class ConstEval {
|
|||
/// countTrailingZeros builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result countTrailingZeros(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -533,7 +533,7 @@ class ConstEval {
|
|||
/// cross builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result cross(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -542,7 +542,7 @@ class ConstEval {
|
|||
/// extractBits builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result extractBits(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -551,7 +551,7 @@ class ConstEval {
|
|||
/// firstLeadingBit builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result firstLeadingBit(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -560,7 +560,7 @@ class ConstEval {
|
|||
/// firstTrailingBit builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result firstTrailingBit(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -569,7 +569,7 @@ class ConstEval {
|
|||
/// floor builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result floor(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -578,7 +578,7 @@ class ConstEval {
|
|||
/// insertBits builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result insertBits(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -587,7 +587,7 @@ class ConstEval {
|
|||
/// max builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result max(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -596,7 +596,7 @@ class ConstEval {
|
|||
/// min builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result min(const sem::Type* ty, // NOLINT(build/include_what_you_use) -- confused by min
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -605,7 +605,7 @@ class ConstEval {
|
|||
/// pack2x16float builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result pack2x16float(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -614,7 +614,7 @@ class ConstEval {
|
|||
/// pack2x16snorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result pack2x16snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -623,7 +623,7 @@ class ConstEval {
|
|||
/// pack2x16unorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result pack2x16unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -632,7 +632,7 @@ class ConstEval {
|
|||
/// pack4x8snorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result pack4x8snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -641,7 +641,7 @@ class ConstEval {
|
|||
/// pack4x8unorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result pack4x8unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -650,7 +650,7 @@ class ConstEval {
|
|||
/// reverseBits builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result reverseBits(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -659,7 +659,7 @@ class ConstEval {
|
|||
/// round builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result round(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -668,7 +668,7 @@ class ConstEval {
|
|||
/// saturate builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result saturate(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -677,7 +677,7 @@ class ConstEval {
|
|||
/// select builtin with single bool third arg
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result select_bool(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -686,7 +686,7 @@ class ConstEval {
|
|||
/// select builtin with vector of bool third arg
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result select_boolvec(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -695,7 +695,7 @@ class ConstEval {
|
|||
/// sign builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result sign(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -704,7 +704,7 @@ class ConstEval {
|
|||
/// sin builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result sin(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -713,7 +713,7 @@ class ConstEval {
|
|||
/// sinh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result sinh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -722,7 +722,7 @@ class ConstEval {
|
|||
/// smoothstep builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result smoothstep(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -731,7 +731,7 @@ class ConstEval {
|
|||
/// step builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result step(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -740,7 +740,7 @@ class ConstEval {
|
|||
/// sqrt builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result sqrt(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -749,7 +749,7 @@ class ConstEval {
|
|||
/// tan builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result tan(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -758,7 +758,7 @@ class ConstEval {
|
|||
/// tanh builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result tanh(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -767,7 +767,7 @@ class ConstEval {
|
|||
/// trunc builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result trunc(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -776,7 +776,7 @@ class ConstEval {
|
|||
/// unpack2x16float builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result unpack2x16float(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -785,7 +785,7 @@ class ConstEval {
|
|||
/// unpack2x16snorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result unpack2x16snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -794,7 +794,7 @@ class ConstEval {
|
|||
/// unpack2x16unorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result unpack2x16unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -803,7 +803,7 @@ class ConstEval {
|
|||
/// unpack4x8snorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result unpack4x8snorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -812,7 +812,7 @@ class ConstEval {
|
|||
/// unpack4x8unorm builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result unpack4x8unorm(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -821,7 +821,7 @@ class ConstEval {
|
|||
/// quantizeToF16 builtin
|
||||
/// @param ty the expression type
|
||||
/// @param args the input arguments
|
||||
/// @param source the source location of the conversion
|
||||
/// @param source the source location
|
||||
/// @return the result value, or null if the value cannot be calculated
|
||||
Result quantizeToF16(const sem::Type* ty,
|
||||
utils::VectorRef<const sem::Constant*> args,
|
||||
|
@ -838,43 +838,53 @@ class ConstEval {
|
|||
void AddNote(const std::string& msg, const Source& source) const;
|
||||
|
||||
/// Adds two Number<T>s
|
||||
/// @param source the source location
|
||||
/// @param a the lhs number
|
||||
/// @param b the rhs number
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Add(NumberT a, NumberT b);
|
||||
utils::Result<NumberT> Add(const Source& source, NumberT a, NumberT b);
|
||||
|
||||
/// Subtracts two Number<T>s
|
||||
/// @param source the source location
|
||||
/// @param a the lhs number
|
||||
/// @param b the rhs number
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Sub(NumberT a, NumberT b);
|
||||
utils::Result<NumberT> Sub(const Source& source, NumberT a, NumberT b);
|
||||
|
||||
/// Multiplies two Number<T>s
|
||||
/// @param source the source location
|
||||
/// @param a the lhs number
|
||||
/// @param b the rhs number
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Mul(NumberT a, NumberT b);
|
||||
utils::Result<NumberT> Mul(const Source& source, NumberT a, NumberT b);
|
||||
|
||||
/// Divides two Number<T>s
|
||||
/// @param source the source location
|
||||
/// @param a the lhs number
|
||||
/// @param b the rhs number
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Div(NumberT a, NumberT b);
|
||||
utils::Result<NumberT> Div(const Source& source, NumberT a, NumberT b);
|
||||
|
||||
/// Returns the dot product of (a1,a2) with (b1,b2)
|
||||
/// @param source the source location
|
||||
/// @param a1 component 1 of lhs vector
|
||||
/// @param a2 component 2 of lhs vector
|
||||
/// @param b1 component 1 of rhs vector
|
||||
/// @param b2 component 2 of rhs vector
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Dot2(NumberT a1, NumberT a2, NumberT b1, NumberT b2);
|
||||
utils::Result<NumberT> Dot2(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT b1,
|
||||
NumberT b2);
|
||||
|
||||
/// Returns the dot product of (a1,a2,a3) with (b1,b2,b3)
|
||||
/// @param source the source location
|
||||
/// @param a1 component 1 of lhs vector
|
||||
/// @param a2 component 2 of lhs vector
|
||||
/// @param a3 component 3 of lhs vector
|
||||
|
@ -883,7 +893,8 @@ class ConstEval {
|
|||
/// @param b3 component 3 of rhs vector
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Dot3(NumberT a1,
|
||||
utils::Result<NumberT> Dot3(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT a3,
|
||||
NumberT b1,
|
||||
|
@ -891,6 +902,7 @@ class ConstEval {
|
|||
NumberT b3);
|
||||
|
||||
/// Returns the dot product of (a1,b1,c1,d1) with (a2,b2,c2,d2)
|
||||
/// @param source the source location
|
||||
/// @param a1 component 1 of lhs vector
|
||||
/// @param a2 component 2 of lhs vector
|
||||
/// @param a3 component 3 of lhs vector
|
||||
|
@ -901,7 +913,8 @@ class ConstEval {
|
|||
/// @param b4 component 4 of rhs vector
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Dot4(NumberT a1,
|
||||
utils::Result<NumberT> Dot4(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT a3,
|
||||
NumberT a4,
|
||||
|
@ -911,77 +924,91 @@ class ConstEval {
|
|||
NumberT b4);
|
||||
|
||||
/// Returns the determinant of the 2x2 matrix [(a1, a2), (b1, b2)]
|
||||
/// @param source the source location
|
||||
/// @param a1 component 1 of the first column vector
|
||||
/// @param a2 component 2 of the first column vector
|
||||
/// @param b1 component 1 of the second column vector
|
||||
/// @param b2 component 2 of the second column vector
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Det2(NumberT a1, NumberT a2, NumberT b1, NumberT b2);
|
||||
utils::Result<NumberT> Det2(const Source& source,
|
||||
NumberT a1,
|
||||
NumberT a2,
|
||||
NumberT b1,
|
||||
NumberT b2);
|
||||
|
||||
/// Clamps e between low and high
|
||||
/// @param source the source location
|
||||
/// @param e the number to clamp
|
||||
/// @param low the lower bound
|
||||
/// @param high the upper bound
|
||||
/// @returns the result number on success, or logs an error and returns Failure
|
||||
template <typename NumberT>
|
||||
utils::Result<NumberT> Clamp(NumberT e, NumberT low, NumberT high);
|
||||
utils::Result<NumberT> Clamp(const Source& source, NumberT e, NumberT low, NumberT high);
|
||||
|
||||
/// Returns a callable that calls Add, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto AddFunc(const sem::Type* elem_ty);
|
||||
auto AddFunc(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Sub, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto SubFunc(const sem::Type* elem_ty);
|
||||
auto SubFunc(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Mul, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto MulFunc(const sem::Type* elem_ty);
|
||||
auto MulFunc(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Div, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto DivFunc(const sem::Type* elem_ty);
|
||||
auto DivFunc(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Dot2, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto Dot2Func(const sem::Type* elem_ty);
|
||||
auto Dot2Func(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Dot3, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto Dot3Func(const sem::Type* elem_ty);
|
||||
auto Dot3Func(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Dot4, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto Dot4Func(const sem::Type* elem_ty);
|
||||
auto Dot4Func(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Det2, and creates a Constant with its result of type `elem_ty`
|
||||
/// if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto Det2Func(const sem::Type* elem_ty);
|
||||
auto Det2Func(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
/// Returns a callable that calls Clamp, and creates a Constant with its result of type
|
||||
/// `elem_ty` if successful, or returns Failure otherwise.
|
||||
/// @param source the source location
|
||||
/// @param elem_ty the element type of the Constant to create on success
|
||||
/// @returns the callable function
|
||||
auto ClampFunc(const sem::Type* elem_ty);
|
||||
auto ClampFunc(const Source& source, const sem::Type* elem_ty);
|
||||
|
||||
ProgramBuilder& builder;
|
||||
const Source* current_source = nullptr;
|
||||
};
|
||||
|
||||
} // namespace tint::resolver
|
||||
|
|
Loading…
Reference in New Issue