Skip to content

Commit 4ef6d54

Browse files
Treehugger RobotAndroid (Google) Code Review
authored andcommitted
Merge "Indicate optimization policy to SurfaceFlinger from DisplayManager" into main
2 parents 15bb18a + 8520206 commit 4ef6d54

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
@@ -394,6 +394,7 @@ class SurfaceComposerClient : public RefBase
394394

395395
static const std::string kEmpty;
396396
static sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
397+
bool optimizeForPower = true,
397398
const std::string& uniqueId = kEmpty,
398399
float requestedRefreshRate = 0);
399400

libs/gui/tests/Surface_test.cpp

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

690-
binder::Status createVirtualDisplay(const std::string& /*displayName*/, bool /*isSecure*/,
691-
const std::string& /*uniqueId*/,
692-
float /*requestedRefreshRate*/,
693-
sp<IBinder>* /*outDisplay*/) override {
690+
binder::Status createVirtualDisplay(
691+
const std::string& /*displayName*/, bool /*isSecure*/,
692+
gui::ISurfaceComposer::OptimizationPolicy /*optimizationPolicy*/,
693+
const std::string& /*uniqueId*/, float /*requestedRefreshRate*/,
694+
sp<IBinder>* /*outDisplay*/) override {
694695
return binder::Status::ok();
695696
}
696697

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);
@@ -3937,6 +3939,7 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
39373939
display->setProjection(state.orientation, state.layerStackSpaceRect,
39383940
state.orientedDisplaySpaceRect);
39393941
display->setDisplayName(state.displayName);
3942+
display->setOptimizationPolicy(state.optimizationPolicy);
39403943
display->setFlags(state.flags);
39413944

39423945
return display;
@@ -8742,16 +8745,16 @@ binder::Status SurfaceComposerAIDL::createConnection(sp<gui::ISurfaceComposerCli
87428745
}
87438746
}
87448747

8745-
binder::Status SurfaceComposerAIDL::createVirtualDisplay(const std::string& displayName,
8746-
bool isSecure, const std::string& uniqueId,
8747-
float requestedRefreshRate,
8748-
sp<IBinder>* outDisplay) {
8748+
binder::Status SurfaceComposerAIDL::createVirtualDisplay(
8749+
const std::string& displayName, bool isSecure,
8750+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy, const std::string& uniqueId,
8751+
float requestedRefreshRate, sp<IBinder>* outDisplay) {
87498752
status_t status = checkAccessPermission();
87508753
if (status != OK) {
87518754
return binderStatusFromStatusT(status);
87528755
}
8753-
*outDisplay =
8754-
mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId, requestedRefreshRate);
8756+
*outDisplay = mFlinger->createVirtualDisplay(displayName, isSecure, optimizationPolicy,
8757+
uniqueId, requestedRefreshRate);
87558758
return binder::Status::ok();
87568759
}
87578760

services/surfaceflinger/SurfaceFlinger.h

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

530530
// ISurfaceComposer implementation:
531531
sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
532+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy,
532533
const std::string& uniqueId,
533534
float requestedRefreshRate = 0.0f);
534535
status_t destroyVirtualDisplay(const sp<IBinder>& displayToken);
@@ -1563,9 +1564,11 @@ class SurfaceComposerAIDL : public gui::BnSurfaceComposer {
15631564
const sp<IBinder>& layerHandle,
15641565
sp<gui::IDisplayEventConnection>* outConnection) override;
15651566
binder::Status createConnection(sp<gui::ISurfaceComposerClient>* outClient) override;
1566-
binder::Status createVirtualDisplay(const std::string& displayName, bool isSecure,
1567-
const std::string& uniqueId, float requestedRefreshRate,
1568-
sp<IBinder>* outDisplay) override;
1567+
binder::Status createVirtualDisplay(
1568+
const std::string& displayName, bool isSecure,
1569+
gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy,
1570+
const std::string& uniqueId, float requestedRefreshRate,
1571+
sp<IBinder>* outDisplay) override;
15691572
binder::Status destroyVirtualDisplay(const sp<IBinder>& displayToken) override;
15701573
binder::Status getPhysicalDisplayIds(std::vector<int64_t>* outDisplayIds) override;
15711574
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)