[tint] Move builtin utilities to builtin namespace
These are useful in IR code too, so move them out of sem.
Bug: tint:1718
Change-Id: I7aace5a58eff7949e5cb1c23552052a88555bee2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/140891
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/builtin/function.cc b/src/tint/builtin/function.cc
index 332e9d1..378e922 100644
--- a/src/tint/builtin/function.cc
+++ b/src/tint/builtin/function.cc
@@ -611,4 +611,85 @@
return out;
}
+bool IsCoarseDerivativeBuiltin(Function f) {
+ return f == Function::kDpdxCoarse || f == Function::kDpdyCoarse || f == Function::kFwidthCoarse;
+}
+
+bool IsFineDerivativeBuiltin(Function f) {
+ return f == Function::kDpdxFine || f == Function::kDpdyFine || f == Function::kFwidthFine;
+}
+
+bool IsDerivativeBuiltin(Function f) {
+ return f == Function::kDpdx || f == Function::kDpdy || f == Function::kFwidth ||
+ IsCoarseDerivativeBuiltin(f) || IsFineDerivativeBuiltin(f);
+}
+
+bool IsTextureBuiltin(Function f) {
+ return IsImageQueryBuiltin(f) || //
+ f == Function::kTextureGather || //
+ f == Function::kTextureGatherCompare || //
+ f == Function::kTextureLoad || //
+ f == Function::kTextureSample || //
+ f == Function::kTextureSampleBaseClampToEdge || //
+ f == Function::kTextureSampleBias || //
+ f == Function::kTextureSampleCompare || //
+ f == Function::kTextureSampleCompareLevel || //
+ f == Function::kTextureSampleGrad || //
+ f == Function::kTextureSampleLevel || //
+ f == Function::kTextureStore;
+}
+
+bool IsImageQueryBuiltin(Function f) {
+ return f == Function::kTextureDimensions || f == Function::kTextureNumLayers ||
+ f == Function::kTextureNumLevels || f == Function::kTextureNumSamples;
+}
+
+bool IsDataPackingBuiltin(Function f) {
+ return f == Function::kPack4X8Snorm || f == Function::kPack4X8Unorm ||
+ f == Function::kPack2X16Snorm || f == Function::kPack2X16Unorm ||
+ f == Function::kPack2X16Float;
+}
+
+bool IsDataUnpackingBuiltin(Function f) {
+ return f == Function::kUnpack4X8Snorm || f == Function::kUnpack4X8Unorm ||
+ f == Function::kUnpack2X16Snorm || f == Function::kUnpack2X16Unorm ||
+ f == Function::kUnpack2X16Float;
+}
+
+bool IsBarrierBuiltin(Function f) {
+ return f == Function::kWorkgroupBarrier || f == Function::kStorageBarrier;
+}
+
+bool IsAtomicBuiltin(Function f) {
+ return f == Function::kAtomicLoad || f == Function::kAtomicStore || f == Function::kAtomicAdd ||
+ f == Function::kAtomicSub || f == Function::kAtomicMax || f == Function::kAtomicMin ||
+ f == Function::kAtomicAnd || f == Function::kAtomicOr || f == Function::kAtomicXor ||
+ f == Function::kAtomicExchange || f == Function::kAtomicCompareExchangeWeak;
+}
+
+bool IsDP4aBuiltin(Function f) {
+ return f == Function::kDot4I8Packed || f == Function::kDot4U8Packed;
+}
+
+bool HasSideEffects(Function f) {
+ switch (f) {
+ case Function::kAtomicAdd:
+ case Function::kAtomicAnd:
+ case Function::kAtomicCompareExchangeWeak:
+ case Function::kAtomicExchange:
+ case Function::kAtomicMax:
+ case Function::kAtomicMin:
+ case Function::kAtomicOr:
+ case Function::kAtomicStore:
+ case Function::kAtomicSub:
+ case Function::kAtomicXor:
+ case Function::kTextureStore:
+ case Function::kWorkgroupUniformLoad:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
} // namespace tint::builtin
diff --git a/src/tint/builtin/function.cc.tmpl b/src/tint/builtin/function.cc.tmpl
index 7912482..a2788df 100644
--- a/src/tint/builtin/function.cc.tmpl
+++ b/src/tint/builtin/function.cc.tmpl
@@ -41,4 +41,91 @@
return out;
}
+bool IsCoarseDerivativeBuiltin(Function f) {
+ return f == Function::kDpdxCoarse || f == Function::kDpdyCoarse ||
+ f == Function::kFwidthCoarse;
+}
+
+bool IsFineDerivativeBuiltin(Function f) {
+ return f == Function::kDpdxFine || f == Function::kDpdyFine ||
+ f == Function::kFwidthFine;
+}
+
+bool IsDerivativeBuiltin(Function f) {
+ return f == Function::kDpdx || f == Function::kDpdy ||
+ f == Function::kFwidth || IsCoarseDerivativeBuiltin(f) ||
+ IsFineDerivativeBuiltin(f);
+}
+
+bool IsTextureBuiltin(Function f) {
+ return IsImageQueryBuiltin(f) || //
+ f == Function::kTextureGather || //
+ f == Function::kTextureGatherCompare || //
+ f == Function::kTextureLoad || //
+ f == Function::kTextureSample || //
+ f == Function::kTextureSampleBaseClampToEdge || //
+ f == Function::kTextureSampleBias || //
+ f == Function::kTextureSampleCompare || //
+ f == Function::kTextureSampleCompareLevel || //
+ f == Function::kTextureSampleGrad || //
+ f == Function::kTextureSampleLevel || //
+ f == Function::kTextureStore;
+}
+
+bool IsImageQueryBuiltin(Function f) {
+ return f == Function::kTextureDimensions ||
+ f == Function::kTextureNumLayers || f == Function::kTextureNumLevels ||
+ f == Function::kTextureNumSamples;
+}
+
+bool IsDataPackingBuiltin(Function f) {
+ return f == Function::kPack4X8Snorm || f == Function::kPack4X8Unorm ||
+ f == Function::kPack2X16Snorm || f == Function::kPack2X16Unorm ||
+ f == Function::kPack2X16Float;
+}
+
+bool IsDataUnpackingBuiltin(Function f) {
+ return f == Function::kUnpack4X8Snorm || f == Function::kUnpack4X8Unorm ||
+ f == Function::kUnpack2X16Snorm || f == Function::kUnpack2X16Unorm ||
+ f == Function::kUnpack2X16Float;
+}
+
+bool IsBarrierBuiltin(Function f) {
+ return f == Function::kWorkgroupBarrier || f == Function::kStorageBarrier;
+}
+
+bool IsAtomicBuiltin(Function f) {
+ return f == Function::kAtomicLoad || f == Function::kAtomicStore ||
+ f == Function::kAtomicAdd || f == Function::kAtomicSub ||
+ f == Function::kAtomicMax || f == Function::kAtomicMin ||
+ f == Function::kAtomicAnd || f == Function::kAtomicOr ||
+ f == Function::kAtomicXor || f == Function::kAtomicExchange ||
+ f == Function::kAtomicCompareExchangeWeak;
+}
+
+bool IsDP4aBuiltin(Function f) {
+ return f == Function::kDot4I8Packed || f == Function::kDot4U8Packed;
+}
+
+bool HasSideEffects(Function f) {
+ switch (f) {
+ case Function::kAtomicAdd:
+ case Function::kAtomicAnd:
+ case Function::kAtomicCompareExchangeWeak:
+ case Function::kAtomicExchange:
+ case Function::kAtomicMax:
+ case Function::kAtomicMin:
+ case Function::kAtomicOr:
+ case Function::kAtomicStore:
+ case Function::kAtomicSub:
+ case Function::kAtomicXor:
+ case Function::kTextureStore:
+ case Function::kWorkgroupUniformLoad:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
} // namespace tint::builtin
diff --git a/src/tint/builtin/function.h b/src/tint/builtin/function.h
index 046e87a..4643157 100644
--- a/src/tint/builtin/function.h
+++ b/src/tint/builtin/function.h
@@ -399,6 +399,60 @@
"_tint_materialize",
};
+/// Determines if the given `f` is a coarse derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is coarse.
+bool IsCoarseDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a fine derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is fine.
+bool IsFineDerivativeBuiltin(Function f);
+
+/// Determine if the given `f` is a derivative builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a derivative builtin
+bool IsDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a texture operation builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a texture operation builtin
+bool IsTextureBuiltin(Function f);
+
+/// Determines if the given `f` is an image query builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an image query builtin
+bool IsImageQueryBuiltin(Function f);
+
+/// Determines if the given `f` is a data packing builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data packing builtin
+bool IsDataPackingBuiltin(Function f);
+
+/// Determines if the given `f` is a data unpacking builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data unpacking builtin
+bool IsDataUnpackingBuiltin(Function f);
+
+/// Determines if the given `f` is a barrier builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a barrier builtin
+bool IsBarrierBuiltin(Function f);
+
+/// Determines if the given `f` is an atomic builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an atomic builtin
+bool IsAtomicBuiltin(Function f);
+
+/// Determines if the given `f` is a DP4a builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a DP4a builtin
+bool IsDP4aBuiltin(Function f);
+
+/// Determines if the given `f` may have side-effects (i.e. writes to at least one of its inputs)
+/// @returns true if intrinsic may have side-effects
+bool HasSideEffects(Function f);
+
} // namespace tint::builtin
// \endcond
diff --git a/src/tint/builtin/function.h.tmpl b/src/tint/builtin/function.h.tmpl
index 02f9acb..2dc35d3 100644
--- a/src/tint/builtin/function.h.tmpl
+++ b/src/tint/builtin/function.h.tmpl
@@ -57,6 +57,60 @@
{{- end }}
};
+/// Determines if the given `f` is a coarse derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is coarse.
+bool IsCoarseDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a fine derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is fine.
+bool IsFineDerivativeBuiltin(Function f);
+
+/// Determine if the given `f` is a derivative builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a derivative builtin
+bool IsDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a texture operation builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a texture operation builtin
+bool IsTextureBuiltin(Function f);
+
+/// Determines if the given `f` is an image query builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an image query builtin
+bool IsImageQueryBuiltin(Function f);
+
+/// Determines if the given `f` is a data packing builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data packing builtin
+bool IsDataPackingBuiltin(Function f);
+
+/// Determines if the given `f` is a data unpacking builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data unpacking builtin
+bool IsDataUnpackingBuiltin(Function f);
+
+/// Determines if the given `f` is a barrier builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a barrier builtin
+bool IsBarrierBuiltin(Function f);
+
+/// Determines if the given `f` is an atomic builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an atomic builtin
+bool IsAtomicBuiltin(Function f);
+
+/// Determines if the given `f` is a DP4a builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a DP4a builtin
+bool IsDP4aBuiltin(Function f);
+
+/// Determines if the given `f` may have side-effects (i.e. writes to at least one of its inputs)
+/// @returns true if intrinsic may have side-effects
+bool HasSideEffects(Function f);
+
} // namespace tint::builtin
// \endcond
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 93d51a2..4cc93c7 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -2393,7 +2393,7 @@
return nullptr;
}
- if (sem::IsTextureBuiltin(builtin_type)) {
+ if (IsTextureBuiltin(builtin_type)) {
if (!validator_.TextureBuiltinFunction(call)) {
return nullptr;
}
diff --git a/src/tint/sem/builtin.cc b/src/tint/sem/builtin.cc
index 4f33ebb..d5d214b 100644
--- a/src/tint/sem/builtin.cc
+++ b/src/tint/sem/builtin.cc
@@ -30,72 +30,6 @@
return builtin::str(type_);
}
-bool IsCoarseDerivativeBuiltin(builtin::Function i) {
- return i == builtin::Function::kDpdxCoarse || i == builtin::Function::kDpdyCoarse ||
- i == builtin::Function::kFwidthCoarse;
-}
-
-bool IsFineDerivativeBuiltin(builtin::Function i) {
- return i == builtin::Function::kDpdxFine || i == builtin::Function::kDpdyFine ||
- i == builtin::Function::kFwidthFine;
-}
-
-bool IsDerivativeBuiltin(builtin::Function i) {
- return i == builtin::Function::kDpdx || i == builtin::Function::kDpdy ||
- i == builtin::Function::kFwidth || IsCoarseDerivativeBuiltin(i) ||
- IsFineDerivativeBuiltin(i);
-}
-
-bool IsTextureBuiltin(builtin::Function i) {
- return IsImageQueryBuiltin(i) || //
- i == builtin::Function::kTextureGather || //
- i == builtin::Function::kTextureGatherCompare || //
- i == builtin::Function::kTextureLoad || //
- i == builtin::Function::kTextureSample || //
- i == builtin::Function::kTextureSampleBaseClampToEdge || //
- i == builtin::Function::kTextureSampleBias || //
- i == builtin::Function::kTextureSampleCompare || //
- i == builtin::Function::kTextureSampleCompareLevel || //
- i == builtin::Function::kTextureSampleGrad || //
- i == builtin::Function::kTextureSampleLevel || //
- i == builtin::Function::kTextureStore;
-}
-
-bool IsImageQueryBuiltin(builtin::Function i) {
- return i == builtin::Function::kTextureDimensions ||
- i == builtin::Function::kTextureNumLayers || i == builtin::Function::kTextureNumLevels ||
- i == builtin::Function::kTextureNumSamples;
-}
-
-bool IsDataPackingBuiltin(builtin::Function i) {
- return i == builtin::Function::kPack4X8Snorm || i == builtin::Function::kPack4X8Unorm ||
- i == builtin::Function::kPack2X16Snorm || i == builtin::Function::kPack2X16Unorm ||
- i == builtin::Function::kPack2X16Float;
-}
-
-bool IsDataUnpackingBuiltin(builtin::Function i) {
- return i == builtin::Function::kUnpack4X8Snorm || i == builtin::Function::kUnpack4X8Unorm ||
- i == builtin::Function::kUnpack2X16Snorm || i == builtin::Function::kUnpack2X16Unorm ||
- i == builtin::Function::kUnpack2X16Float;
-}
-
-bool IsBarrierBuiltin(builtin::Function i) {
- return i == builtin::Function::kWorkgroupBarrier || i == builtin::Function::kStorageBarrier;
-}
-
-bool IsAtomicBuiltin(builtin::Function i) {
- return i == builtin::Function::kAtomicLoad || i == builtin::Function::kAtomicStore ||
- i == builtin::Function::kAtomicAdd || i == builtin::Function::kAtomicSub ||
- i == builtin::Function::kAtomicMax || i == builtin::Function::kAtomicMin ||
- i == builtin::Function::kAtomicAnd || i == builtin::Function::kAtomicOr ||
- i == builtin::Function::kAtomicXor || i == builtin::Function::kAtomicExchange ||
- i == builtin::Function::kAtomicCompareExchangeWeak;
-}
-
-bool IsDP4aBuiltin(builtin::Function i) {
- return i == builtin::Function::kDot4I8Packed || i == builtin::Function::kDot4U8Packed;
-}
-
Builtin::Builtin(builtin::Function type,
const type::Type* return_type,
utils::VectorRef<Parameter*> parameters,
@@ -151,24 +85,7 @@
}
bool Builtin::HasSideEffects() const {
- switch (type_) {
- case builtin::Function::kAtomicAdd:
- case builtin::Function::kAtomicAnd:
- case builtin::Function::kAtomicCompareExchangeWeak:
- case builtin::Function::kAtomicExchange:
- case builtin::Function::kAtomicMax:
- case builtin::Function::kAtomicMin:
- case builtin::Function::kAtomicOr:
- case builtin::Function::kAtomicStore:
- case builtin::Function::kAtomicSub:
- case builtin::Function::kAtomicXor:
- case builtin::Function::kTextureStore:
- case builtin::Function::kWorkgroupUniformLoad:
- return true;
- default:
- break;
- }
- return false;
+ return builtin::HasSideEffects(type_);
}
builtin::Extension Builtin::RequiredExtension() const {
diff --git a/src/tint/sem/builtin.h b/src/tint/sem/builtin.h
index 07c3ad1..614afac 100644
--- a/src/tint/sem/builtin.h
+++ b/src/tint/sem/builtin.h
@@ -26,56 +26,6 @@
namespace tint::sem {
-/// Determines if the given `i` is a coarse derivative
-/// @param i the builtin type
-/// @returns true if the given derivative is coarse.
-bool IsCoarseDerivativeBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a fine derivative
-/// @param i the builtin type
-/// @returns true if the given derivative is fine.
-bool IsFineDerivativeBuiltin(builtin::Function i);
-
-/// Determine if the given `i` is a derivative builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a derivative builtin
-bool IsDerivativeBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a texture operation builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a texture operation builtin
-bool IsTextureBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a image query builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a image query builtin
-bool IsImageQueryBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a data packing builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a data packing builtin
-bool IsDataPackingBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a data unpacking builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a data unpacking builtin
-bool IsDataUnpackingBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a barrier builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a barrier builtin
-bool IsBarrierBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a atomic builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a atomic builtin
-bool IsAtomicBuiltin(builtin::Function i);
-
-/// Determins if the given `i` is a DP4a builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a DP4a builtin
-bool IsDP4aBuiltin(builtin::Function i);
-
/// Builtin holds the semantic information for a builtin function.
class Builtin final : public utils::Castable<Builtin, CallTarget> {
public: