| // Copyright 2021 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/vectorize_scalar_matrix_constructors.h" | |
| #include <string> | |
| #include <utility> | |
| #include "src/transform/test_helper.h" | |
| #include "src/utils/string.h" | |
| namespace tint { | |
| namespace transform { | |
| namespace { | |
| using VectorizeScalarMatrixConstructorsTest = | |
| TransformTestWithParam<std::pair<uint32_t, uint32_t>>; | |
| TEST_P(VectorizeScalarMatrixConstructorsTest, Basic) { | |
| uint32_t cols = GetParam().first; | |
| uint32_t rows = GetParam().second; | |
| std::string mat_type = | |
| "mat" + std::to_string(cols) + "x" + std::to_string(rows) + "<f32>"; | |
| std::string vec_type = "vec" + std::to_string(rows) + "<f32>"; | |
| std::string scalar_values; | |
| std::string vector_values; | |
| for (uint32_t c = 0; c < cols; c++) { | |
| if (c > 0) { | |
| vector_values += ", "; | |
| scalar_values += ", "; | |
| } | |
| vector_values += vec_type + "("; | |
| for (uint32_t r = 0; r < rows; r++) { | |
| if (r > 0) { | |
| scalar_values += ", "; | |
| vector_values += ", "; | |
| } | |
| auto value = std::to_string(c * rows + r) + ".0"; | |
| scalar_values += value; | |
| vector_values += value; | |
| } | |
| vector_values += ")"; | |
| } | |
| std::string tmpl = R"( | |
| [[stage(fragment)]] | |
| fn main() { | |
| let m = ${matrix}(${values}); | |
| } | |
| )"; | |
| tmpl = utils::ReplaceAll(tmpl, "${matrix}", mat_type); | |
| auto src = utils::ReplaceAll(tmpl, "${values}", scalar_values); | |
| auto expect = utils::ReplaceAll(tmpl, "${values}", vector_values); | |
| auto got = Run<VectorizeScalarMatrixConstructors>(src); | |
| EXPECT_EQ(expect, str(got)); | |
| } | |
| TEST_P(VectorizeScalarMatrixConstructorsTest, NonScalarConstructors) { | |
| uint32_t cols = GetParam().first; | |
| uint32_t rows = GetParam().second; | |
| std::string mat_type = | |
| "mat" + std::to_string(cols) + "x" + std::to_string(rows) + "<f32>"; | |
| std::string vec_type = "vec" + std::to_string(rows) + "<f32>"; | |
| std::string columns; | |
| for (uint32_t c = 0; c < cols; c++) { | |
| if (c > 0) { | |
| columns += ", "; | |
| } | |
| columns += vec_type + "()"; | |
| } | |
| std::string tmpl = R"( | |
| [[stage(fragment)]] | |
| fn main() { | |
| let m = ${matrix}(${columns}); | |
| } | |
| )"; | |
| tmpl = utils::ReplaceAll(tmpl, "${matrix}", mat_type); | |
| auto src = utils::ReplaceAll(tmpl, "${columns}", columns); | |
| auto expect = src; | |
| auto got = Run<VectorizeScalarMatrixConstructors>(src); | |
| EXPECT_EQ(expect, str(got)); | |
| } | |
| INSTANTIATE_TEST_SUITE_P(VectorizeScalarMatrixConstructorsTest, | |
| VectorizeScalarMatrixConstructorsTest, | |
| testing::Values(std::make_pair(2, 2), | |
| std::make_pair(2, 3), | |
| std::make_pair(2, 4), | |
| std::make_pair(3, 2), | |
| std::make_pair(3, 3), | |
| std::make_pair(3, 4), | |
| std::make_pair(4, 2), | |
| std::make_pair(4, 3), | |
| std::make_pair(4, 4))); | |
| } // namespace | |
| } // namespace transform | |
| } // namespace tint |