1395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck/*
2395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * Copyright (C) 2016 The Android Open Source Project
3395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck *
4395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * you may not use this file except in compliance with the License.
6395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * You may obtain a copy of the License at
7395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck *
8395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck *
10395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * Unless required by applicable law or agreed to in writing, software
11395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * See the License for the specific language governing permissions and
14395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck * limitations under the License.
15395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck */
16395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
17395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckpackage android.graphics.perftests;
18395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
192cbbd8d3ab8de2937ffff753311876c786176b1bChris Craikimport android.graphics.Outline;
20395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport android.perftests.utils.BenchmarkState;
21395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport android.perftests.utils.PerfStatusReporter;
22395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport android.support.test.filters.LargeTest;
232cbbd8d3ab8de2937ffff753311876c786176b1bChris Craikimport android.view.DisplayListCanvas;
24395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport android.view.RenderNode;
25395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
26395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport org.junit.Rule;
27395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckimport org.junit.Test;
28395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
292cbbd8d3ab8de2937ffff753311876c786176b1bChris Craikimport java.util.ArrayList;
302cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
31395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck@LargeTest
32395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reckpublic class RenderNodePerfTest {
33395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck    @Rule
34395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck    public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
35395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
36395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck    @Test
37395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck    public void testMeasureRenderNodeJniOverhead() {
383acf0382da22cda88234e599cd81b1ff5441cc35John Reck        final RenderNode node = RenderNode.create("benchmark", null);
393acf0382da22cda88234e599cd81b1ff5441cc35John Reck        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
40395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck
41395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck        while (state.keepRunning()) {
42395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck            node.setTranslationX(1.0f);
43395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck        }
44395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck    }
453acf0382da22cda88234e599cd81b1ff5441cc35John Reck
463acf0382da22cda88234e599cd81b1ff5441cc35John Reck    @Test
473acf0382da22cda88234e599cd81b1ff5441cc35John Reck    public void testCreateRenderNodeNoName() {
483acf0382da22cda88234e599cd81b1ff5441cc35John Reck        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
493acf0382da22cda88234e599cd81b1ff5441cc35John Reck        while (state.keepRunning()) {
503acf0382da22cda88234e599cd81b1ff5441cc35John Reck            RenderNode node = RenderNode.create(null, null);
513acf0382da22cda88234e599cd81b1ff5441cc35John Reck            node.destroy();
523acf0382da22cda88234e599cd81b1ff5441cc35John Reck        }
533acf0382da22cda88234e599cd81b1ff5441cc35John Reck    }
543acf0382da22cda88234e599cd81b1ff5441cc35John Reck
553acf0382da22cda88234e599cd81b1ff5441cc35John Reck    @Test
563acf0382da22cda88234e599cd81b1ff5441cc35John Reck    public void testCreateRenderNode() {
573acf0382da22cda88234e599cd81b1ff5441cc35John Reck        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
583acf0382da22cda88234e599cd81b1ff5441cc35John Reck        while (state.keepRunning()) {
593acf0382da22cda88234e599cd81b1ff5441cc35John Reck            RenderNode node = RenderNode.create("LinearLayout", null);
603acf0382da22cda88234e599cd81b1ff5441cc35John Reck            node.destroy();
613acf0382da22cda88234e599cd81b1ff5441cc35John Reck        }
623acf0382da22cda88234e599cd81b1ff5441cc35John Reck    }
633acf0382da22cda88234e599cd81b1ff5441cc35John Reck
643acf0382da22cda88234e599cd81b1ff5441cc35John Reck    @Test
653acf0382da22cda88234e599cd81b1ff5441cc35John Reck    public void testIsValid() {
663acf0382da22cda88234e599cd81b1ff5441cc35John Reck        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
673acf0382da22cda88234e599cd81b1ff5441cc35John Reck        RenderNode node = RenderNode.create("LinearLayout", null);
683acf0382da22cda88234e599cd81b1ff5441cc35John Reck        while (state.keepRunning()) {
693acf0382da22cda88234e599cd81b1ff5441cc35John Reck            node.isValid();
703acf0382da22cda88234e599cd81b1ff5441cc35John Reck        }
713acf0382da22cda88234e599cd81b1ff5441cc35John Reck    }
722cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
732cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    @Test
742cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    public void testStartEnd() {
752cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
762cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        RenderNode node = RenderNode.create("LinearLayout", null);
772cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        while (state.keepRunning()) {
782cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            DisplayListCanvas canvas = node.start(100, 100);
792cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            node.end(canvas);
802cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        }
812cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    }
822cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
832cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    @Test
842cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    public void testStartEndDeepHierarchy() {
852cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
862cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        RenderNode[] nodes = new RenderNode[30];
872cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        DisplayListCanvas[] canvases = new DisplayListCanvas[nodes.length];
882cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        for (int i = 0; i < nodes.length; i++) {
892cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            nodes[i] = RenderNode.create("LinearLayout", null);
902cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        }
912cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
922cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        while (state.keepRunning()) {
932cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            for (int i = 0; i < nodes.length; i++) {
942cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik                canvases[i] = nodes[i].start(100, 100);
952cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            }
962cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            for (int i = nodes.length - 1; i >= 0; i--) {
972cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik                nodes[i].end(canvases[i]);
982cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            }
992cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        }
1002cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    }
1012cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
1022cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    @Test
1032cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    public void testHasIdentityMatrix() {
1042cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
1052cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        RenderNode node = RenderNode.create("LinearLayout", null);
1062cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        while (state.keepRunning()) {
1072cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            node.hasIdentityMatrix();
1082cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        }
1092cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    }
1102cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
1112cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    @Test
1122cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    public void testSetOutline() {
1132cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
1142cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        RenderNode node = RenderNode.create("LinearLayout", null);
1152cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        Outline a = new Outline();
1162cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        a.setRoundRect(0, 0, 100, 100, 10);
1172cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        Outline b = new Outline();
1182cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        b.setRect(50, 50, 150, 150);
1192cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        b.setAlpha(0.5f);
1202cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik
1212cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        while (state.keepRunning()) {
1222cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            node.setOutline(a);
1232cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik            node.setOutline(b);
1242cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik        }
1252cbbd8d3ab8de2937ffff753311876c786176b1bChris Craik    }
126395e9b8db245f7638c1c79e97d8ee56be91614dbJohn Reck}
127