transform: Add Data as an input
Like 42264, this is an attempt to keep transforms immutable, and to keep mutable I/O information in Data objects. Bug: tint:389 Change-Id: Ie417872d3e97f3db3904245a30aa74fdcce76610 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/46260 Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
parent
de1e3c02e3
commit
af8a8ac3d6
|
@ -26,7 +26,7 @@ namespace transform {
|
||||||
BoundArrayAccessors::BoundArrayAccessors() = default;
|
BoundArrayAccessors::BoundArrayAccessors() = default;
|
||||||
BoundArrayAccessors::~BoundArrayAccessors() = default;
|
BoundArrayAccessors::~BoundArrayAccessors() = default;
|
||||||
|
|
||||||
Transform::Output BoundArrayAccessors::Run(const Program* in) {
|
Transform::Output BoundArrayAccessors::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
CloneContext ctx(&out, in);
|
CloneContext ctx(&out, in);
|
||||||
ctx.ReplaceAll([&](ast::ArrayAccessorExpression* expr) {
|
ctx.ReplaceAll([&](ast::ArrayAccessorExpression* expr) {
|
||||||
|
|
|
@ -34,8 +34,9 @@ class BoundArrayAccessors : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ast::ArrayAccessorExpression* Transform(ast::ArrayAccessorExpression* expr,
|
ast::ArrayAccessorExpression* Transform(ast::ArrayAccessorExpression* expr,
|
||||||
|
|
|
@ -30,7 +30,7 @@ const char kPointSizeVar[] = "tint_pointsize";
|
||||||
EmitVertexPointSize::EmitVertexPointSize() = default;
|
EmitVertexPointSize::EmitVertexPointSize() = default;
|
||||||
EmitVertexPointSize::~EmitVertexPointSize() = default;
|
EmitVertexPointSize::~EmitVertexPointSize() = default;
|
||||||
|
|
||||||
Transform::Output EmitVertexPointSize::Run(const Program* in) {
|
Transform::Output EmitVertexPointSize::Run(const Program* in, const DataMap&) {
|
||||||
if (!in->AST().Functions().HasStage(ast::PipelineStage::kVertex)) {
|
if (!in->AST().Functions().HasStage(ast::PipelineStage::kVertex)) {
|
||||||
// If the module doesn't have any vertex stages, then there's nothing to do.
|
// If the module doesn't have any vertex stages, then there's nothing to do.
|
||||||
return Output(Program(in->Clone()));
|
return Output(Program(in->Clone()));
|
||||||
|
|
|
@ -34,8 +34,9 @@ class EmitVertexPointSize : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace transform
|
} // namespace transform
|
||||||
|
|
|
@ -67,7 +67,7 @@ FirstIndexOffset::FirstIndexOffset(uint32_t binding, uint32_t group)
|
||||||
|
|
||||||
FirstIndexOffset::~FirstIndexOffset() = default;
|
FirstIndexOffset::~FirstIndexOffset() = default;
|
||||||
|
|
||||||
Transform::Output FirstIndexOffset::Run(const Program* in) {
|
Transform::Output FirstIndexOffset::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
|
|
||||||
// First do a quick check to see if the transform has already been applied.
|
// First do a quick check to see if the transform has already been applied.
|
||||||
|
@ -191,7 +191,6 @@ ast::Variable* FirstIndexOffset::State::AddUniformBuffer() {
|
||||||
dst->create<ast::GroupDecoration>(Source{}, group),
|
dst->create<ast::GroupDecoration>(Source{}, group),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
dst->AST().AddConstructedType(struct_type);
|
dst->AST().AddConstructedType(struct_type);
|
||||||
|
|
||||||
dst->AST().AddGlobalVariable(idx_var);
|
dst->AST().AddGlobalVariable(idx_var);
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace transform {
|
||||||
///
|
///
|
||||||
class FirstIndexOffset : public Transform {
|
class FirstIndexOffset : public Transform {
|
||||||
public:
|
public:
|
||||||
|
/// Data is outputted by the FirstIndexOffset transform.
|
||||||
/// Data holds information about shader usage and constant buffer offsets.
|
/// Data holds information about shader usage and constant buffer offsets.
|
||||||
struct Data : public Castable<Data, transform::Data> {
|
struct Data : public Castable<Data, transform::Data> {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -96,8 +97,9 @@ class FirstIndexOffset : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct State {
|
struct State {
|
||||||
|
|
|
@ -64,7 +64,7 @@ TEST_F(FirstIndexOffsetTest, EmptyModule) {
|
||||||
auto* src = "";
|
auto* src = "";
|
||||||
auto* expect = "";
|
auto* expect = "";
|
||||||
|
|
||||||
auto got = Run<FirstIndexOffset>(src, 0, 0);
|
auto got = Run(src, std::make_unique<FirstIndexOffset>(0, 0));
|
||||||
|
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ fn entry() -> void {
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto got = Run<FirstIndexOffset>(src, 1, 2);
|
auto got = Run(src, std::make_unique<FirstIndexOffset>(1, 2));
|
||||||
|
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ fn entry() -> void {
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto got = Run<FirstIndexOffset>(src, 1, 7);
|
auto got = Run(src, std::make_unique<FirstIndexOffset>(1, 7));
|
||||||
|
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ fn entry() -> void {
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto got = Run<FirstIndexOffset>(src, 1, 2);
|
auto got = Run(src, std::make_unique<FirstIndexOffset>(1, 2));
|
||||||
|
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ fn entry() -> void {
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto got = Run<FirstIndexOffset>(src, 1, 2);
|
auto got = Run(src, std::make_unique<FirstIndexOffset>(1, 2));
|
||||||
|
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace transform {
|
||||||
Hlsl::Hlsl() = default;
|
Hlsl::Hlsl() = default;
|
||||||
Hlsl::~Hlsl() = default;
|
Hlsl::~Hlsl() = default;
|
||||||
|
|
||||||
Transform::Output Hlsl::Run(const Program* in) {
|
Transform::Output Hlsl::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
CloneContext ctx(&out, in);
|
CloneContext ctx(&out, in);
|
||||||
PromoteArrayInitializerToConstVar(ctx);
|
PromoteArrayInitializerToConstVar(ctx);
|
||||||
|
|
|
@ -35,8 +35,9 @@ class Hlsl : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Hoists the array initializer to a constant variable, declared just before
|
/// Hoists the array initializer to a constant variable, declared just before
|
||||||
|
|
|
@ -20,11 +20,11 @@ namespace transform {
|
||||||
Manager::Manager() = default;
|
Manager::Manager() = default;
|
||||||
Manager::~Manager() = default;
|
Manager::~Manager() = default;
|
||||||
|
|
||||||
Transform::Output Manager::Run(const Program* program) {
|
Transform::Output Manager::Run(const Program* program, const DataMap& data) {
|
||||||
Output out;
|
Output out;
|
||||||
if (!transforms_.empty()) {
|
if (!transforms_.empty()) {
|
||||||
for (auto& transform : transforms_) {
|
for (auto& transform : transforms_) {
|
||||||
auto res = transform->Run(program);
|
auto res = transform->Run(program, data);
|
||||||
out.program = std::move(res.program);
|
out.program = std::move(res.program);
|
||||||
out.data.Add(std::move(res.data));
|
out.data.Add(std::move(res.data));
|
||||||
if (!out.program.IsValid()) {
|
if (!out.program.IsValid()) {
|
||||||
|
|
|
@ -42,8 +42,9 @@ class Manager : public Transform {
|
||||||
|
|
||||||
/// Runs the transforms on `program`, returning the transformation result.
|
/// Runs the transforms on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformed program and diagnostics
|
/// @returns the transformed program and diagnostics
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::unique_ptr<Transform>> transforms_;
|
std::vector<std::unique_ptr<Transform>> transforms_;
|
||||||
|
|
|
@ -266,7 +266,7 @@ const char* kReservedKeywords[] = {"access",
|
||||||
Msl::Msl() = default;
|
Msl::Msl() = default;
|
||||||
Msl::~Msl() = default;
|
Msl::~Msl() = default;
|
||||||
|
|
||||||
Transform::Output Msl::Run(const Program* in) {
|
Transform::Output Msl::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
CloneContext ctx(&out, in);
|
CloneContext ctx(&out, in);
|
||||||
RenameReservedKeywords(&ctx, kReservedKeywords);
|
RenameReservedKeywords(&ctx, kReservedKeywords);
|
||||||
|
|
|
@ -31,8 +31,9 @@ class Msl : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Hoist location-decorated entry point parameters out to struct members.
|
/// Hoist location-decorated entry point parameters out to struct members.
|
||||||
|
|
|
@ -39,7 +39,7 @@ Renamer::Renamer(const Config& config) : cfg_(config) {}
|
||||||
|
|
||||||
Renamer::~Renamer() = default;
|
Renamer::~Renamer() = default;
|
||||||
|
|
||||||
Transform::Output Renamer::Run(const Program* in) {
|
Transform::Output Renamer::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
CloneContext ctx(&out, in);
|
CloneContext ctx(&out, in);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace transform {
|
||||||
/// Renamer is a Transform that renames all the symbols in a program.
|
/// Renamer is a Transform that renames all the symbols in a program.
|
||||||
class Renamer : public Transform {
|
class Renamer : public Transform {
|
||||||
public:
|
public:
|
||||||
|
/// Data is outputted by the Renamer transform.
|
||||||
/// Data holds information about shader usage and constant buffer offsets.
|
/// Data holds information about shader usage and constant buffer offsets.
|
||||||
struct Data : public Castable<Data, transform::Data> {
|
struct Data : public Castable<Data, transform::Data> {
|
||||||
/// Remappings is a map of old symbol name to new symbol name
|
/// Remappings is a map of old symbol name to new symbol name
|
||||||
|
@ -70,8 +71,9 @@ class Renamer : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Config const cfg_;
|
Config const cfg_;
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace transform {
|
||||||
Spirv::Spirv() = default;
|
Spirv::Spirv() = default;
|
||||||
Spirv::~Spirv() = default;
|
Spirv::~Spirv() = default;
|
||||||
|
|
||||||
Transform::Output Spirv::Run(const Program* in) {
|
Transform::Output Spirv::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
CloneContext ctx(&out, in);
|
CloneContext ctx(&out, in);
|
||||||
HandleEntryPointIOTypes(ctx);
|
HandleEntryPointIOTypes(ctx);
|
||||||
|
|
|
@ -37,8 +37,9 @@ class Spirv : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Hoist entry point parameters, return values, and struct members out to
|
/// Hoist entry point parameters, return values, and struct members out to
|
||||||
|
|
|
@ -36,10 +36,12 @@ class TransformTestBase : public BASE {
|
||||||
/// `transforms`.
|
/// `transforms`.
|
||||||
/// @param in the input WGSL source
|
/// @param in the input WGSL source
|
||||||
/// @param transforms the list of transforms to apply
|
/// @param transforms the list of transforms to apply
|
||||||
|
/// @param data the optional DataMap to pass to Transform::Run()
|
||||||
/// @return the transformed output
|
/// @return the transformed output
|
||||||
Transform::Output Run(
|
Transform::Output Run(
|
||||||
std::string in,
|
std::string in,
|
||||||
std::vector<std::unique_ptr<transform::Transform>> transforms) {
|
std::vector<std::unique_ptr<transform::Transform>> transforms,
|
||||||
|
DataMap data = {}) {
|
||||||
auto file = std::make_unique<Source::File>("test", in);
|
auto file = std::make_unique<Source::File>("test", in);
|
||||||
auto program = reader::wgsl::Parse(file.get());
|
auto program = reader::wgsl::Parse(file.get());
|
||||||
|
|
||||||
|
@ -54,30 +56,31 @@ class TransformTestBase : public BASE {
|
||||||
for (auto& transform : transforms) {
|
for (auto& transform : transforms) {
|
||||||
manager.append(std::move(transform));
|
manager.append(std::move(transform));
|
||||||
}
|
}
|
||||||
return manager.Run(&program);
|
return manager.Run(&program, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transforms and returns the WGSL source `in`, transformed using
|
/// Transforms and returns the WGSL source `in`, transformed using
|
||||||
/// `transform`.
|
/// `transform`.
|
||||||
/// @param transform the transform to apply
|
/// @param transform the transform to apply
|
||||||
/// @param in the input WGSL source
|
/// @param in the input WGSL source
|
||||||
|
/// @param data the optional DataMap to pass to Transform::Run()
|
||||||
/// @return the transformed output
|
/// @return the transformed output
|
||||||
Transform::Output Run(std::string in,
|
Transform::Output Run(std::string in,
|
||||||
std::unique_ptr<transform::Transform> transform) {
|
std::unique_ptr<transform::Transform> transform,
|
||||||
|
DataMap data = {}) {
|
||||||
std::vector<std::unique_ptr<transform::Transform>> transforms;
|
std::vector<std::unique_ptr<transform::Transform>> transforms;
|
||||||
transforms.emplace_back(std::move(transform));
|
transforms.emplace_back(std::move(transform));
|
||||||
return Run(std::move(in), std::move(transforms));
|
return Run(std::move(in), std::move(transforms), std::move(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transforms and returns the WGSL source `in`, transformed using
|
/// Transforms and returns the WGSL source `in`, transformed using
|
||||||
/// a transform of type `TRANSFORM`.
|
/// a transform of type `TRANSFORM`.
|
||||||
/// @param in the input WGSL source
|
/// @param in the input WGSL source
|
||||||
/// @param args the TRANSFORM constructor arguments
|
/// @param data the optional DataMap to pass to Transform::Run()
|
||||||
/// @return the transformed output
|
/// @return the transformed output
|
||||||
template <typename TRANSFORM, typename... ARGS>
|
template <typename TRANSFORM>
|
||||||
Transform::Output Run(std::string in, ARGS&&... args) {
|
Transform::Output Run(std::string in, DataMap data = {}) {
|
||||||
return Run(std::move(in),
|
return Run(std::move(in), std::make_unique<TRANSFORM>(), std::move(data));
|
||||||
std::make_unique<TRANSFORM>(std::forward<ARGS>(args)...));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param output the output of the transform
|
/// @param output the output of the transform
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace transform {
|
namespace transform {
|
||||||
|
|
||||||
/// Data is the base class for transforms that emit extra output information
|
/// Data is the base class for transforms that accept extra input or emit extra
|
||||||
/// along with a Program.
|
/// output information along with a Program.
|
||||||
class Data : public Castable<Data> {
|
class Data : public Castable<Data> {
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -67,6 +67,14 @@ class DataMap {
|
||||||
map_[&TypeInfo::Of<T>()] = std::move(data);
|
map_[&TypeInfo::Of<T>()] = std::move(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates the data of type `T` with the provided arguments and adds it into
|
||||||
|
/// DataMap keyed by the ClassID of type T.
|
||||||
|
/// @param args the arguments forwarded to the constructor for type T
|
||||||
|
template <typename T, typename... ARGS>
|
||||||
|
void Add(ARGS&&... args) {
|
||||||
|
Put(std::make_unique<T>(std::forward<ARGS>(args)...));
|
||||||
|
}
|
||||||
|
|
||||||
/// @returns a pointer to the Data placed into the DataMap with a call to
|
/// @returns a pointer to the Data placed into the DataMap with a call to
|
||||||
/// Put()
|
/// Put()
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -137,8 +145,9 @@ class Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
virtual Output Run(const Program* program) = 0;
|
virtual Output Run(const Program* program, const DataMap& data = {}) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Clones the function `in` adding `statements` to the beginning of the
|
/// Clones the function `in` adding `statements` to the beginning of the
|
||||||
|
|
|
@ -40,7 +40,7 @@ VertexPulling::VertexPulling(const Config& config) : cfg(config) {}
|
||||||
|
|
||||||
VertexPulling::~VertexPulling() = default;
|
VertexPulling::~VertexPulling() = default;
|
||||||
|
|
||||||
Transform::Output VertexPulling::Run(const Program* in) {
|
Transform::Output VertexPulling::Run(const Program* in, const DataMap&) {
|
||||||
ProgramBuilder out;
|
ProgramBuilder out;
|
||||||
|
|
||||||
// Find entry point
|
// Find entry point
|
||||||
|
|
|
@ -162,8 +162,9 @@ class VertexPulling : public Transform {
|
||||||
|
|
||||||
/// Runs the transform on `program`, returning the transformation result.
|
/// Runs the transform on `program`, returning the transformation result.
|
||||||
/// @param program the source program to transform
|
/// @param program the source program to transform
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
/// @returns the transformation result
|
/// @returns the transformation result
|
||||||
Output Run(const Program* program) override;
|
Output Run(const Program* program, const DataMap& data = {}) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Config cfg;
|
Config cfg;
|
||||||
|
|
Loading…
Reference in New Issue