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