diff options
| author | 2019-04-05 10:32:50 -0700 | |
|---|---|---|
| committer | 2019-04-08 11:01:12 -0700 | |
| commit | 8f1ee7fdcf5c602aa87a93b727a696bb8e9eddb0 (patch) | |
| tree | 6674593c7df2539979ca549d7802783caf24d1e4 | |
| parent | 09bd3920155f0961b303d1cdd0f6027135aff36d (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.cpp | 9 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.cpp | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.h | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 |
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; } } |