1 /*
2 * Copyright 2017, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "Wrapper.h"
18 #include "bcinfo/MetadataExtractor.h"
19 #include "builder.h"
20 #include "file_utils.h"
21 #include "instructions.h"
22 #include "module.h"
23 #include "test_utils.h"
24 #include "gtest/gtest.h"
25
26 namespace android {
27 namespace spirit {
28
29 class WrapperTest : public ::testing::Test {
30 protected:
SetUp()31 virtual void SetUp() {
32 mWordsGreyscale = readWords("greyscale.spv");
33 mWordsGreyscale2 = readWords("greyscale2.spv");
34 mWordsInvert = readWords("invert.spv");
35 }
36
37 std::vector<uint32_t> mWordsGreyscale;
38 std::vector<uint32_t> mWordsGreyscale2;
39 std::vector<uint32_t> mWordsInvert;
40
41 private:
readWords(const char * testFile)42 std::vector<uint32_t> readWords(const char *testFile) {
43 static const std::string testDataPath(
44 "frameworks/rs/rsov/compiler/spirit/test_data/");
45 const std::string &fullPath = getAbsolutePath(testDataPath + testFile);
46 return readFile<uint32_t>(fullPath);
47 }
48 };
49
TEST_F(WrapperTest,testAddBuffer)50 TEST_F(WrapperTest, testAddBuffer) {
51 Builder b;
52 Module m(&b);
53 auto elemType = m.getIntType(32);
54 VariableInst *buffer = AddBuffer(elemType, 2, b, &m);
55 ASSERT_NE(nullptr, buffer);
56
57 GlobalSection *gs = m.getGlobalSection();
58
59 EXPECT_EQ(1, countEntity<TypeRuntimeArrayInst>(gs));
60 EXPECT_EQ(1, countEntity<TypeStructInst>(gs));
61 EXPECT_EQ(1, countEntity<VariableInst>(gs));
62 }
63
TEST_F(WrapperTest,testAddWrapper1)64 TEST_F(WrapperTest, testAddWrapper1) {
65 std::unique_ptr<Module> m(Deserialize<Module>(mWordsGreyscale));
66
67 ASSERT_NE(nullptr, m);
68
69 m->resolveIds();
70
71 Builder b;
72 m->setBuilder(&b);
73
74 constexpr uint32_t sig =
75 bcinfo::MD_SIG_Kernel | bcinfo::MD_SIG_In | bcinfo::MD_SIG_Out;
76
77 EXPECT_FALSE(AddWrapper("foo", sig, 1, b, m.get()));
78
79 EXPECT_TRUE(AddWrapper("greyscale(vf4;", sig, 1, b, m.get()));
80
81 // The input already has an entry point
82 EXPECT_EQ(2, countEntity<EntryPointDefinition>(m.get()));
83 }
84
TEST_F(WrapperTest,testAddWrapper2)85 TEST_F(WrapperTest, testAddWrapper2) {
86 std::unique_ptr<Module> m(Deserialize<Module>(mWordsInvert));
87
88 ASSERT_NE(nullptr, m);
89
90 m->resolveIds();
91
92 Builder b;
93 m->setBuilder(&b);
94
95 uint32_t sig = bcinfo::MD_SIG_Kernel | bcinfo::MD_SIG_In | bcinfo::MD_SIG_Out;
96
97 EXPECT_FALSE(AddWrapper("foo", sig, 1, b, m.get()));
98
99 ASSERT_TRUE(AddWrapper("invert", sig, 1, b, m.get()));
100
101 EXPECT_EQ(1, countEntity<EntryPointDefinition>(m.get()));
102 }
103
TEST_F(WrapperTest,testAddWrapperForRoot)104 TEST_F(WrapperTest, testAddWrapperForRoot) {
105 std::unique_ptr<Module> m(Deserialize<Module>(mWordsInvert));
106
107 ASSERT_NE(nullptr, m);
108
109 Builder b;
110 m->setBuilder(&b);
111
112 bool success = AddWrapper("root", 0, 1, b, m.get());
113 ASSERT_TRUE(success);
114 }
115
116 } // namespace spirit
117 } // namespace android
118