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