Skip to content

Commit 1903112

Browse files
Brian3031Android (Google) Code Review
authored andcommitted
Merge changes from topic "multiple-picture-listeners" into main
* changes: Add additional ActivePictureTracker test coverage and rename tests Support multiple active picture listeners Rename of ActivePictureUpdater to ActivePictureTracker
2 parents b95944c + bb67bf7 commit 1903112

12 files changed

Lines changed: 607 additions & 381 deletions

METADATA

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
third_party {
1+
third_party {
22
license_type: NOTICE
33
}

libs/gui/SurfaceComposerClient.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3293,10 +3293,17 @@ status_t SurfaceComposerClient::removeHdrLayerInfoListener(
32933293
return statusTFromBinderStatus(status);
32943294
}
32953295

3296-
status_t SurfaceComposerClient::setActivePictureListener(
3296+
status_t SurfaceComposerClient::addActivePictureListener(
32973297
const sp<gui::IActivePictureListener>& listener) {
32983298
binder::Status status =
3299-
ComposerServiceAIDL::getComposerService()->setActivePictureListener(listener);
3299+
ComposerServiceAIDL::getComposerService()->addActivePictureListener(listener);
3300+
return statusTFromBinderStatus(status);
3301+
}
3302+
3303+
status_t SurfaceComposerClient::removeActivePictureListener(
3304+
const sp<gui::IActivePictureListener>& listener) {
3305+
binder::Status status =
3306+
ComposerServiceAIDL::getComposerService()->removeActivePictureListener(listener);
33003307
return statusTFromBinderStatus(status);
33013308
}
33023309

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,8 +607,14 @@ interface ISurfaceComposer {
607607
oneway void removeJankListener(int layerId, IJankListener listener, long afterVsync);
608608

609609
/**
610-
* Sets the listener used to monitor visible content that is being processed with picture
610+
* Adds a listener used to monitor visible content that is being processed with picture
611611
* profiles.
612612
*/
613-
oneway void setActivePictureListener(IActivePictureListener listener);
613+
oneway void addActivePictureListener(IActivePictureListener listener);
614+
615+
/**
616+
* Removes a listener used to monitor visible content that is being processed with picture
617+
* profiles.
618+
*/
619+
oneway void removeActivePictureListener(IActivePictureListener listener);
614620
}

libs/gui/include/gui/SurfaceComposerClient.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,9 @@ class SurfaceComposerClient : public RefBase
298298
static status_t removeHdrLayerInfoListener(const sp<IBinder>& displayToken,
299299
const sp<gui::IHdrLayerInfoListener>& listener);
300300

301-
static status_t setActivePictureListener(const sp<gui::IActivePictureListener>& listener);
301+
static status_t addActivePictureListener(const sp<gui::IActivePictureListener>& listener);
302+
303+
static status_t removeActivePictureListener(const sp<gui::IActivePictureListener>& listener);
302304

303305
/*
304306
* Sends a power boost to the composer. This function is asynchronous.

libs/gui/tests/Surface_test.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,11 @@ class FakeSurfaceComposerAIDL : public gui::ISurfaceComposer {
10161016
return binder::Status::ok();
10171017
}
10181018

1019-
binder::Status setActivePictureListener(const sp<gui::IActivePictureListener>&) {
1019+
binder::Status addActivePictureListener(const sp<gui::IActivePictureListener>&) {
1020+
return binder::Status::ok();
1021+
}
1022+
1023+
binder::Status removeActivePictureListener(const sp<gui::IActivePictureListener>&) {
10201024
return binder::Status::ok();
10211025
}
10221026

services/surfaceflinger/ActivePictureUpdater.cpp renamed to services/surfaceflinger/ActivePictureTracker.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
#include "ActivePictureUpdater.h"
17+
#include "ActivePictureTracker.h"
1818

1919
#include <algorithm>
2020

@@ -23,7 +23,10 @@
2323

2424
namespace android {
2525

26-
void ActivePictureUpdater::onLayerComposed(const Layer& layer, const LayerFE& layerFE,
26+
using gui::ActivePicture;
27+
using gui::IActivePictureListener;
28+
29+
void ActivePictureTracker::onLayerComposed(const Layer& layer, const LayerFE& layerFE,
2730
const CompositionResult& result) {
2831
if (result.wasPictureProfileCommitted) {
2932
gui::ActivePicture picture;
@@ -39,10 +42,47 @@ void ActivePictureUpdater::onLayerComposed(const Layer& layer, const LayerFE& la
3942
}
4043
}
4144

42-
bool ActivePictureUpdater::updateAndHasChanged() {
45+
void ActivePictureTracker::updateAndNotifyListeners(const Listeners& listenersToAdd,
46+
const Listeners& listenersToRemove) {
47+
Listeners newListeners = updateListeners(listenersToAdd, listenersToRemove);
48+
if (updateAndHasChanged()) {
49+
for (auto listener : mListeners) {
50+
listener->onActivePicturesChanged(getActivePictures());
51+
}
52+
} else {
53+
for (auto listener : newListeners) {
54+
listener->onActivePicturesChanged(getActivePictures());
55+
}
56+
}
57+
}
58+
59+
ActivePictureTracker::Listeners ActivePictureTracker::updateListeners(
60+
const Listeners& listenersToAdd, const Listeners& listenersToRemove) {
61+
Listeners newListeners;
62+
for (auto listener : listenersToRemove) {
63+
std::erase_if(mListeners, [listener](const sp<IActivePictureListener>& otherListener) {
64+
return IInterface::asBinder(listener) == IInterface::asBinder(otherListener);
65+
});
66+
}
67+
for (auto listener : listenersToAdd) {
68+
if (std::find_if(mListeners.begin(), mListeners.end(),
69+
[listener](const sp<IActivePictureListener>& otherListener) {
70+
return IInterface::asBinder(listener) ==
71+
IInterface::asBinder(otherListener);
72+
}) == mListeners.end()) {
73+
newListeners.push_back(listener);
74+
}
75+
}
76+
for (auto listener : newListeners) {
77+
mListeners.push_back(listener);
78+
}
79+
return newListeners;
80+
}
81+
82+
bool ActivePictureTracker::updateAndHasChanged() {
4383
bool hasChanged = true;
4484
if (mNewActivePictures.size() == mOldActivePictures.size()) {
45-
auto compare = [](const gui::ActivePicture& lhs, const gui::ActivePicture& rhs) -> int {
85+
auto compare = [](const ActivePicture& lhs, const ActivePicture& rhs) -> int {
4686
if (lhs.layerId == rhs.layerId) {
4787
return lhs.pictureProfileId < rhs.pictureProfileId;
4888
}
@@ -59,7 +99,7 @@ bool ActivePictureUpdater::updateAndHasChanged() {
5999
return hasChanged;
60100
}
61101

62-
const std::vector<gui::ActivePicture>& ActivePictureUpdater::getActivePictures() const {
102+
const std::vector<ActivePicture>& ActivePictureTracker::getActivePictures() const {
63103
return mOldActivePictures;
64104
}
65105

services/surfaceflinger/ActivePictureUpdater.h renamed to services/surfaceflinger/ActivePictureTracker.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <vector>
2020

2121
#include <android/gui/ActivePicture.h>
22+
#include <android/gui/IActivePictureListener.h>
2223

2324
namespace android {
2425

@@ -27,21 +28,28 @@ class LayerFE;
2728
struct CompositionResult;
2829

2930
// Keeps track of active pictures - layers that are undergoing picture processing.
30-
class ActivePictureUpdater {
31+
class ActivePictureTracker {
3132
public:
33+
typedef std::vector<sp<gui::IActivePictureListener>> Listeners;
34+
3235
// Called for each visible layer when SurfaceFlinger finishes composing.
3336
void onLayerComposed(const Layer& layer, const LayerFE& layerFE,
3437
const CompositionResult& result);
3538

3639
// Update internals and return whether the set of active pictures have changed.
37-
bool updateAndHasChanged();
40+
void updateAndNotifyListeners(const Listeners& activePictureListenersToAdd,
41+
const Listeners& activePictureListenersToRemove);
3842

3943
// The current set of active pictures.
4044
const std::vector<gui::ActivePicture>& getActivePictures() const;
4145

4246
private:
47+
Listeners updateListeners(const Listeners& listenersToAdd, const Listeners& listenersToRemove);
48+
bool updateAndHasChanged();
49+
4350
std::vector<gui::ActivePicture> mOldActivePictures;
4451
std::vector<gui::ActivePicture> mNewActivePictures;
52+
Listeners mListeners;
4553
};
4654

4755
} // namespace android

services/surfaceflinger/Android.bp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ filegroup {
198198
name: "libsurfaceflinger_sources",
199199
srcs: [
200200
":libsurfaceflinger_backend_sources",
201-
"ActivePictureUpdater.cpp",
201+
"ActivePictureTracker.cpp",
202202
"BackgroundExecutor.cpp",
203203
"Client.cpp",
204204
"ClientCache.cpp",

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@
126126
#include <gui/SchedulingPolicy.h>
127127
#include <gui/SyncScreenCaptureListener.h>
128128
#include <ui/DisplayIdentification.h>
129-
#include "ActivePictureUpdater.h"
130129
#include "BackgroundExecutor.h"
131130
#include "Client.h"
132131
#include "ClientCache.h"
@@ -2952,7 +2951,7 @@ CompositeResultsPerDisplay SurfaceFlinger::composite(
29522951
layer->setWasClientComposed(compositionResult.lastClientCompositionFence);
29532952
}
29542953
if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
2955-
mActivePictureUpdater.onLayerComposed(*layer, *layerFE, compositionResult);
2954+
mActivePictureTracker.onLayerComposed(*layer, *layerFE, compositionResult);
29562955
}
29572956
}
29582957

@@ -3264,8 +3263,8 @@ void SurfaceFlinger::onCompositionPresented(PhysicalDisplayId pacesetterId,
32643263
std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>
32653264
hdrInfoListeners;
32663265
bool haveNewHdrInfoListeners = false;
3267-
sp<gui::IActivePictureListener> activePictureListener;
3268-
bool haveNewActivePictureListener = false;
3266+
ActivePictureTracker::Listeners activePictureListenersToAdd;
3267+
ActivePictureTracker::Listeners activePictureListenersToRemove;
32693268
{
32703269
Mutex::Autolock lock(mStateLock);
32713270
if (mFpsReporter) {
@@ -3287,9 +3286,8 @@ void SurfaceFlinger::onCompositionPresented(PhysicalDisplayId pacesetterId,
32873286
haveNewHdrInfoListeners = mAddingHDRLayerInfoListener; // grab this with state lock
32883287
mAddingHDRLayerInfoListener = false;
32893288

3290-
activePictureListener = mActivePictureListener;
3291-
haveNewActivePictureListener = mHaveNewActivePictureListener;
3292-
mHaveNewActivePictureListener = false;
3289+
std::swap(activePictureListenersToAdd, mActivePictureListenersToAdd);
3290+
std::swap(activePictureListenersToRemove, mActivePictureListenersToRemove);
32933291
}
32943292

32953293
if (haveNewHdrInfoListeners || mHdrLayerInfoChanged) {
@@ -3353,14 +3351,10 @@ void SurfaceFlinger::onCompositionPresented(PhysicalDisplayId pacesetterId,
33533351
mHdrLayerInfoChanged = false;
33543352

33553353
if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
3356-
// Track, update and notify changes to active pictures - layers that are undergoing picture
3357-
// processing
3358-
if (mActivePictureUpdater.updateAndHasChanged() || haveNewActivePictureListener) {
3359-
if (activePictureListener) {
3360-
activePictureListener->onActivePicturesChanged(
3361-
mActivePictureUpdater.getActivePictures());
3362-
}
3363-
}
3354+
// Track, update and notify changes to active pictures - layers that are undergoing
3355+
// picture processing
3356+
mActivePictureTracker.updateAndNotifyListeners(activePictureListenersToAdd,
3357+
activePictureListenersToRemove);
33643358
}
33653359

33663360
mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
@@ -8226,12 +8220,20 @@ void SurfaceFlinger::updateHdcpLevels(hal::HWDisplayId hwcDisplayId, int32_t con
82268220
}));
82278221
}
82288222

8229-
void SurfaceFlinger::setActivePictureListener(const sp<gui::IActivePictureListener>& listener) {
8230-
if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
8231-
Mutex::Autolock lock(mStateLock);
8232-
mActivePictureListener = listener;
8233-
mHaveNewActivePictureListener = listener != nullptr;
8234-
}
8223+
void SurfaceFlinger::addActivePictureListener(const sp<gui::IActivePictureListener>& listener) {
8224+
Mutex::Autolock lock(mStateLock);
8225+
std::erase_if(mActivePictureListenersToRemove, [listener](const auto& otherListener) {
8226+
return IInterface::asBinder(listener) == IInterface::asBinder(otherListener);
8227+
});
8228+
mActivePictureListenersToAdd.push_back(listener);
8229+
}
8230+
8231+
void SurfaceFlinger::removeActivePictureListener(const sp<gui::IActivePictureListener>& listener) {
8232+
Mutex::Autolock lock(mStateLock);
8233+
std::erase_if(mActivePictureListenersToAdd, [listener](const auto& otherListener) {
8234+
return IInterface::asBinder(listener) == IInterface::asBinder(otherListener);
8235+
});
8236+
mActivePictureListenersToRemove.push_back(listener);
82358237
}
82368238

82378239
std::shared_ptr<renderengine::ExternalTexture> SurfaceFlinger::getExternalTextureFromBufferData(
@@ -9184,11 +9186,20 @@ binder::Status SurfaceComposerAIDL::removeHdrLayerInfoListener(
91849186
return binderStatusFromStatusT(status);
91859187
}
91869188

9187-
binder::Status SurfaceComposerAIDL::setActivePictureListener(
9189+
binder::Status SurfaceComposerAIDL::addActivePictureListener(
9190+
const sp<gui::IActivePictureListener>& listener) {
9191+
status_t status = checkObservePictureProfilesPermission();
9192+
if (status == OK) {
9193+
mFlinger->addActivePictureListener(listener);
9194+
}
9195+
return binderStatusFromStatusT(status);
9196+
}
9197+
9198+
binder::Status SurfaceComposerAIDL::removeActivePictureListener(
91889199
const sp<gui::IActivePictureListener>& listener) {
91899200
status_t status = checkObservePictureProfilesPermission();
91909201
if (status == OK) {
9191-
mFlinger->setActivePictureListener(listener);
9202+
mFlinger->removeActivePictureListener(listener);
91929203
}
91939204
return binderStatusFromStatusT(status);
91949205
}

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
#include <ui/FenceResult.h>
7070

7171
#include <common/FlagManager.h>
72-
#include "ActivePictureUpdater.h"
72+
#include "ActivePictureTracker.h"
7373
#include "BackgroundExecutor.h"
7474
#include "Display/DisplayModeController.h"
7575
#include "Display/PhysicalDisplay.h"
@@ -667,7 +667,9 @@ class SurfaceFlinger : public BnSurfaceComposer,
667667

668668
void updateHdcpLevels(hal::HWDisplayId hwcDisplayId, int32_t connectedLevel, int32_t maxLevel);
669669

670-
void setActivePictureListener(const sp<gui::IActivePictureListener>& listener);
670+
void addActivePictureListener(const sp<gui::IActivePictureListener>& listener);
671+
672+
void removeActivePictureListener(const sp<gui::IActivePictureListener>& listener);
671673

672674
// IBinder::DeathRecipient overrides:
673675
void binderDied(const wp<IBinder>& who) override;
@@ -1407,9 +1409,9 @@ class SurfaceFlinger : public BnSurfaceComposer,
14071409
std::unordered_map<DisplayId, sp<HdrLayerInfoReporter>> mHdrLayerInfoListeners
14081410
GUARDED_BY(mStateLock);
14091411

1410-
sp<gui::IActivePictureListener> mActivePictureListener GUARDED_BY(mStateLock);
1411-
bool mHaveNewActivePictureListener GUARDED_BY(mStateLock);
1412-
ActivePictureUpdater mActivePictureUpdater GUARDED_BY(kMainThreadContext);
1412+
ActivePictureTracker mActivePictureTracker GUARDED_BY(kMainThreadContext);
1413+
ActivePictureTracker::Listeners mActivePictureListenersToAdd GUARDED_BY(mStateLock);
1414+
ActivePictureTracker::Listeners mActivePictureListenersToRemove GUARDED_BY(mStateLock);
14131415

14141416
std::atomic<ui::Transform::RotationFlags> mActiveDisplayTransformHint;
14151417

@@ -1646,8 +1648,8 @@ class SurfaceComposerAIDL : public gui::BnSurfaceComposer {
16461648
binder::Status flushJankData(int32_t layerId) override;
16471649
binder::Status removeJankListener(int32_t layerId, const sp<gui::IJankListener>& listener,
16481650
int64_t afterVsync) override;
1649-
binder::Status setActivePictureListener(const sp<gui::IActivePictureListener>& listener);
1650-
binder::Status clearActivePictureListener();
1651+
binder::Status addActivePictureListener(const sp<gui::IActivePictureListener>& listener);
1652+
binder::Status removeActivePictureListener(const sp<gui::IActivePictureListener>& listener);
16511653

16521654
private:
16531655
static const constexpr bool kUsePermissionCache = true;

0 commit comments

Comments
 (0)