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