/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include // temporarily needed for LayerCreationArgs #include #include #include namespace android::surfaceflinger { namespace { using namespace android::surfaceflinger::frontend; static void addRemoveLayers(benchmark::State& state) { LayerLifecycleManager lifecycleManager; for (auto _ : state) { std::vector> layers; layers.emplace_back(LayerLifecycleManagerHelper::rootLayer(1)); layers.emplace_back(LayerLifecycleManagerHelper::rootLayer(2)); layers.emplace_back(LayerLifecycleManagerHelper::rootLayer(3)); lifecycleManager.addLayers(std::move(layers)); lifecycleManager.onHandlesDestroyed({{1, "1"}, {2, "2"}, {3, "3"}}); lifecycleManager.commitChanges(); } } BENCHMARK(addRemoveLayers); static void updateClientStates(benchmark::State& state) { LayerLifecycleManager lifecycleManager; std::vector> layers; layers.emplace_back(LayerLifecycleManagerHelper::rootLayer(1)); lifecycleManager.addLayers(std::move(layers)); lifecycleManager.commitChanges(); std::vector transactions; transactions.emplace_back(); transactions.back().states.push_back({}); auto& transactionState = transactions.back().states.front(); transactionState.state.what = layer_state_t::eColorChanged; transactionState.state.color.rgb = {0.f, 0.f, 0.f}; transactionState.layerId = 1; lifecycleManager.applyTransactions(transactions); lifecycleManager.commitChanges(); int i = 0; for (auto s : state) { if (i++ % 100 == 0) i = 0; transactionState.state.color.b = static_cast(i / 100.f); lifecycleManager.applyTransactions(transactions); lifecycleManager.commitChanges(); } } BENCHMARK(updateClientStates); static void updateClientStatesNoChanges(benchmark::State& state) { LayerLifecycleManager lifecycleManager; std::vector> layers; layers.emplace_back(LayerLifecycleManagerHelper::rootLayer(1)); lifecycleManager.addLayers(std::move(layers)); std::vector transactions; transactions.emplace_back(); transactions.back().states.push_back({}); auto& transactionState = transactions.back().states.front(); transactionState.state.what = layer_state_t::eColorChanged; transactionState.state.color.rgb = {0.f, 0.f, 0.f}; transactionState.layerId = 1; lifecycleManager.applyTransactions(transactions); lifecycleManager.commitChanges(); for (auto _ : state) { lifecycleManager.applyTransactions(transactions); lifecycleManager.commitChanges(); } } BENCHMARK(updateClientStatesNoChanges); static void propagateManyHiddenChildren(benchmark::State& state) { LayerLifecycleManager lifecycleManager; LayerLifecycleManagerHelper helper(lifecycleManager); helper.createRootLayer(0); for (uint32_t i = 1; i < 50; ++i) { helper.createLayer(i, i - 1); } helper.hideLayer(0); LayerHierarchyBuilder hierarchyBuilder; DisplayInfo info; info.info.logicalHeight = 100; info.info.logicalWidth = 100; DisplayInfos displayInfos; displayInfos.emplace_or_replace(ui::LayerStack::fromValue(1), info); ShadowSettings globalShadowSettings; LayerSnapshotBuilder snapshotBuilder; int i = 1; for (auto _ : state) { i++; helper.setAlpha(0, (1 + (i % 255)) / 255.0f); if (lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) { hierarchyBuilder.update(lifecycleManager); } LayerSnapshotBuilder::Args args{.root = hierarchyBuilder.getHierarchy(), .layerLifecycleManager = lifecycleManager, .displays = displayInfos, .globalShadowSettings = globalShadowSettings, .supportedLayerGenericMetadata = {}, .genericLayerMetadataKeyMap = {}}; snapshotBuilder.update(args); lifecycleManager.commitChanges(); } } BENCHMARK(propagateManyHiddenChildren); } // namespace } // namespace android::surfaceflinger