Rename semantic::Intrinsic to semantic::IntrinsicType
This allows us to create a semantic::Intrinsic class that holds more information about the particular intrinsic overload.
Change-Id: I180ddb507ebc92172badfdd3a59af346f96e1f02
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/40500
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 0767da6..46fb806 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -470,19 +470,19 @@
}
// Returns the WGSL standard library function intrinsic for the
-// given instruction, or semantic::Intrinsic::kNone
-semantic::Intrinsic GetIntrinsic(SpvOp opcode) {
+// given instruction, or semantic::IntrinsicType::kNone
+semantic::IntrinsicType GetIntrinsic(SpvOp opcode) {
switch (opcode) {
case SpvOpBitCount:
- return semantic::Intrinsic::kCountOneBits;
+ return semantic::IntrinsicType::kCountOneBits;
case SpvOpBitReverse:
- return semantic::Intrinsic::kReverseBits;
+ return semantic::IntrinsicType::kReverseBits;
case SpvOpDot:
- return semantic::Intrinsic::kDot;
+ return semantic::IntrinsicType::kDot;
default:
break;
}
- return semantic::Intrinsic::kNone;
+ return semantic::IntrinsicType::kNone;
}
// @param opcode a SPIR-V opcode
@@ -3212,7 +3212,7 @@
}
const auto intrinsic = GetIntrinsic(opcode);
- if (intrinsic != semantic::Intrinsic::kNone) {
+ if (intrinsic != semantic::IntrinsicType::kNone) {
return MakeIntrinsicCall(inst);
}
diff --git a/src/semantic/call.h b/src/semantic/call.h
index c1459d5..6351421 100644
--- a/src/semantic/call.h
+++ b/src/semantic/call.h
@@ -40,16 +40,16 @@
/// Constructor
/// @param return_type the return type of the call
/// @param intrinsic the call target intrinsic
- IntrinsicCall(type::Type* return_type, Intrinsic intrinsic);
+ IntrinsicCall(type::Type* return_type, IntrinsicType intrinsic);
/// Destructor
~IntrinsicCall() override;
/// @returns the target intrinsic for the call
- Intrinsic intrinsic() const { return intrinsic_; }
+ IntrinsicType intrinsic() const { return intrinsic_; }
private:
- Intrinsic const intrinsic_;
+ IntrinsicType const intrinsic_;
};
/// TextureIntrinsicCall holds semantic information for ast::CallExpression
@@ -105,7 +105,7 @@
/// @param intrinsic the call target intrinsic
/// @param params the overload parameter info
TextureIntrinsicCall(type::Type* return_type,
- Intrinsic intrinsic,
+ IntrinsicType intrinsic,
const Parameters& params);
/// Destructor
diff --git a/src/semantic/intrinsic.cc b/src/semantic/intrinsic.cc
index 2ecd238..b2eea27 100644
--- a/src/semantic/intrinsic.cc
+++ b/src/semantic/intrinsic.cc
@@ -17,218 +17,221 @@
namespace tint {
namespace semantic {
-std::ostream& operator<<(std::ostream& out, Intrinsic i) {
+std::ostream& operator<<(std::ostream& out, IntrinsicType i) {
out << intrinsic::str(i);
return out;
}
namespace intrinsic {
-const char* str(Intrinsic i) {
+const char* str(IntrinsicType i) {
/// The emitted name matches the spelling in the WGSL spec.
/// including case.
switch (i) {
- case Intrinsic::kNone:
+ case IntrinsicType::kNone:
return "<not-an-intrinsic>";
- case Intrinsic::kAbs:
+ case IntrinsicType::kAbs:
return "abs";
- case Intrinsic::kAcos:
+ case IntrinsicType::kAcos:
return "acos";
- case Intrinsic::kAll:
+ case IntrinsicType::kAll:
return "all";
- case Intrinsic::kAny:
+ case IntrinsicType::kAny:
return "any";
- case Intrinsic::kArrayLength:
+ case IntrinsicType::kArrayLength:
return "arrayLength";
- case Intrinsic::kAsin:
+ case IntrinsicType::kAsin:
return "asin";
- case Intrinsic::kAtan:
+ case IntrinsicType::kAtan:
return "atan";
- case Intrinsic::kAtan2:
+ case IntrinsicType::kAtan2:
return "atan2";
- case Intrinsic::kCeil:
+ case IntrinsicType::kCeil:
return "ceil";
- case Intrinsic::kClamp:
+ case IntrinsicType::kClamp:
return "clamp";
- case Intrinsic::kCos:
+ case IntrinsicType::kCos:
return "cos";
- case Intrinsic::kCosh:
+ case IntrinsicType::kCosh:
return "cosh";
- case Intrinsic::kCountOneBits:
+ case IntrinsicType::kCountOneBits:
return "countOneBits";
- case Intrinsic::kCross:
+ case IntrinsicType::kCross:
return "cross";
- case Intrinsic::kDeterminant:
+ case IntrinsicType::kDeterminant:
return "determinant";
- case Intrinsic::kDistance:
+ case IntrinsicType::kDistance:
return "distance";
- case Intrinsic::kDot:
+ case IntrinsicType::kDot:
return "dot";
- case Intrinsic::kDpdx:
+ case IntrinsicType::kDpdx:
return "dpdx";
- case Intrinsic::kDpdxCoarse:
+ case IntrinsicType::kDpdxCoarse:
return "dpdxCoarse";
- case Intrinsic::kDpdxFine:
+ case IntrinsicType::kDpdxFine:
return "dpdxFine";
- case Intrinsic::kDpdy:
+ case IntrinsicType::kDpdy:
return "dpdy";
- case Intrinsic::kDpdyCoarse:
+ case IntrinsicType::kDpdyCoarse:
return "dpdyCoarse";
- case Intrinsic::kDpdyFine:
+ case IntrinsicType::kDpdyFine:
return "dpdyFine";
- case Intrinsic::kExp:
+ case IntrinsicType::kExp:
return "exp";
- case Intrinsic::kExp2:
+ case IntrinsicType::kExp2:
return "exp2";
- case Intrinsic::kFaceForward:
+ case IntrinsicType::kFaceForward:
return "faceForward";
- case Intrinsic::kFloor:
+ case IntrinsicType::kFloor:
return "floor";
- case Intrinsic::kFma:
+ case IntrinsicType::kFma:
return "fma";
- case Intrinsic::kFract:
+ case IntrinsicType::kFract:
return "fract";
- case Intrinsic::kFrexp:
+ case IntrinsicType::kFrexp:
return "frexp";
- case Intrinsic::kFwidth:
+ case IntrinsicType::kFwidth:
return "fwidth";
- case Intrinsic::kFwidthCoarse:
+ case IntrinsicType::kFwidthCoarse:
return "fwidthCoarse";
- case Intrinsic::kFwidthFine:
+ case IntrinsicType::kFwidthFine:
return "fwidthFine";
- case Intrinsic::kInverseSqrt:
+ case IntrinsicType::kInverseSqrt:
return "inverseSqrt";
- case Intrinsic::kIsFinite:
+ case IntrinsicType::kIsFinite:
return "isFinite";
- case Intrinsic::kIsInf:
+ case IntrinsicType::kIsInf:
return "isInf";
- case Intrinsic::kIsNan:
+ case IntrinsicType::kIsNan:
return "isNan";
- case Intrinsic::kIsNormal:
+ case IntrinsicType::kIsNormal:
return "isNormal";
- case Intrinsic::kLdexp:
+ case IntrinsicType::kLdexp:
return "ldexp";
- case Intrinsic::kLength:
+ case IntrinsicType::kLength:
return "length";
- case Intrinsic::kLog:
+ case IntrinsicType::kLog:
return "log";
- case Intrinsic::kLog2:
+ case IntrinsicType::kLog2:
return "log2";
- case Intrinsic::kMax:
+ case IntrinsicType::kMax:
return "max";
- case Intrinsic::kMin:
+ case IntrinsicType::kMin:
return "min";
- case Intrinsic::kMix:
+ case IntrinsicType::kMix:
return "mix";
- case Intrinsic::kModf:
+ case IntrinsicType::kModf:
return "modf";
- case Intrinsic::kNormalize:
+ case IntrinsicType::kNormalize:
return "normalize";
- case Intrinsic::kPack4x8Snorm:
+ case IntrinsicType::kPack4x8Snorm:
return "pack4x8snorm";
- case Intrinsic::kPack4x8Unorm:
+ case IntrinsicType::kPack4x8Unorm:
return "pack4x8unorm";
- case Intrinsic::kPack2x16Snorm:
+ case IntrinsicType::kPack2x16Snorm:
return "pack2x16snorm";
- case Intrinsic::kPack2x16Unorm:
+ case IntrinsicType::kPack2x16Unorm:
return "pack2x16unorm";
- case Intrinsic::kPack2x16Float:
+ case IntrinsicType::kPack2x16Float:
return "pack2x16float";
- case Intrinsic::kPow:
+ case IntrinsicType::kPow:
return "pow";
- case Intrinsic::kReflect:
+ case IntrinsicType::kReflect:
return "reflect";
- case Intrinsic::kReverseBits:
+ case IntrinsicType::kReverseBits:
return "reverseBits";
- case Intrinsic::kRound:
+ case IntrinsicType::kRound:
return "round";
- case Intrinsic::kSelect:
+ case IntrinsicType::kSelect:
return "select";
- case Intrinsic::kSign:
+ case IntrinsicType::kSign:
return "sign";
- case Intrinsic::kSin:
+ case IntrinsicType::kSin:
return "sin";
- case Intrinsic::kSinh:
+ case IntrinsicType::kSinh:
return "sinh";
- case Intrinsic::kSmoothStep:
+ case IntrinsicType::kSmoothStep:
return "smoothStep";
- case Intrinsic::kSqrt:
+ case IntrinsicType::kSqrt:
return "sqrt";
- case Intrinsic::kStep:
+ case IntrinsicType::kStep:
return "step";
- case Intrinsic::kTan:
+ case IntrinsicType::kTan:
return "tan";
- case Intrinsic::kTanh:
+ case IntrinsicType::kTanh:
return "tanh";
- case Intrinsic::kTextureDimensions:
+ case IntrinsicType::kTextureDimensions:
return "textureDimensions";
- case Intrinsic::kTextureLoad:
+ case IntrinsicType::kTextureLoad:
return "textureLoad";
- case Intrinsic::kTextureNumLayers:
+ case IntrinsicType::kTextureNumLayers:
return "textureNumLayers";
- case Intrinsic::kTextureNumLevels:
+ case IntrinsicType::kTextureNumLevels:
return "textureNumLevels";
- case Intrinsic::kTextureNumSamples:
+ case IntrinsicType::kTextureNumSamples:
return "textureNumSamples";
- case Intrinsic::kTextureSample:
+ case IntrinsicType::kTextureSample:
return "textureSample";
- case Intrinsic::kTextureSampleBias:
+ case IntrinsicType::kTextureSampleBias:
return "textureSampleBias";
- case Intrinsic::kTextureSampleCompare:
+ case IntrinsicType::kTextureSampleCompare:
return "textureSampleCompare";
- case Intrinsic::kTextureSampleGrad:
+ case IntrinsicType::kTextureSampleGrad:
return "textureSampleGrad";
- case Intrinsic::kTextureSampleLevel:
+ case IntrinsicType::kTextureSampleLevel:
return "textureSampleLevel";
- case Intrinsic::kTextureStore:
+ case IntrinsicType::kTextureStore:
return "textureStore";
- case Intrinsic::kTrunc:
+ case IntrinsicType::kTrunc:
return "trunc";
}
return "<unknown>";
}
-bool IsCoarseDerivative(Intrinsic i) {
- return i == Intrinsic::kDpdxCoarse || i == Intrinsic::kDpdyCoarse ||
- i == Intrinsic::kFwidthCoarse;
+bool IsCoarseDerivative(IntrinsicType i) {
+ return i == IntrinsicType::kDpdxCoarse || i == IntrinsicType::kDpdyCoarse ||
+ i == IntrinsicType::kFwidthCoarse;
}
-bool IsFineDerivative(Intrinsic i) {
- return i == Intrinsic::kDpdxFine || i == Intrinsic::kDpdyFine ||
- i == Intrinsic::kFwidthFine;
+bool IsFineDerivative(IntrinsicType i) {
+ return i == IntrinsicType::kDpdxFine || i == IntrinsicType::kDpdyFine ||
+ i == IntrinsicType::kFwidthFine;
}
-bool IsDerivative(Intrinsic i) {
- return i == Intrinsic::kDpdx || i == Intrinsic::kDpdy ||
- i == Intrinsic::kFwidth || IsCoarseDerivative(i) ||
+bool IsDerivative(IntrinsicType i) {
+ return i == IntrinsicType::kDpdx || i == IntrinsicType::kDpdy ||
+ i == IntrinsicType::kFwidth || IsCoarseDerivative(i) ||
IsFineDerivative(i);
}
-bool IsFloatClassificationIntrinsic(Intrinsic i) {
- return i == Intrinsic::kIsFinite || i == Intrinsic::kIsInf ||
- i == Intrinsic::kIsNan || i == Intrinsic::kIsNormal;
+bool IsFloatClassificationIntrinsic(IntrinsicType i) {
+ return i == IntrinsicType::kIsFinite || i == IntrinsicType::kIsInf ||
+ i == IntrinsicType::kIsNan || i == IntrinsicType::kIsNormal;
}
-bool IsTextureIntrinsic(Intrinsic i) {
- return IsImageQueryIntrinsic(i) || i == Intrinsic::kTextureLoad ||
- i == Intrinsic::kTextureSample ||
- i == Intrinsic::kTextureSampleLevel ||
- i == Intrinsic::kTextureSampleBias ||
- i == Intrinsic::kTextureSampleCompare ||
- i == Intrinsic::kTextureSampleGrad || i == Intrinsic::kTextureStore;
+bool IsTextureIntrinsic(IntrinsicType i) {
+ return IsImageQueryIntrinsic(i) || i == IntrinsicType::kTextureLoad ||
+ i == IntrinsicType::kTextureSample ||
+ i == IntrinsicType::kTextureSampleLevel ||
+ i == IntrinsicType::kTextureSampleBias ||
+ i == IntrinsicType::kTextureSampleCompare ||
+ i == IntrinsicType::kTextureSampleGrad ||
+ i == IntrinsicType::kTextureStore;
}
-bool IsImageQueryIntrinsic(Intrinsic i) {
- return i == semantic::Intrinsic::kTextureDimensions ||
- i == Intrinsic::kTextureNumLayers ||
- i == Intrinsic::kTextureNumLevels ||
- i == Intrinsic::kTextureNumSamples;
+bool IsImageQueryIntrinsic(IntrinsicType i) {
+ return i == semantic::IntrinsicType::kTextureDimensions ||
+ i == IntrinsicType::kTextureNumLayers ||
+ i == IntrinsicType::kTextureNumLevels ||
+ i == IntrinsicType::kTextureNumSamples;
}
-bool IsDataPackingIntrinsic(Intrinsic i) {
- return i == Intrinsic::kPack4x8Snorm || i == Intrinsic::kPack4x8Unorm ||
- i == Intrinsic::kPack2x16Snorm || i == Intrinsic::kPack2x16Unorm ||
- i == Intrinsic::kPack2x16Float;
+bool IsDataPackingIntrinsic(IntrinsicType i) {
+ return i == IntrinsicType::kPack4x8Snorm ||
+ i == IntrinsicType::kPack4x8Unorm ||
+ i == IntrinsicType::kPack2x16Snorm ||
+ i == IntrinsicType::kPack2x16Unorm ||
+ i == IntrinsicType::kPack2x16Float;
}
} // namespace intrinsic
diff --git a/src/semantic/intrinsic.h b/src/semantic/intrinsic.h
index fd5a544..f006f31 100644
--- a/src/semantic/intrinsic.h
+++ b/src/semantic/intrinsic.h
@@ -20,7 +20,7 @@
namespace tint {
namespace semantic {
-enum class Intrinsic {
+enum class IntrinsicType {
kNone = -1,
kAbs,
@@ -104,48 +104,48 @@
/// Emits the name of the intrinsic function. The spelling,
/// including case, matches the name in the WGSL spec.
-std::ostream& operator<<(std::ostream& out, Intrinsic i);
+std::ostream& operator<<(std::ostream& out, IntrinsicType i);
namespace intrinsic {
/// Determines if the given `i` is a coarse derivative
/// @param i the intrinsic
/// @returns true if the given derivative is coarse.
-bool IsCoarseDerivative(Intrinsic i);
+bool IsCoarseDerivative(IntrinsicType i);
/// Determines if the given `i` is a fine derivative
/// @param i the intrinsic
/// @returns true if the given derivative is fine.
-bool IsFineDerivative(Intrinsic i);
+bool IsFineDerivative(IntrinsicType i);
/// Determine if the given `i` is a derivative intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a derivative intrinsic
-bool IsDerivative(Intrinsic i);
+bool IsDerivative(IntrinsicType i);
/// Determines if the given `i` is a float classification intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a float intrinsic
-bool IsFloatClassificationIntrinsic(Intrinsic i);
+bool IsFloatClassificationIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a texture operation intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a texture operation intrinsic
-bool IsTextureIntrinsic(Intrinsic i);
+bool IsTextureIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a image query intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a image query intrinsic
-bool IsImageQueryIntrinsic(Intrinsic i);
+bool IsImageQueryIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a data packing intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a data packing intrinsic
-bool IsDataPackingIntrinsic(Intrinsic i);
+bool IsDataPackingIntrinsic(IntrinsicType i);
/// @returns the name of the intrinsic function. The spelling, including case,
/// matches the name in the WGSL spec.
-const char* str(Intrinsic i);
+const char* str(IntrinsicType i);
} // namespace intrinsic
} // namespace semantic
diff --git a/src/semantic/sem_call.cc b/src/semantic/sem_call.cc
index 72be60a..777ad51 100644
--- a/src/semantic/sem_call.cc
+++ b/src/semantic/sem_call.cc
@@ -25,13 +25,13 @@
Call::~Call() = default;
-IntrinsicCall::IntrinsicCall(type::Type* return_type, Intrinsic intrinsic)
+IntrinsicCall::IntrinsicCall(type::Type* return_type, IntrinsicType intrinsic)
: Base(return_type), intrinsic_(intrinsic) {}
IntrinsicCall::~IntrinsicCall() = default;
TextureIntrinsicCall::TextureIntrinsicCall(type::Type* return_type,
- Intrinsic intrinsic,
+ IntrinsicType intrinsic,
const Parameters& params)
: Base(return_type, intrinsic), params_(params) {}
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 2e72f4a..6b47ffa 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -65,6 +65,11 @@
#include "src/type/void_type.h"
namespace tint {
+namespace {
+
+using IntrinsicType = tint::semantic::IntrinsicType;
+
+} // namespace
TypeDeterminer::TypeDeterminer(ProgramBuilder* builder) : builder_(builder) {}
@@ -415,7 +420,7 @@
auto name = builder_->Symbols().NameFor(ident->symbol());
auto intrinsic = MatchIntrinsic(name);
- if (intrinsic != semantic::Intrinsic::kNone) {
+ if (intrinsic != IntrinsicType::kNone) {
if (!DetermineIntrinsicCall(call, intrinsic)) {
return false;
}
@@ -464,7 +469,7 @@
};
struct IntrinsicData {
- semantic::Intrinsic intrinsic;
+ IntrinsicType intrinsic;
IntrinsicDataType result_type;
uint8_t result_vector_width;
uint8_t param_for_result_type;
@@ -473,74 +478,68 @@
// Note, this isn't all the intrinsics. Some are handled specially before
// we get to the generic code. See the DetermineIntrinsic code below.
constexpr const IntrinsicData kIntrinsicData[] = {
- {semantic::Intrinsic::kAbs, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kAcos, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kAll, IntrinsicDataType::kBool, 1, 0},
- {semantic::Intrinsic::kAny, IntrinsicDataType::kBool, 1, 0},
- {semantic::Intrinsic::kArrayLength, IntrinsicDataType::kUnsignedInteger, 1,
- 0},
- {semantic::Intrinsic::kAsin, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kAtan, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kAtan2, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kCeil, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kClamp, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kCos, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kCosh, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kCountOneBits, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kCross, IntrinsicDataType::kFloat, 3, 0},
- {semantic::Intrinsic::kDeterminant, IntrinsicDataType::kFloat, 1, 0},
- {semantic::Intrinsic::kDistance, IntrinsicDataType::kFloat, 1, 0},
- {semantic::Intrinsic::kDpdx, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDpdxCoarse, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDpdxFine, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDpdy, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDpdyCoarse, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDpdyFine, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kDot, IntrinsicDataType::kFloat, 1, 0},
- {semantic::Intrinsic::kExp, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kExp2, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFaceForward, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFloor, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFwidth, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFwidthCoarse, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFwidthFine, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFma, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFract, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kFrexp, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kInverseSqrt, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kLdexp, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kLength, IntrinsicDataType::kFloat, 1, 0},
- {semantic::Intrinsic::kLog, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kLog2, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kMax, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kMin, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kMix, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kModf, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kNormalize, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kPack4x8Snorm, IntrinsicDataType::kUnsignedInteger, 1,
- 0},
- {semantic::Intrinsic::kPack4x8Unorm, IntrinsicDataType::kUnsignedInteger, 1,
- 0},
- {semantic::Intrinsic::kPack2x16Snorm, IntrinsicDataType::kUnsignedInteger,
- 1, 0},
- {semantic::Intrinsic::kPack2x16Unorm, IntrinsicDataType::kUnsignedInteger,
- 1, 0},
- {semantic::Intrinsic::kPack2x16Float, IntrinsicDataType::kUnsignedInteger,
- 1, 0},
- {semantic::Intrinsic::kPow, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kReflect, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kReverseBits, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kRound, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSelect, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSign, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSin, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSinh, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSmoothStep, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kSqrt, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kStep, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kTan, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kTanh, IntrinsicDataType::kDependent, 0, 0},
- {semantic::Intrinsic::kTrunc, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kAbs, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kAcos, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kAll, IntrinsicDataType::kBool, 1, 0},
+ {IntrinsicType::kAny, IntrinsicDataType::kBool, 1, 0},
+ {IntrinsicType::kArrayLength, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kAsin, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kAtan, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kAtan2, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kCeil, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kClamp, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kCos, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kCosh, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kCountOneBits, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kCross, IntrinsicDataType::kFloat, 3, 0},
+ {IntrinsicType::kDeterminant, IntrinsicDataType::kFloat, 1, 0},
+ {IntrinsicType::kDistance, IntrinsicDataType::kFloat, 1, 0},
+ {IntrinsicType::kDpdx, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDpdxCoarse, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDpdxFine, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDpdy, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDpdyCoarse, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDpdyFine, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kDot, IntrinsicDataType::kFloat, 1, 0},
+ {IntrinsicType::kExp, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kExp2, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFaceForward, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFloor, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFwidth, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFwidthCoarse, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFwidthFine, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFma, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFract, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kFrexp, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kInverseSqrt, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kLdexp, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kLength, IntrinsicDataType::kFloat, 1, 0},
+ {IntrinsicType::kLog, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kLog2, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kMax, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kMin, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kMix, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kModf, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kNormalize, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kPack4x8Snorm, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kPack4x8Unorm, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kPack2x16Snorm, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kPack2x16Unorm, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kPack2x16Float, IntrinsicDataType::kUnsignedInteger, 1, 0},
+ {IntrinsicType::kPow, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kReflect, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kReverseBits, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kRound, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSelect, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSign, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSin, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSinh, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSmoothStep, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kSqrt, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kStep, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kTan, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kTanh, IntrinsicDataType::kDependent, 0, 0},
+ {IntrinsicType::kTrunc, IntrinsicDataType::kDependent, 0, 0},
};
constexpr const uint32_t kIntrinsicDataCount =
@@ -549,7 +548,7 @@
} // namespace
bool TypeDeterminer::DetermineIntrinsicCall(ast::CallExpression* call,
- semantic::Intrinsic intrinsic) {
+ IntrinsicType intrinsic) {
auto create_sem = [&](type::Type* result) {
auto* sem = builder_->create<semantic::IntrinsicCall>(result, intrinsic);
builder_->Sem().Add(call, sem);
@@ -586,18 +585,18 @@
bool is_array = type::IsTextureArray(texture->dim());
bool is_multisampled = texture->Is<type::MultisampledTexture>();
switch (intrinsic) {
- case semantic::Intrinsic::kTextureDimensions:
+ case IntrinsicType::kTextureDimensions:
param.idx.texture = param.count++;
if (call->params().size() > param.count) {
param.idx.level = param.count++;
}
break;
- case semantic::Intrinsic::kTextureNumLayers:
- case semantic::Intrinsic::kTextureNumLevels:
- case semantic::Intrinsic::kTextureNumSamples:
+ case IntrinsicType::kTextureNumLayers:
+ case IntrinsicType::kTextureNumLevels:
+ case IntrinsicType::kTextureNumSamples:
param.idx.texture = param.count++;
break;
- case semantic::Intrinsic::kTextureLoad:
+ case IntrinsicType::kTextureLoad:
param.idx.texture = param.count++;
param.idx.coords = param.count++;
if (is_array) {
@@ -611,7 +610,7 @@
}
}
break;
- case semantic::Intrinsic::kTextureSample:
+ case IntrinsicType::kTextureSample:
param.idx.texture = param.count++;
param.idx.sampler = param.count++;
param.idx.coords = param.count++;
@@ -622,7 +621,7 @@
param.idx.offset = param.count++;
}
break;
- case semantic::Intrinsic::kTextureSampleBias:
+ case IntrinsicType::kTextureSampleBias:
param.idx.texture = param.count++;
param.idx.sampler = param.count++;
param.idx.coords = param.count++;
@@ -634,7 +633,7 @@
param.idx.offset = param.count++;
}
break;
- case semantic::Intrinsic::kTextureSampleLevel:
+ case IntrinsicType::kTextureSampleLevel:
param.idx.texture = param.count++;
param.idx.sampler = param.count++;
param.idx.coords = param.count++;
@@ -646,7 +645,7 @@
param.idx.offset = param.count++;
}
break;
- case semantic::Intrinsic::kTextureSampleCompare:
+ case IntrinsicType::kTextureSampleCompare:
param.idx.texture = param.count++;
param.idx.sampler = param.count++;
param.idx.coords = param.count++;
@@ -658,7 +657,7 @@
param.idx.offset = param.count++;
}
break;
- case semantic::Intrinsic::kTextureSampleGrad:
+ case IntrinsicType::kTextureSampleGrad:
param.idx.texture = param.count++;
param.idx.sampler = param.count++;
param.idx.coords = param.count++;
@@ -671,7 +670,7 @@
param.idx.offset = param.count++;
}
break;
- case semantic::Intrinsic::kTextureStore:
+ case IntrinsicType::kTextureStore:
param.idx.texture = param.count++;
param.idx.coords = param.count++;
if (is_array) {
@@ -697,7 +696,7 @@
// Set the function return type
type::Type* return_type = nullptr;
switch (intrinsic) {
- case semantic::Intrinsic::kTextureDimensions: {
+ case IntrinsicType::kTextureDimensions: {
auto* i32 = builder_->create<type::I32>();
switch (texture->dim()) {
default:
@@ -719,12 +718,12 @@
}
break;
}
- case semantic::Intrinsic::kTextureNumLayers:
- case semantic::Intrinsic::kTextureNumLevels:
- case semantic::Intrinsic::kTextureNumSamples:
+ case IntrinsicType::kTextureNumLayers:
+ case IntrinsicType::kTextureNumLevels:
+ case IntrinsicType::kTextureNumSamples:
return_type = builder_->create<type::I32>();
break;
- case semantic::Intrinsic::kTextureStore:
+ case IntrinsicType::kTextureStore:
return_type = builder_->create<type::Void>();
break;
default: {
@@ -848,7 +847,7 @@
}
std::string name = builder_->Symbols().NameFor(symbol);
- if (MatchIntrinsic(name) != semantic::Intrinsic::kNone) {
+ if (MatchIntrinsic(name) != IntrinsicType::kNone) {
// Identifier is to an intrinsic function, which has no type (currently).
return true;
}
@@ -858,163 +857,163 @@
return false;
}
-semantic::Intrinsic TypeDeterminer::MatchIntrinsic(const std::string& name) {
+IntrinsicType TypeDeterminer::MatchIntrinsic(const std::string& name) {
if (name == "abs") {
- return semantic::Intrinsic::kAbs;
+ return IntrinsicType::kAbs;
} else if (name == "acos") {
- return semantic::Intrinsic::kAcos;
+ return IntrinsicType::kAcos;
} else if (name == "all") {
- return semantic::Intrinsic::kAll;
+ return IntrinsicType::kAll;
} else if (name == "any") {
- return semantic::Intrinsic::kAny;
+ return IntrinsicType::kAny;
} else if (name == "arrayLength") {
- return semantic::Intrinsic::kArrayLength;
+ return IntrinsicType::kArrayLength;
} else if (name == "asin") {
- return semantic::Intrinsic::kAsin;
+ return IntrinsicType::kAsin;
} else if (name == "atan") {
- return semantic::Intrinsic::kAtan;
+ return IntrinsicType::kAtan;
} else if (name == "atan2") {
- return semantic::Intrinsic::kAtan2;
+ return IntrinsicType::kAtan2;
} else if (name == "ceil") {
- return semantic::Intrinsic::kCeil;
+ return IntrinsicType::kCeil;
} else if (name == "clamp") {
- return semantic::Intrinsic::kClamp;
+ return IntrinsicType::kClamp;
} else if (name == "cos") {
- return semantic::Intrinsic::kCos;
+ return IntrinsicType::kCos;
} else if (name == "cosh") {
- return semantic::Intrinsic::kCosh;
+ return IntrinsicType::kCosh;
} else if (name == "countOneBits") {
- return semantic::Intrinsic::kCountOneBits;
+ return IntrinsicType::kCountOneBits;
} else if (name == "cross") {
- return semantic::Intrinsic::kCross;
+ return IntrinsicType::kCross;
} else if (name == "determinant") {
- return semantic::Intrinsic::kDeterminant;
+ return IntrinsicType::kDeterminant;
} else if (name == "distance") {
- return semantic::Intrinsic::kDistance;
+ return IntrinsicType::kDistance;
} else if (name == "dot") {
- return semantic::Intrinsic::kDot;
+ return IntrinsicType::kDot;
} else if (name == "dpdx") {
- return semantic::Intrinsic::kDpdx;
+ return IntrinsicType::kDpdx;
} else if (name == "dpdxCoarse") {
- return semantic::Intrinsic::kDpdxCoarse;
+ return IntrinsicType::kDpdxCoarse;
} else if (name == "dpdxFine") {
- return semantic::Intrinsic::kDpdxFine;
+ return IntrinsicType::kDpdxFine;
} else if (name == "dpdy") {
- return semantic::Intrinsic::kDpdy;
+ return IntrinsicType::kDpdy;
} else if (name == "dpdyCoarse") {
- return semantic::Intrinsic::kDpdyCoarse;
+ return IntrinsicType::kDpdyCoarse;
} else if (name == "dpdyFine") {
- return semantic::Intrinsic::kDpdyFine;
+ return IntrinsicType::kDpdyFine;
} else if (name == "exp") {
- return semantic::Intrinsic::kExp;
+ return IntrinsicType::kExp;
} else if (name == "exp2") {
- return semantic::Intrinsic::kExp2;
+ return IntrinsicType::kExp2;
} else if (name == "faceForward") {
- return semantic::Intrinsic::kFaceForward;
+ return IntrinsicType::kFaceForward;
} else if (name == "floor") {
- return semantic::Intrinsic::kFloor;
+ return IntrinsicType::kFloor;
} else if (name == "fma") {
- return semantic::Intrinsic::kFma;
+ return IntrinsicType::kFma;
} else if (name == "fract") {
- return semantic::Intrinsic::kFract;
+ return IntrinsicType::kFract;
} else if (name == "frexp") {
- return semantic::Intrinsic::kFrexp;
+ return IntrinsicType::kFrexp;
} else if (name == "fwidth") {
- return semantic::Intrinsic::kFwidth;
+ return IntrinsicType::kFwidth;
} else if (name == "fwidthCoarse") {
- return semantic::Intrinsic::kFwidthCoarse;
+ return IntrinsicType::kFwidthCoarse;
} else if (name == "fwidthFine") {
- return semantic::Intrinsic::kFwidthFine;
+ return IntrinsicType::kFwidthFine;
} else if (name == "inverseSqrt") {
- return semantic::Intrinsic::kInverseSqrt;
+ return IntrinsicType::kInverseSqrt;
} else if (name == "isFinite") {
- return semantic::Intrinsic::kIsFinite;
+ return IntrinsicType::kIsFinite;
} else if (name == "isInf") {
- return semantic::Intrinsic::kIsInf;
+ return IntrinsicType::kIsInf;
} else if (name == "isNan") {
- return semantic::Intrinsic::kIsNan;
+ return IntrinsicType::kIsNan;
} else if (name == "isNormal") {
- return semantic::Intrinsic::kIsNormal;
+ return IntrinsicType::kIsNormal;
} else if (name == "ldexp") {
- return semantic::Intrinsic::kLdexp;
+ return IntrinsicType::kLdexp;
} else if (name == "length") {
- return semantic::Intrinsic::kLength;
+ return IntrinsicType::kLength;
} else if (name == "log") {
- return semantic::Intrinsic::kLog;
+ return IntrinsicType::kLog;
} else if (name == "log2") {
- return semantic::Intrinsic::kLog2;
+ return IntrinsicType::kLog2;
} else if (name == "max") {
- return semantic::Intrinsic::kMax;
+ return IntrinsicType::kMax;
} else if (name == "min") {
- return semantic::Intrinsic::kMin;
+ return IntrinsicType::kMin;
} else if (name == "mix") {
- return semantic::Intrinsic::kMix;
+ return IntrinsicType::kMix;
} else if (name == "modf") {
- return semantic::Intrinsic::kModf;
+ return IntrinsicType::kModf;
} else if (name == "normalize") {
- return semantic::Intrinsic::kNormalize;
+ return IntrinsicType::kNormalize;
} else if (name == "pack4x8snorm") {
- return semantic::Intrinsic::kPack4x8Snorm;
+ return IntrinsicType::kPack4x8Snorm;
} else if (name == "pack4x8unorm") {
- return semantic::Intrinsic::kPack4x8Unorm;
+ return IntrinsicType::kPack4x8Unorm;
} else if (name == "pack2x16snorm") {
- return semantic::Intrinsic::kPack2x16Snorm;
+ return IntrinsicType::kPack2x16Snorm;
} else if (name == "pack2x16unorm") {
- return semantic::Intrinsic::kPack2x16Unorm;
+ return IntrinsicType::kPack2x16Unorm;
} else if (name == "pack2x16float") {
- return semantic::Intrinsic::kPack2x16Float;
+ return IntrinsicType::kPack2x16Float;
} else if (name == "pow") {
- return semantic::Intrinsic::kPow;
+ return IntrinsicType::kPow;
} else if (name == "reflect") {
- return semantic::Intrinsic::kReflect;
+ return IntrinsicType::kReflect;
} else if (name == "reverseBits") {
- return semantic::Intrinsic::kReverseBits;
+ return IntrinsicType::kReverseBits;
} else if (name == "round") {
- return semantic::Intrinsic::kRound;
+ return IntrinsicType::kRound;
} else if (name == "select") {
- return semantic::Intrinsic::kSelect;
+ return IntrinsicType::kSelect;
} else if (name == "sign") {
- return semantic::Intrinsic::kSign;
+ return IntrinsicType::kSign;
} else if (name == "sin") {
- return semantic::Intrinsic::kSin;
+ return IntrinsicType::kSin;
} else if (name == "sinh") {
- return semantic::Intrinsic::kSinh;
+ return IntrinsicType::kSinh;
} else if (name == "smoothStep") {
- return semantic::Intrinsic::kSmoothStep;
+ return IntrinsicType::kSmoothStep;
} else if (name == "sqrt") {
- return semantic::Intrinsic::kSqrt;
+ return IntrinsicType::kSqrt;
} else if (name == "step") {
- return semantic::Intrinsic::kStep;
+ return IntrinsicType::kStep;
} else if (name == "tan") {
- return semantic::Intrinsic::kTan;
+ return IntrinsicType::kTan;
} else if (name == "tanh") {
- return semantic::Intrinsic::kTanh;
+ return IntrinsicType::kTanh;
} else if (name == "textureDimensions") {
- return semantic::Intrinsic::kTextureDimensions;
+ return IntrinsicType::kTextureDimensions;
} else if (name == "textureNumLayers") {
- return semantic::Intrinsic::kTextureNumLayers;
+ return IntrinsicType::kTextureNumLayers;
} else if (name == "textureNumLevels") {
- return semantic::Intrinsic::kTextureNumLevels;
+ return IntrinsicType::kTextureNumLevels;
} else if (name == "textureNumSamples") {
- return semantic::Intrinsic::kTextureNumSamples;
+ return IntrinsicType::kTextureNumSamples;
} else if (name == "textureLoad") {
- return semantic::Intrinsic::kTextureLoad;
+ return IntrinsicType::kTextureLoad;
} else if (name == "textureStore") {
- return semantic::Intrinsic::kTextureStore;
+ return IntrinsicType::kTextureStore;
} else if (name == "textureSample") {
- return semantic::Intrinsic::kTextureSample;
+ return IntrinsicType::kTextureSample;
} else if (name == "textureSampleBias") {
- return semantic::Intrinsic::kTextureSampleBias;
+ return IntrinsicType::kTextureSampleBias;
} else if (name == "textureSampleCompare") {
- return semantic::Intrinsic::kTextureSampleCompare;
+ return IntrinsicType::kTextureSampleCompare;
} else if (name == "textureSampleGrad") {
- return semantic::Intrinsic::kTextureSampleGrad;
+ return IntrinsicType::kTextureSampleGrad;
} else if (name == "textureSampleLevel") {
- return semantic::Intrinsic::kTextureSampleLevel;
+ return IntrinsicType::kTextureSampleLevel;
} else if (name == "trunc") {
- return semantic::Intrinsic::kTrunc;
+ return IntrinsicType::kTrunc;
}
- return semantic::Intrinsic::kNone;
+ return IntrinsicType::kNone;
}
bool TypeDeterminer::DetermineMemberAccessor(
diff --git a/src/type_determiner.h b/src/type_determiner.h
index 916a6b2..c8dc34d 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -67,9 +67,9 @@
bool Determine();
/// @param name the function name to try and match as an intrinsic.
- /// @return the semantic::Intrinsic for the given name. If `name` does not
- /// match an intrinsic, returns semantic::Intrinsic::kNone
- static semantic::Intrinsic MatchIntrinsic(const std::string& name);
+ /// @return the semantic::IntrinsicType for the given name. If `name` does not
+ /// match an intrinsic, returns semantic::IntrinsicType::kNone
+ static semantic::IntrinsicType MatchIntrinsic(const std::string& name);
private:
template <typename T>
@@ -177,7 +177,7 @@
bool DetermineConstructor(ast::ConstructorExpression* expr);
bool DetermineIdentifier(ast::IdentifierExpression* expr);
bool DetermineIntrinsicCall(ast::CallExpression* call,
- semantic::Intrinsic intrinsic);
+ semantic::IntrinsicType intrinsic);
bool DetermineMemberAccessor(ast::MemberAccessorExpression* expr);
bool DetermineUnaryOp(ast::UnaryOpExpression* expr);
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index c6822c1..9013905 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -75,6 +75,8 @@
namespace tint {
namespace {
+using IntrinsicType = semantic::IntrinsicType;
+
class FakeStmt : public ast::Statement {
public:
explicit FakeStmt(Source source) : ast::Statement(source) {}
@@ -1618,7 +1620,7 @@
struct IntrinsicData {
const char* name;
- semantic::Intrinsic intrinsic;
+ IntrinsicType intrinsic;
};
inline std::ostream& operator<<(std::ostream& out, IntrinsicData data) {
out << data.name;
@@ -1634,89 +1636,82 @@
TypeDeterminerTest,
IntrinsicDataTest,
testing::Values(
- IntrinsicData{"abs", semantic::Intrinsic::kAbs},
- IntrinsicData{"acos", semantic::Intrinsic::kAcos},
- IntrinsicData{"all", semantic::Intrinsic::kAll},
- IntrinsicData{"any", semantic::Intrinsic::kAny},
- IntrinsicData{"arrayLength", semantic::Intrinsic::kArrayLength},
- IntrinsicData{"asin", semantic::Intrinsic::kAsin},
- IntrinsicData{"atan", semantic::Intrinsic::kAtan},
- IntrinsicData{"atan2", semantic::Intrinsic::kAtan2},
- IntrinsicData{"ceil", semantic::Intrinsic::kCeil},
- IntrinsicData{"clamp", semantic::Intrinsic::kClamp},
- IntrinsicData{"cos", semantic::Intrinsic::kCos},
- IntrinsicData{"cosh", semantic::Intrinsic::kCosh},
- IntrinsicData{"countOneBits", semantic::Intrinsic::kCountOneBits},
- IntrinsicData{"cross", semantic::Intrinsic::kCross},
- IntrinsicData{"determinant", semantic::Intrinsic::kDeterminant},
- IntrinsicData{"distance", semantic::Intrinsic::kDistance},
- IntrinsicData{"dot", semantic::Intrinsic::kDot},
- IntrinsicData{"dpdx", semantic::Intrinsic::kDpdx},
- IntrinsicData{"dpdxCoarse", semantic::Intrinsic::kDpdxCoarse},
- IntrinsicData{"dpdxFine", semantic::Intrinsic::kDpdxFine},
- IntrinsicData{"dpdy", semantic::Intrinsic::kDpdy},
- IntrinsicData{"dpdyCoarse", semantic::Intrinsic::kDpdyCoarse},
- IntrinsicData{"dpdyFine", semantic::Intrinsic::kDpdyFine},
- IntrinsicData{"exp", semantic::Intrinsic::kExp},
- IntrinsicData{"exp2", semantic::Intrinsic::kExp2},
- IntrinsicData{"faceForward", semantic::Intrinsic::kFaceForward},
- IntrinsicData{"floor", semantic::Intrinsic::kFloor},
- IntrinsicData{"fma", semantic::Intrinsic::kFma},
- IntrinsicData{"fract", semantic::Intrinsic::kFract},
- IntrinsicData{"frexp", semantic::Intrinsic::kFrexp},
- IntrinsicData{"fwidth", semantic::Intrinsic::kFwidth},
- IntrinsicData{"fwidthCoarse", semantic::Intrinsic::kFwidthCoarse},
- IntrinsicData{"fwidthFine", semantic::Intrinsic::kFwidthFine},
- IntrinsicData{"inverseSqrt", semantic::Intrinsic::kInverseSqrt},
- IntrinsicData{"isFinite", semantic::Intrinsic::kIsFinite},
- IntrinsicData{"isInf", semantic::Intrinsic::kIsInf},
- IntrinsicData{"isNan", semantic::Intrinsic::kIsNan},
- IntrinsicData{"isNormal", semantic::Intrinsic::kIsNormal},
- IntrinsicData{"ldexp", semantic::Intrinsic::kLdexp},
- IntrinsicData{"length", semantic::Intrinsic::kLength},
- IntrinsicData{"log", semantic::Intrinsic::kLog},
- IntrinsicData{"log2", semantic::Intrinsic::kLog2},
- IntrinsicData{"max", semantic::Intrinsic::kMax},
- IntrinsicData{"min", semantic::Intrinsic::kMin},
- IntrinsicData{"mix", semantic::Intrinsic::kMix},
- IntrinsicData{"modf", semantic::Intrinsic::kModf},
- IntrinsicData{"normalize", semantic::Intrinsic::kNormalize},
- IntrinsicData{"pow", semantic::Intrinsic::kPow},
- IntrinsicData{"reflect", semantic::Intrinsic::kReflect},
- IntrinsicData{"reverseBits", semantic::Intrinsic::kReverseBits},
- IntrinsicData{"round", semantic::Intrinsic::kRound},
- IntrinsicData{"select", semantic::Intrinsic::kSelect},
- IntrinsicData{"sign", semantic::Intrinsic::kSign},
- IntrinsicData{"sin", semantic::Intrinsic::kSin},
- IntrinsicData{"sinh", semantic::Intrinsic::kSinh},
- IntrinsicData{"smoothStep", semantic::Intrinsic::kSmoothStep},
- IntrinsicData{"sqrt", semantic::Intrinsic::kSqrt},
- IntrinsicData{"step", semantic::Intrinsic::kStep},
- IntrinsicData{"tan", semantic::Intrinsic::kTan},
- IntrinsicData{"tanh", semantic::Intrinsic::kTanh},
- IntrinsicData{"textureDimensions",
- semantic::Intrinsic::kTextureDimensions},
- IntrinsicData{"textureLoad", semantic::Intrinsic::kTextureLoad},
- IntrinsicData{"textureNumLayers",
- semantic::Intrinsic::kTextureNumLayers},
- IntrinsicData{"textureNumLevels",
- semantic::Intrinsic::kTextureNumLevels},
- IntrinsicData{"textureNumSamples",
- semantic::Intrinsic::kTextureNumSamples},
- IntrinsicData{"textureSample", semantic::Intrinsic::kTextureSample},
- IntrinsicData{"textureSampleBias",
- semantic::Intrinsic::kTextureSampleBias},
+ 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",
- semantic::Intrinsic::kTextureSampleCompare},
- IntrinsicData{"textureSampleGrad",
- semantic::Intrinsic::kTextureSampleGrad},
- IntrinsicData{"textureSampleLevel",
- semantic::Intrinsic::kTextureSampleLevel},
- IntrinsicData{"trunc", semantic::Intrinsic::kTrunc}));
+ IntrinsicType::kTextureSampleCompare},
+ IntrinsicData{"textureSampleGrad", IntrinsicType::kTextureSampleGrad},
+ IntrinsicData{"textureSampleLevel", IntrinsicType::kTextureSampleLevel},
+ IntrinsicData{"trunc", IntrinsicType::kTrunc}));
TEST_F(TypeDeterminerTest, MatchIntrinsicNoMatch) {
EXPECT_EQ(TypeDeterminer::MatchIntrinsic("not_intrinsic"),
- semantic::Intrinsic::kNone);
+ IntrinsicType::kNone);
}
using ImportData_DataPackingTest = TypeDeterminerTestWithParam<IntrinsicData>;
@@ -1736,11 +1731,11 @@
TypeDeterminerTest,
ImportData_DataPackingTest,
testing::Values(
- IntrinsicData{"pack4x8snorm", semantic::Intrinsic::kPack4x8Snorm},
- IntrinsicData{"pack4x8unorm", semantic::Intrinsic::kPack4x8Unorm},
- IntrinsicData{"pack2x16snorm", semantic::Intrinsic::kPack2x16Snorm},
- IntrinsicData{"pack2x16unorm", semantic::Intrinsic::kPack2x16Unorm},
- IntrinsicData{"pack2x16float", semantic::Intrinsic::kPack2x16Float}));
+ IntrinsicData{"pack4x8snorm", IntrinsicType::kPack4x8Snorm},
+ IntrinsicData{"pack4x8unorm", IntrinsicType::kPack4x8Unorm},
+ IntrinsicData{"pack2x16snorm", IntrinsicType::kPack2x16Snorm},
+ IntrinsicData{"pack2x16unorm", IntrinsicType::kPack2x16Unorm},
+ IntrinsicData{"pack2x16float", IntrinsicType::kPack2x16Float}));
using ImportData_SingleParamTest = TypeDeterminerTestWithParam<IntrinsicData>;
TEST_P(ImportData_SingleParamTest, Scalar) {
@@ -1786,29 +1781,28 @@
INSTANTIATE_TEST_SUITE_P(
TypeDeterminerTest,
ImportData_SingleParamTest,
- testing::Values(IntrinsicData{"acos", semantic::Intrinsic::kAcos},
- IntrinsicData{"asin", semantic::Intrinsic::kAsin},
- IntrinsicData{"atan", semantic::Intrinsic::kAtan},
- IntrinsicData{"ceil", semantic::Intrinsic::kCeil},
- IntrinsicData{"cos", semantic::Intrinsic::kCos},
- IntrinsicData{"cosh", semantic::Intrinsic::kCosh},
- IntrinsicData{"exp", semantic::Intrinsic::kExp},
- IntrinsicData{"exp2", semantic::Intrinsic::kExp2},
- IntrinsicData{"floor", semantic::Intrinsic::kFloor},
- IntrinsicData{"fract", semantic::Intrinsic::kFract},
- IntrinsicData{"inverseSqrt",
- semantic::Intrinsic::kInverseSqrt},
- IntrinsicData{"log", semantic::Intrinsic::kLog},
- IntrinsicData{"log2", semantic::Intrinsic::kLog2},
- IntrinsicData{"normalize", semantic::Intrinsic::kNormalize},
- IntrinsicData{"round", semantic::Intrinsic::kRound},
- IntrinsicData{"sign", semantic::Intrinsic::kSign},
- IntrinsicData{"sin", semantic::Intrinsic::kSin},
- IntrinsicData{"sinh", semantic::Intrinsic::kSinh},
- IntrinsicData{"sqrt", semantic::Intrinsic::kSqrt},
- IntrinsicData{"tan", semantic::Intrinsic::kTan},
- IntrinsicData{"tanh", semantic::Intrinsic::kTanh},
- IntrinsicData{"trunc", semantic::Intrinsic::kTrunc}));
+ testing::Values(IntrinsicData{"acos", IntrinsicType::kAcos},
+ IntrinsicData{"asin", IntrinsicType::kAsin},
+ IntrinsicData{"atan", IntrinsicType::kAtan},
+ IntrinsicData{"ceil", IntrinsicType::kCeil},
+ IntrinsicData{"cos", IntrinsicType::kCos},
+ IntrinsicData{"cosh", IntrinsicType::kCosh},
+ IntrinsicData{"exp", IntrinsicType::kExp},
+ IntrinsicData{"exp2", IntrinsicType::kExp2},
+ IntrinsicData{"floor", IntrinsicType::kFloor},
+ IntrinsicData{"fract", IntrinsicType::kFract},
+ IntrinsicData{"inverseSqrt", IntrinsicType::kInverseSqrt},
+ IntrinsicData{"log", IntrinsicType::kLog},
+ IntrinsicData{"log2", IntrinsicType::kLog2},
+ IntrinsicData{"normalize", IntrinsicType::kNormalize},
+ IntrinsicData{"round", IntrinsicType::kRound},
+ IntrinsicData{"sign", IntrinsicType::kSign},
+ IntrinsicData{"sin", IntrinsicType::kSin},
+ IntrinsicData{"sinh", IntrinsicType::kSinh},
+ IntrinsicData{"sqrt", IntrinsicType::kSqrt},
+ IntrinsicData{"tan", IntrinsicType::kTan},
+ IntrinsicData{"tanh", IntrinsicType::kTanh},
+ IntrinsicData{"trunc", IntrinsicType::kTrunc}));
using ImportData_SingleParam_FloatOrInt_Test =
TypeDeterminerTestWithParam<IntrinsicData>;
@@ -1919,8 +1913,8 @@
INSTANTIATE_TEST_SUITE_P(TypeDeterminerTest,
ImportData_SingleParam_FloatOrInt_Test,
- testing::Values(IntrinsicData{
- "abs", semantic::Intrinsic::kAbs}));
+ testing::Values(IntrinsicData{"abs",
+ IntrinsicType::kAbs}));
TEST_F(TypeDeterminerTest, ImportData_Length_Scalar) {
auto* ident = Expr("length");
@@ -1992,10 +1986,10 @@
INSTANTIATE_TEST_SUITE_P(
TypeDeterminerTest,
ImportData_TwoParamTest,
- testing::Values(IntrinsicData{"atan2", semantic::Intrinsic::kAtan2},
- IntrinsicData{"pow", semantic::Intrinsic::kPow},
- IntrinsicData{"step", semantic::Intrinsic::kStep},
- IntrinsicData{"reflect", semantic::Intrinsic::kReflect}));
+ testing::Values(IntrinsicData{"atan2", IntrinsicType::kAtan2},
+ IntrinsicData{"pow", IntrinsicType::kPow},
+ IntrinsicData{"step", IntrinsicType::kStep},
+ IntrinsicData{"reflect", IntrinsicType::kReflect}));
TEST_F(TypeDeterminerTest, ImportData_Distance_Scalar) {
auto* ident = Expr("distance");
@@ -2093,11 +2087,10 @@
INSTANTIATE_TEST_SUITE_P(
TypeDeterminerTest,
ImportData_ThreeParamTest,
- testing::Values(
- IntrinsicData{"mix", semantic::Intrinsic::kMix},
- IntrinsicData{"smoothStep", semantic::Intrinsic::kSmoothStep},
- IntrinsicData{"fma", semantic::Intrinsic::kFma},
- IntrinsicData{"faceForward", semantic::Intrinsic::kFaceForward}));
+ testing::Values(IntrinsicData{"mix", IntrinsicType::kMix},
+ IntrinsicData{"smoothStep", IntrinsicType::kSmoothStep},
+ IntrinsicData{"fma", IntrinsicType::kFma},
+ IntrinsicData{"faceForward", IntrinsicType::kFaceForward}));
using ImportData_ThreeParam_FloatOrInt_Test =
TypeDeterminerTestWithParam<IntrinsicData>;
@@ -2200,8 +2193,8 @@
INSTANTIATE_TEST_SUITE_P(TypeDeterminerTest,
ImportData_ThreeParam_FloatOrInt_Test,
- testing::Values(IntrinsicData{
- "clamp", semantic::Intrinsic::kClamp}));
+ testing::Values(IntrinsicData{"clamp",
+ IntrinsicType::kClamp}));
using ImportData_Int_SingleParamTest =
TypeDeterminerTestWithParam<IntrinsicData>;
@@ -2248,9 +2241,8 @@
INSTANTIATE_TEST_SUITE_P(
TypeDeterminerTest,
ImportData_Int_SingleParamTest,
- testing::Values(
- IntrinsicData{"countOneBits", semantic::Intrinsic::kCountOneBits},
- IntrinsicData{"reverseBits", semantic::Intrinsic::kReverseBits}));
+ testing::Values(IntrinsicData{"countOneBits", IntrinsicType::kCountOneBits},
+ IntrinsicData{"reverseBits", IntrinsicType::kReverseBits}));
using ImportData_FloatOrInt_TwoParamTest =
TypeDeterminerTestWithParam<IntrinsicData>;
@@ -2351,8 +2343,8 @@
INSTANTIATE_TEST_SUITE_P(
TypeDeterminerTest,
ImportData_FloatOrInt_TwoParamTest,
- testing::Values(IntrinsicData{"min", semantic::Intrinsic::kMin},
- IntrinsicData{"max", semantic::Intrinsic::kMax}));
+ testing::Values(IntrinsicData{"min", IntrinsicType::kMin},
+ IntrinsicData{"max", IntrinsicType::kMax}));
TEST_F(TypeDeterminerTest, ImportData_GLSL_Determinant) {
Global("var", ast::StorageClass::kFunction, ty.mat3x3<f32>());
@@ -2385,8 +2377,7 @@
INSTANTIATE_TEST_SUITE_P(TypeDeterminerTest,
ImportData_Matrix_OneParam_Test,
testing::Values(IntrinsicData{
- "determinant",
- semantic::Intrinsic::kDeterminant}));
+ "determinant", IntrinsicType::kDeterminant}));
TEST_F(TypeDeterminerTest, Function_EntryPoints_StageDecoration) {
// fn b() {}
diff --git a/src/validator/validator_impl.cc b/src/validator/validator_impl.cc
index bb568de..16da3e3 100644
--- a/src/validator/validator_impl.cc
+++ b/src/validator/validator_impl.cc
@@ -49,6 +49,8 @@
namespace {
+using IntrinsicType = semantic::IntrinsicType;
+
enum class IntrinsicDataType {
kMixed,
kFloatOrIntScalarOrVector,
@@ -63,7 +65,7 @@
};
struct IntrinsicData {
- semantic::Intrinsic intrinsic;
+ IntrinsicType intrinsic;
uint32_t param_count;
IntrinsicDataType data_type;
uint32_t vector_size;
@@ -73,122 +75,97 @@
// Note, this isn't all the intrinsics. Some are handled specially before
// we get to the generic code. See the ValidateCallExpr code below.
constexpr const IntrinsicData kIntrinsicData[] = {
- {semantic::Intrinsic::kAbs, 1, IntrinsicDataType::kFloatOrIntScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kAcos, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kAbs, 1, IntrinsicDataType::kFloatOrIntScalarOrVector, 0,
true},
- {semantic::Intrinsic::kAll, 1, IntrinsicDataType::kBoolVector, 0, false},
- {semantic::Intrinsic::kAny, 1, IntrinsicDataType::kBoolVector, 0, false},
- {semantic::Intrinsic::kArrayLength, 1, IntrinsicDataType::kMixed, 0, false},
- {semantic::Intrinsic::kAsin, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kAcos, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kAll, 1, IntrinsicDataType::kBoolVector, 0, false},
+ {IntrinsicType::kAny, 1, IntrinsicDataType::kBoolVector, 0, false},
+ {IntrinsicType::kArrayLength, 1, IntrinsicDataType::kMixed, 0, false},
+ {IntrinsicType::kAsin, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kAtan, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kAtan2, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kAtan, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kCeil, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kClamp, 3, IntrinsicDataType::kFloatOrIntScalarOrVector, 0,
true},
- {semantic::Intrinsic::kAtan2, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kCos, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kCosh, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kCountOneBits, 1, IntrinsicDataType::kIntScalarOrVector, 0,
true},
- {semantic::Intrinsic::kCeil, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kClamp, 3,
- IntrinsicDataType::kFloatOrIntScalarOrVector, 0, true},
- {semantic::Intrinsic::kCos, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kCosh, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kCountOneBits, 1,
- IntrinsicDataType::kIntScalarOrVector, 0, true},
- {semantic::Intrinsic::kCross, 2, IntrinsicDataType::kFloatVector, 3, true},
- {semantic::Intrinsic::kDeterminant, 1, IntrinsicDataType::kMatrix, 0,
+ {IntrinsicType::kCross, 2, IntrinsicDataType::kFloatVector, 3, true},
+ {IntrinsicType::kDeterminant, 1, IntrinsicDataType::kMatrix, 0, false},
+ {IntrinsicType::kDistance, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
false},
- {semantic::Intrinsic::kDistance, 2, IntrinsicDataType::kFloatScalarOrVector,
- 0, false},
- {semantic::Intrinsic::kDot, 2, IntrinsicDataType::kFloatVector, 0, false},
- {semantic::Intrinsic::kDpdx, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kDot, 2, IntrinsicDataType::kFloatVector, 0, false},
+ {IntrinsicType::kDpdx, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kDpdxCoarse, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kDpdxCoarse, 1,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kDpdxFine, 1, IntrinsicDataType::kFloatScalarOrVector,
+ {IntrinsicType::kDpdxFine, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kDpdy, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kDpdyCoarse, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kDpdyFine, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kExp, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kExp2, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kFaceForward, 3, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kFloor, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kFma, 3, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kFract, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kFrexp, 2, IntrinsicDataType::kMixed, 0, false},
+ {IntrinsicType::kFwidth, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ true},
+ {IntrinsicType::kFwidthCoarse, 1, IntrinsicDataType::kFloatScalarOrVector,
0, true},
- {semantic::Intrinsic::kDpdy, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kFwidthFine, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kDpdyCoarse, 1,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kDpdyFine, 1, IntrinsicDataType::kFloatScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kExp, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kInverseSqrt, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kExp2, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kLdexp, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kFaceForward, 3,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kFloor, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kFma, 3, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kFract, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kFrexp, 2, IntrinsicDataType::kMixed, 0, false},
- {semantic::Intrinsic::kFwidth, 1, IntrinsicDataType::kFloatScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kFwidthCoarse, 1,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kFwidthFine, 1,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kInverseSqrt, 1,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kLdexp, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kLength, 1, IntrinsicDataType::kFloatScalarOrVector,
- 0, false},
- {semantic::Intrinsic::kLog, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kLog2, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kMax, 2, IntrinsicDataType::kFloatOrIntScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kMin, 2, IntrinsicDataType::kFloatOrIntScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kMix, 3, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kModf, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kNormalize, 1, IntrinsicDataType::kFloatVector, 0,
- true},
- {semantic::Intrinsic::kPack4x8Snorm, 1, IntrinsicDataType::kFloatVector, 4,
+ {IntrinsicType::kLength, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
false},
- {semantic::Intrinsic::kPack4x8Unorm, 1, IntrinsicDataType::kFloatVector, 4,
+ {IntrinsicType::kLog, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kLog2, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kMax, 2, IntrinsicDataType::kFloatOrIntScalarOrVector, 0,
+ true},
+ {IntrinsicType::kMin, 2, IntrinsicDataType::kFloatOrIntScalarOrVector, 0,
+ true},
+ {IntrinsicType::kMix, 3, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kModf, 2, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kNormalize, 1, IntrinsicDataType::kFloatVector, 0, true},
+ {IntrinsicType::kPack4x8Snorm, 1, IntrinsicDataType::kFloatVector, 4,
false},
- {semantic::Intrinsic::kPack2x16Snorm, 1, IntrinsicDataType::kFloatVector, 2,
+ {IntrinsicType::kPack4x8Unorm, 1, IntrinsicDataType::kFloatVector, 4,
false},
- {semantic::Intrinsic::kPack2x16Unorm, 1, IntrinsicDataType::kFloatVector, 2,
+ {IntrinsicType::kPack2x16Snorm, 1, IntrinsicDataType::kFloatVector, 2,
false},
- {semantic::Intrinsic::kPack2x16Float, 1, IntrinsicDataType::kFloatVector, 2,
+ {IntrinsicType::kPack2x16Unorm, 1, IntrinsicDataType::kFloatVector, 2,
false},
- {semantic::Intrinsic::kPow, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kPack2x16Float, 1, IntrinsicDataType::kFloatVector, 2,
+ false},
+ {IntrinsicType::kPow, 2, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kReflect, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kReflect, 2, IntrinsicDataType::kFloatScalarOrVector,
- 0, true},
- {semantic::Intrinsic::kReverseBits, 1,
- IntrinsicDataType::kIntScalarOrVector, 0, true},
- {semantic::Intrinsic::kRound, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kReverseBits, 1, IntrinsicDataType::kIntScalarOrVector, 0,
true},
- {semantic::Intrinsic::kSelect, 3, IntrinsicDataType::kMixed, 0, false},
- {semantic::Intrinsic::kSign, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kRound, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kSin, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kSelect, 3, IntrinsicDataType::kMixed, 0, false},
+ {IntrinsicType::kSign, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kSin, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kSinh, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kSmoothStep, 3, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
- {semantic::Intrinsic::kSinh, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kSmoothStep, 3,
- IntrinsicDataType::kFloatScalarOrVector, 0, true},
- {semantic::Intrinsic::kSqrt, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kStep, 2, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kTan, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kTanh, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
- true},
- {semantic::Intrinsic::kTrunc, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
+ {IntrinsicType::kSqrt, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kStep, 2, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kTan, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kTanh, 1, IntrinsicDataType::kFloatScalarOrVector, 0, true},
+ {IntrinsicType::kTrunc, 1, IntrinsicDataType::kFloatScalarOrVector, 0,
true},
};
@@ -731,7 +708,7 @@
}
} else {
// Special cases.
- if (data->intrinsic == semantic::Intrinsic::kFrexp) {
+ if (data->intrinsic == IntrinsicType::kFrexp) {
auto* p0 = expr->params()[0];
auto* p1 = expr->params()[1];
auto* t0 = program_->TypeOf(p0)->UnwrapPtrIfNeeded();
@@ -773,7 +750,7 @@
}
}
- if (data->intrinsic == semantic::Intrinsic::kSelect) {
+ if (data->intrinsic == IntrinsicType::kSelect) {
auto* type = program_->TypeOf(expr);
auto* t0 = program_->TypeOf(expr->params()[0])->UnwrapPtrIfNeeded();
auto* t1 = program_->TypeOf(expr->params()[1])->UnwrapPtrIfNeeded();
@@ -819,7 +796,7 @@
}
}
- if (data->intrinsic == semantic::Intrinsic::kArrayLength) {
+ if (data->intrinsic == IntrinsicType::kArrayLength) {
if (!program_->TypeOf(expr)->UnwrapPtrIfNeeded()->Is<type::U32>()) {
add_error(
expr->source(),
@@ -840,15 +817,15 @@
}
// Result types don't match parameter types.
- if (data->intrinsic == semantic::Intrinsic::kAll ||
- data->intrinsic == semantic::Intrinsic::kAny) {
+ if (data->intrinsic == IntrinsicType::kAll ||
+ data->intrinsic == IntrinsicType::kAny) {
if (!IsValidType(program_->TypeOf(expr), expr->source(), builtin,
IntrinsicDataType::kBoolScalar, 0, this)) {
return false;
}
}
- if (data->intrinsic == semantic::Intrinsic::kDot) {
+ if (data->intrinsic == IntrinsicType::kDot) {
if (!IsValidType(program_->TypeOf(expr), expr->source(), builtin,
IntrinsicDataType::kFloatScalar, 0, this)) {
return false;
@@ -864,9 +841,9 @@
}
}
- if (data->intrinsic == semantic::Intrinsic::kLength ||
- data->intrinsic == semantic::Intrinsic::kDistance ||
- data->intrinsic == semantic::Intrinsic::kDeterminant) {
+ if (data->intrinsic == IntrinsicType::kLength ||
+ data->intrinsic == IntrinsicType::kDistance ||
+ data->intrinsic == IntrinsicType::kDeterminant) {
if (!IsValidType(program_->TypeOf(expr), expr->source(), builtin,
IntrinsicDataType::kFloatScalar, 0, this)) {
return false;
@@ -874,7 +851,7 @@
}
// Must be a square matrix.
- if (data->intrinsic == semantic::Intrinsic::kDeterminant) {
+ if (data->intrinsic == IntrinsicType::kDeterminant) {
const auto* matrix =
program_->TypeOf(expr->params()[0])->As<type::Matrix>();
if (matrix->rows() != matrix->columns()) {
@@ -887,8 +864,8 @@
}
// Last parameter must be a pointer.
- if (data->intrinsic == semantic::Intrinsic::kFrexp ||
- data->intrinsic == semantic::Intrinsic::kModf) {
+ if (data->intrinsic == IntrinsicType::kFrexp ||
+ data->intrinsic == IntrinsicType::kModf) {
auto* last_param = expr->params()[data->param_count - 1];
if (!program_->TypeOf(last_param)->Is<type::Pointer>()) {
add_error(last_param->source(), "incorrect type for " + builtin +
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 52dfa12..2a4d304 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -548,10 +548,10 @@
}
if (auto* sem = call_sem->As<semantic::IntrinsicCall>()) {
const auto& params = expr->params();
- if (sem->intrinsic() == semantic::Intrinsic::kSelect) {
+ if (sem->intrinsic() == semantic::IntrinsicType::kSelect) {
error_ = "select not supported in HLSL backend yet";
return false;
- } else if (sem->intrinsic() == semantic::Intrinsic::kIsNormal) {
+ } else if (sem->intrinsic() == semantic::IntrinsicType::kIsNormal) {
error_ = "is_normal not supported in HLSL backend yet";
return false;
} else if (semantic::intrinsic::IsDataPackingIntrinsic(sem->intrinsic())) {
@@ -650,21 +650,21 @@
uint32_t dims = 2;
bool is_signed = false;
uint32_t scale = 65535;
- if (ident->intrinsic() == semantic::Intrinsic::kPack4x8Snorm ||
- ident->intrinsic() == semantic::Intrinsic::kPack4x8Unorm) {
+ if (ident->intrinsic() == semantic::IntrinsicType::kPack4x8Snorm ||
+ ident->intrinsic() == semantic::IntrinsicType::kPack4x8Unorm) {
dims = 4;
scale = 255;
}
- if (ident->intrinsic() == semantic::Intrinsic::kPack4x8Snorm ||
- ident->intrinsic() == semantic::Intrinsic::kPack2x16Snorm) {
+ if (ident->intrinsic() == semantic::IntrinsicType::kPack4x8Snorm ||
+ ident->intrinsic() == semantic::IntrinsicType::kPack2x16Snorm) {
is_signed = true;
scale = (scale - 1) / 2;
}
switch (ident->intrinsic()) {
- case semantic::Intrinsic::kPack4x8Snorm:
- case semantic::Intrinsic::kPack4x8Unorm:
- case semantic::Intrinsic::kPack2x16Snorm:
- case semantic::Intrinsic::kPack2x16Unorm:
+ case semantic::IntrinsicType::kPack4x8Snorm:
+ case semantic::IntrinsicType::kPack4x8Unorm:
+ case semantic::IntrinsicType::kPack2x16Snorm:
+ case semantic::IntrinsicType::kPack2x16Unorm:
pre << (is_signed ? "" : "u") << "int" << dims << " " << tmp_name << " = "
<< (is_signed ? "" : "u") << "int" << dims << "(round(clamp("
<< expr_out.str() << ", " << (is_signed ? "-1.0" : "0.0")
@@ -683,7 +683,7 @@
}
out << ")";
break;
- case semantic::Intrinsic::kPack2x16Float:
+ case semantic::IntrinsicType::kPack2x16Float:
pre << "uint2 " << tmp_name << " = f32tof16(" << expr_out.str() << ");\n";
out << "(" << tmp_name << ".x | " << tmp_name << ".y << 16)";
break;
@@ -709,17 +709,17 @@
auto* texture_type = TypeOf(texture)->UnwrapAll()->As<type::Texture>();
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureDimensions:
- case semantic::Intrinsic::kTextureNumLayers:
- case semantic::Intrinsic::kTextureNumLevels:
- case semantic::Intrinsic::kTextureNumSamples: {
+ case semantic::IntrinsicType::kTextureDimensions:
+ case semantic::IntrinsicType::kTextureNumLayers:
+ case semantic::IntrinsicType::kTextureNumLevels:
+ case semantic::IntrinsicType::kTextureNumSamples: {
// All of these intrinsics use the GetDimensions() method on the texture
int num_dimensions = 0;
const char* swizzle = "";
bool add_mip_level_in = false;
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureDimensions:
+ case semantic::IntrinsicType::kTextureDimensions:
switch (texture_type->dim()) {
case type::TextureDimension::kNone:
error_ = "texture dimension is kNone";
@@ -755,7 +755,7 @@
break;
}
break;
- case semantic::Intrinsic::kTextureNumLayers:
+ case semantic::IntrinsicType::kTextureNumLayers:
switch (texture_type->dim()) {
default:
error_ = "texture dimension is not arrayed";
@@ -771,7 +771,7 @@
break;
}
break;
- case semantic::Intrinsic::kTextureNumLevels:
+ case semantic::IntrinsicType::kTextureNumLevels:
add_mip_level_in = true;
switch (texture_type->dim()) {
default:
@@ -790,7 +790,7 @@
break;
}
break;
- case semantic::Intrinsic::kTextureNumSamples:
+ case semantic::IntrinsicType::kTextureNumSamples:
switch (texture_type->dim()) {
default:
error_ = "texture dimension does not support multisampling";
@@ -860,28 +860,28 @@
bool pack_mip_in_coords = false;
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureSample:
+ case semantic::IntrinsicType::kTextureSample:
out << ".Sample(";
break;
- case semantic::Intrinsic::kTextureSampleBias:
+ case semantic::IntrinsicType::kTextureSampleBias:
out << ".SampleBias(";
break;
- case semantic::Intrinsic::kTextureSampleLevel:
+ case semantic::IntrinsicType::kTextureSampleLevel:
out << ".SampleLevel(";
break;
- case semantic::Intrinsic::kTextureSampleGrad:
+ case semantic::IntrinsicType::kTextureSampleGrad:
out << ".SampleGrad(";
break;
- case semantic::Intrinsic::kTextureSampleCompare:
+ case semantic::IntrinsicType::kTextureSampleCompare:
out << ".SampleCmp(";
break;
- case semantic::Intrinsic::kTextureLoad:
+ case semantic::IntrinsicType::kTextureLoad:
out << ".Load(";
if (!texture_type->Is<type::StorageTexture>()) {
pack_mip_in_coords = true;
}
break;
- case semantic::Intrinsic::kTextureStore:
+ case semantic::IntrinsicType::kTextureStore:
out << "[";
break;
default:
@@ -937,7 +937,7 @@
}
}
- if (sem->intrinsic() == semantic::Intrinsic::kTextureStore) {
+ if (sem->intrinsic() == semantic::IntrinsicType::kTextureStore) {
out << "] = ";
if (!EmitExpression(pre, out, params[pidx.value]))
return false;
@@ -952,94 +952,94 @@
const semantic::IntrinsicCall* call) {
std::string out;
switch (call->intrinsic()) {
- case semantic::Intrinsic::kAcos:
- case semantic::Intrinsic::kAny:
- case semantic::Intrinsic::kAll:
- case semantic::Intrinsic::kAsin:
- case semantic::Intrinsic::kAtan:
- case semantic::Intrinsic::kAtan2:
- case semantic::Intrinsic::kCeil:
- case semantic::Intrinsic::kCos:
- case semantic::Intrinsic::kCosh:
- case semantic::Intrinsic::kCross:
- case semantic::Intrinsic::kDeterminant:
- case semantic::Intrinsic::kDistance:
- case semantic::Intrinsic::kDot:
- case semantic::Intrinsic::kExp:
- case semantic::Intrinsic::kExp2:
- case semantic::Intrinsic::kFloor:
- case semantic::Intrinsic::kFma:
- case semantic::Intrinsic::kLdexp:
- case semantic::Intrinsic::kLength:
- case semantic::Intrinsic::kLog:
- case semantic::Intrinsic::kLog2:
- case semantic::Intrinsic::kNormalize:
- case semantic::Intrinsic::kPow:
- case semantic::Intrinsic::kReflect:
- case semantic::Intrinsic::kRound:
- case semantic::Intrinsic::kSin:
- case semantic::Intrinsic::kSinh:
- case semantic::Intrinsic::kSqrt:
- case semantic::Intrinsic::kStep:
- case semantic::Intrinsic::kTan:
- case semantic::Intrinsic::kTanh:
- case semantic::Intrinsic::kTrunc:
- case semantic::Intrinsic::kMix:
- case semantic::Intrinsic::kSign:
- case semantic::Intrinsic::kAbs:
- case semantic::Intrinsic::kMax:
- case semantic::Intrinsic::kMin:
- case semantic::Intrinsic::kClamp:
+ case semantic::IntrinsicType::kAcos:
+ case semantic::IntrinsicType::kAny:
+ case semantic::IntrinsicType::kAll:
+ case semantic::IntrinsicType::kAsin:
+ case semantic::IntrinsicType::kAtan:
+ case semantic::IntrinsicType::kAtan2:
+ case semantic::IntrinsicType::kCeil:
+ case semantic::IntrinsicType::kCos:
+ case semantic::IntrinsicType::kCosh:
+ case semantic::IntrinsicType::kCross:
+ case semantic::IntrinsicType::kDeterminant:
+ case semantic::IntrinsicType::kDistance:
+ case semantic::IntrinsicType::kDot:
+ case semantic::IntrinsicType::kExp:
+ case semantic::IntrinsicType::kExp2:
+ case semantic::IntrinsicType::kFloor:
+ case semantic::IntrinsicType::kFma:
+ case semantic::IntrinsicType::kLdexp:
+ case semantic::IntrinsicType::kLength:
+ case semantic::IntrinsicType::kLog:
+ case semantic::IntrinsicType::kLog2:
+ case semantic::IntrinsicType::kNormalize:
+ case semantic::IntrinsicType::kPow:
+ case semantic::IntrinsicType::kReflect:
+ case semantic::IntrinsicType::kRound:
+ case semantic::IntrinsicType::kSin:
+ case semantic::IntrinsicType::kSinh:
+ case semantic::IntrinsicType::kSqrt:
+ case semantic::IntrinsicType::kStep:
+ case semantic::IntrinsicType::kTan:
+ case semantic::IntrinsicType::kTanh:
+ case semantic::IntrinsicType::kTrunc:
+ case semantic::IntrinsicType::kMix:
+ case semantic::IntrinsicType::kSign:
+ case semantic::IntrinsicType::kAbs:
+ case semantic::IntrinsicType::kMax:
+ case semantic::IntrinsicType::kMin:
+ case semantic::IntrinsicType::kClamp:
out = semantic::intrinsic::str(call->intrinsic());
break;
- case semantic::Intrinsic::kCountOneBits:
+ case semantic::IntrinsicType::kCountOneBits:
out = "countbits";
break;
- case semantic::Intrinsic::kDpdx:
+ case semantic::IntrinsicType::kDpdx:
out = "ddx";
break;
- case semantic::Intrinsic::kDpdxCoarse:
+ case semantic::IntrinsicType::kDpdxCoarse:
out = "ddx_coarse";
break;
- case semantic::Intrinsic::kDpdxFine:
+ case semantic::IntrinsicType::kDpdxFine:
out = "ddx_fine";
break;
- case semantic::Intrinsic::kDpdy:
+ case semantic::IntrinsicType::kDpdy:
out = "ddy";
break;
- case semantic::Intrinsic::kDpdyCoarse:
+ case semantic::IntrinsicType::kDpdyCoarse:
out = "ddy_coarse";
break;
- case semantic::Intrinsic::kDpdyFine:
+ case semantic::IntrinsicType::kDpdyFine:
out = "ddy_fine";
break;
- case semantic::Intrinsic::kFaceForward:
+ case semantic::IntrinsicType::kFaceForward:
out = "faceforward";
break;
- case semantic::Intrinsic::kFract:
+ case semantic::IntrinsicType::kFract:
out = "frac";
break;
- case semantic::Intrinsic::kFwidth:
- case semantic::Intrinsic::kFwidthCoarse:
- case semantic::Intrinsic::kFwidthFine:
+ case semantic::IntrinsicType::kFwidth:
+ case semantic::IntrinsicType::kFwidthCoarse:
+ case semantic::IntrinsicType::kFwidthFine:
out = "fwidth";
break;
- case semantic::Intrinsic::kInverseSqrt:
+ case semantic::IntrinsicType::kInverseSqrt:
out = "rsqrt";
break;
- case semantic::Intrinsic::kIsFinite:
+ case semantic::IntrinsicType::kIsFinite:
out = "isfinite";
break;
- case semantic::Intrinsic::kIsInf:
+ case semantic::IntrinsicType::kIsInf:
out = "isinf";
break;
- case semantic::Intrinsic::kIsNan:
+ case semantic::IntrinsicType::kIsNan:
out = "isnan";
break;
- case semantic::Intrinsic::kReverseBits:
+ case semantic::IntrinsicType::kReverseBits:
out = "reversebits";
break;
- case semantic::Intrinsic::kSmoothStep:
+ case semantic::IntrinsicType::kSmoothStep:
out = "smoothstep";
break;
default:
diff --git a/src/writer/hlsl/generator_impl_intrinsic_test.cc b/src/writer/hlsl/generator_impl_intrinsic_test.cc
index 1976462..27a76e5 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_test.cc
@@ -29,6 +29,8 @@
namespace hlsl {
namespace {
+using IntrinsicType = semantic::IntrinsicType;
+
using ::testing::HasSubstr;
using HlslGeneratorImplTest_Intrinsic = TestHelper;
@@ -40,7 +42,7 @@
};
struct IntrinsicData {
- semantic::Intrinsic intrinsic;
+ IntrinsicType intrinsic;
ParamType type;
const char* hlsl_name;
};
@@ -61,92 +63,92 @@
return out;
}
-ast::CallExpression* GenerateCall(semantic::Intrinsic intrinsic,
+ast::CallExpression* GenerateCall(IntrinsicType intrinsic,
ParamType type,
ProgramBuilder* builder) {
std::string name;
std::ostringstream str(name);
str << intrinsic;
switch (intrinsic) {
- case semantic::Intrinsic::kAcos:
- case semantic::Intrinsic::kAsin:
- case semantic::Intrinsic::kAtan:
- case semantic::Intrinsic::kCeil:
- case semantic::Intrinsic::kCos:
- case semantic::Intrinsic::kCosh:
- case semantic::Intrinsic::kDpdx:
- case semantic::Intrinsic::kDpdxCoarse:
- case semantic::Intrinsic::kDpdxFine:
- case semantic::Intrinsic::kDpdy:
- case semantic::Intrinsic::kDpdyCoarse:
- case semantic::Intrinsic::kDpdyFine:
- case semantic::Intrinsic::kExp:
- case semantic::Intrinsic::kExp2:
- case semantic::Intrinsic::kFloor:
- case semantic::Intrinsic::kFract:
- case semantic::Intrinsic::kFwidth:
- case semantic::Intrinsic::kFwidthCoarse:
- case semantic::Intrinsic::kFwidthFine:
- case semantic::Intrinsic::kInverseSqrt:
- case semantic::Intrinsic::kIsFinite:
- case semantic::Intrinsic::kIsInf:
- case semantic::Intrinsic::kIsNan:
- case semantic::Intrinsic::kIsNormal:
- case semantic::Intrinsic::kLdexp:
- case semantic::Intrinsic::kLength:
- case semantic::Intrinsic::kLog:
- case semantic::Intrinsic::kLog2:
- case semantic::Intrinsic::kNormalize:
- case semantic::Intrinsic::kReflect:
- case semantic::Intrinsic::kRound:
- case semantic::Intrinsic::kSin:
- case semantic::Intrinsic::kSinh:
- case semantic::Intrinsic::kSqrt:
- case semantic::Intrinsic::kTan:
- case semantic::Intrinsic::kTanh:
- case semantic::Intrinsic::kTrunc:
- case semantic::Intrinsic::kSign:
+ case IntrinsicType::kAcos:
+ case IntrinsicType::kAsin:
+ case IntrinsicType::kAtan:
+ case IntrinsicType::kCeil:
+ case IntrinsicType::kCos:
+ case IntrinsicType::kCosh:
+ case IntrinsicType::kDpdx:
+ case IntrinsicType::kDpdxCoarse:
+ case IntrinsicType::kDpdxFine:
+ case IntrinsicType::kDpdy:
+ case IntrinsicType::kDpdyCoarse:
+ case IntrinsicType::kDpdyFine:
+ case IntrinsicType::kExp:
+ case IntrinsicType::kExp2:
+ case IntrinsicType::kFloor:
+ case IntrinsicType::kFract:
+ case IntrinsicType::kFwidth:
+ case IntrinsicType::kFwidthCoarse:
+ case IntrinsicType::kFwidthFine:
+ case IntrinsicType::kInverseSqrt:
+ case IntrinsicType::kIsFinite:
+ case IntrinsicType::kIsInf:
+ case IntrinsicType::kIsNan:
+ case IntrinsicType::kIsNormal:
+ case IntrinsicType::kLdexp:
+ case IntrinsicType::kLength:
+ case IntrinsicType::kLog:
+ case IntrinsicType::kLog2:
+ case IntrinsicType::kNormalize:
+ case IntrinsicType::kReflect:
+ case IntrinsicType::kRound:
+ case IntrinsicType::kSin:
+ case IntrinsicType::kSinh:
+ case IntrinsicType::kSqrt:
+ case IntrinsicType::kTan:
+ case IntrinsicType::kTanh:
+ case IntrinsicType::kTrunc:
+ case IntrinsicType::kSign:
return builder->Call(str.str(), "f1");
- case semantic::Intrinsic::kAtan2:
- case semantic::Intrinsic::kCross:
- case semantic::Intrinsic::kDot:
- case semantic::Intrinsic::kDistance:
- case semantic::Intrinsic::kPow:
- case semantic::Intrinsic::kStep:
+ case IntrinsicType::kAtan2:
+ case IntrinsicType::kCross:
+ case IntrinsicType::kDot:
+ case IntrinsicType::kDistance:
+ case IntrinsicType::kPow:
+ case IntrinsicType::kStep:
return builder->Call(str.str(), "f1", "f2");
- case semantic::Intrinsic::kFma:
- case semantic::Intrinsic::kMix:
- case semantic::Intrinsic::kFaceForward:
- case semantic::Intrinsic::kSmoothStep:
+ case IntrinsicType::kFma:
+ case IntrinsicType::kMix:
+ case IntrinsicType::kFaceForward:
+ case IntrinsicType::kSmoothStep:
return builder->Call(str.str(), "f1", "f2", "f3");
- case semantic::Intrinsic::kAll:
- case semantic::Intrinsic::kAny:
+ case IntrinsicType::kAll:
+ case IntrinsicType::kAny:
return builder->Call(str.str(), "b1");
- case semantic::Intrinsic::kAbs:
+ case IntrinsicType::kAbs:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1");
} else {
return builder->Call(str.str(), "u1");
}
- case semantic::Intrinsic::kCountOneBits:
- case semantic::Intrinsic::kReverseBits:
+ case IntrinsicType::kCountOneBits:
+ case IntrinsicType::kReverseBits:
return builder->Call(str.str(), "u1");
- case semantic::Intrinsic::kMax:
- case semantic::Intrinsic::kMin:
+ case IntrinsicType::kMax:
+ case IntrinsicType::kMin:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1", "f2");
} else {
return builder->Call(str.str(), "u1", "u2");
}
- case semantic::Intrinsic::kClamp:
+ case IntrinsicType::kClamp:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1", "f2", "f3");
} else {
return builder->Call(str.str(), "u1", "u2", "u3");
}
- case semantic::Intrinsic::kSelect:
+ case IntrinsicType::kSelect:
return builder->Call(str.str(), "f1", "f2", "b1");
- case semantic::Intrinsic::kDeterminant:
+ case IntrinsicType::kDeterminant:
return builder->Call(str.str(), "m1");
default:
break;
@@ -183,81 +185,72 @@
HlslGeneratorImplTest_Intrinsic,
HlslIntrinsicTest,
testing::Values(
- IntrinsicData{semantic::Intrinsic::kAbs, ParamType::kF32, "abs"},
- IntrinsicData{semantic::Intrinsic::kAbs, ParamType::kU32, "abs"},
- IntrinsicData{semantic::Intrinsic::kAcos, ParamType::kF32, "acos"},
- IntrinsicData{semantic::Intrinsic::kAll, ParamType::kBool, "all"},
- IntrinsicData{semantic::Intrinsic::kAny, ParamType::kBool, "any"},
- IntrinsicData{semantic::Intrinsic::kAsin, ParamType::kF32, "asin"},
- IntrinsicData{semantic::Intrinsic::kAtan, ParamType::kF32, "atan"},
- IntrinsicData{semantic::Intrinsic::kAtan2, ParamType::kF32, "atan2"},
- IntrinsicData{semantic::Intrinsic::kCeil, ParamType::kF32, "ceil"},
- IntrinsicData{semantic::Intrinsic::kClamp, ParamType::kF32, "clamp"},
- IntrinsicData{semantic::Intrinsic::kClamp, ParamType::kU32, "clamp"},
- IntrinsicData{semantic::Intrinsic::kCos, ParamType::kF32, "cos"},
- IntrinsicData{semantic::Intrinsic::kCosh, ParamType::kF32, "cosh"},
- IntrinsicData{semantic::Intrinsic::kCountOneBits, ParamType::kU32,
+ IntrinsicData{IntrinsicType::kAbs, ParamType::kF32, "abs"},
+ IntrinsicData{IntrinsicType::kAbs, ParamType::kU32, "abs"},
+ IntrinsicData{IntrinsicType::kAcos, ParamType::kF32, "acos"},
+ IntrinsicData{IntrinsicType::kAll, ParamType::kBool, "all"},
+ IntrinsicData{IntrinsicType::kAny, ParamType::kBool, "any"},
+ IntrinsicData{IntrinsicType::kAsin, ParamType::kF32, "asin"},
+ IntrinsicData{IntrinsicType::kAtan, ParamType::kF32, "atan"},
+ IntrinsicData{IntrinsicType::kAtan2, ParamType::kF32, "atan2"},
+ IntrinsicData{IntrinsicType::kCeil, ParamType::kF32, "ceil"},
+ IntrinsicData{IntrinsicType::kClamp, ParamType::kF32, "clamp"},
+ IntrinsicData{IntrinsicType::kClamp, ParamType::kU32, "clamp"},
+ IntrinsicData{IntrinsicType::kCos, ParamType::kF32, "cos"},
+ IntrinsicData{IntrinsicType::kCosh, ParamType::kF32, "cosh"},
+ IntrinsicData{IntrinsicType::kCountOneBits, ParamType::kU32,
"countbits"},
- IntrinsicData{semantic::Intrinsic::kCross, ParamType::kF32, "cross"},
- IntrinsicData{semantic::Intrinsic::kDeterminant, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kCross, ParamType::kF32, "cross"},
+ IntrinsicData{IntrinsicType::kDeterminant, ParamType::kF32,
"determinant"},
- IntrinsicData{semantic::Intrinsic::kDistance, ParamType::kF32,
- "distance"},
- IntrinsicData{semantic::Intrinsic::kDot, ParamType::kF32, "dot"},
- IntrinsicData{semantic::Intrinsic::kDpdx, ParamType::kF32, "ddx"},
- IntrinsicData{semantic::Intrinsic::kDpdxCoarse, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDistance, ParamType::kF32, "distance"},
+ IntrinsicData{IntrinsicType::kDot, ParamType::kF32, "dot"},
+ IntrinsicData{IntrinsicType::kDpdx, ParamType::kF32, "ddx"},
+ IntrinsicData{IntrinsicType::kDpdxCoarse, ParamType::kF32,
"ddx_coarse"},
- IntrinsicData{semantic::Intrinsic::kDpdxFine, ParamType::kF32,
- "ddx_fine"},
- IntrinsicData{semantic::Intrinsic::kDpdy, ParamType::kF32, "ddy"},
- IntrinsicData{semantic::Intrinsic::kDpdyCoarse, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDpdxFine, ParamType::kF32, "ddx_fine"},
+ IntrinsicData{IntrinsicType::kDpdy, ParamType::kF32, "ddy"},
+ IntrinsicData{IntrinsicType::kDpdyCoarse, ParamType::kF32,
"ddy_coarse"},
- IntrinsicData{semantic::Intrinsic::kDpdyFine, ParamType::kF32,
- "ddy_fine"},
- IntrinsicData{semantic::Intrinsic::kExp, ParamType::kF32, "exp"},
- IntrinsicData{semantic::Intrinsic::kExp2, ParamType::kF32, "exp2"},
- IntrinsicData{semantic::Intrinsic::kFaceForward, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDpdyFine, ParamType::kF32, "ddy_fine"},
+ IntrinsicData{IntrinsicType::kExp, ParamType::kF32, "exp"},
+ IntrinsicData{IntrinsicType::kExp2, ParamType::kF32, "exp2"},
+ IntrinsicData{IntrinsicType::kFaceForward, ParamType::kF32,
"faceforward"},
- IntrinsicData{semantic::Intrinsic::kFloor, ParamType::kF32, "floor"},
- IntrinsicData{semantic::Intrinsic::kFma, ParamType::kF32, "fma"},
- IntrinsicData{semantic::Intrinsic::kFract, ParamType::kF32, "frac"},
- IntrinsicData{semantic::Intrinsic::kFwidth, ParamType::kF32, "fwidth"},
- IntrinsicData{semantic::Intrinsic::kFwidthCoarse, ParamType::kF32,
- "fwidth"},
- IntrinsicData{semantic::Intrinsic::kFwidthFine, ParamType::kF32,
- "fwidth"},
- IntrinsicData{semantic::Intrinsic::kInverseSqrt, ParamType::kF32,
- "rsqrt"},
- IntrinsicData{semantic::Intrinsic::kIsFinite, ParamType::kF32,
- "isfinite"},
- IntrinsicData{semantic::Intrinsic::kIsInf, ParamType::kF32, "isinf"},
- IntrinsicData{semantic::Intrinsic::kIsNan, ParamType::kF32, "isnan"},
- IntrinsicData{semantic::Intrinsic::kLdexp, ParamType::kF32, "ldexp"},
- IntrinsicData{semantic::Intrinsic::kLength, ParamType::kF32, "length"},
- IntrinsicData{semantic::Intrinsic::kLog, ParamType::kF32, "log"},
- IntrinsicData{semantic::Intrinsic::kLog2, ParamType::kF32, "log2"},
- IntrinsicData{semantic::Intrinsic::kMax, ParamType::kF32, "max"},
- IntrinsicData{semantic::Intrinsic::kMax, ParamType::kU32, "max"},
- IntrinsicData{semantic::Intrinsic::kMin, ParamType::kF32, "min"},
- IntrinsicData{semantic::Intrinsic::kMin, ParamType::kU32, "min"},
- IntrinsicData{semantic::Intrinsic::kNormalize, ParamType::kF32,
- "normalize"},
- IntrinsicData{semantic::Intrinsic::kPow, ParamType::kF32, "pow"},
- IntrinsicData{semantic::Intrinsic::kReflect, ParamType::kF32,
- "reflect"},
- IntrinsicData{semantic::Intrinsic::kReverseBits, ParamType::kU32,
+ IntrinsicData{IntrinsicType::kFloor, ParamType::kF32, "floor"},
+ IntrinsicData{IntrinsicType::kFma, ParamType::kF32, "fma"},
+ IntrinsicData{IntrinsicType::kFract, ParamType::kF32, "frac"},
+ IntrinsicData{IntrinsicType::kFwidth, ParamType::kF32, "fwidth"},
+ IntrinsicData{IntrinsicType::kFwidthCoarse, ParamType::kF32, "fwidth"},
+ IntrinsicData{IntrinsicType::kFwidthFine, ParamType::kF32, "fwidth"},
+ IntrinsicData{IntrinsicType::kInverseSqrt, ParamType::kF32, "rsqrt"},
+ IntrinsicData{IntrinsicType::kIsFinite, ParamType::kF32, "isfinite"},
+ IntrinsicData{IntrinsicType::kIsInf, ParamType::kF32, "isinf"},
+ IntrinsicData{IntrinsicType::kIsNan, ParamType::kF32, "isnan"},
+ IntrinsicData{IntrinsicType::kLdexp, ParamType::kF32, "ldexp"},
+ IntrinsicData{IntrinsicType::kLength, ParamType::kF32, "length"},
+ IntrinsicData{IntrinsicType::kLog, ParamType::kF32, "log"},
+ IntrinsicData{IntrinsicType::kLog2, ParamType::kF32, "log2"},
+ IntrinsicData{IntrinsicType::kMax, ParamType::kF32, "max"},
+ IntrinsicData{IntrinsicType::kMax, ParamType::kU32, "max"},
+ IntrinsicData{IntrinsicType::kMin, ParamType::kF32, "min"},
+ IntrinsicData{IntrinsicType::kMin, ParamType::kU32, "min"},
+ IntrinsicData{IntrinsicType::kNormalize, ParamType::kF32, "normalize"},
+ IntrinsicData{IntrinsicType::kPow, ParamType::kF32, "pow"},
+ IntrinsicData{IntrinsicType::kReflect, ParamType::kF32, "reflect"},
+ IntrinsicData{IntrinsicType::kReverseBits, ParamType::kU32,
"reversebits"},
- IntrinsicData{semantic::Intrinsic::kRound, ParamType::kU32, "round"},
- IntrinsicData{semantic::Intrinsic::kSign, ParamType::kF32, "sign"},
- IntrinsicData{semantic::Intrinsic::kSin, ParamType::kF32, "sin"},
- IntrinsicData{semantic::Intrinsic::kSinh, ParamType::kF32, "sinh"},
- IntrinsicData{semantic::Intrinsic::kSmoothStep, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kRound, ParamType::kU32, "round"},
+ IntrinsicData{IntrinsicType::kSign, ParamType::kF32, "sign"},
+ IntrinsicData{IntrinsicType::kSin, ParamType::kF32, "sin"},
+ IntrinsicData{IntrinsicType::kSinh, ParamType::kF32, "sinh"},
+ IntrinsicData{IntrinsicType::kSmoothStep, ParamType::kF32,
"smoothstep"},
- IntrinsicData{semantic::Intrinsic::kSqrt, ParamType::kF32, "sqrt"},
- IntrinsicData{semantic::Intrinsic::kStep, ParamType::kF32, "step"},
- IntrinsicData{semantic::Intrinsic::kTan, ParamType::kF32, "tan"},
- IntrinsicData{semantic::Intrinsic::kTanh, ParamType::kF32, "tanh"},
- IntrinsicData{semantic::Intrinsic::kTrunc, ParamType::kF32, "trunc"}));
+ IntrinsicData{IntrinsicType::kSqrt, ParamType::kF32, "sqrt"},
+ IntrinsicData{IntrinsicType::kStep, ParamType::kF32, "step"},
+ IntrinsicData{IntrinsicType::kTan, ParamType::kF32, "tan"},
+ IntrinsicData{IntrinsicType::kTanh, ParamType::kF32, "tanh"},
+ IntrinsicData{IntrinsicType::kTrunc, ParamType::kF32, "trunc"}));
TEST_F(HlslGeneratorImplTest_Intrinsic, DISABLED_Intrinsic_IsNormal) {
FAIL();
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index cdce707..0020501 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -449,7 +449,7 @@
return EmitTextureCall(expr, sem);
}
if (auto* sem = call_sem->As<semantic::IntrinsicCall>()) {
- if (sem->intrinsic() == semantic::Intrinsic::kPack2x16Float) {
+ if (sem->intrinsic() == semantic::IntrinsicType::kPack2x16Float) {
make_indent();
out_ << "as_type<uint>(half2(";
if (!EmitExpression(expr->params()[0])) {
@@ -580,7 +580,7 @@
TypeOf(params[pidx.texture])->UnwrapAll()->As<type::Texture>();
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureDimensions: {
+ case semantic::IntrinsicType::kTextureDimensions: {
std::vector<const char*> dims;
switch (texture_type->dim()) {
case type::TextureDimension::kNone:
@@ -634,7 +634,7 @@
}
return true;
}
- case semantic::Intrinsic::kTextureNumLayers: {
+ case semantic::IntrinsicType::kTextureNumLayers: {
out_ << "int(";
if (!EmitExpression(params[pidx.texture])) {
return false;
@@ -642,7 +642,7 @@
out_ << ".get_array_size())";
return true;
}
- case semantic::Intrinsic::kTextureNumLevels: {
+ case semantic::IntrinsicType::kTextureNumLevels: {
out_ << "int(";
if (!EmitExpression(params[pidx.texture])) {
return false;
@@ -650,7 +650,7 @@
out_ << ".get_num_mip_levels())";
return true;
}
- case semantic::Intrinsic::kTextureNumSamples: {
+ case semantic::IntrinsicType::kTextureNumSamples: {
out_ << "int(";
if (!EmitExpression(params[pidx.texture])) {
return false;
@@ -668,20 +668,20 @@
bool lod_param_is_named = true;
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureSample:
- case semantic::Intrinsic::kTextureSampleBias:
- case semantic::Intrinsic::kTextureSampleLevel:
- case semantic::Intrinsic::kTextureSampleGrad:
+ case semantic::IntrinsicType::kTextureSample:
+ case semantic::IntrinsicType::kTextureSampleBias:
+ case semantic::IntrinsicType::kTextureSampleLevel:
+ case semantic::IntrinsicType::kTextureSampleGrad:
out_ << ".sample(";
break;
- case semantic::Intrinsic::kTextureSampleCompare:
+ case semantic::IntrinsicType::kTextureSampleCompare:
out_ << ".sample_compare(";
break;
- case semantic::Intrinsic::kTextureLoad:
+ case semantic::IntrinsicType::kTextureLoad:
out_ << ".read(";
lod_param_is_named = false;
break;
- case semantic::Intrinsic::kTextureStore:
+ case semantic::IntrinsicType::kTextureStore:
out_ << ".write(";
break;
default:
@@ -780,118 +780,118 @@
const semantic::IntrinsicCall* call) {
std::string out = "metal::";
switch (call->intrinsic()) {
- case semantic::Intrinsic::kAcos:
- case semantic::Intrinsic::kAll:
- case semantic::Intrinsic::kAny:
- case semantic::Intrinsic::kAsin:
- case semantic::Intrinsic::kAtan:
- case semantic::Intrinsic::kAtan2:
- case semantic::Intrinsic::kCeil:
- case semantic::Intrinsic::kCos:
- case semantic::Intrinsic::kCosh:
- case semantic::Intrinsic::kCross:
- case semantic::Intrinsic::kDeterminant:
- case semantic::Intrinsic::kDistance:
- case semantic::Intrinsic::kDot:
- case semantic::Intrinsic::kExp:
- case semantic::Intrinsic::kExp2:
- case semantic::Intrinsic::kFloor:
- case semantic::Intrinsic::kFma:
- case semantic::Intrinsic::kFract:
- case semantic::Intrinsic::kLength:
- case semantic::Intrinsic::kLdexp:
- case semantic::Intrinsic::kLog:
- case semantic::Intrinsic::kLog2:
- case semantic::Intrinsic::kMix:
- case semantic::Intrinsic::kNormalize:
- case semantic::Intrinsic::kPow:
- case semantic::Intrinsic::kReflect:
- case semantic::Intrinsic::kRound:
- case semantic::Intrinsic::kSelect:
- case semantic::Intrinsic::kSin:
- case semantic::Intrinsic::kSinh:
- case semantic::Intrinsic::kSqrt:
- case semantic::Intrinsic::kStep:
- case semantic::Intrinsic::kTan:
- case semantic::Intrinsic::kTanh:
- case semantic::Intrinsic::kTrunc:
- case semantic::Intrinsic::kSign:
- case semantic::Intrinsic::kClamp:
+ case semantic::IntrinsicType::kAcos:
+ case semantic::IntrinsicType::kAll:
+ case semantic::IntrinsicType::kAny:
+ case semantic::IntrinsicType::kAsin:
+ case semantic::IntrinsicType::kAtan:
+ case semantic::IntrinsicType::kAtan2:
+ case semantic::IntrinsicType::kCeil:
+ case semantic::IntrinsicType::kCos:
+ case semantic::IntrinsicType::kCosh:
+ case semantic::IntrinsicType::kCross:
+ case semantic::IntrinsicType::kDeterminant:
+ case semantic::IntrinsicType::kDistance:
+ case semantic::IntrinsicType::kDot:
+ case semantic::IntrinsicType::kExp:
+ case semantic::IntrinsicType::kExp2:
+ case semantic::IntrinsicType::kFloor:
+ case semantic::IntrinsicType::kFma:
+ case semantic::IntrinsicType::kFract:
+ case semantic::IntrinsicType::kLength:
+ case semantic::IntrinsicType::kLdexp:
+ case semantic::IntrinsicType::kLog:
+ case semantic::IntrinsicType::kLog2:
+ case semantic::IntrinsicType::kMix:
+ case semantic::IntrinsicType::kNormalize:
+ case semantic::IntrinsicType::kPow:
+ case semantic::IntrinsicType::kReflect:
+ case semantic::IntrinsicType::kRound:
+ case semantic::IntrinsicType::kSelect:
+ case semantic::IntrinsicType::kSin:
+ case semantic::IntrinsicType::kSinh:
+ case semantic::IntrinsicType::kSqrt:
+ case semantic::IntrinsicType::kStep:
+ case semantic::IntrinsicType::kTan:
+ case semantic::IntrinsicType::kTanh:
+ case semantic::IntrinsicType::kTrunc:
+ case semantic::IntrinsicType::kSign:
+ case semantic::IntrinsicType::kClamp:
out += semantic::intrinsic::str(call->intrinsic());
break;
- case semantic::Intrinsic::kAbs:
+ case semantic::IntrinsicType::kAbs:
if (call->Type()->is_float_scalar_or_vector()) {
out += "fabs";
} else {
out += "abs";
}
break;
- case semantic::Intrinsic::kCountOneBits:
+ case semantic::IntrinsicType::kCountOneBits:
out += "popcount";
break;
- case semantic::Intrinsic::kDpdx:
- case semantic::Intrinsic::kDpdxCoarse:
- case semantic::Intrinsic::kDpdxFine:
+ case semantic::IntrinsicType::kDpdx:
+ case semantic::IntrinsicType::kDpdxCoarse:
+ case semantic::IntrinsicType::kDpdxFine:
out += "dfdx";
break;
- case semantic::Intrinsic::kDpdy:
- case semantic::Intrinsic::kDpdyCoarse:
- case semantic::Intrinsic::kDpdyFine:
+ case semantic::IntrinsicType::kDpdy:
+ case semantic::IntrinsicType::kDpdyCoarse:
+ case semantic::IntrinsicType::kDpdyFine:
out += "dfdy";
break;
- case semantic::Intrinsic::kFwidth:
- case semantic::Intrinsic::kFwidthCoarse:
- case semantic::Intrinsic::kFwidthFine:
+ case semantic::IntrinsicType::kFwidth:
+ case semantic::IntrinsicType::kFwidthCoarse:
+ case semantic::IntrinsicType::kFwidthFine:
out += "fwidth";
break;
- case semantic::Intrinsic::kIsFinite:
+ case semantic::IntrinsicType::kIsFinite:
out += "isfinite";
break;
- case semantic::Intrinsic::kIsInf:
+ case semantic::IntrinsicType::kIsInf:
out += "isinf";
break;
- case semantic::Intrinsic::kIsNan:
+ case semantic::IntrinsicType::kIsNan:
out += "isnan";
break;
- case semantic::Intrinsic::kIsNormal:
+ case semantic::IntrinsicType::kIsNormal:
out += "isnormal";
break;
- case semantic::Intrinsic::kMax:
+ case semantic::IntrinsicType::kMax:
if (call->Type()->is_float_scalar_or_vector()) {
out += "fmax";
} else {
out += "max";
}
break;
- case semantic::Intrinsic::kMin:
+ case semantic::IntrinsicType::kMin:
if (call->Type()->is_float_scalar_or_vector()) {
out += "fmin";
} else {
out += "min";
}
break;
- case semantic::Intrinsic::kFaceForward:
+ case semantic::IntrinsicType::kFaceForward:
out += "faceforward";
break;
- case semantic::Intrinsic::kPack4x8Snorm:
+ case semantic::IntrinsicType::kPack4x8Snorm:
out += "pack_float_to_snorm4x8";
break;
- case semantic::Intrinsic::kPack4x8Unorm:
+ case semantic::IntrinsicType::kPack4x8Unorm:
out += "pack_float_to_unorm4x8";
break;
- case semantic::Intrinsic::kPack2x16Snorm:
+ case semantic::IntrinsicType::kPack2x16Snorm:
out += "pack_float_to_snorm2x16";
break;
- case semantic::Intrinsic::kPack2x16Unorm:
+ case semantic::IntrinsicType::kPack2x16Unorm:
out += "pack_float_to_unorm2x16";
break;
- case semantic::Intrinsic::kReverseBits:
+ case semantic::IntrinsicType::kReverseBits:
out += "reverse_bits";
break;
- case semantic::Intrinsic::kSmoothStep:
+ case semantic::IntrinsicType::kSmoothStep:
out += "smoothstep";
break;
- case semantic::Intrinsic::kInverseSqrt:
+ case semantic::IntrinsicType::kInverseSqrt:
out += "rsqrt";
break;
default:
diff --git a/src/writer/msl/generator_impl_intrinsic_test.cc b/src/writer/msl/generator_impl_intrinsic_test.cc
index 7540043..2555904 100644
--- a/src/writer/msl/generator_impl_intrinsic_test.cc
+++ b/src/writer/msl/generator_impl_intrinsic_test.cc
@@ -30,6 +30,8 @@
namespace msl {
namespace {
+using IntrinsicType = semantic::IntrinsicType;
+
using MslGeneratorImplTest = TestHelper;
enum class ParamType {
@@ -39,7 +41,7 @@
};
struct IntrinsicData {
- semantic::Intrinsic intrinsic;
+ IntrinsicType intrinsic;
ParamType type;
const char* msl_name;
};
@@ -60,97 +62,97 @@
return out;
}
-ast::CallExpression* GenerateCall(semantic::Intrinsic intrinsic,
+ast::CallExpression* GenerateCall(IntrinsicType intrinsic,
ParamType type,
ProgramBuilder* builder) {
std::string name;
std::ostringstream str(name);
str << intrinsic;
switch (intrinsic) {
- case semantic::Intrinsic::kAcos:
- case semantic::Intrinsic::kAsin:
- case semantic::Intrinsic::kAtan:
- case semantic::Intrinsic::kCeil:
- case semantic::Intrinsic::kCos:
- case semantic::Intrinsic::kCosh:
- case semantic::Intrinsic::kDpdx:
- case semantic::Intrinsic::kDpdxCoarse:
- case semantic::Intrinsic::kDpdxFine:
- case semantic::Intrinsic::kDpdy:
- case semantic::Intrinsic::kDpdyCoarse:
- case semantic::Intrinsic::kDpdyFine:
- case semantic::Intrinsic::kExp:
- case semantic::Intrinsic::kExp2:
- case semantic::Intrinsic::kFloor:
- case semantic::Intrinsic::kFract:
- case semantic::Intrinsic::kFwidth:
- case semantic::Intrinsic::kFwidthCoarse:
- case semantic::Intrinsic::kFwidthFine:
- case semantic::Intrinsic::kInverseSqrt:
- case semantic::Intrinsic::kIsFinite:
- case semantic::Intrinsic::kIsInf:
- case semantic::Intrinsic::kIsNan:
- case semantic::Intrinsic::kIsNormal:
- case semantic::Intrinsic::kLdexp:
- case semantic::Intrinsic::kLength:
- case semantic::Intrinsic::kLog:
- case semantic::Intrinsic::kLog2:
- case semantic::Intrinsic::kNormalize:
- case semantic::Intrinsic::kPack4x8Snorm:
- case semantic::Intrinsic::kPack4x8Unorm:
- case semantic::Intrinsic::kReflect:
- case semantic::Intrinsic::kRound:
- case semantic::Intrinsic::kSin:
- case semantic::Intrinsic::kSinh:
- case semantic::Intrinsic::kSqrt:
- case semantic::Intrinsic::kTan:
- case semantic::Intrinsic::kTanh:
- case semantic::Intrinsic::kTrunc:
- case semantic::Intrinsic::kSign:
+ case IntrinsicType::kAcos:
+ case IntrinsicType::kAsin:
+ case IntrinsicType::kAtan:
+ case IntrinsicType::kCeil:
+ case IntrinsicType::kCos:
+ case IntrinsicType::kCosh:
+ case IntrinsicType::kDpdx:
+ case IntrinsicType::kDpdxCoarse:
+ case IntrinsicType::kDpdxFine:
+ case IntrinsicType::kDpdy:
+ case IntrinsicType::kDpdyCoarse:
+ case IntrinsicType::kDpdyFine:
+ case IntrinsicType::kExp:
+ case IntrinsicType::kExp2:
+ case IntrinsicType::kFloor:
+ case IntrinsicType::kFract:
+ case IntrinsicType::kFwidth:
+ case IntrinsicType::kFwidthCoarse:
+ case IntrinsicType::kFwidthFine:
+ case IntrinsicType::kInverseSqrt:
+ case IntrinsicType::kIsFinite:
+ case IntrinsicType::kIsInf:
+ case IntrinsicType::kIsNan:
+ case IntrinsicType::kIsNormal:
+ case IntrinsicType::kLdexp:
+ case IntrinsicType::kLength:
+ case IntrinsicType::kLog:
+ case IntrinsicType::kLog2:
+ case IntrinsicType::kNormalize:
+ case IntrinsicType::kPack4x8Snorm:
+ case IntrinsicType::kPack4x8Unorm:
+ case IntrinsicType::kReflect:
+ case IntrinsicType::kRound:
+ case IntrinsicType::kSin:
+ case IntrinsicType::kSinh:
+ case IntrinsicType::kSqrt:
+ case IntrinsicType::kTan:
+ case IntrinsicType::kTanh:
+ case IntrinsicType::kTrunc:
+ case IntrinsicType::kSign:
return builder->Call(str.str(), "f1");
- case semantic::Intrinsic::kAtan2:
- case semantic::Intrinsic::kCross:
- case semantic::Intrinsic::kDot:
- case semantic::Intrinsic::kDistance:
- case semantic::Intrinsic::kPow:
- case semantic::Intrinsic::kStep:
+ case IntrinsicType::kAtan2:
+ case IntrinsicType::kCross:
+ case IntrinsicType::kDot:
+ case IntrinsicType::kDistance:
+ case IntrinsicType::kPow:
+ case IntrinsicType::kStep:
return builder->Call(str.str(), "f1", "f2");
- case semantic::Intrinsic::kFma:
- case semantic::Intrinsic::kMix:
- case semantic::Intrinsic::kFaceForward:
- case semantic::Intrinsic::kSmoothStep:
+ case IntrinsicType::kFma:
+ case IntrinsicType::kMix:
+ case IntrinsicType::kFaceForward:
+ case IntrinsicType::kSmoothStep:
return builder->Call(str.str(), "f1", "f2", "f3");
- case semantic::Intrinsic::kAll:
- case semantic::Intrinsic::kAny:
+ case IntrinsicType::kAll:
+ case IntrinsicType::kAny:
return builder->Call(str.str(), "b1");
- case semantic::Intrinsic::kAbs:
+ case IntrinsicType::kAbs:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1");
} else {
return builder->Call(str.str(), "u1");
}
- case semantic::Intrinsic::kCountOneBits:
- case semantic::Intrinsic::kReverseBits:
+ case IntrinsicType::kCountOneBits:
+ case IntrinsicType::kReverseBits:
return builder->Call(str.str(), "u1");
- case semantic::Intrinsic::kMax:
- case semantic::Intrinsic::kMin:
+ case IntrinsicType::kMax:
+ case IntrinsicType::kMin:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1", "f2");
} else {
return builder->Call(str.str(), "u1", "u2");
}
- case semantic::Intrinsic::kClamp:
+ case IntrinsicType::kClamp:
if (type == ParamType::kF32) {
return builder->Call(str.str(), "f1", "f2", "f3");
} else {
return builder->Call(str.str(), "u1", "u2", "u3");
}
- case semantic::Intrinsic::kSelect:
+ case IntrinsicType::kSelect:
return builder->Call(str.str(), "f1", "f2", "b1");
- case semantic::Intrinsic::kDeterminant:
+ case IntrinsicType::kDeterminant:
return builder->Call(str.str(), "m1");
- case semantic::Intrinsic::kPack2x16Snorm:
- case semantic::Intrinsic::kPack2x16Unorm:
+ case IntrinsicType::kPack2x16Snorm:
+ case IntrinsicType::kPack2x16Unorm:
return builder->Call(str.str(), "f4");
default:
break;
@@ -189,125 +191,90 @@
MslGeneratorImplTest,
MslIntrinsicTest,
testing::Values(
- IntrinsicData{semantic::Intrinsic::kAbs, ParamType::kF32,
- "metal::fabs"},
- IntrinsicData{semantic::Intrinsic::kAbs, ParamType::kU32, "metal::abs"},
- IntrinsicData{semantic::Intrinsic::kAcos, ParamType::kF32,
- "metal::acos"},
- IntrinsicData{semantic::Intrinsic::kAll, ParamType::kBool,
- "metal::all"},
- IntrinsicData{semantic::Intrinsic::kAny, ParamType::kBool,
- "metal::any"},
- IntrinsicData{semantic::Intrinsic::kAsin, ParamType::kF32,
- "metal::asin"},
- IntrinsicData{semantic::Intrinsic::kAtan, ParamType::kF32,
- "metal::atan"},
- IntrinsicData{semantic::Intrinsic::kAtan2, ParamType::kF32,
- "metal::atan2"},
- IntrinsicData{semantic::Intrinsic::kCeil, ParamType::kF32,
- "metal::ceil"},
- IntrinsicData{semantic::Intrinsic::kClamp, ParamType::kF32,
- "metal::clamp"},
- IntrinsicData{semantic::Intrinsic::kClamp, ParamType::kU32,
- "metal::clamp"},
- IntrinsicData{semantic::Intrinsic::kCos, ParamType::kF32, "metal::cos"},
- IntrinsicData{semantic::Intrinsic::kCosh, ParamType::kF32,
- "metal::cosh"},
- IntrinsicData{semantic::Intrinsic::kCountOneBits, ParamType::kU32,
+ IntrinsicData{IntrinsicType::kAbs, ParamType::kF32, "metal::fabs"},
+ IntrinsicData{IntrinsicType::kAbs, ParamType::kU32, "metal::abs"},
+ IntrinsicData{IntrinsicType::kAcos, ParamType::kF32, "metal::acos"},
+ IntrinsicData{IntrinsicType::kAll, ParamType::kBool, "metal::all"},
+ IntrinsicData{IntrinsicType::kAny, ParamType::kBool, "metal::any"},
+ IntrinsicData{IntrinsicType::kAsin, ParamType::kF32, "metal::asin"},
+ IntrinsicData{IntrinsicType::kAtan, ParamType::kF32, "metal::atan"},
+ IntrinsicData{IntrinsicType::kAtan2, ParamType::kF32, "metal::atan2"},
+ IntrinsicData{IntrinsicType::kCeil, ParamType::kF32, "metal::ceil"},
+ IntrinsicData{IntrinsicType::kClamp, ParamType::kF32, "metal::clamp"},
+ IntrinsicData{IntrinsicType::kClamp, ParamType::kU32, "metal::clamp"},
+ IntrinsicData{IntrinsicType::kCos, ParamType::kF32, "metal::cos"},
+ IntrinsicData{IntrinsicType::kCosh, ParamType::kF32, "metal::cosh"},
+ IntrinsicData{IntrinsicType::kCountOneBits, ParamType::kU32,
"metal::popcount"},
- IntrinsicData{semantic::Intrinsic::kCross, ParamType::kF32,
- "metal::cross"},
- IntrinsicData{semantic::Intrinsic::kDeterminant, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kCross, ParamType::kF32, "metal::cross"},
+ IntrinsicData{IntrinsicType::kDeterminant, ParamType::kF32,
"metal::determinant"},
- IntrinsicData{semantic::Intrinsic::kDistance, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDistance, ParamType::kF32,
"metal::distance"},
- IntrinsicData{semantic::Intrinsic::kDot, ParamType::kF32, "metal::dot"},
- IntrinsicData{semantic::Intrinsic::kDpdx, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDot, ParamType::kF32, "metal::dot"},
+ IntrinsicData{IntrinsicType::kDpdx, ParamType::kF32, "metal::dfdx"},
+ IntrinsicData{IntrinsicType::kDpdxCoarse, ParamType::kF32,
"metal::dfdx"},
- IntrinsicData{semantic::Intrinsic::kDpdxCoarse, ParamType::kF32,
- "metal::dfdx"},
- IntrinsicData{semantic::Intrinsic::kDpdxFine, ParamType::kF32,
- "metal::dfdx"},
- IntrinsicData{semantic::Intrinsic::kDpdy, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDpdxFine, ParamType::kF32, "metal::dfdx"},
+ IntrinsicData{IntrinsicType::kDpdy, ParamType::kF32, "metal::dfdy"},
+ IntrinsicData{IntrinsicType::kDpdyCoarse, ParamType::kF32,
"metal::dfdy"},
- IntrinsicData{semantic::Intrinsic::kDpdyCoarse, ParamType::kF32,
- "metal::dfdy"},
- IntrinsicData{semantic::Intrinsic::kDpdyFine, ParamType::kF32,
- "metal::dfdy"},
- IntrinsicData{semantic::Intrinsic::kExp, ParamType::kF32, "metal::exp"},
- IntrinsicData{semantic::Intrinsic::kExp2, ParamType::kF32,
- "metal::exp2"},
- IntrinsicData{semantic::Intrinsic::kFaceForward, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kDpdyFine, ParamType::kF32, "metal::dfdy"},
+ IntrinsicData{IntrinsicType::kExp, ParamType::kF32, "metal::exp"},
+ IntrinsicData{IntrinsicType::kExp2, ParamType::kF32, "metal::exp2"},
+ IntrinsicData{IntrinsicType::kFaceForward, ParamType::kF32,
"metal::faceforward"},
- IntrinsicData{semantic::Intrinsic::kFloor, ParamType::kF32,
- "metal::floor"},
- IntrinsicData{semantic::Intrinsic::kFma, ParamType::kF32, "metal::fma"},
- IntrinsicData{semantic::Intrinsic::kFract, ParamType::kF32,
- "metal::fract"},
- IntrinsicData{semantic::Intrinsic::kFwidth, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kFloor, ParamType::kF32, "metal::floor"},
+ IntrinsicData{IntrinsicType::kFma, ParamType::kF32, "metal::fma"},
+ IntrinsicData{IntrinsicType::kFract, ParamType::kF32, "metal::fract"},
+ IntrinsicData{IntrinsicType::kFwidth, ParamType::kF32, "metal::fwidth"},
+ IntrinsicData{IntrinsicType::kFwidthCoarse, ParamType::kF32,
"metal::fwidth"},
- IntrinsicData{semantic::Intrinsic::kFwidthCoarse, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kFwidthFine, ParamType::kF32,
"metal::fwidth"},
- IntrinsicData{semantic::Intrinsic::kFwidthFine, ParamType::kF32,
- "metal::fwidth"},
- IntrinsicData{semantic::Intrinsic::kInverseSqrt, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kInverseSqrt, ParamType::kF32,
"metal::rsqrt"},
- IntrinsicData{semantic::Intrinsic::kIsFinite, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kIsFinite, ParamType::kF32,
"metal::isfinite"},
- IntrinsicData{semantic::Intrinsic::kIsInf, ParamType::kF32,
- "metal::isinf"},
- IntrinsicData{semantic::Intrinsic::kIsNan, ParamType::kF32,
- "metal::isnan"},
- IntrinsicData{semantic::Intrinsic::kIsNormal, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kIsInf, ParamType::kF32, "metal::isinf"},
+ IntrinsicData{IntrinsicType::kIsNan, ParamType::kF32, "metal::isnan"},
+ IntrinsicData{IntrinsicType::kIsNormal, ParamType::kF32,
"metal::isnormal"},
- IntrinsicData{semantic::Intrinsic::kLdexp, ParamType::kF32,
- "metal::ldexp"},
- IntrinsicData{semantic::Intrinsic::kLength, ParamType::kF32,
- "metal::length"},
- IntrinsicData{semantic::Intrinsic::kLog, ParamType::kF32, "metal::log"},
- IntrinsicData{semantic::Intrinsic::kLog2, ParamType::kF32,
- "metal::log2"},
- IntrinsicData{semantic::Intrinsic::kMax, ParamType::kF32,
- "metal::fmax"},
- IntrinsicData{semantic::Intrinsic::kMax, ParamType::kU32, "metal::max"},
- IntrinsicData{semantic::Intrinsic::kMin, ParamType::kF32,
- "metal::fmin"},
- IntrinsicData{semantic::Intrinsic::kMin, ParamType::kU32, "metal::min"},
- IntrinsicData{semantic::Intrinsic::kNormalize, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kLdexp, ParamType::kF32, "metal::ldexp"},
+ IntrinsicData{IntrinsicType::kLength, ParamType::kF32, "metal::length"},
+ IntrinsicData{IntrinsicType::kLog, ParamType::kF32, "metal::log"},
+ IntrinsicData{IntrinsicType::kLog2, ParamType::kF32, "metal::log2"},
+ IntrinsicData{IntrinsicType::kMax, ParamType::kF32, "metal::fmax"},
+ IntrinsicData{IntrinsicType::kMax, ParamType::kU32, "metal::max"},
+ IntrinsicData{IntrinsicType::kMin, ParamType::kF32, "metal::fmin"},
+ IntrinsicData{IntrinsicType::kMin, ParamType::kU32, "metal::min"},
+ IntrinsicData{IntrinsicType::kNormalize, ParamType::kF32,
"metal::normalize"},
- IntrinsicData{semantic::Intrinsic::kPack4x8Snorm, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kPack4x8Snorm, ParamType::kF32,
"metal::pack_float_to_snorm4x8"},
- IntrinsicData{semantic::Intrinsic::kPack4x8Unorm, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kPack4x8Unorm, ParamType::kF32,
"metal::pack_float_to_unorm4x8"},
- IntrinsicData{semantic::Intrinsic::kPack2x16Snorm, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kPack2x16Snorm, ParamType::kF32,
"metal::pack_float_to_snorm2x16"},
- IntrinsicData{semantic::Intrinsic::kPack2x16Unorm, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kPack2x16Unorm, ParamType::kF32,
"metal::pack_float_to_unorm2x16"},
- IntrinsicData{semantic::Intrinsic::kPow, ParamType::kF32, "metal::pow"},
- IntrinsicData{semantic::Intrinsic::kReflect, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kPow, ParamType::kF32, "metal::pow"},
+ IntrinsicData{IntrinsicType::kReflect, ParamType::kF32,
"metal::reflect"},
- IntrinsicData{semantic::Intrinsic::kReverseBits, ParamType::kU32,
+ IntrinsicData{IntrinsicType::kReverseBits, ParamType::kU32,
"metal::reverse_bits"},
- IntrinsicData{semantic::Intrinsic::kRound, ParamType::kU32,
- "metal::round"},
- IntrinsicData{semantic::Intrinsic::kSelect, ParamType::kF32,
- "metal::select"},
- IntrinsicData{semantic::Intrinsic::kSign, ParamType::kF32,
- "metal::sign"},
- IntrinsicData{semantic::Intrinsic::kSin, ParamType::kF32, "metal::sin"},
- IntrinsicData{semantic::Intrinsic::kSinh, ParamType::kF32,
- "metal::sinh"},
- IntrinsicData{semantic::Intrinsic::kSmoothStep, ParamType::kF32,
+ IntrinsicData{IntrinsicType::kRound, ParamType::kU32, "metal::round"},
+ IntrinsicData{IntrinsicType::kSelect, ParamType::kF32, "metal::select"},
+ IntrinsicData{IntrinsicType::kSign, ParamType::kF32, "metal::sign"},
+ IntrinsicData{IntrinsicType::kSin, ParamType::kF32, "metal::sin"},
+ IntrinsicData{IntrinsicType::kSinh, ParamType::kF32, "metal::sinh"},
+ IntrinsicData{IntrinsicType::kSmoothStep, ParamType::kF32,
"metal::smoothstep"},
- IntrinsicData{semantic::Intrinsic::kSqrt, ParamType::kF32,
- "metal::sqrt"},
- IntrinsicData{semantic::Intrinsic::kStep, ParamType::kF32,
- "metal::step"},
- IntrinsicData{semantic::Intrinsic::kTan, ParamType::kF32, "metal::tan"},
- IntrinsicData{semantic::Intrinsic::kTanh, ParamType::kF32,
- "metal::tanh"},
- IntrinsicData{semantic::Intrinsic::kTrunc, ParamType::kF32,
- "metal::trunc"}));
+ IntrinsicData{IntrinsicType::kSqrt, ParamType::kF32, "metal::sqrt"},
+ IntrinsicData{IntrinsicType::kStep, ParamType::kF32, "metal::step"},
+ IntrinsicData{IntrinsicType::kTan, ParamType::kF32, "metal::tan"},
+ IntrinsicData{IntrinsicType::kTanh, ParamType::kF32, "metal::tanh"},
+ IntrinsicData{IntrinsicType::kTrunc, ParamType::kF32, "metal::trunc"}));
TEST_F(MslGeneratorImplTest, Intrinsic_Call) {
Global("param1", ast::StorageClass::kFunction, ty.vec2<f32>());
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index a351357..ce32ebb 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -87,6 +87,8 @@
namespace spirv {
namespace {
+using IntrinsicType = semantic::IntrinsicType;
+
const char kGLSLstd450[] = "GLSL.std.450";
uint32_t size_of(const InstructionList& instructions) {
@@ -166,26 +168,25 @@
return type->As<type::Matrix>();
}
-uint32_t intrinsic_to_glsl_method(type::Type* type,
- semantic::Intrinsic intrinsic) {
+uint32_t intrinsic_to_glsl_method(type::Type* type, IntrinsicType intrinsic) {
switch (intrinsic) {
- case semantic::Intrinsic::kAbs:
+ case IntrinsicType::kAbs:
if (type->is_float_scalar_or_vector()) {
return GLSLstd450FAbs;
} else {
return GLSLstd450SAbs;
}
- case semantic::Intrinsic::kAcos:
+ case IntrinsicType::kAcos:
return GLSLstd450Acos;
- case semantic::Intrinsic::kAsin:
+ case IntrinsicType::kAsin:
return GLSLstd450Asin;
- case semantic::Intrinsic::kAtan:
+ case IntrinsicType::kAtan:
return GLSLstd450Atan;
- case semantic::Intrinsic::kAtan2:
+ case IntrinsicType::kAtan2:
return GLSLstd450Atan2;
- case semantic::Intrinsic::kCeil:
+ case IntrinsicType::kCeil:
return GLSLstd450Ceil;
- case semantic::Intrinsic::kClamp:
+ case IntrinsicType::kClamp:
if (type->is_float_scalar_or_vector()) {
return GLSLstd450NClamp;
} else if (type->is_unsigned_scalar_or_vector()) {
@@ -193,41 +194,41 @@
} else {
return GLSLstd450SClamp;
}
- case semantic::Intrinsic::kCos:
+ case IntrinsicType::kCos:
return GLSLstd450Cos;
- case semantic::Intrinsic::kCosh:
+ case IntrinsicType::kCosh:
return GLSLstd450Cosh;
- case semantic::Intrinsic::kCross:
+ case IntrinsicType::kCross:
return GLSLstd450Cross;
- case semantic::Intrinsic::kDeterminant:
+ case IntrinsicType::kDeterminant:
return GLSLstd450Determinant;
- case semantic::Intrinsic::kDistance:
+ case IntrinsicType::kDistance:
return GLSLstd450Distance;
- case semantic::Intrinsic::kExp:
+ case IntrinsicType::kExp:
return GLSLstd450Exp;
- case semantic::Intrinsic::kExp2:
+ case IntrinsicType::kExp2:
return GLSLstd450Exp2;
- case semantic::Intrinsic::kFaceForward:
+ case IntrinsicType::kFaceForward:
return GLSLstd450FaceForward;
- case semantic::Intrinsic::kFloor:
+ case IntrinsicType::kFloor:
return GLSLstd450Floor;
- case semantic::Intrinsic::kFma:
+ case IntrinsicType::kFma:
return GLSLstd450Fma;
- case semantic::Intrinsic::kFract:
+ case IntrinsicType::kFract:
return GLSLstd450Fract;
- case semantic::Intrinsic::kFrexp:
+ case IntrinsicType::kFrexp:
return GLSLstd450Frexp;
- case semantic::Intrinsic::kInverseSqrt:
+ case IntrinsicType::kInverseSqrt:
return GLSLstd450InverseSqrt;
- case semantic::Intrinsic::kLdexp:
+ case IntrinsicType::kLdexp:
return GLSLstd450Ldexp;
- case semantic::Intrinsic::kLength:
+ case IntrinsicType::kLength:
return GLSLstd450Length;
- case semantic::Intrinsic::kLog:
+ case IntrinsicType::kLog:
return GLSLstd450Log;
- case semantic::Intrinsic::kLog2:
+ case IntrinsicType::kLog2:
return GLSLstd450Log2;
- case semantic::Intrinsic::kMax:
+ case IntrinsicType::kMax:
if (type->is_float_scalar_or_vector()) {
return GLSLstd450NMax;
} else if (type->is_unsigned_scalar_or_vector()) {
@@ -235,7 +236,7 @@
} else {
return GLSLstd450SMax;
}
- case semantic::Intrinsic::kMin:
+ case IntrinsicType::kMin:
if (type->is_float_scalar_or_vector()) {
return GLSLstd450NMin;
} else if (type->is_unsigned_scalar_or_vector()) {
@@ -243,45 +244,45 @@
} else {
return GLSLstd450SMin;
}
- case semantic::Intrinsic::kMix:
+ case IntrinsicType::kMix:
return GLSLstd450FMix;
- case semantic::Intrinsic::kModf:
+ case IntrinsicType::kModf:
return GLSLstd450Modf;
- case semantic::Intrinsic::kNormalize:
+ case IntrinsicType::kNormalize:
return GLSLstd450Normalize;
- case semantic::Intrinsic::kPack4x8Snorm:
+ case IntrinsicType::kPack4x8Snorm:
return GLSLstd450PackSnorm4x8;
- case semantic::Intrinsic::kPack4x8Unorm:
+ case IntrinsicType::kPack4x8Unorm:
return GLSLstd450PackUnorm4x8;
- case semantic::Intrinsic::kPack2x16Snorm:
+ case IntrinsicType::kPack2x16Snorm:
return GLSLstd450PackSnorm2x16;
- case semantic::Intrinsic::kPack2x16Unorm:
+ case IntrinsicType::kPack2x16Unorm:
return GLSLstd450PackUnorm2x16;
- case semantic::Intrinsic::kPack2x16Float:
+ case IntrinsicType::kPack2x16Float:
return GLSLstd450PackHalf2x16;
- case semantic::Intrinsic::kPow:
+ case IntrinsicType::kPow:
return GLSLstd450Pow;
- case semantic::Intrinsic::kReflect:
+ case IntrinsicType::kReflect:
return GLSLstd450Reflect;
- case semantic::Intrinsic::kRound:
+ case IntrinsicType::kRound:
return GLSLstd450Round;
- case semantic::Intrinsic::kSign:
+ case IntrinsicType::kSign:
return GLSLstd450FSign;
- case semantic::Intrinsic::kSin:
+ case IntrinsicType::kSin:
return GLSLstd450Sin;
- case semantic::Intrinsic::kSinh:
+ case IntrinsicType::kSinh:
return GLSLstd450Sinh;
- case semantic::Intrinsic::kSmoothStep:
+ case IntrinsicType::kSmoothStep:
return GLSLstd450SmoothStep;
- case semantic::Intrinsic::kSqrt:
+ case IntrinsicType::kSqrt:
return GLSLstd450Sqrt;
- case semantic::Intrinsic::kStep:
+ case IntrinsicType::kStep:
return GLSLstd450Step;
- case semantic::Intrinsic::kTan:
+ case IntrinsicType::kTan:
return GLSLstd450Tan;
- case semantic::Intrinsic::kTanh:
+ case IntrinsicType::kTanh:
return GLSLstd450Tanh;
- case semantic::Intrinsic::kTrunc:
+ case IntrinsicType::kTrunc:
return GLSLstd450Trunc;
default:
break;
@@ -1897,11 +1898,11 @@
OperandList params = {Operand::Int(result_type_id), result};
spv::Op op = spv::Op::OpNop;
- if (intrinsic == semantic::Intrinsic::kAny) {
+ if (intrinsic == IntrinsicType::kAny) {
op = spv::Op::OpAny;
- } else if (intrinsic == semantic::Intrinsic::kAll) {
+ } else if (intrinsic == IntrinsicType::kAll) {
op = spv::Op::OpAll;
- } else if (intrinsic == semantic::Intrinsic::kArrayLength) {
+ } else if (intrinsic == IntrinsicType::kArrayLength) {
if (call->params().empty()) {
error_ = "missing param for runtime array length";
return 0;
@@ -1934,35 +1935,35 @@
return 0;
}
return result_id;
- } else if (intrinsic == semantic::Intrinsic::kCountOneBits) {
+ } else if (intrinsic == IntrinsicType::kCountOneBits) {
op = spv::Op::OpBitCount;
- } else if (intrinsic == semantic::Intrinsic::kDot) {
+ } else if (intrinsic == IntrinsicType::kDot) {
op = spv::Op::OpDot;
- } else if (intrinsic == semantic::Intrinsic::kDpdx) {
+ } else if (intrinsic == IntrinsicType::kDpdx) {
op = spv::Op::OpDPdx;
- } else if (intrinsic == semantic::Intrinsic::kDpdxCoarse) {
+ } else if (intrinsic == IntrinsicType::kDpdxCoarse) {
op = spv::Op::OpDPdxCoarse;
- } else if (intrinsic == semantic::Intrinsic::kDpdxFine) {
+ } else if (intrinsic == IntrinsicType::kDpdxFine) {
op = spv::Op::OpDPdxFine;
- } else if (intrinsic == semantic::Intrinsic::kDpdy) {
+ } else if (intrinsic == IntrinsicType::kDpdy) {
op = spv::Op::OpDPdy;
- } else if (intrinsic == semantic::Intrinsic::kDpdyCoarse) {
+ } else if (intrinsic == IntrinsicType::kDpdyCoarse) {
op = spv::Op::OpDPdyCoarse;
- } else if (intrinsic == semantic::Intrinsic::kDpdyFine) {
+ } else if (intrinsic == IntrinsicType::kDpdyFine) {
op = spv::Op::OpDPdyFine;
- } else if (intrinsic == semantic::Intrinsic::kFwidth) {
+ } else if (intrinsic == IntrinsicType::kFwidth) {
op = spv::Op::OpFwidth;
- } else if (intrinsic == semantic::Intrinsic::kFwidthCoarse) {
+ } else if (intrinsic == IntrinsicType::kFwidthCoarse) {
op = spv::Op::OpFwidthCoarse;
- } else if (intrinsic == semantic::Intrinsic::kFwidthFine) {
+ } else if (intrinsic == IntrinsicType::kFwidthFine) {
op = spv::Op::OpFwidthFine;
- } else if (intrinsic == semantic::Intrinsic::kIsInf) {
+ } else if (intrinsic == IntrinsicType::kIsInf) {
op = spv::Op::OpIsInf;
- } else if (intrinsic == semantic::Intrinsic::kIsNan) {
+ } else if (intrinsic == IntrinsicType::kIsNan) {
op = spv::Op::OpIsNan;
- } else if (intrinsic == semantic::Intrinsic::kReverseBits) {
+ } else if (intrinsic == IntrinsicType::kReverseBits) {
op = spv::Op::OpBitReverse;
- } else if (intrinsic == semantic::Intrinsic::kSelect) {
+ } else if (intrinsic == IntrinsicType::kSelect) {
op = spv::Op::OpSelect;
} else {
GenerateGLSLstd450Import();
@@ -2163,7 +2164,7 @@
};
switch (sem->intrinsic()) {
- case semantic::Intrinsic::kTextureDimensions: {
+ case IntrinsicType::kTextureDimensions: {
// Number of returned elements from OpImageQuerySize[Lod] may not match
// those of textureDimensions().
// This might be due to an extra vector scalar describing the number of
@@ -2219,7 +2220,7 @@
}
break;
}
- case semantic::Intrinsic::kTextureNumLayers: {
+ case IntrinsicType::kTextureNumLayers: {
uint32_t spirv_dims = 0;
switch (texture_type->dim()) {
default:
@@ -2254,19 +2255,19 @@
}
break;
}
- case semantic::Intrinsic::kTextureNumLevels: {
+ case IntrinsicType::kTextureNumLevels: {
op = spv::Op::OpImageQueryLevels;
append_result_type_and_id_to_spirv_params();
spirv_params.emplace_back(gen_param(pidx.texture));
break;
}
- case semantic::Intrinsic::kTextureNumSamples: {
+ case IntrinsicType::kTextureNumSamples: {
op = spv::Op::OpImageQuerySamples;
append_result_type_and_id_to_spirv_params();
spirv_params.emplace_back(gen_param(pidx.texture));
break;
}
- case semantic::Intrinsic::kTextureLoad: {
+ case IntrinsicType::kTextureLoad: {
op = texture_type->Is<type::StorageTexture>() ? spv::Op::OpImageRead
: spv::Op::OpImageFetch;
append_result_type_and_id_to_spirv_params_for_read();
@@ -2287,7 +2288,7 @@
break;
}
- case semantic::Intrinsic::kTextureStore: {
+ case IntrinsicType::kTextureStore: {
op = spv::Op::OpImageWrite;
spirv_params.emplace_back(gen_param(pidx.texture));
if (!append_coords_to_spirv_params()) {
@@ -2296,7 +2297,7 @@
spirv_params.emplace_back(gen_param(pidx.value));
break;
}
- case semantic::Intrinsic::kTextureSample: {
+ case IntrinsicType::kTextureSample: {
op = spv::Op::OpImageSampleImplicitLod;
append_result_type_and_id_to_spirv_params_for_read();
if (!append_image_and_coords_to_spirv_params()) {
@@ -2304,7 +2305,7 @@
}
break;
}
- case semantic::Intrinsic::kTextureSampleBias: {
+ case IntrinsicType::kTextureSampleBias: {
op = spv::Op::OpImageSampleImplicitLod;
append_result_type_and_id_to_spirv_params_for_read();
if (!append_image_and_coords_to_spirv_params()) {
@@ -2315,7 +2316,7 @@
ImageOperand{SpvImageOperandsBiasMask, gen_param(pidx.bias)});
break;
}
- case semantic::Intrinsic::kTextureSampleLevel: {
+ case IntrinsicType::kTextureSampleLevel: {
op = spv::Op::OpImageSampleExplicitLod;
append_result_type_and_id_to_spirv_params_for_read();
if (!append_image_and_coords_to_spirv_params()) {
@@ -2339,7 +2340,7 @@
image_operands.emplace_back(ImageOperand{SpvImageOperandsLodMask, level});
break;
}
- case semantic::Intrinsic::kTextureSampleGrad: {
+ case IntrinsicType::kTextureSampleGrad: {
op = spv::Op::OpImageSampleExplicitLod;
append_result_type_and_id_to_spirv_params_for_read();
if (!append_image_and_coords_to_spirv_params()) {
@@ -2353,7 +2354,7 @@
ImageOperand{SpvImageOperandsGradMask, gen_param(pidx.ddy)});
break;
}
- case semantic::Intrinsic::kTextureSampleCompare: {
+ case IntrinsicType::kTextureSampleCompare: {
op = spv::Op::OpImageSampleDrefExplicitLod;
append_result_type_and_id_to_spirv_params();
if (!append_image_and_coords_to_spirv_params()) {