diff options
Diffstat (limited to 'services/surfaceflinger/Scheduler/LayerHistory.h')
-rw-r--r-- | services/surfaceflinger/Scheduler/LayerHistory.h | 115 |
1 files changed, 16 insertions, 99 deletions
diff --git a/services/surfaceflinger/Scheduler/LayerHistory.h b/services/surfaceflinger/Scheduler/LayerHistory.h index 228b8a06af..82f6c3907b 100644 --- a/services/surfaceflinger/Scheduler/LayerHistory.h +++ b/services/surfaceflinger/Scheduler/LayerHistory.h @@ -22,6 +22,7 @@ #include <memory> #include <mutex> +#include <string> #include <utility> #include <vector> @@ -35,25 +36,23 @@ class TestableScheduler; namespace scheduler { class LayerHistoryTest; -class LayerHistoryTestV2; class LayerInfo; -class LayerInfoV2; class LayerHistory { public: using LayerVoteType = RefreshRateConfigs::LayerVoteType; - virtual ~LayerHistory() = default; + LayerHistory(const RefreshRateConfigs&); + ~LayerHistory(); // Layers are unregistered when the weak reference expires. - virtual void registerLayer(Layer*, float lowRefreshRate, float highRefreshRate, - LayerVoteType type) = 0; + void registerLayer(Layer*, LayerVoteType type); // Sets the display size. Client is responsible for synchronization. - virtual void setDisplayArea(uint32_t displayArea) = 0; + void setDisplayArea(uint32_t displayArea) { mDisplayArea = displayArea; } - // Sets whether a config change is pending to be applied - virtual void setConfigChangePending(bool pending) = 0; + // Sets whether a mode change is pending to be applied + void setModeChangePending(bool pending) { mModeChangePending = pending; } // Represents which layer activity is recorded enum class LayerUpdateType { @@ -63,104 +62,23 @@ public: }; // Marks the layer as active, and records the given state to its history. - virtual void record(Layer*, nsecs_t presentTime, nsecs_t now, LayerUpdateType updateType) = 0; + void record(Layer*, nsecs_t presentTime, nsecs_t now, LayerUpdateType updateType); using Summary = std::vector<RefreshRateConfigs::LayerRequirement>; // Rebuilds sets of active/inactive layers, and accumulates stats for active layers. - virtual Summary summarize(nsecs_t now) = 0; + Summary summarize(nsecs_t now); - virtual void clear() = 0; -}; - -namespace impl { -// Records per-layer history of scheduling-related information (primarily present time), -// heuristically categorizes layers as active or inactive, and summarizes stats about -// active layers (primarily maximum refresh rate). See go/content-fps-detection-in-scheduler. -class LayerHistory : public android::scheduler::LayerHistory { -public: - LayerHistory(); - virtual ~LayerHistory(); - - // Layers are unregistered when the weak reference expires. - void registerLayer(Layer*, float lowRefreshRate, float highRefreshRate, - LayerVoteType type) override; - - void setDisplayArea(uint32_t /*displayArea*/) override {} - - void setConfigChangePending(bool /*pending*/) override {} - - // Marks the layer as active, and records the given state to its history. - void record(Layer*, nsecs_t presentTime, nsecs_t now, LayerUpdateType updateType) override; - - // Rebuilds sets of active/inactive layers, and accumulates stats for active layers. - android::scheduler::LayerHistory::Summary summarize(nsecs_t now) override; - - void clear() override; - -private: - friend class android::scheduler::LayerHistoryTest; - friend TestableScheduler; - - using LayerPair = std::pair<wp<Layer>, std::unique_ptr<LayerInfo>>; - using LayerInfos = std::vector<LayerPair>; - - struct ActiveLayers { - LayerInfos& infos; - const size_t index; - - auto begin() { return infos.begin(); } - auto end() { return begin() + static_cast<long>(index); } - }; - - ActiveLayers activeLayers() REQUIRES(mLock) { return {mLayerInfos, mActiveLayersEnd}; } - - // Iterates over layers in a single pass, swapping pairs such that active layers precede - // inactive layers, and inactive layers precede expired layers. Removes expired layers by - // truncating after inactive layers. - void partitionLayers(nsecs_t now) REQUIRES(mLock); - - mutable std::mutex mLock; - - // Partitioned such that active layers precede inactive layers. For fast lookup, the few active - // layers are at the front, and weak pointers are stored in contiguous memory to hit the cache. - LayerInfos mLayerInfos GUARDED_BY(mLock); - size_t mActiveLayersEnd GUARDED_BY(mLock) = 0; - - // Whether to emit systrace output and debug logs. - const bool mTraceEnabled; - - // Whether to use priority sent from WindowManager to determine the relevancy of the layer. - const bool mUseFrameRatePriority; -}; - -class LayerHistoryV2 : public android::scheduler::LayerHistory { -public: - LayerHistoryV2(const scheduler::RefreshRateConfigs&); - virtual ~LayerHistoryV2(); - - // Layers are unregistered when the weak reference expires. - void registerLayer(Layer*, float lowRefreshRate, float highRefreshRate, - LayerVoteType type) override; - - // Sets the display size. Client is responsible for synchronization. - void setDisplayArea(uint32_t displayArea) override { mDisplayArea = displayArea; } - - void setConfigChangePending(bool pending) override { mConfigChangePending = pending; } - - // Marks the layer as active, and records the given state to its history. - void record(Layer*, nsecs_t presentTime, nsecs_t now, LayerUpdateType updateType) override; - - // Rebuilds sets of active/inactive layers, and accumulates stats for active layers. - android::scheduler::LayerHistory::Summary summarize(nsecs_t /*now*/) override; + void clear(); - void clear() override; + void deregisterLayer(Layer*); + std::string dump() const; private: - friend android::scheduler::LayerHistoryTestV2; + friend LayerHistoryTest; friend TestableScheduler; - using LayerPair = std::pair<wp<Layer>, std::unique_ptr<LayerInfoV2>>; + using LayerPair = std::pair<Layer*, std::unique_ptr<LayerInfo>>; using LayerInfos = std::vector<LayerPair>; struct ActiveLayers { @@ -193,10 +111,9 @@ private: // Whether to use priority sent from WindowManager to determine the relevancy of the layer. const bool mUseFrameRatePriority; - // Whether a config change is in progress or not - std::atomic<bool> mConfigChangePending = false; + // Whether a mode change is in progress or not + std::atomic<bool> mModeChangePending = false; }; -} // namespace impl } // namespace scheduler } // namespace android |