TestUtils.h revision 6fe991e5e76f9af9dab960100d5768d96d5f4daa
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef TEST_UTILS_H 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define TEST_UTILS_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <Matrix.h> 20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <Rect.h> 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <RenderNode.h> 22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <renderstate/RenderState.h> 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <renderthread/RenderThread.h> 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <Snapshot.h> 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <memory> 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define EXPECT_MATRIX_APPROX_EQ(a, b) \ 32003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik EXPECT_TRUE(TestUtils::matricesAreApproxEqual(a, b)) 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define EXPECT_RECT_APPROX_EQ(a, b) \ 35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik EXPECT_TRUE(MathUtils::areEqual(a.left, b.left) \ 36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik && MathUtils::areEqual(a.top, b.top) \ 37003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik && MathUtils::areEqual(a.right, b.right) \ 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik && MathUtils::areEqual(a.bottom, b.bottom)); 39003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass TestUtils { 41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic: 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static bool matricesAreApproxEqual(const Matrix4& a, const Matrix4& b) { 43161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik for (int i = 0; i < 16; i++) { 44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!MathUtils::areEqual(a[i], b[i])) { 45b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return false; 46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 48003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik return true; 49b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 50b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static std::unique_ptr<Snapshot> makeSnapshot(const Matrix4& transform, const Rect& clip) { 52003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik std::unique_ptr<Snapshot> snapshot(new Snapshot()); 53003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik snapshot->clip(clip.left, clip.top, clip.right, clip.bottom, SkRegion::kReplace_Op); 54b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *(snapshot->transform) = transform; 55003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik return snapshot; 56b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 57b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 58b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static SkBitmap createSkBitmap(int width, int height) { 59003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik SkBitmap bitmap; 60b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SkImageInfo info = SkImageInfo::MakeUnknown(width, height); 61b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik bitmap.setInfo(info); 62b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik bitmap.allocPixels(info); 63b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return bitmap; 64b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 65b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik template<class CanvasType> 67b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static std::unique_ptr<DisplayList> createDisplayList(int width, int height, 68b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik std::function<void(CanvasType& canvas)> canvasCallback) { 69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik CanvasType canvas(width, height); 70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik canvasCallback(canvas); 71b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return std::unique_ptr<DisplayList>(canvas.finishRecording()); 72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik template<class CanvasType> 75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static sp<RenderNode> createNode(int left, int top, int right, int bottom, 766fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik std::function<void(CanvasType& canvas)> canvasCallback) { 776fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik sp<RenderNode> node = new RenderNode(); 786fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik node->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom); 796fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 806fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 816fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik CanvasType canvas( 826fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik node->stagingProperties().getWidth(), node->stagingProperties().getHeight()); 836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik canvasCallback(canvas); 846fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik node->setStagingDisplayList(canvas.finishRecording()); 856fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik return node; 866fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik } 876fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 886fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik static void syncNodePropertiesAndDisplayList(sp<RenderNode>& node) { 89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik node->syncProperties(); 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik node->syncDisplayList(); 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik typedef std::function<void(RenderState& state, Caches& caches)> RtCallback; 94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik class TestTask : public renderthread::RenderTask { 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik public: 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik TestTask(RtCallback rtCallback) 98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : rtCallback(rtCallback) {} 99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik virtual ~TestTask() {} 100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik virtual void run() override { 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // RenderState only valid once RenderThread is running, so queried here 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderState& renderState = renderthread::RenderThread::getInstance().renderState(); 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik renderState.onGLContextCreated(); 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik rtCallback(renderState, Caches::getInstance()); 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik renderState.onGLContextDestroyed(); 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RtCallback rtCallback; 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /** 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * NOTE: requires surfaceflinger to run, otherwise this method will wait indefinitely. 1136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 1146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik static void runOnRenderThread(RtCallback rtCallback) { 1156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik TestTask task(rtCallback); 1166fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik renderthread::RenderThread::getInstance().queueAndWait(&task); 1176fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik } 1186fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; // class TestUtils 1196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} /* namespace uirenderer */ 1216fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} /* namespace android */ 1226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1236fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik#endif /* TEST_UTILS_H */ 1246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik