diff options
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 7 | ||||
-rw-r--r-- | libs/gui/aidl/android/gui/ISurfaceComposer.aidl | 11 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 1 | ||||
-rw-r--r-- | libs/gui/tests/Surface_test.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 21 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 11 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 21 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 9 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h | 8 |
10 files changed, 83 insertions, 21 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index df57b275c5..6ffd99e40a 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -1391,11 +1391,16 @@ void SurfaceComposerClient::Transaction::enableDebugLogCallPoints() { // --------------------------------------------------------------------------- sp<IBinder> SurfaceComposerClient::createVirtualDisplay(const std::string& displayName, - bool isSecure, const std::string& uniqueId, + bool isSecure, bool optimizeForPower, + const std::string& uniqueId, float requestedRefreshRate) { + const gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy = optimizeForPower + ? gui::ISurfaceComposer::OptimizationPolicy::optimizeForPower + : gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance; sp<IBinder> display = nullptr; binder::Status status = ComposerServiceAIDL::getComposerService()->createVirtualDisplay(displayName, isSecure, + optimizationPolicy, uniqueId, requestedRefreshRate, &display); diff --git a/libs/gui/aidl/android/gui/ISurfaceComposer.aidl b/libs/gui/aidl/android/gui/ISurfaceComposer.aidl index da47ee27ba..9b2f089665 100644 --- a/libs/gui/aidl/android/gui/ISurfaceComposer.aidl +++ b/libs/gui/aidl/android/gui/ISurfaceComposer.aidl @@ -67,6 +67,11 @@ interface ISurfaceComposer { frameRateOverride = 1 << 1, } + enum OptimizationPolicy { + optimizeForPower = 0, + optimizeForPerformance = 1, + } + /** * Signal that we're done booting. * Requires ACCESS_SURFACE_FLINGER permission @@ -97,6 +102,10 @@ interface ISurfaceComposer { * The name of the virtual display. * isSecure * Whether this virtual display is secure. + * optimizationPolicy + * Whether to optimize for power or performance. Displays that are optimizing for power may + * be dependent on a different display that optimizes for performance when they are on, + * which will guarantee performance for all of the other displays. * uniqueId * The unique ID for the display. * requestedRefreshRate @@ -108,7 +117,7 @@ interface ISurfaceComposer { * requires ACCESS_SURFACE_FLINGER permission. */ @nullable IBinder createVirtualDisplay(@utf8InCpp String displayName, boolean isSecure, - @utf8InCpp String uniqueId, float requestedRefreshRate); + OptimizationPolicy optimizationPolicy, @utf8InCpp String uniqueId, float requestedRefreshRate); /** * Destroy a virtual display. diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 60f16ae902..18d2a4cc63 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -396,6 +396,7 @@ public: static const std::string kEmpty; static sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure, + bool optimizeForPower = true, const std::string& uniqueId = kEmpty, float requestedRefreshRate = 0); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 98d13290a0..25d5b990b0 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -692,10 +692,11 @@ public: return binder::Status::ok(); } - binder::Status createVirtualDisplay(const std::string& /*displayName*/, bool /*isSecure*/, - const std::string& /*uniqueId*/, - float /*requestedRefreshRate*/, - sp<IBinder>* /*outDisplay*/) override { + binder::Status createVirtualDisplay( + const std::string& /*displayName*/, bool /*isSecure*/, + gui::ISurfaceComposer::OptimizationPolicy /*optimizationPolicy*/, + const std::string& /*uniqueId*/, float /*requestedRefreshRate*/, + sp<IBinder>* /*outDisplay*/) override { return binder::Status::ok(); } diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index e8b09b043e..07770f12ba 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -51,6 +51,17 @@ namespace android { namespace hal = hardware::graphics::composer::hal; +namespace gui { +inline std::string_view to_string(ISurfaceComposer::OptimizationPolicy optimizationPolicy) { + switch (optimizationPolicy) { + case ISurfaceComposer::OptimizationPolicy::optimizeForPower: + return "optimizeForPower"; + case ISurfaceComposer::OptimizationPolicy::optimizeForPerformance: + return "optimizeForPerformance"; + } +} +} // namespace gui + DisplayDeviceCreationArgs::DisplayDeviceCreationArgs( const sp<SurfaceFlinger>& flinger, HWComposer& hwComposer, const wp<IBinder>& displayToken, std::shared_ptr<compositionengine::Display> compositionDisplay) @@ -283,6 +294,7 @@ void DisplayDevice::dump(utils::Dumper& dumper) const { dumper.dump("name"sv, '"' + mDisplayName + '"'); dumper.dump("powerMode"sv, mPowerMode); + dumper.dump("optimizationPolicy"sv, mOptimizationPolicy); if (mRefreshRateSelector) { mRefreshRateSelector->dump(dumper); @@ -305,6 +317,15 @@ void DisplayDevice::setSecure(bool secure) { mCompositionDisplay->setSecure(secure); } +gui::ISurfaceComposer::OptimizationPolicy DisplayDevice::getOptimizationPolicy() const { + return mOptimizationPolicy; +} + +void DisplayDevice::setOptimizationPolicy( + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) { + mOptimizationPolicy = optimizationPolicy; +} + const Rect DisplayDevice::getBounds() const { return mCompositionDisplay->getState().displaySpace.getBoundsAsRect(); } diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index b5a543a7c1..be374299f7 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -93,6 +93,11 @@ public: bool isSecure() const; void setSecure(bool secure); + // The optimization policy influences whether this display is optimized for power or + // performance. + gui::ISurfaceComposer::OptimizationPolicy getOptimizationPolicy() const; + void setOptimizationPolicy(gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy); + int getWidth() const; int getHeight() const; ui::Size getSize() const { return {getWidth(), getHeight()}; } @@ -236,6 +241,9 @@ private: // TODO(b/182939859): Remove special cases for primary display. const bool mIsPrimary; + gui::ISurfaceComposer::OptimizationPolicy mOptimizationPolicy = + gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance; + uint32_t mFlags = 0; // Requested refresh rate in fps, supported only for virtual displays. @@ -283,6 +291,9 @@ struct DisplayDeviceState { std::string displayName; std::string uniqueId; bool isSecure = false; + + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy = + gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance; bool isProtected = false; // Refer to DisplayDevice::mRequestedRefreshRate, for virtual display only Fps requestedRefreshRate; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 98abd10bee..806740b37f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -576,9 +576,10 @@ void SurfaceFlinger::run() { mScheduler->run(); } -sp<IBinder> SurfaceFlinger::createVirtualDisplay(const std::string& displayName, bool isSecure, - const std::string& uniqueId, - float requestedRefreshRate) { +sp<IBinder> SurfaceFlinger::createVirtualDisplay( + const std::string& displayName, bool isSecure, + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId, + float requestedRefreshRate) { // SurfaceComposerAIDL checks for some permissions, but adding an additional check here. // This is to ensure that only root, system, and graphics can request to create a secure // display. Secure displays can show secure content so we add an additional restriction on it. @@ -611,6 +612,7 @@ sp<IBinder> SurfaceFlinger::createVirtualDisplay(const std::string& displayName, // Set display as protected when marked as secure to ensure no behavior change // TODO (b/314820005): separate as a different arg when creating the display. state.isProtected = isSecure; + state.optimizationPolicy = optimizationPolicy; state.displayName = displayName; state.uniqueId = uniqueId; state.requestedRefreshRate = Fps::fromValue(requestedRefreshRate); @@ -3927,6 +3929,7 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( display->setProjection(state.orientation, state.layerStackSpaceRect, state.orientedDisplaySpaceRect); display->setDisplayName(state.displayName); + display->setOptimizationPolicy(state.optimizationPolicy); display->setFlags(state.flags); return display; @@ -8748,16 +8751,16 @@ binder::Status SurfaceComposerAIDL::createConnection(sp<gui::ISurfaceComposerCli } } -binder::Status SurfaceComposerAIDL::createVirtualDisplay(const std::string& displayName, - bool isSecure, const std::string& uniqueId, - float requestedRefreshRate, - sp<IBinder>* outDisplay) { +binder::Status SurfaceComposerAIDL::createVirtualDisplay( + const std::string& displayName, bool isSecure, + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId, + float requestedRefreshRate, sp<IBinder>* outDisplay) { status_t status = checkAccessPermission(); if (status != OK) { return binderStatusFromStatusT(status); } - *outDisplay = - mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId, requestedRefreshRate); + *outDisplay = mFlinger->createVirtualDisplay(displayName, isSecure, optimizationPolicy, + uniqueId, requestedRefreshRate); return binder::Status::ok(); } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 3f454ba1b8..57bc1f3376 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -531,6 +531,7 @@ private: // ISurfaceComposer implementation: sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure, + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId, float requestedRefreshRate = 0.0f); status_t destroyVirtualDisplay(const sp<IBinder>& displayToken); @@ -1564,9 +1565,11 @@ public: const sp<IBinder>& layerHandle, sp<gui::IDisplayEventConnection>* outConnection) override; binder::Status createConnection(sp<gui::ISurfaceComposerClient>* outClient) override; - binder::Status createVirtualDisplay(const std::string& displayName, bool isSecure, - const std::string& uniqueId, float requestedRefreshRate, - sp<IBinder>* outDisplay) override; + binder::Status createVirtualDisplay( + const std::string& displayName, bool isSecure, + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, + const std::string& uniqueId, float requestedRefreshRate, + sp<IBinder>* outDisplay) override; binder::Status destroyVirtualDisplay(const sp<IBinder>& displayToken) override; binder::Status getPhysicalDisplayIds(std::vector<int64_t>* outDisplayIds) override; binder::Status getPhysicalDisplayToken(int64_t displayId, sp<IBinder>* outDisplay) override; diff --git a/services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp b/services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp index aadff760fe..aa5b7863a9 100644 --- a/services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp +++ b/services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp @@ -141,7 +141,11 @@ TEST_F(CreateDisplayTest, createDisplaySetsCurrentStateForUniqueId) { // -------------------------------------------------------------------- // Invocation - sp<IBinder> displayToken = mFlinger.createVirtualDisplay(kDisplayName, false, kUniqueId); + sp<IBinder> displayToken = + mFlinger.createVirtualDisplay(kDisplayName, false, + gui::ISurfaceComposer::OptimizationPolicy:: + optimizeForPower, + kUniqueId); // -------------------------------------------------------------------- // Postconditions diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 41f2b6e5c0..18e2d7bc1d 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -399,12 +399,16 @@ public: float requestedRefreshRate = 0.0f) { static const std::string kTestId = "virtual:libsurfaceflinger_unittest:TestableSurfaceFlinger"; - return mFlinger->createVirtualDisplay(displayName, isSecure, kTestId, requestedRefreshRate); + return mFlinger + ->createVirtualDisplay(displayName, isSecure, + gui::ISurfaceComposer::OptimizationPolicy::optimizeForPower, + kTestId, requestedRefreshRate); } auto createVirtualDisplay(const std::string& displayName, bool isSecure, + gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId, float requestedRefreshRate = 0.0f) { - return mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId, + return mFlinger->createVirtualDisplay(displayName, isSecure, optimizationPolicy, uniqueId, requestedRefreshRate); } |