blob: 188fa640117b21a3dc7c9d96fccf3b040dccd807 [file] [log] [blame]
Ana Krulec61f86db2018-11-19 14:16:35 +01001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070019#include <android-base/thread_annotations.h>
20#include <utils/RefBase.h>
Ana Krulec61f86db2018-11-19 14:16:35 +010021#include <utils/Timers.h>
22
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070023#include <memory>
24#include <mutex>
25#include <utility>
26#include <vector>
Ana Krulec434c22d2018-11-28 13:48:36 +010027
Ana Krulec61f86db2018-11-19 14:16:35 +010028namespace android {
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070029
30class Layer;
Dominik Laskowski49cea512019-11-12 14:13:23 -080031class TestableScheduler;
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070032
Ady Abraham09bd3922019-04-08 10:44:56 -070033namespace scheduler {
Ana Krulec61f86db2018-11-19 14:16:35 +010034
Ady Abrahame3ed2f92020-01-06 17:01:28 -080035class LayerHistoryTest;
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070036class LayerInfo;
37
Ana Krulec61f86db2018-11-19 14:16:35 +010038class LayerHistory {
39public:
Ady Abrahame3ed2f92020-01-06 17:01:28 -080040 virtual ~LayerHistory() = default;
Ana Krulec61f86db2018-11-19 14:16:35 +010041
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070042 // Layers are unregistered when the weak reference expires.
Ady Abrahame3ed2f92020-01-06 17:01:28 -080043 virtual void registerLayer(Layer*, float lowRefreshRate, float highRefreshRate) = 0;
Ady Abraham09bd3922019-04-08 10:44:56 -070044
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070045 // Marks the layer as active, and records the given state to its history.
Ady Abrahame3ed2f92020-01-06 17:01:28 -080046 virtual void record(Layer*, nsecs_t presentTime, nsecs_t now) = 0;
Ady Abrahama315ce72019-04-24 14:35:20 -070047
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070048 struct Summary {
49 float maxRefreshRate; // Maximum refresh rate among recently active layers.
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070050 };
Ady Abraham09bd3922019-04-08 10:44:56 -070051
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070052 // Rebuilds sets of active/inactive layers, and accumulates stats for active layers.
Ady Abrahame3ed2f92020-01-06 17:01:28 -080053 virtual Summary summarize(nsecs_t now) = 0;
Ady Abrahama9bf4ca2019-06-11 19:08:58 -070054
Ady Abrahame3ed2f92020-01-06 17:01:28 -080055 virtual void clear() = 0;
56};
57
58namespace impl {
59// Records per-layer history of scheduling-related information (primarily present time),
60// heuristically categorizes layers as active or inactive, and summarizes stats about
61// active layers (primarily maximum refresh rate). See go/content-fps-detection-in-scheduler.
62class LayerHistory : public android::scheduler::LayerHistory {
63public:
64 LayerHistory();
65 virtual ~LayerHistory();
66
67 // Layers are unregistered when the weak reference expires.
68 void registerLayer(Layer*, float lowRefreshRate, float highRefreshRate) override;
69
70 // Marks the layer as active, and records the given state to its history.
71 void record(Layer*, nsecs_t presentTime, nsecs_t now) override;
72
73 // Rebuilds sets of active/inactive layers, and accumulates stats for active layers.
74 android::scheduler::LayerHistory::Summary summarize(nsecs_t now) override;
75
76 void clear() override;
Ana Krulec61f86db2018-11-19 14:16:35 +010077
78private:
Ady Abrahame3ed2f92020-01-06 17:01:28 -080079 friend class android::scheduler::LayerHistoryTest;
Dominik Laskowski49cea512019-11-12 14:13:23 -080080 friend TestableScheduler;
Ady Abraham09bd3922019-04-08 10:44:56 -070081
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070082 using LayerPair = std::pair<wp<Layer>, std::unique_ptr<LayerInfo>>;
83 using LayerInfos = std::vector<LayerPair>;
Ady Abraham09bd3922019-04-08 10:44:56 -070084
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070085 struct ActiveLayers {
86 LayerInfos& infos;
87 const size_t index;
Ady Abraham09bd3922019-04-08 10:44:56 -070088
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -070089 auto begin() { return infos.begin(); }
90 auto end() { return begin() + index; }
91 };
92
93 ActiveLayers activeLayers() REQUIRES(mLock) { return {mLayerInfos, mActiveLayersEnd}; }
94
95 // Iterates over layers in a single pass, swapping pairs such that active layers precede
96 // inactive layers, and inactive layers precede expired layers. Removes expired layers by
97 // truncating after inactive layers.
98 void partitionLayers(nsecs_t now) REQUIRES(mLock);
99
100 mutable std::mutex mLock;
101
102 // Partitioned such that active layers precede inactive layers. For fast lookup, the few active
103 // layers are at the front, and weak pointers are stored in contiguous memory to hit the cache.
104 LayerInfos mLayerInfos GUARDED_BY(mLock);
105 size_t mActiveLayersEnd GUARDED_BY(mLock) = 0;
106
107 // Whether to emit systrace output and debug logs.
108 const bool mTraceEnabled;
Ana Krulecc84d09b2019-11-02 23:10:29 +0100109
110 // Whether to use priority sent from WindowManager to determine the relevancy of the layer.
111 const bool mUseFrameRatePriority;
Ana Krulec61f86db2018-11-19 14:16:35 +0100112};
113
Ady Abrahame3ed2f92020-01-06 17:01:28 -0800114} // namespace impl
Ady Abraham09bd3922019-04-08 10:44:56 -0700115} // namespace scheduler
Dominik Laskowskif7a09ed2019-10-07 13:54:18 -0700116} // namespace android