summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2019-04-05 10:32:50 -0700
committer Ady Abraham <adyabr@google.com> 2019-04-08 11:01:12 -0700
commit8f1ee7fdcf5c602aa87a93b727a696bb8e9eddb0 (patch)
tree6674593c7df2539979ca549d7802783caf24d1e4
parent09bd3920155f0961b303d1cdd0f6027135aff36d (diff)
SurfaceFlinger: handle wallpaper scenario in Scheduler
Use the fact that a layer contains wallpaper in Scheduler's algorithm when picking a refresh rate. Wallpaper should be presented in the lowest active refresh rate to preserve power. Test: systrace during wallpaper Bug: 124065567 Change-Id: Ibb18e62eaf1a6b9b3ab1ec18a3135fb17c8f57fc
-rw-r--r--services/surfaceflinger/Layer.cpp9
-rw-r--r--services/surfaceflinger/Layer.h3
-rw-r--r--services/surfaceflinger/Scheduler/Scheduler.cpp7
-rw-r--r--services/surfaceflinger/Scheduler/Scheduler.h4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp2
5 files changed, 19 insertions, 6 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index de05f74a9b..b47497a33a 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -70,7 +70,10 @@ using base::StringAppendF;
std::atomic<int32_t> Layer::sSequence{1};
Layer::Layer(const LayerCreationArgs& args)
- : mFlinger(args.flinger), mName(args.name), mClientRef(args.client) {
+ : mFlinger(args.flinger),
+ mName(args.name),
+ mClientRef(args.client),
+ mWindowType(args.metadata.getInt32(METADATA_WINDOW_TYPE, 0)) {
mCurrentCrop.makeInvalid();
uint32_t layerFlags = 0;
@@ -115,7 +118,7 @@ Layer::Layer(const LayerCreationArgs& args)
mFrameEventHistory.initializeCompositorTiming(compositorTiming);
mFrameTracker.setDisplayRefreshPeriod(compositorTiming.interval);
- mSchedulerLayerHandle = mFlinger->mScheduler->registerLayer(mName.c_str());
+ mSchedulerLayerHandle = mFlinger->mScheduler->registerLayer(mName.c_str(), mWindowType);
mFlinger->onLayerCreated();
}
@@ -1300,6 +1303,7 @@ void Layer::miniDumpHeader(std::string& result) {
result.append("-----------------------------\n");
result.append(" Layer name\n");
result.append(" Z | ");
+ result.append(" Window Type | ");
result.append(" Comp Type | ");
result.append(" Transform | ");
result.append(" Disp Frame (LTRB) | ");
@@ -1336,6 +1340,7 @@ void Layer::miniDump(std::string& result, const sp<DisplayDevice>& displayDevice
} else {
StringAppendF(&result, " %10d | ", layerState.z);
}
+ StringAppendF(&result, " %10d | ", mWindowType);
StringAppendF(&result, "%10s | ", toString(getCompositionType(displayDevice)).c_str());
StringAppendF(&result, "%10s | ",
toString(getCompositionLayer() ? compositionState.bufferTransform
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 66e35b6136..f4545e0538 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -885,6 +885,9 @@ protected:
// Can only be accessed with the SF state lock held.
bool mChildrenChanged{false};
+ // Window types from WindowManager.LayoutParams
+ const int mWindowType;
+
// This is populated if the layer is registered with Scheduler for tracking purposes.
std::unique_ptr<scheduler::LayerHistory::LayerHandle> mSchedulerLayerHandle;
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp
index 9f92d92ecf..073a2dbf02 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.cpp
+++ b/services/surfaceflinger/Scheduler/Scheduler.cpp
@@ -28,6 +28,7 @@
#include <android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h>
#include <configstore/Utils.h>
#include <cutils/properties.h>
+#include <input/InputWindow.h>
#include <system/window.h>
#include <ui/DisplayStatInfo.h>
#include <utils/Timers.h>
@@ -301,8 +302,10 @@ void Scheduler::dumpPrimaryDispSync(std::string& result) const {
}
std::unique_ptr<scheduler::LayerHistory::LayerHandle> Scheduler::registerLayer(
- const std::string name) {
- RefreshRateType refreshRateType = RefreshRateType::PERFORMANCE;
+ std::string const& name, int windowType) {
+ RefreshRateType refreshRateType = (windowType == InputWindowInfo::TYPE_WALLPAPER)
+ ? RefreshRateType::DEFAULT
+ : RefreshRateType::PERFORMANCE;
const auto refreshRate = mRefreshRateConfigs.getRefreshRate(refreshRateType);
const uint32_t fps = (refreshRate) ? refreshRate->fps : 0;
diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h
index 1d53252361..1318fbb9c8 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.h
+++ b/services/surfaceflinger/Scheduler/Scheduler.h
@@ -147,7 +147,9 @@ public:
void setIgnorePresentFences(bool ignore);
nsecs_t expectedPresentTime();
// Registers the layer in the scheduler, and returns the handle for future references.
- std::unique_ptr<scheduler::LayerHistory::LayerHandle> registerLayer(const std::string name);
+ std::unique_ptr<scheduler::LayerHistory::LayerHandle> registerLayer(std::string const& name,
+ int windowType);
+
// Stores present time for a layer.
void addLayerPresentTime(
const std::unique_ptr<scheduler::LayerHistory::LayerHandle>& layerHandle,
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7c88cd807d..9f32ff7ccb 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4030,7 +4030,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie
if (metadata.has(METADATA_WINDOW_TYPE)) {
int32_t windowType = metadata.getInt32(METADATA_WINDOW_TYPE, 0);
if (windowType == 441731) {
- metadata.setInt32(METADATA_WINDOW_TYPE, 2024); // TYPE_NAVIGATION_BAR_PANEL
+ metadata.setInt32(METADATA_WINDOW_TYPE, InputWindowInfo::TYPE_NAVIGATION_BAR_PANEL);
primaryDisplayOnly = true;
}
}