1919#include < semaphore.h>
2020#include < stdint.h>
2121#include < sys/types.h>
22+ #include < algorithm>
2223
2324#include < android/gui/BnWindowInfosReportedListener.h>
2425#include < android/gui/DisplayState.h>
@@ -844,7 +845,7 @@ SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
844845
845846void SurfaceComposerClient::Transaction::sanitize (int pid, int uid) {
846847 uint32_t permissions = LayerStatePermissions::getTransactionPermissions (pid, uid);
847- for (auto & [handle, composerState] : mComposerStates ) {
848+ for (auto & composerState : mComposerStates ) {
848849 composerState.state .sanitize (permissions);
849850 }
850851 if (!mInputWindowCommands .empty () &&
@@ -879,7 +880,7 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel
879880 if (count > parcel->dataSize ()) {
880881 return BAD_VALUE;
881882 }
882- SortedVector <DisplayState> displayStates;
883+ Vector <DisplayState> displayStates;
883884 displayStates.setCapacity (count);
884885 for (size_t i = 0 ; i < count; i++) {
885886 DisplayState displayState;
@@ -922,17 +923,14 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel
922923 if (count > parcel->dataSize ()) {
923924 return BAD_VALUE;
924925 }
925- std::unordered_map<sp<IBinder>, ComposerState, IBinderHash > composerStates;
926- composerStates.reserve (count);
926+ Vector< ComposerState> composerStates;
927+ composerStates.setCapacity (count);
927928 for (size_t i = 0 ; i < count; i++) {
928- sp<IBinder> surfaceControlHandle;
929- SAFE_PARCEL (parcel->readStrongBinder , &surfaceControlHandle);
930-
931929 ComposerState composerState;
932930 if (composerState.read (*parcel) == BAD_VALUE) {
933931 return BAD_VALUE;
934932 }
935- composerStates[surfaceControlHandle] = composerState;
933+ composerStates. add ( composerState) ;
936934 }
937935
938936 InputWindowCommands inputWindowCommands;
@@ -965,9 +963,9 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel
965963 mDesiredPresentTime = desiredPresentTime;
966964 mIsAutoTimestamp = isAutoTimestamp;
967965 mFrameTimelineInfo = frameTimelineInfo;
968- mDisplayStates = displayStates;
966+ mDisplayStates = std::move ( displayStates) ;
969967 mListenerCallbacks = listenerCallbacks;
970- mComposerStates = composerStates;
968+ mComposerStates = std::move ( composerStates) ;
971969 mInputWindowCommands = inputWindowCommands;
972970 mApplyToken = applyToken;
973971 mUncacheBuffers = std::move (uncacheBuffers);
@@ -1015,8 +1013,7 @@ status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const
10151013 }
10161014
10171015 parcel->writeUint32 (static_cast <uint32_t >(mComposerStates .size ()));
1018- for (auto const & [handle, composerState] : mComposerStates ) {
1019- SAFE_PARCEL (parcel->writeStrongBinder , handle);
1016+ for (auto const & composerState : mComposerStates ) {
10201017 composerState.write (*parcel);
10211018 }
10221019
@@ -1073,23 +1070,31 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Tr
10731070 }
10741071 mMergedTransactionIds .insert (mMergedTransactionIds .begin (), other.mId );
10751072
1076- for (auto const & [handle, composerState] : other.mComposerStates ) {
1077- if (mComposerStates .count (handle) == 0 ) {
1078- mComposerStates [handle] = composerState;
1079- } else {
1080- if (composerState.state .what & layer_state_t ::eBufferChanged) {
1081- releaseBufferIfOverwriting (mComposerStates [handle].state );
1073+ for (auto const & otherState : other.mComposerStates ) {
1074+ if (auto it = std::find_if (mComposerStates .begin (), mComposerStates .end (),
1075+ [&otherState](const auto & composerState) {
1076+ return composerState.state .surface ==
1077+ otherState.state .surface ;
1078+ });
1079+ it != mComposerStates .end ()) {
1080+ if (otherState.state .what & layer_state_t ::eBufferChanged) {
1081+ releaseBufferIfOverwriting (it->state );
10821082 }
1083- mComposerStates [handle].state .merge (composerState.state );
1083+ it->state .merge (otherState.state );
1084+ } else {
1085+ mComposerStates .add (otherState);
10841086 }
10851087 }
10861088
10871089 for (auto const & state : other.mDisplayStates ) {
1088- ssize_t index = mDisplayStates .indexOf (state);
1089- if (index < 0 ) {
1090- mDisplayStates .add (state);
1090+ if (auto it = std::find_if (mDisplayStates .begin (), mDisplayStates .end (),
1091+ [&state](const auto & displayState) {
1092+ return displayState.token == state.token ;
1093+ });
1094+ it != mDisplayStates .end ()) {
1095+ it->merge (state);
10911096 } else {
1092- mDisplayStates .editItemAt ( static_cast < size_t >(index)). merge (state);
1097+ mDisplayStates .add (state);
10931098 }
10941099 }
10951100
@@ -1186,8 +1191,8 @@ void SurfaceComposerClient::Transaction::cacheBuffers() {
11861191 }
11871192
11881193 size_t count = 0 ;
1189- for (auto & [handle, cs] : mComposerStates ) {
1190- layer_state_t * s = &( mComposerStates [handle] .state ) ;
1194+ for (auto & cs : mComposerStates ) {
1195+ layer_state_t * s = &cs .state ;
11911196 if (!(s->what & layer_state_t ::eBufferChanged)) {
11921197 continue ;
11931198 } else if (s->bufferData &&
@@ -1312,15 +1317,6 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay
13121317
13131318 cacheBuffers ();
13141319
1315- Vector<ComposerState> composerStates;
1316- Vector<DisplayState> displayStates;
1317-
1318- for (auto const & kv : mComposerStates ) {
1319- composerStates.add (kv.second );
1320- }
1321-
1322- displayStates = std::move (mDisplayStates );
1323-
13241320 if (oneWay) {
13251321 if (synchronous) {
13261322 ALOGE (" Transaction attempted to set synchronous and one way at the same time"
@@ -1340,7 +1336,7 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay
13401336
13411337 sp<ISurfaceComposer> sf (ComposerService::getComposerService ());
13421338 status_t binderStatus =
1343- sf->setTransactionState (mFrameTimelineInfo , composerStates, displayStates , mFlags ,
1339+ sf->setTransactionState (mFrameTimelineInfo , mComposerStates , mDisplayStates , mFlags ,
13441340 applyToken, mInputWindowCommands , mDesiredPresentTime ,
13451341 mIsAutoTimestamp , mUncacheBuffers , hasListenerCallbacks,
13461342 listenerCallbacks, mId , mMergedTransactionIds );
@@ -1456,18 +1452,21 @@ void SurfaceComposerClient::Transaction::setEarlyWakeupEnd() {
14561452
14571453layer_state_t * SurfaceComposerClient::Transaction::getLayerState (const sp<SurfaceControl>& sc) {
14581454 auto handle = sc->getLayerStateHandle ();
1459-
1460- if (mComposerStates .count (handle) == 0 ) {
1461- // we don't have it, add an initialized layer_state to our list
1462- ComposerState s;
1463-
1464- s.state .surface = handle;
1465- s.state .layerId = sc->getLayerId ();
1466-
1467- mComposerStates [handle] = s;
1455+ if (auto it = std::find_if (mComposerStates .begin (), mComposerStates .end (),
1456+ [&handle](const auto & composerState) {
1457+ return composerState.state .surface == handle;
1458+ });
1459+ it != mComposerStates .end ()) {
1460+ return &it->state ;
14681461 }
14691462
1470- return &(mComposerStates [handle].state );
1463+ // we don't have it, add an initialized layer_state to our list
1464+ ComposerState s;
1465+ s.state .surface = handle;
1466+ s.state .layerId = sc->getLayerId ();
1467+ mComposerStates .add (s);
1468+
1469+ return &mComposerStates .editItemAt (mComposerStates .size () - 1 ).state ;
14711470}
14721471
14731472void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback (
@@ -2492,15 +2491,17 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setConte
24922491// ---------------------------------------------------------------------------
24932492
24942493DisplayState& SurfaceComposerClient::Transaction::getDisplayState (const sp<IBinder>& token) {
2494+ if (auto it = std::find_if (mDisplayStates .begin (), mDisplayStates .end (),
2495+ [token](const auto & display) { return display.token == token; });
2496+ it != mDisplayStates .end ()) {
2497+ return *it;
2498+ }
2499+
2500+ // If display state doesn't exist, add a new one.
24952501 DisplayState s;
24962502 s.token = token;
2497- ssize_t index = mDisplayStates .indexOf (s);
2498- if (index < 0 ) {
2499- // we don't have it, add an initialized layer_state to our list
2500- s.what = 0 ;
2501- index = mDisplayStates .add (s);
2502- }
2503- return mDisplayStates .editItemAt (static_cast <size_t >(index));
2503+ mDisplayStates .add (s);
2504+ return mDisplayStates .editItemAt (mDisplayStates .size () - 1 );
25042505}
25052506
25062507status_t SurfaceComposerClient::Transaction::setDisplaySurface (const sp<IBinder>& token,
0 commit comments