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