Move IntrinsicType parsing to semantic/intrinsic.h
Keeps the enum / parse / print code all together. Change-Id: I78e5e15b6a97d3aec619a94e4390ecc4a77ab478 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/43980 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
dee7d36f8a
commit
f25d51977a
1
BUILD.gn
1
BUILD.gn
|
@ -844,6 +844,7 @@ source_set("tint_unittests_core_src") {
|
||||||
"src/intrinsic_table_test.cc",
|
"src/intrinsic_table_test.cc",
|
||||||
"src/program_builder_test.cc",
|
"src/program_builder_test.cc",
|
||||||
"src/program_test.cc",
|
"src/program_test.cc",
|
||||||
|
"src/semantic/sem_intrinsic_test.cc",
|
||||||
"src/scope_stack_test.cc",
|
"src/scope_stack_test.cc",
|
||||||
"src/symbol_table_test.cc",
|
"src/symbol_table_test.cc",
|
||||||
"src/symbol_test.cc",
|
"src/symbol_test.cc",
|
||||||
|
|
|
@ -472,6 +472,7 @@ if(${TINT_BUILD_TESTS})
|
||||||
inspector/inspector_test.cc
|
inspector/inspector_test.cc
|
||||||
intrinsic_table_test.cc
|
intrinsic_table_test.cc
|
||||||
program_test.cc
|
program_test.cc
|
||||||
|
semantic/sem_intrinsic_test.cc
|
||||||
scope_stack_test.cc
|
scope_stack_test.cc
|
||||||
symbol_table_test.cc
|
symbol_table_test.cc
|
||||||
symbol_test.cc
|
symbol_test.cc
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#define SRC_SEMANTIC_INTRINSIC_H_
|
#define SRC_SEMANTIC_INTRINSIC_H_
|
||||||
|
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "src/semantic/call_target.h"
|
#include "src/semantic/call_target.h"
|
||||||
|
|
||||||
|
@ -109,6 +110,12 @@ enum class IntrinsicType {
|
||||||
kUnpack2x16Float,
|
kUnpack2x16Float,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Matches the IntrisicType by name
|
||||||
|
/// @param name the intrinsic name to parse
|
||||||
|
/// @returns the parsed IntrinsicType, or IntrinsicType::kNone if `name` did not
|
||||||
|
/// match any intrinsic.
|
||||||
|
IntrinsicType ParseIntrinsicType(const std::string& name);
|
||||||
|
|
||||||
/// @returns the name of the intrinsic function type. The spelling, including
|
/// @returns the name of the intrinsic function type. The spelling, including
|
||||||
/// case, matches the name in the WGSL spec.
|
/// case, matches the name in the WGSL spec.
|
||||||
const char* str(IntrinsicType i);
|
const char* str(IntrinsicType i);
|
||||||
|
|
|
@ -28,6 +28,175 @@ const char* Intrinsic::str() const {
|
||||||
return semantic::str(type_);
|
return semantic::str(type_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntrinsicType ParseIntrinsicType(const std::string& name) {
|
||||||
|
if (name == "abs") {
|
||||||
|
return IntrinsicType::kAbs;
|
||||||
|
} else if (name == "acos") {
|
||||||
|
return IntrinsicType::kAcos;
|
||||||
|
} else if (name == "all") {
|
||||||
|
return IntrinsicType::kAll;
|
||||||
|
} else if (name == "any") {
|
||||||
|
return IntrinsicType::kAny;
|
||||||
|
} else if (name == "arrayLength") {
|
||||||
|
return IntrinsicType::kArrayLength;
|
||||||
|
} else if (name == "asin") {
|
||||||
|
return IntrinsicType::kAsin;
|
||||||
|
} else if (name == "atan") {
|
||||||
|
return IntrinsicType::kAtan;
|
||||||
|
} else if (name == "atan2") {
|
||||||
|
return IntrinsicType::kAtan2;
|
||||||
|
} else if (name == "ceil") {
|
||||||
|
return IntrinsicType::kCeil;
|
||||||
|
} else if (name == "clamp") {
|
||||||
|
return IntrinsicType::kClamp;
|
||||||
|
} else if (name == "cos") {
|
||||||
|
return IntrinsicType::kCos;
|
||||||
|
} else if (name == "cosh") {
|
||||||
|
return IntrinsicType::kCosh;
|
||||||
|
} else if (name == "countOneBits") {
|
||||||
|
return IntrinsicType::kCountOneBits;
|
||||||
|
} else if (name == "cross") {
|
||||||
|
return IntrinsicType::kCross;
|
||||||
|
} else if (name == "determinant") {
|
||||||
|
return IntrinsicType::kDeterminant;
|
||||||
|
} else if (name == "distance") {
|
||||||
|
return IntrinsicType::kDistance;
|
||||||
|
} else if (name == "dot") {
|
||||||
|
return IntrinsicType::kDot;
|
||||||
|
} else if (name == "dpdx") {
|
||||||
|
return IntrinsicType::kDpdx;
|
||||||
|
} else if (name == "dpdxCoarse") {
|
||||||
|
return IntrinsicType::kDpdxCoarse;
|
||||||
|
} else if (name == "dpdxFine") {
|
||||||
|
return IntrinsicType::kDpdxFine;
|
||||||
|
} else if (name == "dpdy") {
|
||||||
|
return IntrinsicType::kDpdy;
|
||||||
|
} else if (name == "dpdyCoarse") {
|
||||||
|
return IntrinsicType::kDpdyCoarse;
|
||||||
|
} else if (name == "dpdyFine") {
|
||||||
|
return IntrinsicType::kDpdyFine;
|
||||||
|
} else if (name == "exp") {
|
||||||
|
return IntrinsicType::kExp;
|
||||||
|
} else if (name == "exp2") {
|
||||||
|
return IntrinsicType::kExp2;
|
||||||
|
} else if (name == "faceForward") {
|
||||||
|
return IntrinsicType::kFaceForward;
|
||||||
|
} else if (name == "floor") {
|
||||||
|
return IntrinsicType::kFloor;
|
||||||
|
} else if (name == "fma") {
|
||||||
|
return IntrinsicType::kFma;
|
||||||
|
} else if (name == "fract") {
|
||||||
|
return IntrinsicType::kFract;
|
||||||
|
} else if (name == "frexp") {
|
||||||
|
return IntrinsicType::kFrexp;
|
||||||
|
} else if (name == "fwidth") {
|
||||||
|
return IntrinsicType::kFwidth;
|
||||||
|
} else if (name == "fwidthCoarse") {
|
||||||
|
return IntrinsicType::kFwidthCoarse;
|
||||||
|
} else if (name == "fwidthFine") {
|
||||||
|
return IntrinsicType::kFwidthFine;
|
||||||
|
} else if (name == "inverseSqrt") {
|
||||||
|
return IntrinsicType::kInverseSqrt;
|
||||||
|
} else if (name == "isFinite") {
|
||||||
|
return IntrinsicType::kIsFinite;
|
||||||
|
} else if (name == "isInf") {
|
||||||
|
return IntrinsicType::kIsInf;
|
||||||
|
} else if (name == "isNan") {
|
||||||
|
return IntrinsicType::kIsNan;
|
||||||
|
} else if (name == "isNormal") {
|
||||||
|
return IntrinsicType::kIsNormal;
|
||||||
|
} else if (name == "ldexp") {
|
||||||
|
return IntrinsicType::kLdexp;
|
||||||
|
} else if (name == "length") {
|
||||||
|
return IntrinsicType::kLength;
|
||||||
|
} else if (name == "log") {
|
||||||
|
return IntrinsicType::kLog;
|
||||||
|
} else if (name == "log2") {
|
||||||
|
return IntrinsicType::kLog2;
|
||||||
|
} else if (name == "max") {
|
||||||
|
return IntrinsicType::kMax;
|
||||||
|
} else if (name == "min") {
|
||||||
|
return IntrinsicType::kMin;
|
||||||
|
} else if (name == "mix") {
|
||||||
|
return IntrinsicType::kMix;
|
||||||
|
} else if (name == "modf") {
|
||||||
|
return IntrinsicType::kModf;
|
||||||
|
} else if (name == "normalize") {
|
||||||
|
return IntrinsicType::kNormalize;
|
||||||
|
} else if (name == "pack4x8snorm") {
|
||||||
|
return IntrinsicType::kPack4x8Snorm;
|
||||||
|
} else if (name == "pack4x8unorm") {
|
||||||
|
return IntrinsicType::kPack4x8Unorm;
|
||||||
|
} else if (name == "pack2x16snorm") {
|
||||||
|
return IntrinsicType::kPack2x16Snorm;
|
||||||
|
} else if (name == "pack2x16unorm") {
|
||||||
|
return IntrinsicType::kPack2x16Unorm;
|
||||||
|
} else if (name == "pack2x16float") {
|
||||||
|
return IntrinsicType::kPack2x16Float;
|
||||||
|
} else if (name == "pow") {
|
||||||
|
return IntrinsicType::kPow;
|
||||||
|
} else if (name == "reflect") {
|
||||||
|
return IntrinsicType::kReflect;
|
||||||
|
} else if (name == "reverseBits") {
|
||||||
|
return IntrinsicType::kReverseBits;
|
||||||
|
} else if (name == "round") {
|
||||||
|
return IntrinsicType::kRound;
|
||||||
|
} else if (name == "select") {
|
||||||
|
return IntrinsicType::kSelect;
|
||||||
|
} else if (name == "sign") {
|
||||||
|
return IntrinsicType::kSign;
|
||||||
|
} else if (name == "sin") {
|
||||||
|
return IntrinsicType::kSin;
|
||||||
|
} else if (name == "sinh") {
|
||||||
|
return IntrinsicType::kSinh;
|
||||||
|
} else if (name == "smoothStep") {
|
||||||
|
return IntrinsicType::kSmoothStep;
|
||||||
|
} else if (name == "sqrt") {
|
||||||
|
return IntrinsicType::kSqrt;
|
||||||
|
} else if (name == "step") {
|
||||||
|
return IntrinsicType::kStep;
|
||||||
|
} else if (name == "tan") {
|
||||||
|
return IntrinsicType::kTan;
|
||||||
|
} else if (name == "tanh") {
|
||||||
|
return IntrinsicType::kTanh;
|
||||||
|
} else if (name == "textureDimensions") {
|
||||||
|
return IntrinsicType::kTextureDimensions;
|
||||||
|
} else if (name == "textureNumLayers") {
|
||||||
|
return IntrinsicType::kTextureNumLayers;
|
||||||
|
} else if (name == "textureNumLevels") {
|
||||||
|
return IntrinsicType::kTextureNumLevels;
|
||||||
|
} else if (name == "textureNumSamples") {
|
||||||
|
return IntrinsicType::kTextureNumSamples;
|
||||||
|
} else if (name == "textureLoad") {
|
||||||
|
return IntrinsicType::kTextureLoad;
|
||||||
|
} else if (name == "textureStore") {
|
||||||
|
return IntrinsicType::kTextureStore;
|
||||||
|
} else if (name == "textureSample") {
|
||||||
|
return IntrinsicType::kTextureSample;
|
||||||
|
} else if (name == "textureSampleBias") {
|
||||||
|
return IntrinsicType::kTextureSampleBias;
|
||||||
|
} else if (name == "textureSampleCompare") {
|
||||||
|
return IntrinsicType::kTextureSampleCompare;
|
||||||
|
} else if (name == "textureSampleGrad") {
|
||||||
|
return IntrinsicType::kTextureSampleGrad;
|
||||||
|
} else if (name == "textureSampleLevel") {
|
||||||
|
return IntrinsicType::kTextureSampleLevel;
|
||||||
|
} else if (name == "trunc") {
|
||||||
|
return IntrinsicType::kTrunc;
|
||||||
|
} else if (name == "unpack4x8snorm") {
|
||||||
|
return IntrinsicType::kUnpack4x8Snorm;
|
||||||
|
} else if (name == "unpack4x8unorm") {
|
||||||
|
return IntrinsicType::kUnpack4x8Unorm;
|
||||||
|
} else if (name == "unpack2x16snorm") {
|
||||||
|
return IntrinsicType::kUnpack2x16Snorm;
|
||||||
|
} else if (name == "unpack2x16unorm") {
|
||||||
|
return IntrinsicType::kUnpack2x16Unorm;
|
||||||
|
} else if (name == "unpack2x16float") {
|
||||||
|
return IntrinsicType::kUnpack2x16Float;
|
||||||
|
}
|
||||||
|
return IntrinsicType::kNone;
|
||||||
|
}
|
||||||
|
|
||||||
const char* str(IntrinsicType i) {
|
const char* str(IntrinsicType i) {
|
||||||
/// The emitted name matches the spelling in the WGSL spec.
|
/// The emitted name matches the spelling in the WGSL spec.
|
||||||
/// including case.
|
/// including case.
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
// Copyright 2021 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/semantic/intrinsic.h"
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace tint {
|
||||||
|
namespace semantic {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct IntrinsicData {
|
||||||
|
const char* name;
|
||||||
|
IntrinsicType intrinsic;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline std::ostream& operator<<(std::ostream& out, IntrinsicData data) {
|
||||||
|
out << data.name;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
using IntrinsicTypeTest = testing::TestWithParam<IntrinsicData>;
|
||||||
|
|
||||||
|
TEST_P(IntrinsicTypeTest, Parse) {
|
||||||
|
auto param = GetParam();
|
||||||
|
EXPECT_EQ(ParseIntrinsicType(param.name), param.intrinsic);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
IntrinsicTypeTest,
|
||||||
|
IntrinsicTypeTest,
|
||||||
|
testing::Values(
|
||||||
|
IntrinsicData{"abs", IntrinsicType::kAbs},
|
||||||
|
IntrinsicData{"acos", IntrinsicType::kAcos},
|
||||||
|
IntrinsicData{"all", IntrinsicType::kAll},
|
||||||
|
IntrinsicData{"any", IntrinsicType::kAny},
|
||||||
|
IntrinsicData{"arrayLength", IntrinsicType::kArrayLength},
|
||||||
|
IntrinsicData{"asin", IntrinsicType::kAsin},
|
||||||
|
IntrinsicData{"atan", IntrinsicType::kAtan},
|
||||||
|
IntrinsicData{"atan2", IntrinsicType::kAtan2},
|
||||||
|
IntrinsicData{"ceil", IntrinsicType::kCeil},
|
||||||
|
IntrinsicData{"clamp", IntrinsicType::kClamp},
|
||||||
|
IntrinsicData{"cos", IntrinsicType::kCos},
|
||||||
|
IntrinsicData{"cosh", IntrinsicType::kCosh},
|
||||||
|
IntrinsicData{"countOneBits", IntrinsicType::kCountOneBits},
|
||||||
|
IntrinsicData{"cross", IntrinsicType::kCross},
|
||||||
|
IntrinsicData{"determinant", IntrinsicType::kDeterminant},
|
||||||
|
IntrinsicData{"distance", IntrinsicType::kDistance},
|
||||||
|
IntrinsicData{"dot", IntrinsicType::kDot},
|
||||||
|
IntrinsicData{"dpdx", IntrinsicType::kDpdx},
|
||||||
|
IntrinsicData{"dpdxCoarse", IntrinsicType::kDpdxCoarse},
|
||||||
|
IntrinsicData{"dpdxFine", IntrinsicType::kDpdxFine},
|
||||||
|
IntrinsicData{"dpdy", IntrinsicType::kDpdy},
|
||||||
|
IntrinsicData{"dpdyCoarse", IntrinsicType::kDpdyCoarse},
|
||||||
|
IntrinsicData{"dpdyFine", IntrinsicType::kDpdyFine},
|
||||||
|
IntrinsicData{"exp", IntrinsicType::kExp},
|
||||||
|
IntrinsicData{"exp2", IntrinsicType::kExp2},
|
||||||
|
IntrinsicData{"faceForward", IntrinsicType::kFaceForward},
|
||||||
|
IntrinsicData{"floor", IntrinsicType::kFloor},
|
||||||
|
IntrinsicData{"fma", IntrinsicType::kFma},
|
||||||
|
IntrinsicData{"fract", IntrinsicType::kFract},
|
||||||
|
IntrinsicData{"frexp", IntrinsicType::kFrexp},
|
||||||
|
IntrinsicData{"fwidth", IntrinsicType::kFwidth},
|
||||||
|
IntrinsicData{"fwidthCoarse", IntrinsicType::kFwidthCoarse},
|
||||||
|
IntrinsicData{"fwidthFine", IntrinsicType::kFwidthFine},
|
||||||
|
IntrinsicData{"inverseSqrt", IntrinsicType::kInverseSqrt},
|
||||||
|
IntrinsicData{"isFinite", IntrinsicType::kIsFinite},
|
||||||
|
IntrinsicData{"isInf", IntrinsicType::kIsInf},
|
||||||
|
IntrinsicData{"isNan", IntrinsicType::kIsNan},
|
||||||
|
IntrinsicData{"isNormal", IntrinsicType::kIsNormal},
|
||||||
|
IntrinsicData{"ldexp", IntrinsicType::kLdexp},
|
||||||
|
IntrinsicData{"length", IntrinsicType::kLength},
|
||||||
|
IntrinsicData{"log", IntrinsicType::kLog},
|
||||||
|
IntrinsicData{"log2", IntrinsicType::kLog2},
|
||||||
|
IntrinsicData{"max", IntrinsicType::kMax},
|
||||||
|
IntrinsicData{"min", IntrinsicType::kMin},
|
||||||
|
IntrinsicData{"mix", IntrinsicType::kMix},
|
||||||
|
IntrinsicData{"modf", IntrinsicType::kModf},
|
||||||
|
IntrinsicData{"normalize", IntrinsicType::kNormalize},
|
||||||
|
IntrinsicData{"pow", IntrinsicType::kPow},
|
||||||
|
IntrinsicData{"reflect", IntrinsicType::kReflect},
|
||||||
|
IntrinsicData{"reverseBits", IntrinsicType::kReverseBits},
|
||||||
|
IntrinsicData{"round", IntrinsicType::kRound},
|
||||||
|
IntrinsicData{"select", IntrinsicType::kSelect},
|
||||||
|
IntrinsicData{"sign", IntrinsicType::kSign},
|
||||||
|
IntrinsicData{"sin", IntrinsicType::kSin},
|
||||||
|
IntrinsicData{"sinh", IntrinsicType::kSinh},
|
||||||
|
IntrinsicData{"smoothStep", IntrinsicType::kSmoothStep},
|
||||||
|
IntrinsicData{"sqrt", IntrinsicType::kSqrt},
|
||||||
|
IntrinsicData{"step", IntrinsicType::kStep},
|
||||||
|
IntrinsicData{"tan", IntrinsicType::kTan},
|
||||||
|
IntrinsicData{"tanh", IntrinsicType::kTanh},
|
||||||
|
IntrinsicData{"textureDimensions", IntrinsicType::kTextureDimensions},
|
||||||
|
IntrinsicData{"textureLoad", IntrinsicType::kTextureLoad},
|
||||||
|
IntrinsicData{"textureNumLayers", IntrinsicType::kTextureNumLayers},
|
||||||
|
IntrinsicData{"textureNumLevels", IntrinsicType::kTextureNumLevels},
|
||||||
|
IntrinsicData{"textureNumSamples", IntrinsicType::kTextureNumSamples},
|
||||||
|
IntrinsicData{"textureSample", IntrinsicType::kTextureSample},
|
||||||
|
IntrinsicData{"textureSampleBias", IntrinsicType::kTextureSampleBias},
|
||||||
|
IntrinsicData{"textureSampleCompare",
|
||||||
|
IntrinsicType::kTextureSampleCompare},
|
||||||
|
IntrinsicData{"textureSampleGrad", IntrinsicType::kTextureSampleGrad},
|
||||||
|
IntrinsicData{"textureSampleLevel", IntrinsicType::kTextureSampleLevel},
|
||||||
|
IntrinsicData{"trunc", IntrinsicType::kTrunc}));
|
||||||
|
|
||||||
|
TEST_F(IntrinsicTypeTest, ParseNoMatch) {
|
||||||
|
EXPECT_EQ(ParseIntrinsicType("not_intrinsic"), IntrinsicType::kNone);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace semantic
|
||||||
|
} // namespace tint
|
|
@ -412,7 +412,7 @@ bool TypeDeterminer::DetermineCall(ast::CallExpression* call) {
|
||||||
|
|
||||||
auto name = builder_->Symbols().NameFor(ident->symbol());
|
auto name = builder_->Symbols().NameFor(ident->symbol());
|
||||||
|
|
||||||
auto intrinsic_type = MatchIntrinsicType(name);
|
auto intrinsic_type = semantic::ParseIntrinsicType(name);
|
||||||
if (intrinsic_type != IntrinsicType::kNone) {
|
if (intrinsic_type != IntrinsicType::kNone) {
|
||||||
if (!DetermineIntrinsicCall(call, intrinsic_type)) {
|
if (!DetermineIntrinsicCall(call, intrinsic_type)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -563,7 +563,7 @@ bool TypeDeterminer::DetermineIdentifier(ast::IdentifierExpression* expr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name = builder_->Symbols().NameFor(symbol);
|
std::string name = builder_->Symbols().NameFor(symbol);
|
||||||
if (MatchIntrinsicType(name) != IntrinsicType::kNone) {
|
if (semantic::ParseIntrinsicType(name) != IntrinsicType::kNone) {
|
||||||
diagnostics_.add_error("missing '(' for intrinsic call",
|
diagnostics_.add_error("missing '(' for intrinsic call",
|
||||||
expr->source().End());
|
expr->source().End());
|
||||||
return false;
|
return false;
|
||||||
|
@ -575,175 +575,6 @@ bool TypeDeterminer::DetermineIdentifier(ast::IdentifierExpression* expr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
IntrinsicType TypeDeterminer::MatchIntrinsicType(const std::string& name) {
|
|
||||||
if (name == "abs") {
|
|
||||||
return IntrinsicType::kAbs;
|
|
||||||
} else if (name == "acos") {
|
|
||||||
return IntrinsicType::kAcos;
|
|
||||||
} else if (name == "all") {
|
|
||||||
return IntrinsicType::kAll;
|
|
||||||
} else if (name == "any") {
|
|
||||||
return IntrinsicType::kAny;
|
|
||||||
} else if (name == "arrayLength") {
|
|
||||||
return IntrinsicType::kArrayLength;
|
|
||||||
} else if (name == "asin") {
|
|
||||||
return IntrinsicType::kAsin;
|
|
||||||
} else if (name == "atan") {
|
|
||||||
return IntrinsicType::kAtan;
|
|
||||||
} else if (name == "atan2") {
|
|
||||||
return IntrinsicType::kAtan2;
|
|
||||||
} else if (name == "ceil") {
|
|
||||||
return IntrinsicType::kCeil;
|
|
||||||
} else if (name == "clamp") {
|
|
||||||
return IntrinsicType::kClamp;
|
|
||||||
} else if (name == "cos") {
|
|
||||||
return IntrinsicType::kCos;
|
|
||||||
} else if (name == "cosh") {
|
|
||||||
return IntrinsicType::kCosh;
|
|
||||||
} else if (name == "countOneBits") {
|
|
||||||
return IntrinsicType::kCountOneBits;
|
|
||||||
} else if (name == "cross") {
|
|
||||||
return IntrinsicType::kCross;
|
|
||||||
} else if (name == "determinant") {
|
|
||||||
return IntrinsicType::kDeterminant;
|
|
||||||
} else if (name == "distance") {
|
|
||||||
return IntrinsicType::kDistance;
|
|
||||||
} else if (name == "dot") {
|
|
||||||
return IntrinsicType::kDot;
|
|
||||||
} else if (name == "dpdx") {
|
|
||||||
return IntrinsicType::kDpdx;
|
|
||||||
} else if (name == "dpdxCoarse") {
|
|
||||||
return IntrinsicType::kDpdxCoarse;
|
|
||||||
} else if (name == "dpdxFine") {
|
|
||||||
return IntrinsicType::kDpdxFine;
|
|
||||||
} else if (name == "dpdy") {
|
|
||||||
return IntrinsicType::kDpdy;
|
|
||||||
} else if (name == "dpdyCoarse") {
|
|
||||||
return IntrinsicType::kDpdyCoarse;
|
|
||||||
} else if (name == "dpdyFine") {
|
|
||||||
return IntrinsicType::kDpdyFine;
|
|
||||||
} else if (name == "exp") {
|
|
||||||
return IntrinsicType::kExp;
|
|
||||||
} else if (name == "exp2") {
|
|
||||||
return IntrinsicType::kExp2;
|
|
||||||
} else if (name == "faceForward") {
|
|
||||||
return IntrinsicType::kFaceForward;
|
|
||||||
} else if (name == "floor") {
|
|
||||||
return IntrinsicType::kFloor;
|
|
||||||
} else if (name == "fma") {
|
|
||||||
return IntrinsicType::kFma;
|
|
||||||
} else if (name == "fract") {
|
|
||||||
return IntrinsicType::kFract;
|
|
||||||
} else if (name == "frexp") {
|
|
||||||
return IntrinsicType::kFrexp;
|
|
||||||
} else if (name == "fwidth") {
|
|
||||||
return IntrinsicType::kFwidth;
|
|
||||||
} else if (name == "fwidthCoarse") {
|
|
||||||
return IntrinsicType::kFwidthCoarse;
|
|
||||||
} else if (name == "fwidthFine") {
|
|
||||||
return IntrinsicType::kFwidthFine;
|
|
||||||
} else if (name == "inverseSqrt") {
|
|
||||||
return IntrinsicType::kInverseSqrt;
|
|
||||||
} else if (name == "isFinite") {
|
|
||||||
return IntrinsicType::kIsFinite;
|
|
||||||
} else if (name == "isInf") {
|
|
||||||
return IntrinsicType::kIsInf;
|
|
||||||
} else if (name == "isNan") {
|
|
||||||
return IntrinsicType::kIsNan;
|
|
||||||
} else if (name == "isNormal") {
|
|
||||||
return IntrinsicType::kIsNormal;
|
|
||||||
} else if (name == "ldexp") {
|
|
||||||
return IntrinsicType::kLdexp;
|
|
||||||
} else if (name == "length") {
|
|
||||||
return IntrinsicType::kLength;
|
|
||||||
} else if (name == "log") {
|
|
||||||
return IntrinsicType::kLog;
|
|
||||||
} else if (name == "log2") {
|
|
||||||
return IntrinsicType::kLog2;
|
|
||||||
} else if (name == "max") {
|
|
||||||
return IntrinsicType::kMax;
|
|
||||||
} else if (name == "min") {
|
|
||||||
return IntrinsicType::kMin;
|
|
||||||
} else if (name == "mix") {
|
|
||||||
return IntrinsicType::kMix;
|
|
||||||
} else if (name == "modf") {
|
|
||||||
return IntrinsicType::kModf;
|
|
||||||
} else if (name == "normalize") {
|
|
||||||
return IntrinsicType::kNormalize;
|
|
||||||
} else if (name == "pack4x8snorm") {
|
|
||||||
return IntrinsicType::kPack4x8Snorm;
|
|
||||||
} else if (name == "pack4x8unorm") {
|
|
||||||
return IntrinsicType::kPack4x8Unorm;
|
|
||||||
} else if (name == "pack2x16snorm") {
|
|
||||||
return IntrinsicType::kPack2x16Snorm;
|
|
||||||
} else if (name == "pack2x16unorm") {
|
|
||||||
return IntrinsicType::kPack2x16Unorm;
|
|
||||||
} else if (name == "pack2x16float") {
|
|
||||||
return IntrinsicType::kPack2x16Float;
|
|
||||||
} else if (name == "pow") {
|
|
||||||
return IntrinsicType::kPow;
|
|
||||||
} else if (name == "reflect") {
|
|
||||||
return IntrinsicType::kReflect;
|
|
||||||
} else if (name == "reverseBits") {
|
|
||||||
return IntrinsicType::kReverseBits;
|
|
||||||
} else if (name == "round") {
|
|
||||||
return IntrinsicType::kRound;
|
|
||||||
} else if (name == "select") {
|
|
||||||
return IntrinsicType::kSelect;
|
|
||||||
} else if (name == "sign") {
|
|
||||||
return IntrinsicType::kSign;
|
|
||||||
} else if (name == "sin") {
|
|
||||||
return IntrinsicType::kSin;
|
|
||||||
} else if (name == "sinh") {
|
|
||||||
return IntrinsicType::kSinh;
|
|
||||||
} else if (name == "smoothStep") {
|
|
||||||
return IntrinsicType::kSmoothStep;
|
|
||||||
} else if (name == "sqrt") {
|
|
||||||
return IntrinsicType::kSqrt;
|
|
||||||
} else if (name == "step") {
|
|
||||||
return IntrinsicType::kStep;
|
|
||||||
} else if (name == "tan") {
|
|
||||||
return IntrinsicType::kTan;
|
|
||||||
} else if (name == "tanh") {
|
|
||||||
return IntrinsicType::kTanh;
|
|
||||||
} else if (name == "textureDimensions") {
|
|
||||||
return IntrinsicType::kTextureDimensions;
|
|
||||||
} else if (name == "textureNumLayers") {
|
|
||||||
return IntrinsicType::kTextureNumLayers;
|
|
||||||
} else if (name == "textureNumLevels") {
|
|
||||||
return IntrinsicType::kTextureNumLevels;
|
|
||||||
} else if (name == "textureNumSamples") {
|
|
||||||
return IntrinsicType::kTextureNumSamples;
|
|
||||||
} else if (name == "textureLoad") {
|
|
||||||
return IntrinsicType::kTextureLoad;
|
|
||||||
} else if (name == "textureStore") {
|
|
||||||
return IntrinsicType::kTextureStore;
|
|
||||||
} else if (name == "textureSample") {
|
|
||||||
return IntrinsicType::kTextureSample;
|
|
||||||
} else if (name == "textureSampleBias") {
|
|
||||||
return IntrinsicType::kTextureSampleBias;
|
|
||||||
} else if (name == "textureSampleCompare") {
|
|
||||||
return IntrinsicType::kTextureSampleCompare;
|
|
||||||
} else if (name == "textureSampleGrad") {
|
|
||||||
return IntrinsicType::kTextureSampleGrad;
|
|
||||||
} else if (name == "textureSampleLevel") {
|
|
||||||
return IntrinsicType::kTextureSampleLevel;
|
|
||||||
} else if (name == "trunc") {
|
|
||||||
return IntrinsicType::kTrunc;
|
|
||||||
} else if (name == "unpack4x8snorm") {
|
|
||||||
return IntrinsicType::kUnpack4x8Snorm;
|
|
||||||
} else if (name == "unpack4x8unorm") {
|
|
||||||
return IntrinsicType::kUnpack4x8Unorm;
|
|
||||||
} else if (name == "unpack2x16snorm") {
|
|
||||||
return IntrinsicType::kUnpack2x16Snorm;
|
|
||||||
} else if (name == "unpack2x16unorm") {
|
|
||||||
return IntrinsicType::kUnpack2x16Unorm;
|
|
||||||
} else if (name == "unpack2x16float") {
|
|
||||||
return IntrinsicType::kUnpack2x16Float;
|
|
||||||
}
|
|
||||||
return IntrinsicType::kNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TypeDeterminer::DetermineMemberAccessor(
|
bool TypeDeterminer::DetermineMemberAccessor(
|
||||||
ast::MemberAccessorExpression* expr) {
|
ast::MemberAccessorExpression* expr) {
|
||||||
if (!DetermineResultType(expr->structure())) {
|
if (!DetermineResultType(expr->structure())) {
|
||||||
|
|
|
@ -65,11 +65,6 @@ class TypeDeterminer {
|
||||||
/// @returns true if the type determiner was successful
|
/// @returns true if the type determiner was successful
|
||||||
bool Determine();
|
bool Determine();
|
||||||
|
|
||||||
/// @param name the function name to try and match as an intrinsic type.
|
|
||||||
/// @return the semantic::IntrinsicType for the given name. If `name` does not
|
|
||||||
/// match an intrinsic, returns semantic::Intrinsic::kNone
|
|
||||||
static semantic::IntrinsicType MatchIntrinsicType(const std::string& name);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Structure holding semantic information about a variable.
|
/// Structure holding semantic information about a variable.
|
||||||
/// Used to build the semantic::Variable nodes at the end of resolving.
|
/// Used to build the semantic::Variable nodes at the end of resolving.
|
||||||
|
|
|
@ -1995,97 +1995,11 @@ struct IntrinsicData {
|
||||||
const char* name;
|
const char* name;
|
||||||
IntrinsicType intrinsic;
|
IntrinsicType intrinsic;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, IntrinsicData data) {
|
inline std::ostream& operator<<(std::ostream& out, IntrinsicData data) {
|
||||||
out << data.name;
|
out << data.name;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
using IntrinsicDataTest = TypeDeterminerTestWithParam<IntrinsicData>;
|
|
||||||
TEST_P(IntrinsicDataTest, Lookup) {
|
|
||||||
auto param = GetParam();
|
|
||||||
|
|
||||||
EXPECT_EQ(TypeDeterminer::MatchIntrinsicType(param.name), param.intrinsic);
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_SUITE_P(
|
|
||||||
TypeDeterminerTest,
|
|
||||||
IntrinsicDataTest,
|
|
||||||
testing::Values(
|
|
||||||
IntrinsicData{"abs", IntrinsicType::kAbs},
|
|
||||||
IntrinsicData{"acos", IntrinsicType::kAcos},
|
|
||||||
IntrinsicData{"all", IntrinsicType::kAll},
|
|
||||||
IntrinsicData{"any", IntrinsicType::kAny},
|
|
||||||
IntrinsicData{"arrayLength", IntrinsicType::kArrayLength},
|
|
||||||
IntrinsicData{"asin", IntrinsicType::kAsin},
|
|
||||||
IntrinsicData{"atan", IntrinsicType::kAtan},
|
|
||||||
IntrinsicData{"atan2", IntrinsicType::kAtan2},
|
|
||||||
IntrinsicData{"ceil", IntrinsicType::kCeil},
|
|
||||||
IntrinsicData{"clamp", IntrinsicType::kClamp},
|
|
||||||
IntrinsicData{"cos", IntrinsicType::kCos},
|
|
||||||
IntrinsicData{"cosh", IntrinsicType::kCosh},
|
|
||||||
IntrinsicData{"countOneBits", IntrinsicType::kCountOneBits},
|
|
||||||
IntrinsicData{"cross", IntrinsicType::kCross},
|
|
||||||
IntrinsicData{"determinant", IntrinsicType::kDeterminant},
|
|
||||||
IntrinsicData{"distance", IntrinsicType::kDistance},
|
|
||||||
IntrinsicData{"dot", IntrinsicType::kDot},
|
|
||||||
IntrinsicData{"dpdx", IntrinsicType::kDpdx},
|
|
||||||
IntrinsicData{"dpdxCoarse", IntrinsicType::kDpdxCoarse},
|
|
||||||
IntrinsicData{"dpdxFine", IntrinsicType::kDpdxFine},
|
|
||||||
IntrinsicData{"dpdy", IntrinsicType::kDpdy},
|
|
||||||
IntrinsicData{"dpdyCoarse", IntrinsicType::kDpdyCoarse},
|
|
||||||
IntrinsicData{"dpdyFine", IntrinsicType::kDpdyFine},
|
|
||||||
IntrinsicData{"exp", IntrinsicType::kExp},
|
|
||||||
IntrinsicData{"exp2", IntrinsicType::kExp2},
|
|
||||||
IntrinsicData{"faceForward", IntrinsicType::kFaceForward},
|
|
||||||
IntrinsicData{"floor", IntrinsicType::kFloor},
|
|
||||||
IntrinsicData{"fma", IntrinsicType::kFma},
|
|
||||||
IntrinsicData{"fract", IntrinsicType::kFract},
|
|
||||||
IntrinsicData{"frexp", IntrinsicType::kFrexp},
|
|
||||||
IntrinsicData{"fwidth", IntrinsicType::kFwidth},
|
|
||||||
IntrinsicData{"fwidthCoarse", IntrinsicType::kFwidthCoarse},
|
|
||||||
IntrinsicData{"fwidthFine", IntrinsicType::kFwidthFine},
|
|
||||||
IntrinsicData{"inverseSqrt", IntrinsicType::kInverseSqrt},
|
|
||||||
IntrinsicData{"isFinite", IntrinsicType::kIsFinite},
|
|
||||||
IntrinsicData{"isInf", IntrinsicType::kIsInf},
|
|
||||||
IntrinsicData{"isNan", IntrinsicType::kIsNan},
|
|
||||||
IntrinsicData{"isNormal", IntrinsicType::kIsNormal},
|
|
||||||
IntrinsicData{"ldexp", IntrinsicType::kLdexp},
|
|
||||||
IntrinsicData{"length", IntrinsicType::kLength},
|
|
||||||
IntrinsicData{"log", IntrinsicType::kLog},
|
|
||||||
IntrinsicData{"log2", IntrinsicType::kLog2},
|
|
||||||
IntrinsicData{"max", IntrinsicType::kMax},
|
|
||||||
IntrinsicData{"min", IntrinsicType::kMin},
|
|
||||||
IntrinsicData{"mix", IntrinsicType::kMix},
|
|
||||||
IntrinsicData{"modf", IntrinsicType::kModf},
|
|
||||||
IntrinsicData{"normalize", IntrinsicType::kNormalize},
|
|
||||||
IntrinsicData{"pow", IntrinsicType::kPow},
|
|
||||||
IntrinsicData{"reflect", IntrinsicType::kReflect},
|
|
||||||
IntrinsicData{"reverseBits", IntrinsicType::kReverseBits},
|
|
||||||
IntrinsicData{"round", IntrinsicType::kRound},
|
|
||||||
IntrinsicData{"select", IntrinsicType::kSelect},
|
|
||||||
IntrinsicData{"sign", IntrinsicType::kSign},
|
|
||||||
IntrinsicData{"sin", IntrinsicType::kSin},
|
|
||||||
IntrinsicData{"sinh", IntrinsicType::kSinh},
|
|
||||||
IntrinsicData{"smoothStep", IntrinsicType::kSmoothStep},
|
|
||||||
IntrinsicData{"sqrt", IntrinsicType::kSqrt},
|
|
||||||
IntrinsicData{"step", IntrinsicType::kStep},
|
|
||||||
IntrinsicData{"tan", IntrinsicType::kTan},
|
|
||||||
IntrinsicData{"tanh", IntrinsicType::kTanh},
|
|
||||||
IntrinsicData{"textureDimensions", IntrinsicType::kTextureDimensions},
|
|
||||||
IntrinsicData{"textureLoad", IntrinsicType::kTextureLoad},
|
|
||||||
IntrinsicData{"textureNumLayers", IntrinsicType::kTextureNumLayers},
|
|
||||||
IntrinsicData{"textureNumLevels", IntrinsicType::kTextureNumLevels},
|
|
||||||
IntrinsicData{"textureNumSamples", IntrinsicType::kTextureNumSamples},
|
|
||||||
IntrinsicData{"textureSample", IntrinsicType::kTextureSample},
|
|
||||||
IntrinsicData{"textureSampleBias", IntrinsicType::kTextureSampleBias},
|
|
||||||
IntrinsicData{"textureSampleCompare",
|
|
||||||
IntrinsicType::kTextureSampleCompare},
|
|
||||||
IntrinsicData{"textureSampleGrad", IntrinsicType::kTextureSampleGrad},
|
|
||||||
IntrinsicData{"textureSampleLevel", IntrinsicType::kTextureSampleLevel},
|
|
||||||
IntrinsicData{"trunc", IntrinsicType::kTrunc}));
|
|
||||||
|
|
||||||
TEST_F(TypeDeterminerTest, MatchIntrinsicNoMatch) {
|
|
||||||
EXPECT_EQ(TypeDeterminer::MatchIntrinsicType("not_intrinsic"),
|
|
||||||
IntrinsicType::kNone);
|
|
||||||
}
|
|
||||||
|
|
||||||
using Intrinsic_DataPackingTest = TypeDeterminerTestWithParam<IntrinsicData>;
|
using Intrinsic_DataPackingTest = TypeDeterminerTestWithParam<IntrinsicData>;
|
||||||
TEST_P(Intrinsic_DataPackingTest, InferType) {
|
TEST_P(Intrinsic_DataPackingTest, InferType) {
|
||||||
|
@ -2270,6 +2184,8 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
IntrinsicData{"tanh", IntrinsicType::kTanh},
|
IntrinsicData{"tanh", IntrinsicType::kTanh},
|
||||||
IntrinsicData{"trunc", IntrinsicType::kTrunc}));
|
IntrinsicData{"trunc", IntrinsicType::kTrunc}));
|
||||||
|
|
||||||
|
using IntrinsicDataTest = TypeDeterminerTest;
|
||||||
|
|
||||||
TEST_F(IntrinsicDataTest, ArrayLength_Vector) {
|
TEST_F(IntrinsicDataTest, ArrayLength_Vector) {
|
||||||
Global("arr", ty.array<int>(), ast::StorageClass::kNone);
|
Global("arr", ty.array<int>(), ast::StorageClass::kNone);
|
||||||
auto* call = Call("arrayLength", "arr");
|
auto* call = Call("arrayLength", "arr");
|
||||||
|
|
Loading…
Reference in New Issue