SF: Optimize layer history in scheduler
Register layers with LayerHistory by storing a weak pointer rather than
allocating a LayerHandle. Query layer visibility when needed instead of
synchronizing it to LayerInfo whenever Layer::isVisible is called. Store
active/inactive layers in contiguous memory instead of two hash maps for
cache efficiency, and minimal allocation and run time of operations like
clearing history. Remove redundant ref-counting, locking, and frequency-
period conversion in LayerInfo. Avoid sleeping in unit tests.
This is also prework for per-display layer history.
Bug: 130554049
Bug: 134772048
Test: go/wm-smoke with debug.sf.layer_history_trace
Test: C2/F2 test cases from spreadsheet
Test: LayerHistoryTest with new test cases
Change-Id: Ibfcfe46cd76ebd93b916d4a0c737a19e837d4ff1
diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h
index a5971fe..c983475 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.h
+++ b/services/surfaceflinger/Scheduler/Scheduler.h
@@ -100,17 +100,11 @@
void addPresentFence(const std::shared_ptr<FenceTime>&);
void setIgnorePresentFences(bool ignore);
nsecs_t getDispSyncExpectedPresentTime();
- // Registers the layer in the scheduler, and returns the handle for future references.
- std::unique_ptr<scheduler::LayerHistory::LayerHandle> registerLayer(std::string const& name,
- int windowType);
- // Stores present time for a layer.
- void addLayerPresentTimeAndHDR(
- const std::unique_ptr<scheduler::LayerHistory::LayerHandle>& layerHandle,
- nsecs_t presentTime, bool isHDR);
- // Stores visibility for a layer.
- void setLayerVisibility(
- const std::unique_ptr<scheduler::LayerHistory::LayerHandle>& layerHandle, bool visible);
+ // Layers are registered on creation, and unregistered when the weak reference expires.
+ void registerLayer(Layer*);
+ void recordLayerHistory(Layer*, nsecs_t presentTime, bool isHDR);
+
// Updates FPS based on the most content presented.
void updateFpsBasedOnContent();