Skip to content

Commit 8520206

Browse files
author
Dennis Kiilerich
committed
Indicate optimization policy to SurfaceFlinger from DisplayManager
DisplayManager's never-blank concept is translated in VirtualDisplayAdapter to be a power-optimised display (instead of a performance optimised display) in the downstream components. This concept indicates that these displays typically depend on another display's presence and activeness to be continually rendered and shown. The display they depend on instead optimises for performance when it is on, meaning that all the related displays have good performance. For cases where power optimisation information is not available (calls to DisplayControl#createVirtualDisplay(String, boolean) and SurfaceComposerClient::createVirtualDisplay), the power optimisation state is defaulted to optimise for power since these are system calls and this preserves the previous behaviour. Bug: 342681202 Flag: EXEMPT refactor Test: Flashed build on test device, ran Android Auto Projected Change-Id: I6a9fdf7c4be080e2f4df6734def8a4fbefde5742
1 parent ae7eda1 commit 8520206

10 files changed

Lines changed: 83 additions & 21 deletions

File tree

libs/gui/SurfaceComposerClient.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1391,11 +1391,16 @@ void SurfaceComposerClient::Transaction::enableDebugLogCallPoints() {
13911391
// ---------------------------------------------------------------------------
13921392

13931393
sp<IBinder> SurfaceComposerClient::createVirtualDisplay(const std::string& displayName,
1394-
bool isSecure, const std::string& uniqueId,
1394+
bool isSecure, bool optimizeForPower,
1395+
const std::string& uniqueId,
13951396
float requestedRefreshRate) {
1397+
const gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy = optimizeForPower
1398+
? gui::ISurfaceComposer::OptimizationPolicy::optimizeForPower
1399+
: gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
13961400
sp<IBinder> display = nullptr;
13971401
binder::Status status =
13981402
ComposerServiceAIDL::getComposerService()->createVirtualDisplay(displayName, isSecure,
1403+
optimizationPolicy,
13991404
uniqueId,
14001405
requestedRefreshRate,
14011406
&display);

libs/gui/aidl/android/gui/ISurfaceComposer.aidl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ interface ISurfaceComposer {
6767
frameRateOverride = 1 << 1,
6868
}
6969

70+
enum OptimizationPolicy {
71+
optimizeForPower = 0,
72+
optimizeForPerformance = 1,
73+
}
74+
7075
/**
7176
* Signal that we're done booting.
7277
* Requires ACCESS_SURFACE_FLINGER permission
@@ -97,6 +102,10 @@ interface ISurfaceComposer {
97102
* The name of the virtual display.
98103
* isSecure
99104
* Whether this virtual display is secure.
105+
* optimizationPolicy
106+
* Whether to optimize for power or performance. Displays that are optimizing for power may
107+
* be dependent on a different display that optimizes for performance when they are on,
108+
* which will guarantee performance for all of the other displays.
100109
* uniqueId
101110
* The unique ID for the display.
102111
* requestedRefreshRate
@@ -108,7 +117,7 @@ interface ISurfaceComposer {
108117
* requires ACCESS_SURFACE_FLINGER permission.
109118
*/
110119
@nullable IBinder createVirtualDisplay(@utf8InCpp String displayName, boolean isSecure,
111-
@utf8InCpp String uniqueId, float requestedRefreshRate);
120+
OptimizationPolicy optimizationPolicy, @utf8InCpp String uniqueId, float requestedRefreshRate);
112121

113122
/**
114123
* Destroy a virtual display.

libs/gui/include/gui/SurfaceComposerClient.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ class SurfaceComposerClient : public RefBase
396396

397397
static const std::string kEmpty;
398398
static sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
399+
bool optimizeForPower = true,
399400
const std::string& uniqueId = kEmpty,
400401
float requestedRefreshRate = 0);
401402

libs/gui/tests/Surface_test.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -692,10 +692,11 @@ class FakeSurfaceComposerAIDL : public gui::ISurfaceComposer {
692692
return binder::Status::ok();
693693
}
694694

695-
binder::Status createVirtualDisplay(const std::string& /*displayName*/, bool /*isSecure*/,
696-
const std::string& /*uniqueId*/,
697-
float /*requestedRefreshRate*/,
698-
sp<IBinder>* /*outDisplay*/) override {
695+
binder::Status createVirtualDisplay(
696+
const std::string& /*displayName*/, bool /*isSecure*/,
697+
gui::ISurfaceComposer::OptimizationPolicy /*optimizationPolicy*/,
698+
const std::string& /*uniqueId*/, float /*requestedRefreshRate*/,
699+
sp<IBinder>* /*outDisplay*/) override {
699700
return binder::Status::ok();
700701
}
701702

services/surfaceflinger/DisplayDevice.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@ namespace android {
5151

5252
namespace hal = hardware::graphics::composer::hal;
5353

54+
namespace gui {
55+
inline std::string_view to_string(ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
56+
switch (optimizationPolicy) {
57+
case ISurfaceComposer::OptimizationPolicy::optimizeForPower:
58+
return "optimizeForPower";
59+
case ISurfaceComposer::OptimizationPolicy::optimizeForPerformance:
60+
return "optimizeForPerformance";
61+
}
62+
}
63+
} // namespace gui
64+
5465
DisplayDeviceCreationArgs::DisplayDeviceCreationArgs(
5566
const sp<SurfaceFlinger>& flinger, HWComposer& hwComposer, const wp<IBinder>& displayToken,
5667
std::shared_ptr<compositionengine::Display> compositionDisplay)
@@ -283,6 +294,7 @@ void DisplayDevice::dump(utils::Dumper& dumper) const {
283294

284295
dumper.dump("name"sv, '"' + mDisplayName + '"');
285296
dumper.dump("powerMode"sv, mPowerMode);
297+
dumper.dump("optimizationPolicy"sv, mOptimizationPolicy);
286298

287299
if (mRefreshRateSelector) {
288300
mRefreshRateSelector->dump(dumper);
@@ -305,6 +317,15 @@ void DisplayDevice::setSecure(bool secure) {
305317
mCompositionDisplay->setSecure(secure);
306318
}
307319

320+
gui::ISurfaceComposer::OptimizationPolicy DisplayDevice::getOptimizationPolicy() const {
321+
return mOptimizationPolicy;
322+
}
323+
324+
void DisplayDevice::setOptimizationPolicy(
325+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
326+
mOptimizationPolicy = optimizationPolicy;
327+
}
328+
308329
const Rect DisplayDevice::getBounds() const {
309330
return mCompositionDisplay->getState().displaySpace.getBoundsAsRect();
310331
}

services/surfaceflinger/DisplayDevice.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ class DisplayDevice : public RefBase {
9393
bool isSecure() const;
9494
void setSecure(bool secure);
9595

96+
// The optimization policy influences whether this display is optimized for power or
97+
// performance.
98+
gui::ISurfaceComposer::OptimizationPolicy getOptimizationPolicy() const;
99+
void setOptimizationPolicy(gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy);
100+
96101
int getWidth() const;
97102
int getHeight() const;
98103
ui::Size getSize() const { return {getWidth(), getHeight()}; }
@@ -236,6 +241,9 @@ class DisplayDevice : public RefBase {
236241
// TODO(b/182939859): Remove special cases for primary display.
237242
const bool mIsPrimary;
238243

244+
gui::ISurfaceComposer::OptimizationPolicy mOptimizationPolicy =
245+
gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
246+
239247
uint32_t mFlags = 0;
240248

241249
// Requested refresh rate in fps, supported only for virtual displays.
@@ -283,6 +291,9 @@ struct DisplayDeviceState {
283291
std::string displayName;
284292
std::string uniqueId;
285293
bool isSecure = false;
294+
295+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy =
296+
gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
286297
bool isProtected = false;
287298
// Refer to DisplayDevice::mRequestedRefreshRate, for virtual display only
288299
Fps requestedRefreshRate;

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -576,9 +576,10 @@ void SurfaceFlinger::run() {
576576
mScheduler->run();
577577
}
578578

579-
sp<IBinder> SurfaceFlinger::createVirtualDisplay(const std::string& displayName, bool isSecure,
580-
const std::string& uniqueId,
581-
float requestedRefreshRate) {
579+
sp<IBinder> SurfaceFlinger::createVirtualDisplay(
580+
const std::string& displayName, bool isSecure,
581+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId,
582+
float requestedRefreshRate) {
582583
// SurfaceComposerAIDL checks for some permissions, but adding an additional check here.
583584
// This is to ensure that only root, system, and graphics can request to create a secure
584585
// 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,
611612
// Set display as protected when marked as secure to ensure no behavior change
612613
// TODO (b/314820005): separate as a different arg when creating the display.
613614
state.isProtected = isSecure;
615+
state.optimizationPolicy = optimizationPolicy;
614616
state.displayName = displayName;
615617
state.uniqueId = uniqueId;
616618
state.requestedRefreshRate = Fps::fromValue(requestedRefreshRate);
@@ -3927,6 +3929,7 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
39273929
display->setProjection(state.orientation, state.layerStackSpaceRect,
39283930
state.orientedDisplaySpaceRect);
39293931
display->setDisplayName(state.displayName);
3932+
display->setOptimizationPolicy(state.optimizationPolicy);
39303933
display->setFlags(state.flags);
39313934

39323935
return display;
@@ -8748,16 +8751,16 @@ binder::Status SurfaceComposerAIDL::createConnection(sp<gui::ISurfaceComposerCli
87488751
}
87498752
}
87508753

8751-
binder::Status SurfaceComposerAIDL::createVirtualDisplay(const std::string& displayName,
8752-
bool isSecure, const std::string& uniqueId,
8753-
float requestedRefreshRate,
8754-
sp<IBinder>* outDisplay) {
8754+
binder::Status SurfaceComposerAIDL::createVirtualDisplay(
8755+
const std::string& displayName, bool isSecure,
8756+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId,
8757+
float requestedRefreshRate, sp<IBinder>* outDisplay) {
87558758
status_t status = checkAccessPermission();
87568759
if (status != OK) {
87578760
return binderStatusFromStatusT(status);
87588761
}
8759-
*outDisplay =
8760-
mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId, requestedRefreshRate);
8762+
*outDisplay = mFlinger->createVirtualDisplay(displayName, isSecure, optimizationPolicy,
8763+
uniqueId, requestedRefreshRate);
87618764
return binder::Status::ok();
87628765
}
87638766

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ class SurfaceFlinger : public BnSurfaceComposer,
531531

532532
// ISurfaceComposer implementation:
533533
sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
534+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy,
534535
const std::string& uniqueId,
535536
float requestedRefreshRate = 0.0f);
536537
status_t destroyVirtualDisplay(const sp<IBinder>& displayToken);
@@ -1564,9 +1565,11 @@ class SurfaceComposerAIDL : public gui::BnSurfaceComposer {
15641565
const sp<IBinder>& layerHandle,
15651566
sp<gui::IDisplayEventConnection>* outConnection) override;
15661567
binder::Status createConnection(sp<gui::ISurfaceComposerClient>* outClient) override;
1567-
binder::Status createVirtualDisplay(const std::string& displayName, bool isSecure,
1568-
const std::string& uniqueId, float requestedRefreshRate,
1569-
sp<IBinder>* outDisplay) override;
1568+
binder::Status createVirtualDisplay(
1569+
const std::string& displayName, bool isSecure,
1570+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy,
1571+
const std::string& uniqueId, float requestedRefreshRate,
1572+
sp<IBinder>* outDisplay) override;
15701573
binder::Status destroyVirtualDisplay(const sp<IBinder>& displayToken) override;
15711574
binder::Status getPhysicalDisplayIds(std::vector<int64_t>* outDisplayIds) override;
15721575
binder::Status getPhysicalDisplayToken(int64_t displayId, sp<IBinder>* outDisplay) override;

services/surfaceflinger/tests/unittests/SurfaceFlinger_CreateDisplayTest.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ TEST_F(CreateDisplayTest, createDisplaySetsCurrentStateForUniqueId) {
141141
// --------------------------------------------------------------------
142142
// Invocation
143143

144-
sp<IBinder> displayToken = mFlinger.createVirtualDisplay(kDisplayName, false, kUniqueId);
144+
sp<IBinder> displayToken =
145+
mFlinger.createVirtualDisplay(kDisplayName, false,
146+
gui::ISurfaceComposer::OptimizationPolicy::
147+
optimizeForPower,
148+
kUniqueId);
145149

146150
// --------------------------------------------------------------------
147151
// Postconditions

services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,12 +399,16 @@ class TestableSurfaceFlinger {
399399
float requestedRefreshRate = 0.0f) {
400400
static const std::string kTestId =
401401
"virtual:libsurfaceflinger_unittest:TestableSurfaceFlinger";
402-
return mFlinger->createVirtualDisplay(displayName, isSecure, kTestId, requestedRefreshRate);
402+
return mFlinger
403+
->createVirtualDisplay(displayName, isSecure,
404+
gui::ISurfaceComposer::OptimizationPolicy::optimizeForPower,
405+
kTestId, requestedRefreshRate);
403406
}
404407

405408
auto createVirtualDisplay(const std::string& displayName, bool isSecure,
409+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy,
406410
const std::string& uniqueId, float requestedRefreshRate = 0.0f) {
407-
return mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId,
411+
return mFlinger->createVirtualDisplay(displayName, isSecure, optimizationPolicy, uniqueId,
408412
requestedRefreshRate);
409413
}
410414

0 commit comments

Comments
 (0)