summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2019-04-08 10:44:56 -0700
committer Ady Abraham <adyabr@google.com> 2019-04-08 10:55:32 -0700
commit09bd3920155f0961b303d1cdd0f6027135aff36d (patch)
treee5f577b8de8661a8801fccb9744f53d91741f9a1 /services/surfaceflinger/SurfaceFlinger.cpp
parent22488f69b442064261f8764e64e3705fd2e22cb3 (diff)
SF: Updating content FPS tracking
1) Each time SF creates a layer, register it with Scheduler and return handle 2) BufferQueueLayer and BufferStateLayer can now send information about buffers for given layers via layer handle. Algorithm for detecting content fps: 1) Keep the refresh rate per layer (explicit timestamp, or 0). 2) Keep information about last 10 present or update timestamps. This will be an indicator for precedence. 3) Choose the MAX refresh rate among last updated layers. For more info see go/surface-flinger-scheduler and go/content-fps-detection-in-scheduler Test: Updating unit tests. Systrace. Change-Id: I988a7a79e9a9f0f61674c9b637c5142db3336177 Bug: 127727337
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 9c2cef8cbd..7c88cd807d 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -605,7 +605,8 @@ void SurfaceFlinger::init() {
Mutex::Autolock _l(mStateLock);
// start the EventThread
mScheduler =
- getFactory().createScheduler([this](bool enabled) { setPrimaryVsyncEnabled(enabled); });
+ getFactory().createScheduler([this](bool enabled) { setPrimaryVsyncEnabled(enabled); },
+ mRefreshRateConfigs);
auto resyncCallback =
mScheduler->makeResyncCallback(std::bind(&SurfaceFlinger::getVsyncPeriod, this));
@@ -702,6 +703,7 @@ void SurfaceFlinger::init() {
setRefreshRateTo(type, event);
});
}
+
mRefreshRateConfigs.populate(getHwComposer().getConfigs(*display->getId()));
mRefreshRateStats.setConfigMode(getHwComposer().getActiveConfigIndex(*display->getId()));
@@ -1607,7 +1609,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) NO_THREAD_SAFETY_ANALYSIS {
if (mUseSmart90ForVideo) {
// This call is made each time SF wakes up and creates a new frame. It is part
// of video detection feature.
- mScheduler->updateFpsBasedOnNativeWindowApi();
+ mScheduler->updateFpsBasedOnContent();
}
if (performSetActiveConfig()) {
@@ -3115,6 +3117,7 @@ void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Re
bool SurfaceFlinger::handlePageFlip()
{
+ ATRACE_CALL();
ALOGV("handlePageFlip");
nsecs_t latchTime = systemTime();
@@ -3140,6 +3143,7 @@ bool SurfaceFlinger::handlePageFlip()
if (layer->shouldPresentNow(expectedPresentTime)) {
mLayersWithQueuedFrames.push_back(layer);
} else {
+ ATRACE_NAME("!layer->shouldPresentNow()");
layer->useEmptyDamage();
}
} else {
@@ -3979,10 +3983,8 @@ uint32_t SurfaceFlinger::setClientStateLocked(
buffer = s.buffer;
}
if (buffer) {
- if (layer->setBuffer(buffer)) {
+ if (layer->setBuffer(buffer, postTime, desiredPresentTime)) {
flags |= eTraversalNeeded;
- layer->setPostTime(postTime);
- layer->setDesiredPresentTime(desiredPresentTime);
}
}
if (layer->setTransactionCompletedListeners(callbackHandles)) flags |= eTraversalNeeded;