diff --git a/BUILD.gn b/BUILD.gn index 0f40dd40e0..26bc2211c8 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -375,6 +375,8 @@ source_set("libtint_core_src") { "src/source.h", "src/transform/bound_array_accessors_transform.cc", "src/transform/bound_array_accessors_transform.h", + "src/transform/manager.cc", + "src/transform/manager.h", "src/transform/transformer.cc", "src/transform/transformer.h", "src/transform/vertex_pulling_transform.cc", diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c7730d6896..f5c76c5c6d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -196,6 +196,8 @@ set(TINT_LIB_SRCS source.h transform/bound_array_accessors_transform.cc transform/bound_array_accessors_transform.h + transform/manager.cc + transform/manager.h transform/transformer.cc transform/transformer.h transform/vertex_pulling_transform.cc diff --git a/src/transform/manager.cc b/src/transform/manager.cc new file mode 100644 index 0000000000..a7b336463d --- /dev/null +++ b/src/transform/manager.cc @@ -0,0 +1,35 @@ +// Copyright 2020 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/transform/manager.h" + +namespace tint { +namespace transform { + +Manager::Manager() = default; + +Manager::~Manager() = default; + +bool Manager::Run() { + for (auto& transform : transforms_) { + if (!transform->Run()) { + error_ = transform->error(); + return false; + } + } + return true; +} + +} // namespace transform +} // namespace tint diff --git a/src/transform/manager.h b/src/transform/manager.h new file mode 100644 index 0000000000..538e4cfe5f --- /dev/null +++ b/src/transform/manager.h @@ -0,0 +1,57 @@ +// Copyright 2020 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SRC_TRANSFORM_MANAGER_H_ +#define SRC_TRANSFORM_MANAGER_H_ + +#include +#include + +#include "src/transform/transformer.h" + +namespace tint { +namespace transform { + +/// Manager for the provided passes. The passes will be execute in the +/// appended order. If any pass fails the manager will return immediately and +/// the error can be retrieved with the |error| method. +class Manager { + public: + /// Constructor + Manager(); + ~Manager(); + + /// Add pass to the manager + /// @param transform the transform to append + void append(std::unique_ptr transform) { + transforms_.push_back(std::move(transform)); + } + + /// Runs the transforms + /// @returns true on success; false otherwise + bool Run(); + + /// @returns the error, or blank if none set + std::string error() const { return error_; } + + private: + std::vector> transforms_; + + std::string error_; +}; + +} // namespace transform +} // namespace tint + +#endif // SRC_TRANSFORM_MANAGER_H_