[ir] Convert BuiltinPolyfillSpirv to a free function
The LiteralOperand and SampleImage classes remain in the transform's
header for now, and will be moved into the `lang/spirv/` directory
once the SPIR-V specific transforms have been moved to
`lang/spirv/raise/`.
Bug: tint:1718
Change-Id: I8b203a6390b288af5d20e6f0fe8bd54c2bb16ad5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143826
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
index 926045e..ebef77a 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
@@ -19,6 +19,7 @@
#include "spirv/unified1/spirv.h"
#include "src/tint/lang/core/ir/builder.h"
#include "src/tint/lang/core/ir/module.h"
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/lang/core/type/builtin_structs.h"
#include "src/tint/lang/core/type/depth_multisampled_texture.h"
#include "src/tint/lang/core/type/depth_texture.h"
@@ -28,20 +29,17 @@
#include "src/tint/lang/core/type/texture.h"
#include "src/tint/utils/ice/ice.h"
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv);
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv::LiteralOperand);
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv::SampledImage);
+TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::LiteralOperand);
+TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::SampledImage);
using namespace tint::number_suffixes; // NOLINT
namespace tint::ir::transform {
-BuiltinPolyfillSpirv::BuiltinPolyfillSpirv() = default;
-
-BuiltinPolyfillSpirv::~BuiltinPolyfillSpirv() = default;
+namespace {
/// PIMPL state for the transform.
-struct BuiltinPolyfillSpirv::State {
+struct State {
/// The IR module.
Module* ir = nullptr;
@@ -803,24 +801,31 @@
}
};
-void BuiltinPolyfillSpirv::Run(ir::Module* ir) const {
+} // namespace
+
+Result<SuccessType, std::string> BuiltinPolyfillSpirv(Module* ir) {
+ auto result = ValidateAndDumpIfNeeded(*ir, "BuiltinPolyfillSpirv transform");
+ if (!result) {
+ return result;
+ }
+
State{ir}.Process();
+
+ return Success;
}
-BuiltinPolyfillSpirv::LiteralOperand::LiteralOperand(const constant::Value* value) : Base(value) {}
+LiteralOperand::LiteralOperand(const constant::Value* value) : Base(value) {}
-BuiltinPolyfillSpirv::LiteralOperand::~LiteralOperand() = default;
+LiteralOperand::~LiteralOperand() = default;
-BuiltinPolyfillSpirv::SampledImage::SampledImage(const type::Type* image)
- : Base(static_cast<size_t>(
- Hash(tint::TypeInfo::Of<BuiltinPolyfillSpirv::SampledImage>().full_hashcode, image)),
+SampledImage::SampledImage(const type::Type* image)
+ : Base(static_cast<size_t>(Hash(tint::TypeInfo::Of<SampledImage>().full_hashcode, image)),
type::Flags{}),
image_(image) {}
-BuiltinPolyfillSpirv::SampledImage* BuiltinPolyfillSpirv::SampledImage::Clone(
- type::CloneContext& ctx) const {
+SampledImage* SampledImage::Clone(type::CloneContext& ctx) const {
auto* image = image_->Clone(ctx);
- return ctx.dst.mgr->Get<BuiltinPolyfillSpirv::SampledImage>(image);
+ return ctx.dst.mgr->Get<SampledImage>(image);
}
} // namespace tint::ir::transform
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
index 3433f23..b9dcc40 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
@@ -18,68 +18,59 @@
#include <string>
#include "src/tint/lang/core/ir/constant.h"
-#include "src/tint/lang/core/ir/transform/transform.h"
#include "src/tint/lang/core/type/type.h"
+#include "src/tint/utils/result/result.h"
-// Forward declarations
-namespace tint::type {
+// Forward declarations.
+namespace tint::ir {
+class Module;
class Texture;
-} // namespace tint::type
+} // namespace tint::ir
namespace tint::ir::transform {
/// BuiltinPolyfillSpirv is a transform that replaces calls to builtins with polyfills and calls to
/// SPIR-V backend intrinsic functions.
-class BuiltinPolyfillSpirv final : public Castable<BuiltinPolyfillSpirv, Transform> {
+/// @param module the module to transform
+/// @returns an error string on failure
+Result<SuccessType, std::string> BuiltinPolyfillSpirv(Module* module);
+
+/// LiteralOperand is a type of constant value that is intended to be emitted as a literal in
+/// the SPIR-V instruction stream.
+/// TODO(jrprice): Move this to lang/spirv.
+class LiteralOperand final : public Castable<LiteralOperand, ir::Constant> {
public:
/// Constructor
- BuiltinPolyfillSpirv();
+ /// @param value the operand value
+ explicit LiteralOperand(const constant::Value* value);
/// Destructor
- ~BuiltinPolyfillSpirv() override;
+ ~LiteralOperand() override;
+};
- /// @copydoc Transform::Run
- void Run(ir::Module* module) const override;
+/// SampledImage represents an OpTypeSampledImage in SPIR-V.
+/// TODO(jrprice): Move this to lang/spirv.
+class SampledImage final : public Castable<SampledImage, type::Type> {
+ public:
+ /// Constructor
+ /// @param image the image type
+ explicit SampledImage(const type::Type* image);
- /// LiteralOperand is a type of constant value that is intended to be emitted as a literal in
- /// the SPIR-V instruction stream.
- class LiteralOperand final : public Castable<LiteralOperand, ir::Constant> {
- public:
- /// Constructor
- /// @param value the operand value
- explicit LiteralOperand(const constant::Value* value);
- /// Destructor
- ~LiteralOperand() override;
- };
+ /// @param other the other node to compare against
+ /// @returns true if the this type is equal to @p other
+ bool Equals(const UniqueNode& other) const override { return &other.TypeInfo() == &TypeInfo(); }
- /// SampledImage represents an OpTypeSampledImage in SPIR-V.
- class SampledImage final : public Castable<SampledImage, type::Type> {
- public:
- /// Constructor
- /// @param image the image type
- explicit SampledImage(const type::Type* image);
+ /// @returns the friendly name for this type
+ std::string FriendlyName() const override { return "spirv.sampled_image"; }
- /// @param other the other node to compare against
- /// @returns true if the this type is equal to @p other
- bool Equals(const UniqueNode& other) const override {
- return &other.TypeInfo() == &TypeInfo();
- }
+ /// @param ctx the clone context
+ /// @returns a clone of this type
+ SampledImage* Clone(type::CloneContext& ctx) const override;
- /// @returns the friendly name for this type
- std::string FriendlyName() const override { return "spirv.sampled_image"; }
-
- /// @param ctx the clone context
- /// @returns a clone of this type
- SampledImage* Clone(type::CloneContext& ctx) const override;
-
- /// @returns the image type
- const type::Type* Image() const { return image_; }
-
- private:
- const type::Type* image_;
- };
+ /// @returns the image type
+ const type::Type* Image() const { return image_; }
private:
- struct State;
+ const type::Type* image_;
};
} // namespace tint::ir::transform
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
index 41119b9..06e279d 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
@@ -92,7 +92,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -162,7 +162,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -232,7 +232,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -278,7 +278,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -322,7 +322,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -366,7 +366,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -427,7 +427,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -471,7 +471,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -513,7 +513,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -557,7 +557,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -601,7 +601,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -645,7 +645,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -689,7 +689,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -733,7 +733,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -777,7 +777,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -821,7 +821,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -865,7 +865,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -900,7 +900,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -941,7 +941,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -990,7 +990,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1026,7 +1026,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1062,7 +1062,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1099,7 +1099,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1136,7 +1136,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1176,7 +1176,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1217,7 +1217,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1255,7 +1255,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1292,7 +1292,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1330,7 +1330,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1368,7 +1368,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1408,7 +1408,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1451,7 +1451,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1491,7 +1491,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1532,7 +1532,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1576,7 +1576,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1615,7 +1615,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1655,7 +1655,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1698,7 +1698,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1737,7 +1737,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1777,7 +1777,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1820,7 +1820,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1861,7 +1861,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1903,7 +1903,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1949,7 +1949,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -1989,7 +1989,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2030,7 +2030,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2074,7 +2074,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2114,7 +2114,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2155,7 +2155,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2199,7 +2199,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2236,7 +2236,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2275,7 +2275,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2315,7 +2315,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2357,7 +2357,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2396,7 +2396,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2438,7 +2438,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2481,7 +2481,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2516,7 +2516,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2552,7 +2552,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2588,7 +2588,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2623,7 +2623,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2659,7 +2659,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2695,7 +2695,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2730,7 +2730,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2765,7 +2765,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
@@ -2803,7 +2803,7 @@
}
)";
- Run<BuiltinPolyfillSpirv>();
+ Run(BuiltinPolyfillSpirv);
EXPECT_EQ(expect, str());
}
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 2003cb0..e96f5e1 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -107,8 +107,8 @@
ir::transform::AddEmptyEntryPoint{}.Run(module);
ir::transform::BlockDecoratedStructs{}.Run(module);
- ir::transform::BuiltinPolyfillSpirv{}.Run(module);
+ RUN_TRANSFORM(BuiltinPolyfillSpirv);
RUN_TRANSFORM(DemoteToHelper);
RUN_TRANSFORM(ExpandImplicitSplats);
RUN_TRANSFORM(HandleMatrixArithmetic);
@@ -169,10 +169,10 @@
},
// Dedup a SampledImage if its underlying image will be deduped.
- [&](const ir::transform::BuiltinPolyfillSpirv::SampledImage* si) -> const type::Type* {
+ [&](const ir::transform::SampledImage* si) -> const type::Type* {
auto* img = DedupType(si->Image(), types);
if (img != si->Image()) {
- return types.Get<ir::transform::BuiltinPolyfillSpirv::SampledImage>(img);
+ return types.Get<ir::transform::SampledImage>(img);
}
return si;
},
@@ -271,7 +271,7 @@
uint32_t Printer::Constant(ir::Constant* constant) {
// If it is a literal operand, just return the value.
- if (auto* literal = constant->As<ir::transform::BuiltinPolyfillSpirv::LiteralOperand>()) {
+ if (auto* literal = constant->As<ir::transform::LiteralOperand>()) {
return literal->Value()->ValueAs<uint32_t>();
}
@@ -412,7 +412,7 @@
[&](const type::Struct* str) { EmitStructType(id, str, addrspace); },
[&](const type::Texture* tex) { EmitTextureType(id, tex); },
[&](const type::Sampler*) { module_.PushType(spv::Op::OpTypeSampler, {id}); },
- [&](const ir::transform::BuiltinPolyfillSpirv::SampledImage* s) {
+ [&](const ir::transform::SampledImage* s) {
module_.PushType(spv::Op::OpTypeSampledImage, {id, Type(s->Image())});
},
[&](Default) { TINT_ICE() << "unhandled type: " << ty->FriendlyName(); });