1eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr/*
2eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * Copyright (C) 2017 The Android Open Source Project
3eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr *
4eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * Licensed under the Apache License, Version 2.0 (the "License");
5eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * you may not use this file except in compliance with the License.
6eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * You may obtain a copy of the License at
7eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr *
8eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr *      http://www.apache.org/licenses/LICENSE-2.0
9eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr *
10eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * Unless required by applicable law or agreed to in writing, software
11eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * distributed under the License is distributed on an "AS IS" BASIS,
12eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * See the License for the specific language governing permissions and
14eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr * limitations under the License.
15eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr */
16eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
17eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr#include <gtest/gtest.h>
18eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
19eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr#include <gui/SurfaceComposerClient.h>
20eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
21eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr#include <utils/String8.h>
22eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
23eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr#include <thread>
24eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr#include <functional>
257794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw#include <layerproto/LayerProtoParser.h>
26eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
27eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carrnamespace android {
28eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
29eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert CarrTEST(SurfaceFlingerStress, create_and_destroy) {
30eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    auto do_stress = []() {
31eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        sp<SurfaceComposerClient> client = new SurfaceComposerClient;
32eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        ASSERT_EQ(NO_ERROR, client->initCheck());
33eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        for (int j = 0; j < 1000; j++) {
34eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr            auto surf = client->createSurface(String8("t"), 100, 100,
35eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr                    PIXEL_FORMAT_RGBA_8888, 0);
36eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr            ASSERT_TRUE(surf != nullptr);
37eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr            client->destroySurface(surf->getHandle());
38eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        }
39eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    };
40eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
41eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    std::vector<std::thread> threads;
42eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    for (int i = 0; i < 10; i++) {
43eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        threads.push_back(std::thread(do_stress));
44eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    }
45eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    for (auto& thread : threads) {
46eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr        thread.join();
47eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr    }
48eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr}
49eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr
507794ec15e59fd6dd389ba05379ff81287c6ab52fchaviwsurfaceflinger::LayersProto generateLayerProto() {
517794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    surfaceflinger::LayersProto layersProto;
527794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    std::array<surfaceflinger::LayerProto*, 10> layers = {};
537794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    for (size_t i = 0; i < layers.size(); ++i) {
547794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        layers[i] = layersProto.add_layers();
557794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        layers[i]->set_id(i);
567794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    }
577794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
587794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[0]->add_children(1);
597794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[1]->set_parent(0);
607794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[0]->add_children(2);
617794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[2]->set_parent(0);
627794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[0]->add_children(3);
637794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[3]->set_parent(0);
647794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[2]->add_children(4);
657794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[4]->set_parent(2);
667794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[3]->add_children(5);
677794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[5]->set_parent(3);
687794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[5]->add_children(6);
697794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[6]->set_parent(5);
707794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[5]->add_children(7);
717794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[7]->set_parent(5);
727794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[6]->add_children(8);
737794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[8]->set_parent(6);
747794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
757794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[4]->set_z_order_relative_of(3);
767794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[3]->add_relatives(4);
777794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[8]->set_z_order_relative_of(9);
787794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[9]->add_relatives(8);
797794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[3]->set_z_order_relative_of(1);
807794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    layers[1]->add_relatives(3);
817794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
827794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw/* ----------------------------
837794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *       - 0 -      - 9 -
847794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *      /  |  \
857794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *     1   2   3(1)
867794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *         |    |
877794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *         4(3) 5
887794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *             / \
897794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *            6   7
907794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *            |
917794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw *            8(9)
927794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw * -------------------------- */
937794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
947794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    return layersProto;
957794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw}
967794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
977794ec15e59fd6dd389ba05379ff81287c6ab52fchaviwTEST(LayerProtoStress, mem_info) {
987794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    std::string cmd = "dumpsys meminfo ";
997794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    cmd += std::to_string(getpid());
1007794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    system(cmd.c_str());
1017794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    for (int i = 0; i < 100000; i++) {
1027794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        surfaceflinger::LayersProto layersProto = generateLayerProto();
1037794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        auto layerTree = surfaceflinger::LayerProtoParser::generateLayerTree(layersProto);
1047794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        // Allow some layerTrees to just fall out of scope (instead of std::move)
1057794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        if (i % 2) {
1067794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw            surfaceflinger::LayerProtoParser::layersToString(std::move(layerTree));
1077794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw        }
1087794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    }
1097794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw    system(cmd.c_str());
1107794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw}
1117794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw
112eb8939942d917c8f4b200a4cdafdf8c39aacff82Robert Carr}
113