• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "SurfaceComposerClient"
18 
19 #include <stdint.h>
20 #include <sys/types.h>
21 
22 #include <android/gui/DisplayState.h>
23 #include <android/gui/IWindowInfosListener.h>
24 #include <utils/Errors.h>
25 #include <utils/Log.h>
26 #include <utils/SortedVector.h>
27 #include <utils/String8.h>
28 #include <utils/threads.h>
29 
30 #include <binder/IPCThreadState.h>
31 #include <binder/IServiceManager.h>
32 #include <binder/ProcessState.h>
33 
34 #include <system/graphics.h>
35 
36 #include <gui/BufferItemConsumer.h>
37 #include <gui/CpuConsumer.h>
38 #include <gui/IGraphicBufferProducer.h>
39 #include <gui/ISurfaceComposer.h>
40 #include <gui/ISurfaceComposerClient.h>
41 #include <gui/LayerState.h>
42 #include <gui/Surface.h>
43 #include <gui/SurfaceComposerClient.h>
44 #include <gui/WindowInfo.h>
45 #include <private/gui/ParcelUtils.h>
46 #include <ui/DisplayMode.h>
47 #include <ui/DisplayState.h>
48 #include <ui/DynamicDisplayInfo.h>
49 
50 #include <private/gui/ComposerService.h>
51 #include <private/gui/ComposerServiceAIDL.h>
52 
53 // This server size should always be smaller than the server cache size
54 #define BUFFER_CACHE_MAX_SIZE 64
55 
56 namespace android {
57 
58 using aidl::android::hardware::graphics::common::DisplayDecorationSupport;
59 using gui::FocusRequest;
60 using gui::IRegionSamplingListener;
61 using gui::WindowInfo;
62 using gui::WindowInfoHandle;
63 using gui::WindowInfosListener;
64 using ui::ColorMode;
65 // ---------------------------------------------------------------------------
66 
67 ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
68 ANDROID_SINGLETON_STATIC_INSTANCE(ComposerServiceAIDL);
69 
70 namespace {
71 // Initialize transaction id counter used to generate transaction ids
72 std::atomic<uint32_t> idCounter = 0;
generateId()73 int64_t generateId() {
74     return (((int64_t)getpid()) << 32) | ++idCounter;
75 }
76 } // namespace
77 
ComposerService()78 ComposerService::ComposerService()
79 : Singleton<ComposerService>() {
80     Mutex::Autolock _l(mLock);
81     connectLocked();
82 }
83 
connectLocked()84 bool ComposerService::connectLocked() {
85     const String16 name("SurfaceFlinger");
86     mComposerService = waitForService<ISurfaceComposer>(name);
87     if (mComposerService == nullptr) {
88         return false; // fatal error or permission problem
89     }
90 
91     // Create the death listener.
92     class DeathObserver : public IBinder::DeathRecipient {
93         ComposerService& mComposerService;
94         virtual void binderDied(const wp<IBinder>& who) {
95             ALOGW("ComposerService remote (surfaceflinger) died [%p]",
96                   who.unsafe_get());
97             mComposerService.composerServiceDied();
98         }
99      public:
100         explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
101     };
102 
103     mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
104     IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
105     return true;
106 }
107 
getComposerService()108 /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
109     ComposerService& instance = ComposerService::getInstance();
110     Mutex::Autolock _l(instance.mLock);
111     if (instance.mComposerService == nullptr) {
112         if (ComposerService::getInstance().connectLocked()) {
113             ALOGD("ComposerService reconnected");
114             WindowInfosListenerReporter::getInstance()->reconnect(instance.mComposerService);
115         }
116     }
117     return instance.mComposerService;
118 }
119 
composerServiceDied()120 void ComposerService::composerServiceDied()
121 {
122     Mutex::Autolock _l(mLock);
123     mComposerService = nullptr;
124     mDeathObserver = nullptr;
125 }
126 
ComposerServiceAIDL()127 ComposerServiceAIDL::ComposerServiceAIDL() : Singleton<ComposerServiceAIDL>() {
128     std::scoped_lock lock(mMutex);
129     connectLocked();
130 }
131 
connectLocked()132 bool ComposerServiceAIDL::connectLocked() {
133     const String16 name("SurfaceFlingerAIDL");
134     mComposerService = waitForService<gui::ISurfaceComposer>(name);
135     if (mComposerService == nullptr) {
136         return false; // fatal error or permission problem
137     }
138 
139     // Create the death listener.
140     class DeathObserver : public IBinder::DeathRecipient {
141         ComposerServiceAIDL& mComposerService;
142         virtual void binderDied(const wp<IBinder>& who) {
143             ALOGW("ComposerService aidl remote (surfaceflinger) died [%p]", who.unsafe_get());
144             mComposerService.composerServiceDied();
145         }
146 
147     public:
148         explicit DeathObserver(ComposerServiceAIDL& mgr) : mComposerService(mgr) {}
149     };
150 
151     mDeathObserver = new DeathObserver(*const_cast<ComposerServiceAIDL*>(this));
152     IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
153     return true;
154 }
155 
getComposerService()156 /*static*/ sp<gui::ISurfaceComposer> ComposerServiceAIDL::getComposerService() {
157     ComposerServiceAIDL& instance = ComposerServiceAIDL::getInstance();
158     std::scoped_lock lock(instance.mMutex);
159     if (instance.mComposerService == nullptr) {
160         if (ComposerServiceAIDL::getInstance().connectLocked()) {
161             ALOGD("ComposerServiceAIDL reconnected");
162         }
163     }
164     return instance.mComposerService;
165 }
166 
composerServiceDied()167 void ComposerServiceAIDL::composerServiceDied() {
168     std::scoped_lock lock(mMutex);
169     mComposerService = nullptr;
170     mDeathObserver = nullptr;
171 }
172 
173 class DefaultComposerClient: public Singleton<DefaultComposerClient> {
174     Mutex mLock;
175     sp<SurfaceComposerClient> mClient;
176     friend class Singleton<ComposerService>;
177 public:
getComposerClient()178     static sp<SurfaceComposerClient> getComposerClient() {
179         DefaultComposerClient& dc = DefaultComposerClient::getInstance();
180         Mutex::Autolock _l(dc.mLock);
181         if (dc.mClient == nullptr) {
182             dc.mClient = new SurfaceComposerClient;
183         }
184         return dc.mClient;
185     }
186 };
187 ANDROID_SINGLETON_STATIC_INSTANCE(DefaultComposerClient);
188 
189 
getDefault()190 sp<SurfaceComposerClient> SurfaceComposerClient::getDefault() {
191     return DefaultComposerClient::getComposerClient();
192 }
193 
~JankDataListener()194 JankDataListener::~JankDataListener() {
195 }
196 
197 // ---------------------------------------------------------------------------
198 
199 // TransactionCompletedListener does not use ANDROID_SINGLETON_STATIC_INSTANCE because it needs
200 // to be able to return a sp<> to its instance to pass to SurfaceFlinger.
201 // ANDROID_SINGLETON_STATIC_INSTANCE only allows a reference to an instance.
202 
203 // 0 is an invalid callback id
TransactionCompletedListener()204 TransactionCompletedListener::TransactionCompletedListener() : mCallbackIdCounter(1) {}
205 
getNextIdLocked()206 int64_t TransactionCompletedListener::getNextIdLocked() {
207     return mCallbackIdCounter++;
208 }
209 
210 sp<TransactionCompletedListener> TransactionCompletedListener::sInstance = nullptr;
211 static std::mutex sListenerInstanceMutex;
212 
setInstance(const sp<TransactionCompletedListener> & listener)213 void TransactionCompletedListener::setInstance(const sp<TransactionCompletedListener>& listener) {
214     sInstance = listener;
215 }
216 
getInstance()217 sp<TransactionCompletedListener> TransactionCompletedListener::getInstance() {
218     std::lock_guard<std::mutex> lock(sListenerInstanceMutex);
219     if (sInstance == nullptr) {
220         sInstance = new TransactionCompletedListener;
221     }
222     return sInstance;
223 }
224 
getIInstance()225 sp<ITransactionCompletedListener> TransactionCompletedListener::getIInstance() {
226     return static_cast<sp<ITransactionCompletedListener>>(getInstance());
227 }
228 
startListeningLocked()229 void TransactionCompletedListener::startListeningLocked() {
230     if (mListening) {
231         return;
232     }
233     ProcessState::self()->startThreadPool();
234     mListening = true;
235 }
236 
addCallbackFunction(const TransactionCompletedCallback & callbackFunction,const std::unordered_set<sp<SurfaceControl>,SurfaceComposerClient::SCHash> & surfaceControls,CallbackId::Type callbackType)237 CallbackId TransactionCompletedListener::addCallbackFunction(
238         const TransactionCompletedCallback& callbackFunction,
239         const std::unordered_set<sp<SurfaceControl>, SurfaceComposerClient::SCHash>&
240                 surfaceControls,
241         CallbackId::Type callbackType) {
242     std::lock_guard<std::mutex> lock(mMutex);
243     startListeningLocked();
244 
245     CallbackId callbackId(getNextIdLocked(), callbackType);
246     mCallbacks[callbackId].callbackFunction = callbackFunction;
247     auto& callbackSurfaceControls = mCallbacks[callbackId].surfaceControls;
248 
249     for (const auto& surfaceControl : surfaceControls) {
250         callbackSurfaceControls[surfaceControl->getHandle()] = surfaceControl;
251     }
252 
253     return callbackId;
254 }
255 
addJankListener(const sp<JankDataListener> & listener,sp<SurfaceControl> surfaceControl)256 void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
257                                                    sp<SurfaceControl> surfaceControl) {
258     std::lock_guard<std::mutex> lock(mMutex);
259     mJankListeners.insert({surfaceControl->getLayerId(), listener});
260 }
261 
removeJankListener(const sp<JankDataListener> & listener)262 void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) {
263     std::lock_guard<std::mutex> lock(mMutex);
264     for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {
265         if (it->second == listener) {
266             it = mJankListeners.erase(it);
267         } else {
268             it++;
269         }
270     }
271 }
272 
setReleaseBufferCallback(const ReleaseCallbackId & callbackId,ReleaseBufferCallback listener)273 void TransactionCompletedListener::setReleaseBufferCallback(const ReleaseCallbackId& callbackId,
274                                                             ReleaseBufferCallback listener) {
275     std::scoped_lock<std::mutex> lock(mMutex);
276     mReleaseBufferCallbacks[callbackId] = listener;
277 }
278 
addSurfaceStatsListener(void * context,void * cookie,sp<SurfaceControl> surfaceControl,SurfaceStatsCallback listener)279 void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
280         sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
281     std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
282     mSurfaceStatsListeners.insert(
283             {surfaceControl->getLayerId(), SurfaceStatsCallbackEntry(context, cookie, listener)});
284 }
285 
removeSurfaceStatsListener(void * context,void * cookie)286 void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) {
287     std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
288     for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) {
289         auto [itContext, itCookie, itListener] = it->second;
290         if (itContext == context && itCookie == cookie) {
291             it = mSurfaceStatsListeners.erase(it);
292         } else {
293             it++;
294         }
295     }
296 }
297 
addSurfaceControlToCallbacks(const sp<SurfaceControl> & surfaceControl,const std::unordered_set<CallbackId,CallbackIdHash> & callbackIds)298 void TransactionCompletedListener::addSurfaceControlToCallbacks(
299         const sp<SurfaceControl>& surfaceControl,
300         const std::unordered_set<CallbackId, CallbackIdHash>& callbackIds) {
301     std::lock_guard<std::mutex> lock(mMutex);
302 
303     for (auto callbackId : callbackIds) {
304         mCallbacks[callbackId].surfaceControls.emplace(std::piecewise_construct,
305                                                        std::forward_as_tuple(
306                                                                surfaceControl->getHandle()),
307                                                        std::forward_as_tuple(surfaceControl));
308     }
309 }
310 
onTransactionCompleted(ListenerStats listenerStats)311 void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
312     std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap;
313     std::multimap<int32_t, sp<JankDataListener>> jankListenersMap;
314     {
315         std::lock_guard<std::mutex> lock(mMutex);
316 
317         /* This listener knows all the sp<IBinder> to sp<SurfaceControl> for all its registered
318          * callbackIds, except for when Transactions are merged together. This probably cannot be
319          * solved before this point because the Transactions could be merged together and applied in
320          * a different process.
321          *
322          * Fortunately, we get all the callbacks for this listener for the same frame together at
323          * the same time. This means if any Transactions were merged together, we will get their
324          * callbacks at the same time. We can combine all the sp<IBinder> to sp<SurfaceControl> maps
325          * for all the callbackIds to generate one super map that contains all the sp<IBinder> to
326          * sp<SurfaceControl> that could possibly exist for the callbacks.
327          */
328         callbacksMap = mCallbacks;
329         jankListenersMap = mJankListeners;
330         for (const auto& transactionStats : listenerStats.transactionStats) {
331             for (auto& callbackId : transactionStats.callbackIds) {
332                 mCallbacks.erase(callbackId);
333             }
334         }
335     }
336     for (const auto& transactionStats : listenerStats.transactionStats) {
337         // handle on commit callbacks
338         for (auto callbackId : transactionStats.callbackIds) {
339             if (callbackId.type != CallbackId::Type::ON_COMMIT) {
340                 continue;
341             }
342             auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
343             if (!callbackFunction) {
344                 ALOGE("cannot call null callback function, skipping");
345                 continue;
346             }
347             std::vector<SurfaceControlStats> surfaceControlStats;
348             for (const auto& surfaceStats : transactionStats.surfaceStats) {
349                 surfaceControlStats
350                         .emplace_back(callbacksMap[callbackId]
351                                               .surfaceControls[surfaceStats.surfaceControl],
352                                       transactionStats.latchTime, surfaceStats.acquireTimeOrFence,
353                                       transactionStats.presentFence,
354                                       surfaceStats.previousReleaseFence, surfaceStats.transformHint,
355                                       surfaceStats.eventStats,
356                                       surfaceStats.currentMaxAcquiredBufferCount);
357             }
358 
359             callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
360                              surfaceControlStats);
361         }
362 
363         // handle on complete callbacks
364         for (auto callbackId : transactionStats.callbackIds) {
365             if (callbackId.type != CallbackId::Type::ON_COMPLETE) {
366                 continue;
367             }
368             auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
369             if (!callbackFunction) {
370                 ALOGE("cannot call null callback function, skipping");
371                 continue;
372             }
373             std::vector<SurfaceControlStats> surfaceControlStats;
374             for (const auto& surfaceStats : transactionStats.surfaceStats) {
375                 surfaceControlStats
376                         .emplace_back(callbacksMap[callbackId]
377                                               .surfaceControls[surfaceStats.surfaceControl],
378                                       transactionStats.latchTime, surfaceStats.acquireTimeOrFence,
379                                       transactionStats.presentFence,
380                                       surfaceStats.previousReleaseFence, surfaceStats.transformHint,
381                                       surfaceStats.eventStats,
382                                       surfaceStats.currentMaxAcquiredBufferCount);
383                 if (callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl]) {
384                     callbacksMap[callbackId]
385                             .surfaceControls[surfaceStats.surfaceControl]
386                             ->setTransformHint(surfaceStats.transformHint);
387                 }
388                 // If there is buffer id set, we look up any pending client release buffer callbacks
389                 // and call them. This is a performance optimization when we have a transaction
390                 // callback and a release buffer callback happening at the same time to avoid an
391                 // additional ipc call from the server.
392                 if (surfaceStats.previousReleaseCallbackId != ReleaseCallbackId::INVALID_ID) {
393                     ReleaseBufferCallback callback;
394                     {
395                         std::scoped_lock<std::mutex> lock(mMutex);
396                         callback = popReleaseBufferCallbackLocked(
397                                 surfaceStats.previousReleaseCallbackId);
398                     }
399                     if (callback) {
400                         callback(surfaceStats.previousReleaseCallbackId,
401                                  surfaceStats.previousReleaseFence
402                                          ? surfaceStats.previousReleaseFence
403                                          : Fence::NO_FENCE,
404                                  surfaceStats.currentMaxAcquiredBufferCount);
405                     }
406                 }
407             }
408 
409             callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
410                              surfaceControlStats);
411         }
412 
413         for (const auto& surfaceStats : transactionStats.surfaceStats) {
414             // The callbackMap contains the SurfaceControl object, which we need to look up the
415             // layerId. Since we don't know which callback contains the SurfaceControl, iterate
416             // through all until the SC is found.
417             int32_t layerId = -1;
418             for (auto callbackId : transactionStats.callbackIds) {
419                 if (callbackId.type != CallbackId::Type::ON_COMPLETE) {
420                     // We only want to run the stats callback for ON_COMPLETE
421                     continue;
422                 }
423                 sp<SurfaceControl> sc =
424                         callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl];
425                 if (sc != nullptr) {
426                     layerId = sc->getLayerId();
427                     break;
428                 }
429             }
430 
431             if (layerId != -1) {
432                 // Acquire surface stats listener lock such that we guarantee that after calling
433                 // unregister, there won't be any further callback.
434                 std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
435                 auto listenerRange = mSurfaceStatsListeners.equal_range(layerId);
436                 for (auto it = listenerRange.first; it != listenerRange.second; it++) {
437                     auto entry = it->second;
438                     entry.callback(entry.context, transactionStats.latchTime,
439                         transactionStats.presentFence, surfaceStats);
440                 }
441             }
442 
443             if (surfaceStats.jankData.empty()) continue;
444             auto jankRange = jankListenersMap.equal_range(layerId);
445             for (auto it = jankRange.first; it != jankRange.second; it++) {
446                 it->second->onJankDataAvailable(surfaceStats.jankData);
447             }
448         }
449     }
450 }
451 
onTransactionQueueStalled()452 void TransactionCompletedListener::onTransactionQueueStalled() {
453       std::unordered_map<void*, std::function<void()>> callbackCopy;
454       {
455           std::scoped_lock<std::mutex> lock(mMutex);
456           callbackCopy = mQueueStallListeners;
457       }
458       for (auto const& it : callbackCopy) {
459           it.second();
460       }
461 }
462 
addQueueStallListener(std::function<void ()> stallListener,void * id)463 void TransactionCompletedListener::addQueueStallListener(std::function<void()> stallListener,
464                                                          void* id) {
465     std::scoped_lock<std::mutex> lock(mMutex);
466     mQueueStallListeners[id] = stallListener;
467 }
removeQueueStallListener(void * id)468 void TransactionCompletedListener::removeQueueStallListener(void *id) {
469     std::scoped_lock<std::mutex> lock(mMutex);
470     mQueueStallListeners.erase(id);
471 }
472 
onReleaseBuffer(ReleaseCallbackId callbackId,sp<Fence> releaseFence,uint32_t currentMaxAcquiredBufferCount)473 void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId,
474                                                    sp<Fence> releaseFence,
475                                                    uint32_t currentMaxAcquiredBufferCount) {
476     ReleaseBufferCallback callback;
477     {
478         std::scoped_lock<std::mutex> lock(mMutex);
479         callback = popReleaseBufferCallbackLocked(callbackId);
480     }
481     if (!callback) {
482         ALOGE("Could not call release buffer callback, buffer not found %s",
483               callbackId.to_string().c_str());
484         return;
485     }
486     std::optional<uint32_t> optionalMaxAcquiredBufferCount =
487             currentMaxAcquiredBufferCount == UINT_MAX
488             ? std::nullopt
489             : std::make_optional<uint32_t>(currentMaxAcquiredBufferCount);
490     callback(callbackId, releaseFence, optionalMaxAcquiredBufferCount);
491 }
492 
popReleaseBufferCallbackLocked(const ReleaseCallbackId & callbackId)493 ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked(
494         const ReleaseCallbackId& callbackId) {
495     ReleaseBufferCallback callback;
496     auto itr = mReleaseBufferCallbacks.find(callbackId);
497     if (itr == mReleaseBufferCallbacks.end()) {
498         return nullptr;
499     }
500     callback = itr->second;
501     mReleaseBufferCallbacks.erase(itr);
502     return callback;
503 }
504 
removeReleaseBufferCallback(const ReleaseCallbackId & callbackId)505 void TransactionCompletedListener::removeReleaseBufferCallback(
506         const ReleaseCallbackId& callbackId) {
507     {
508         std::scoped_lock<std::mutex> lock(mMutex);
509         popReleaseBufferCallbackLocked(callbackId);
510     }
511 }
512 
513 // ---------------------------------------------------------------------------
514 
515 void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId);
516 
517 /**
518  * We use the BufferCache to reduce the overhead of exchanging GraphicBuffers with
519  * the server. If we were to simply parcel the GraphicBuffer we would pay two overheads
520  *     1. Cost of sending the FD
521  *     2. Cost of importing the GraphicBuffer with the mapper in the receiving process.
522  * To ease this cost we implement the following scheme of caching buffers to integers,
523  * or said-otherwise, naming them with integers. This is the scheme known as slots in
524  * the legacy BufferQueue system.
525  *     1. When sending Buffers to SurfaceFlinger we look up the Buffer in the cache.
526  *     2. If there is a cache-hit we remove the Buffer from the Transaction and instead
527  *        send the cached integer.
528  *     3. If there is a cache miss, we cache the new buffer and send the integer
529  *        along with the Buffer, SurfaceFlinger on it's side creates a new cache
530  *        entry, and we use the integer for further communication.
531  * A few details about lifetime:
532  *     1. The cache evicts by LRU. The server side cache is keyed by BufferCache::getToken
533  *        which is per process Unique. The server side cache is larger than the client side
534  *        cache so that the server will never evict entries before the client.
535  *     2. When the client evicts an entry it notifies the server via an uncacheBuffer
536  *        transaction.
537  *     3. The client only references the Buffers by ID, and uses buffer->addDeathCallback
538  *        to auto-evict destroyed buffers.
539  */
540 class BufferCache : public Singleton<BufferCache> {
541 public:
BufferCache()542     BufferCache() : token(new BBinder()) {}
543 
getToken()544     sp<IBinder> getToken() {
545         return IInterface::asBinder(TransactionCompletedListener::getIInstance());
546     }
547 
getCacheId(const sp<GraphicBuffer> & buffer,uint64_t * cacheId)548     status_t getCacheId(const sp<GraphicBuffer>& buffer, uint64_t* cacheId) {
549         std::lock_guard<std::mutex> lock(mMutex);
550 
551         auto itr = mBuffers.find(buffer->getId());
552         if (itr == mBuffers.end()) {
553             return BAD_VALUE;
554         }
555         itr->second = getCounter();
556         *cacheId = buffer->getId();
557         return NO_ERROR;
558     }
559 
cache(const sp<GraphicBuffer> & buffer)560     uint64_t cache(const sp<GraphicBuffer>& buffer) {
561         std::lock_guard<std::mutex> lock(mMutex);
562 
563         if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) {
564             evictLeastRecentlyUsedBuffer();
565         }
566 
567         buffer->addDeathCallback(removeDeadBufferCallback, nullptr);
568 
569         mBuffers[buffer->getId()] = getCounter();
570         return buffer->getId();
571     }
572 
uncache(uint64_t cacheId)573     void uncache(uint64_t cacheId) {
574         std::lock_guard<std::mutex> lock(mMutex);
575         uncacheLocked(cacheId);
576     }
577 
uncacheLocked(uint64_t cacheId)578     void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) {
579         mBuffers.erase(cacheId);
580         SurfaceComposerClient::doUncacheBufferTransaction(cacheId);
581     }
582 
583 private:
evictLeastRecentlyUsedBuffer()584     void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) {
585         auto itr = mBuffers.begin();
586         uint64_t minCounter = itr->second;
587         auto minBuffer = itr;
588         itr++;
589 
590         while (itr != mBuffers.end()) {
591             uint64_t counter = itr->second;
592             if (counter < minCounter) {
593                 minCounter = counter;
594                 minBuffer = itr;
595             }
596             itr++;
597         }
598         uncacheLocked(minBuffer->first);
599     }
600 
getCounter()601     uint64_t getCounter() REQUIRES(mMutex) {
602         static uint64_t counter = 0;
603         return counter++;
604     }
605 
606     std::mutex mMutex;
607     std::map<uint64_t /*Cache id*/, uint64_t /*counter*/> mBuffers GUARDED_BY(mMutex);
608 
609     // Used by ISurfaceComposer to identify which process is sending the cached buffer.
610     sp<IBinder> token;
611 };
612 
613 ANDROID_SINGLETON_STATIC_INSTANCE(BufferCache);
614 
removeDeadBufferCallback(void *,uint64_t graphicBufferId)615 void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId) {
616     // GraphicBuffer id's are used as the cache ids.
617     BufferCache::getInstance().uncache(graphicBufferId);
618 }
619 
620 // ---------------------------------------------------------------------------
621 
Transaction()622 SurfaceComposerClient::Transaction::Transaction() {
623     mId = generateId();
624 }
625 
Transaction(const Transaction & other)626 SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
627       : mId(other.mId),
628         mForceSynchronous(other.mForceSynchronous),
629         mTransactionNestCount(other.mTransactionNestCount),
630         mAnimation(other.mAnimation),
631         mEarlyWakeupStart(other.mEarlyWakeupStart),
632         mEarlyWakeupEnd(other.mEarlyWakeupEnd),
633         mContainsBuffer(other.mContainsBuffer),
634         mDesiredPresentTime(other.mDesiredPresentTime),
635         mIsAutoTimestamp(other.mIsAutoTimestamp),
636         mFrameTimelineInfo(other.mFrameTimelineInfo),
637         mApplyToken(other.mApplyToken) {
638     mDisplayStates = other.mDisplayStates;
639     mComposerStates = other.mComposerStates;
640     mInputWindowCommands = other.mInputWindowCommands;
641     mListenerCallbacks = other.mListenerCallbacks;
642 }
643 
sanitize()644 void SurfaceComposerClient::Transaction::sanitize() {
645     for (auto & [handle, composerState] : mComposerStates) {
646         composerState.state.sanitize(0 /* permissionMask */);
647     }
648     mInputWindowCommands.clear();
649 }
650 
651 std::unique_ptr<SurfaceComposerClient::Transaction>
createFromParcel(const Parcel * parcel)652 SurfaceComposerClient::Transaction::createFromParcel(const Parcel* parcel) {
653     auto transaction = std::make_unique<Transaction>();
654     if (transaction->readFromParcel(parcel) == NO_ERROR) {
655         return transaction;
656     }
657     return nullptr;
658 }
659 
660 
readFromParcel(const Parcel * parcel)661 status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel) {
662     const uint32_t forceSynchronous = parcel->readUint32();
663     const uint32_t transactionNestCount = parcel->readUint32();
664     const bool animation = parcel->readBool();
665     const bool earlyWakeupStart = parcel->readBool();
666     const bool earlyWakeupEnd = parcel->readBool();
667     const bool containsBuffer = parcel->readBool();
668     const int64_t desiredPresentTime = parcel->readInt64();
669     const bool isAutoTimestamp = parcel->readBool();
670     FrameTimelineInfo frameTimelineInfo;
671     SAFE_PARCEL(frameTimelineInfo.read, *parcel);
672 
673     sp<IBinder> applyToken;
674     parcel->readNullableStrongBinder(&applyToken);
675     size_t count = static_cast<size_t>(parcel->readUint32());
676     if (count > parcel->dataSize()) {
677         return BAD_VALUE;
678     }
679     SortedVector<DisplayState> displayStates;
680     displayStates.setCapacity(count);
681     for (size_t i = 0; i < count; i++) {
682         DisplayState displayState;
683         if (displayState.read(*parcel) == BAD_VALUE) {
684             return BAD_VALUE;
685         }
686         displayStates.add(displayState);
687     }
688 
689     count = static_cast<size_t>(parcel->readUint32());
690     if (count > parcel->dataSize()) {
691         return BAD_VALUE;
692     }
693     std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> listenerCallbacks;
694     listenerCallbacks.reserve(count);
695     for (size_t i = 0; i < count; i++) {
696         sp<ITransactionCompletedListener> listener =
697                 interface_cast<ITransactionCompletedListener>(parcel->readStrongBinder());
698         size_t numCallbackIds = parcel->readUint32();
699         if (numCallbackIds > parcel->dataSize()) {
700             return BAD_VALUE;
701         }
702         for (size_t j = 0; j < numCallbackIds; j++) {
703             CallbackId id;
704             parcel->readParcelable(&id);
705             listenerCallbacks[listener].callbackIds.insert(id);
706         }
707         size_t numSurfaces = parcel->readUint32();
708         if (numSurfaces > parcel->dataSize()) {
709             return BAD_VALUE;
710         }
711         for (size_t j = 0; j < numSurfaces; j++) {
712             sp<SurfaceControl> surface;
713             SAFE_PARCEL(SurfaceControl::readFromParcel, *parcel, &surface);
714             listenerCallbacks[listener].surfaceControls.insert(surface);
715         }
716     }
717 
718     count = static_cast<size_t>(parcel->readUint32());
719     if (count > parcel->dataSize()) {
720         return BAD_VALUE;
721     }
722     std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> composerStates;
723     composerStates.reserve(count);
724     for (size_t i = 0; i < count; i++) {
725         sp<IBinder> surfaceControlHandle;
726         SAFE_PARCEL(parcel->readStrongBinder, &surfaceControlHandle);
727 
728         ComposerState composerState;
729         if (composerState.read(*parcel) == BAD_VALUE) {
730             return BAD_VALUE;
731         }
732         composerStates[surfaceControlHandle] = composerState;
733     }
734 
735     InputWindowCommands inputWindowCommands;
736     inputWindowCommands.read(*parcel);
737 
738     // Parsing was successful. Update the object.
739     mForceSynchronous = forceSynchronous;
740     mTransactionNestCount = transactionNestCount;
741     mAnimation = animation;
742     mEarlyWakeupStart = earlyWakeupStart;
743     mEarlyWakeupEnd = earlyWakeupEnd;
744     mContainsBuffer = containsBuffer;
745     mDesiredPresentTime = desiredPresentTime;
746     mIsAutoTimestamp = isAutoTimestamp;
747     mFrameTimelineInfo = frameTimelineInfo;
748     mDisplayStates = displayStates;
749     mListenerCallbacks = listenerCallbacks;
750     mComposerStates = composerStates;
751     mInputWindowCommands = inputWindowCommands;
752     mApplyToken = applyToken;
753     return NO_ERROR;
754 }
755 
writeToParcel(Parcel * parcel) const756 status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const {
757     // If we write the Transaction to a parcel, we want to ensure the Buffers are cached
758     // before crossing the IPC boundary. Otherwise the receiving party will cache the buffers
759     // but is unlikely to use them again as they are owned by the other process.
760     // You may be asking yourself, is this const cast safe? Const cast is safe up
761     // until the point where you try and write to an object that was originally const at which
762     // point we enter undefined behavior. In this case we are safe though, because there are
763     // two possibilities:
764     //    1. The SurfaceComposerClient::Transaction was originally non-const. Safe.
765     //    2. It was originall const! In this case not only was it useless, but it by definition
766     //       contains no composer states and so cacheBuffers will not perform any writes.
767 
768     const_cast<SurfaceComposerClient::Transaction*>(this)->cacheBuffers();
769 
770     parcel->writeUint32(mForceSynchronous);
771     parcel->writeUint32(mTransactionNestCount);
772     parcel->writeBool(mAnimation);
773     parcel->writeBool(mEarlyWakeupStart);
774     parcel->writeBool(mEarlyWakeupEnd);
775     parcel->writeBool(mContainsBuffer);
776     parcel->writeInt64(mDesiredPresentTime);
777     parcel->writeBool(mIsAutoTimestamp);
778     SAFE_PARCEL(mFrameTimelineInfo.write, *parcel);
779     parcel->writeStrongBinder(mApplyToken);
780     parcel->writeUint32(static_cast<uint32_t>(mDisplayStates.size()));
781     for (auto const& displayState : mDisplayStates) {
782         displayState.write(*parcel);
783     }
784 
785     parcel->writeUint32(static_cast<uint32_t>(mListenerCallbacks.size()));
786     for (auto const& [listener, callbackInfo] : mListenerCallbacks) {
787         parcel->writeStrongBinder(ITransactionCompletedListener::asBinder(listener));
788         parcel->writeUint32(static_cast<uint32_t>(callbackInfo.callbackIds.size()));
789         for (auto callbackId : callbackInfo.callbackIds) {
790             parcel->writeParcelable(callbackId);
791         }
792         parcel->writeUint32(static_cast<uint32_t>(callbackInfo.surfaceControls.size()));
793         for (auto surfaceControl : callbackInfo.surfaceControls) {
794             SAFE_PARCEL(surfaceControl->writeToParcel, *parcel);
795         }
796     }
797 
798     parcel->writeUint32(static_cast<uint32_t>(mComposerStates.size()));
799     for (auto const& [handle, composerState] : mComposerStates) {
800         SAFE_PARCEL(parcel->writeStrongBinder, handle);
801         composerState.write(*parcel);
802     }
803 
804     mInputWindowCommands.write(*parcel);
805     return NO_ERROR;
806 }
807 
releaseBufferIfOverwriting(const layer_state_t & state)808 void SurfaceComposerClient::Transaction::releaseBufferIfOverwriting(const layer_state_t& state) {
809     if (!(state.what & layer_state_t::eBufferChanged)) {
810         return;
811     }
812 
813     auto listener = state.bufferData->releaseBufferListener;
814     sp<Fence> fence =
815             state.bufferData->acquireFence ? state.bufferData->acquireFence : Fence::NO_FENCE;
816     if (state.bufferData->releaseBufferEndpoint ==
817         IInterface::asBinder(TransactionCompletedListener::getIInstance())) {
818         // if the callback is in process, run on a different thread to avoid any lock contigency
819         // issues in the client.
820         SurfaceComposerClient::getDefault()
821                 ->mReleaseCallbackThread
822                 .addReleaseCallback(state.bufferData->generateReleaseCallbackId(), fence);
823     } else {
824         listener->onReleaseBuffer(state.bufferData->generateReleaseCallbackId(), fence, UINT_MAX);
825     }
826 }
827 
merge(Transaction && other)828 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
829     for (auto const& [handle, composerState] : other.mComposerStates) {
830         if (mComposerStates.count(handle) == 0) {
831             mComposerStates[handle] = composerState;
832         } else {
833             if (composerState.state.what & layer_state_t::eBufferChanged) {
834                 releaseBufferIfOverwriting(mComposerStates[handle].state);
835             }
836             mComposerStates[handle].state.merge(composerState.state);
837         }
838     }
839 
840     for (auto const& state : other.mDisplayStates) {
841         ssize_t index = mDisplayStates.indexOf(state);
842         if (index < 0) {
843             mDisplayStates.add(state);
844         } else {
845             mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
846         }
847     }
848 
849     for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
850         auto& [callbackIds, surfaceControls] = callbackInfo;
851         mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
852                                                                 callbackIds.begin()),
853                                                         std::make_move_iterator(callbackIds.end()));
854 
855         mListenerCallbacks[listener].surfaceControls.insert(surfaceControls.begin(),
856                                                             surfaceControls.end());
857 
858         auto& currentProcessCallbackInfo =
859                 mListenerCallbacks[TransactionCompletedListener::getIInstance()];
860         currentProcessCallbackInfo.surfaceControls
861                 .insert(std::make_move_iterator(surfaceControls.begin()),
862                         std::make_move_iterator(surfaceControls.end()));
863 
864         // register all surface controls for all callbackIds for this listener that is merging
865         for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
866             TransactionCompletedListener::getInstance()
867                     ->addSurfaceControlToCallbacks(surfaceControl,
868                                                    currentProcessCallbackInfo.callbackIds);
869         }
870     }
871 
872     mInputWindowCommands.merge(other.mInputWindowCommands);
873 
874     mContainsBuffer |= other.mContainsBuffer;
875     mEarlyWakeupStart = mEarlyWakeupStart || other.mEarlyWakeupStart;
876     mEarlyWakeupEnd = mEarlyWakeupEnd || other.mEarlyWakeupEnd;
877     mApplyToken = other.mApplyToken;
878 
879     mFrameTimelineInfo.merge(other.mFrameTimelineInfo);
880 
881     other.clear();
882     return *this;
883 }
884 
clear()885 void SurfaceComposerClient::Transaction::clear() {
886     mComposerStates.clear();
887     mDisplayStates.clear();
888     mListenerCallbacks.clear();
889     mInputWindowCommands.clear();
890     mContainsBuffer = false;
891     mForceSynchronous = 0;
892     mTransactionNestCount = 0;
893     mAnimation = false;
894     mEarlyWakeupStart = false;
895     mEarlyWakeupEnd = false;
896     mDesiredPresentTime = 0;
897     mIsAutoTimestamp = true;
898     mFrameTimelineInfo.clear();
899     mApplyToken = nullptr;
900 }
901 
getId()902 uint64_t SurfaceComposerClient::Transaction::getId() {
903     return mId;
904 }
905 
doUncacheBufferTransaction(uint64_t cacheId)906 void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) {
907     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
908 
909     client_cache_t uncacheBuffer;
910     uncacheBuffer.token = BufferCache::getInstance().getToken();
911     uncacheBuffer.id = cacheId;
912 
913     sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
914     sf->setTransactionState(FrameTimelineInfo{}, {}, {}, 0, applyToken, {}, systemTime(), true,
915                             uncacheBuffer, false, {}, generateId());
916 }
917 
cacheBuffers()918 void SurfaceComposerClient::Transaction::cacheBuffers() {
919     if (!mContainsBuffer) {
920         return;
921     }
922 
923     size_t count = 0;
924     for (auto& [handle, cs] : mComposerStates) {
925         layer_state_t* s = &(mComposerStates[handle].state);
926         if (!(s->what & layer_state_t::eBufferChanged)) {
927             continue;
928         } else if (s->bufferData &&
929                    s->bufferData->flags.test(BufferData::BufferDataChange::cachedBufferChanged)) {
930             // If eBufferChanged and eCachedBufferChanged are both trued then that means
931             // we already cached the buffer in a previous call to cacheBuffers, perhaps
932             // from writeToParcel on a Transaction that was merged in to this one.
933             continue;
934         }
935 
936         // Don't try to cache a null buffer. Sending null buffers is cheap so we shouldn't waste
937         // time trying to cache them.
938         if (!s->bufferData || !s->bufferData->buffer) {
939             continue;
940         }
941 
942         uint64_t cacheId = 0;
943         status_t ret = BufferCache::getInstance().getCacheId(s->bufferData->buffer, &cacheId);
944         if (ret == NO_ERROR) {
945             // Cache-hit. Strip the buffer and send only the id.
946             s->bufferData->buffer = nullptr;
947         } else {
948             // Cache-miss. Include the buffer and send the new cacheId.
949             cacheId = BufferCache::getInstance().cache(s->bufferData->buffer);
950         }
951         s->bufferData->flags |= BufferData::BufferDataChange::cachedBufferChanged;
952         s->bufferData->cachedBuffer.token = BufferCache::getInstance().getToken();
953         s->bufferData->cachedBuffer.id = cacheId;
954 
955         // If we have more buffers than the size of the cache, we should stop caching so we don't
956         // evict other buffers in this transaction
957         count++;
958         if (count >= BUFFER_CACHE_MAX_SIZE) {
959             break;
960         }
961     }
962 }
963 
apply(bool synchronous,bool oneWay)964 status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay) {
965     if (mStatus != NO_ERROR) {
966         return mStatus;
967     }
968 
969     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
970 
971     bool hasListenerCallbacks = !mListenerCallbacks.empty();
972     std::vector<ListenerCallbacks> listenerCallbacks;
973     // For every listener with registered callbacks
974     for (const auto& [listener, callbackInfo] : mListenerCallbacks) {
975         auto& [callbackIds, surfaceControls] = callbackInfo;
976         if (callbackIds.empty()) {
977             continue;
978         }
979 
980         if (surfaceControls.empty()) {
981             listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));
982         } else {
983             // If the listener has any SurfaceControls set on this Transaction update the surface
984             // state
985             for (const auto& surfaceControl : surfaceControls) {
986                 layer_state_t* s = getLayerState(surfaceControl);
987                 if (!s) {
988                     ALOGE("failed to get layer state");
989                     continue;
990                 }
991                 std::vector<CallbackId> callbacks(callbackIds.begin(), callbackIds.end());
992                 s->what |= layer_state_t::eHasListenerCallbacksChanged;
993                 s->listeners.emplace_back(IInterface::asBinder(listener), callbacks);
994             }
995         }
996     }
997 
998     cacheBuffers();
999 
1000     Vector<ComposerState> composerStates;
1001     Vector<DisplayState> displayStates;
1002     uint32_t flags = 0;
1003 
1004     mForceSynchronous |= synchronous;
1005 
1006     for (auto const& kv : mComposerStates){
1007         composerStates.add(kv.second);
1008     }
1009 
1010     displayStates = std::move(mDisplayStates);
1011 
1012     if (mForceSynchronous) {
1013         flags |= ISurfaceComposer::eSynchronous;
1014     }
1015     if (mAnimation) {
1016         flags |= ISurfaceComposer::eAnimation;
1017     }
1018     if (oneWay) {
1019       if (mForceSynchronous) {
1020           ALOGE("Transaction attempted to set synchronous and one way at the same time"
1021                 " this is an invalid request. Synchronous will win for safety");
1022       } else {
1023           flags |= ISurfaceComposer::eOneWay;
1024       }
1025     }
1026 
1027     // If both mEarlyWakeupStart and mEarlyWakeupEnd are set
1028     // it is equivalent for none
1029     if (mEarlyWakeupStart && !mEarlyWakeupEnd) {
1030         flags |= ISurfaceComposer::eEarlyWakeupStart;
1031     }
1032     if (mEarlyWakeupEnd && !mEarlyWakeupStart) {
1033         flags |= ISurfaceComposer::eEarlyWakeupEnd;
1034     }
1035 
1036     sp<IBinder> applyToken = mApplyToken
1037             ? mApplyToken
1038             : IInterface::asBinder(TransactionCompletedListener::getIInstance());
1039 
1040     sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
1041                             mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
1042                             {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,
1043                             hasListenerCallbacks, listenerCallbacks, mId);
1044     mId = generateId();
1045 
1046     // Clear the current states and flags
1047     clear();
1048 
1049     mStatus = NO_ERROR;
1050     return NO_ERROR;
1051 }
1052 
1053 // ---------------------------------------------------------------------------
1054 
createDisplay(const String8 & displayName,bool secure)1055 sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
1056     sp<IBinder> display = nullptr;
1057     binder::Status status =
1058             ComposerServiceAIDL::getComposerService()->createDisplay(std::string(
1059                                                                              displayName.string()),
1060                                                                      secure, &display);
1061     return status.isOk() ? display : nullptr;
1062 }
1063 
destroyDisplay(const sp<IBinder> & display)1064 void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
1065     ComposerServiceAIDL::getComposerService()->destroyDisplay(display);
1066 }
1067 
getPhysicalDisplayIds()1068 std::vector<PhysicalDisplayId> SurfaceComposerClient::getPhysicalDisplayIds() {
1069     std::vector<int64_t> displayIds;
1070     std::vector<PhysicalDisplayId> physicalDisplayIds;
1071     binder::Status status =
1072             ComposerServiceAIDL::getComposerService()->getPhysicalDisplayIds(&displayIds);
1073     if (status.isOk()) {
1074         physicalDisplayIds.reserve(displayIds.size());
1075         for (auto item : displayIds) {
1076             auto id = DisplayId::fromValue<PhysicalDisplayId>(static_cast<uint64_t>(item));
1077             physicalDisplayIds.push_back(*id);
1078         }
1079     }
1080     return physicalDisplayIds;
1081 }
1082 
getPrimaryPhysicalDisplayId(PhysicalDisplayId * id)1083 status_t SurfaceComposerClient::getPrimaryPhysicalDisplayId(PhysicalDisplayId* id) {
1084     int64_t displayId;
1085     binder::Status status =
1086             ComposerServiceAIDL::getComposerService()->getPrimaryPhysicalDisplayId(&displayId);
1087     if (status.isOk()) {
1088         *id = *DisplayId::fromValue<PhysicalDisplayId>(static_cast<uint64_t>(displayId));
1089     }
1090     return status.transactionError();
1091 }
1092 
getInternalDisplayId()1093 std::optional<PhysicalDisplayId> SurfaceComposerClient::getInternalDisplayId() {
1094     ComposerServiceAIDL& instance = ComposerServiceAIDL::getInstance();
1095     return instance.getInternalDisplayId();
1096 }
1097 
getPhysicalDisplayToken(PhysicalDisplayId displayId)1098 sp<IBinder> SurfaceComposerClient::getPhysicalDisplayToken(PhysicalDisplayId displayId) {
1099     sp<IBinder> display = nullptr;
1100     binder::Status status =
1101             ComposerServiceAIDL::getComposerService()->getPhysicalDisplayToken(displayId.value,
1102                                                                                &display);
1103     return status.isOk() ? display : nullptr;
1104 }
1105 
getInternalDisplayToken()1106 sp<IBinder> SurfaceComposerClient::getInternalDisplayToken() {
1107     ComposerServiceAIDL& instance = ComposerServiceAIDL::getInstance();
1108     return instance.getInternalDisplayToken();
1109 }
1110 
setAnimationTransaction()1111 void SurfaceComposerClient::Transaction::setAnimationTransaction() {
1112     mAnimation = true;
1113 }
1114 
setEarlyWakeupStart()1115 void SurfaceComposerClient::Transaction::setEarlyWakeupStart() {
1116     mEarlyWakeupStart = true;
1117 }
1118 
setEarlyWakeupEnd()1119 void SurfaceComposerClient::Transaction::setEarlyWakeupEnd() {
1120     mEarlyWakeupEnd = true;
1121 }
1122 
getLayerState(const sp<SurfaceControl> & sc)1123 layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
1124     auto handle = sc->getLayerStateHandle();
1125 
1126     if (mComposerStates.count(handle) == 0) {
1127         // we don't have it, add an initialized layer_state to our list
1128         ComposerState s;
1129 
1130         s.state.surface = handle;
1131         s.state.layerId = sc->getLayerId();
1132 
1133         mComposerStates[handle] = s;
1134     }
1135 
1136     return &(mComposerStates[handle].state);
1137 }
1138 
registerSurfaceControlForCallback(const sp<SurfaceControl> & sc)1139 void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
1140         const sp<SurfaceControl>& sc) {
1141     auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
1142     callbackInfo.surfaceControls.insert(sc);
1143 
1144     TransactionCompletedListener::getInstance()
1145             ->addSurfaceControlToCallbacks(sc, callbackInfo.callbackIds);
1146 }
1147 
setPosition(const sp<SurfaceControl> & sc,float x,float y)1148 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
1149         const sp<SurfaceControl>& sc, float x, float y) {
1150     layer_state_t* s = getLayerState(sc);
1151     if (!s) {
1152         mStatus = BAD_INDEX;
1153         return *this;
1154     }
1155     s->what |= layer_state_t::ePositionChanged;
1156     s->x = x;
1157     s->y = y;
1158 
1159     registerSurfaceControlForCallback(sc);
1160     return *this;
1161 }
1162 
show(const sp<SurfaceControl> & sc)1163 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
1164         const sp<SurfaceControl>& sc) {
1165     return setFlags(sc, 0, layer_state_t::eLayerHidden);
1166 }
1167 
hide(const sp<SurfaceControl> & sc)1168 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
1169         const sp<SurfaceControl>& sc) {
1170     return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
1171 }
1172 
setSize(const sp<SurfaceControl> & sc,uint32_t w,uint32_t h)1173 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
1174         const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
1175     layer_state_t* s = getLayerState(sc);
1176     if (!s) {
1177         mStatus = BAD_INDEX;
1178         return *this;
1179     }
1180     s->what |= layer_state_t::eSizeChanged;
1181     s->w = w;
1182     s->h = h;
1183 
1184     registerSurfaceControlForCallback(sc);
1185     return *this;
1186 }
1187 
setLayer(const sp<SurfaceControl> & sc,int32_t z)1188 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
1189         const sp<SurfaceControl>& sc, int32_t z) {
1190     layer_state_t* s = getLayerState(sc);
1191     if (!s) {
1192         mStatus = BAD_INDEX;
1193         return *this;
1194     }
1195     s->what |= layer_state_t::eLayerChanged;
1196     s->what &= ~layer_state_t::eRelativeLayerChanged;
1197     s->z = z;
1198 
1199     registerSurfaceControlForCallback(sc);
1200     return *this;
1201 }
1202 
setRelativeLayer(const sp<SurfaceControl> & sc,const sp<SurfaceControl> & relativeTo,int32_t z)1203 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(
1204         const sp<SurfaceControl>& sc, const sp<SurfaceControl>& relativeTo, int32_t z) {
1205     layer_state_t* s = getLayerState(sc);
1206     if (!s) {
1207         mStatus = BAD_INDEX;
1208         return *this;
1209     }
1210     s->what |= layer_state_t::eRelativeLayerChanged;
1211     s->what &= ~layer_state_t::eLayerChanged;
1212     s->relativeLayerSurfaceControl = relativeTo;
1213     s->z = z;
1214 
1215     registerSurfaceControlForCallback(sc);
1216     return *this;
1217 }
1218 
setFlags(const sp<SurfaceControl> & sc,uint32_t flags,uint32_t mask)1219 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
1220         const sp<SurfaceControl>& sc, uint32_t flags,
1221         uint32_t mask) {
1222     layer_state_t* s = getLayerState(sc);
1223     if (!s) {
1224         mStatus = BAD_INDEX;
1225         return *this;
1226     }
1227     if ((mask & layer_state_t::eLayerOpaque) || (mask & layer_state_t::eLayerHidden) ||
1228         (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) ||
1229         (mask & layer_state_t::eEnableBackpressure) ||
1230         (mask & layer_state_t::eLayerIsDisplayDecoration)) {
1231         s->what |= layer_state_t::eFlagsChanged;
1232     }
1233     s->flags &= ~mask;
1234     s->flags |= (flags & mask);
1235     s->mask |= mask;
1236 
1237     registerSurfaceControlForCallback(sc);
1238     return *this;
1239 }
1240 
setTransparentRegionHint(const sp<SurfaceControl> & sc,const Region & transparentRegion)1241 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
1242         const sp<SurfaceControl>& sc,
1243         const Region& transparentRegion) {
1244     layer_state_t* s = getLayerState(sc);
1245     if (!s) {
1246         mStatus = BAD_INDEX;
1247         return *this;
1248     }
1249     s->what |= layer_state_t::eTransparentRegionChanged;
1250     s->transparentRegion = transparentRegion;
1251 
1252     registerSurfaceControlForCallback(sc);
1253     return *this;
1254 }
1255 
setDimmingEnabled(const sp<SurfaceControl> & sc,bool dimmingEnabled)1256 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDimmingEnabled(
1257         const sp<SurfaceControl>& sc, bool dimmingEnabled) {
1258     layer_state_t* s = getLayerState(sc);
1259     if (!s) {
1260         mStatus = BAD_INDEX;
1261         return *this;
1262     }
1263     s->what |= layer_state_t::eDimmingEnabledChanged;
1264     s->dimmingEnabled = dimmingEnabled;
1265 
1266     registerSurfaceControlForCallback(sc);
1267     return *this;
1268 }
1269 
setAlpha(const sp<SurfaceControl> & sc,float alpha)1270 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
1271         const sp<SurfaceControl>& sc, float alpha) {
1272     layer_state_t* s = getLayerState(sc);
1273     if (!s) {
1274         mStatus = BAD_INDEX;
1275         return *this;
1276     }
1277     if (alpha < 0.0f || alpha > 1.0f) {
1278         ALOGE("SurfaceComposerClient::Transaction::setAlpha: invalid alpha %f, clamping", alpha);
1279     }
1280     s->what |= layer_state_t::eAlphaChanged;
1281     s->alpha = std::clamp(alpha, 0.f, 1.f);
1282 
1283     registerSurfaceControlForCallback(sc);
1284     return *this;
1285 }
1286 
setLayerStack(const sp<SurfaceControl> & sc,ui::LayerStack layerStack)1287 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
1288         const sp<SurfaceControl>& sc, ui::LayerStack layerStack) {
1289     layer_state_t* s = getLayerState(sc);
1290     if (!s) {
1291         mStatus = BAD_INDEX;
1292         return *this;
1293     }
1294     s->what |= layer_state_t::eLayerStackChanged;
1295     s->layerStack = layerStack;
1296 
1297     registerSurfaceControlForCallback(sc);
1298     return *this;
1299 }
1300 
setMetadata(const sp<SurfaceControl> & sc,uint32_t key,const Parcel & p)1301 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMetadata(
1302         const sp<SurfaceControl>& sc, uint32_t key, const Parcel& p) {
1303     layer_state_t* s = getLayerState(sc);
1304     if (!s) {
1305         mStatus = BAD_INDEX;
1306         return *this;
1307     }
1308     s->what |= layer_state_t::eMetadataChanged;
1309 
1310     s->metadata.mMap[key] = {p.data(), p.data() + p.dataSize()};
1311 
1312     registerSurfaceControlForCallback(sc);
1313     return *this;
1314 }
1315 
setMatrix(const sp<SurfaceControl> & sc,float dsdx,float dtdx,float dtdy,float dsdy)1316 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
1317         const sp<SurfaceControl>& sc, float dsdx, float dtdx,
1318         float dtdy, float dsdy) {
1319     layer_state_t* s = getLayerState(sc);
1320     if (!s) {
1321         mStatus = BAD_INDEX;
1322         return *this;
1323     }
1324     s->what |= layer_state_t::eMatrixChanged;
1325     layer_state_t::matrix22_t matrix;
1326     matrix.dsdx = dsdx;
1327     matrix.dtdx = dtdx;
1328     matrix.dsdy = dsdy;
1329     matrix.dtdy = dtdy;
1330     s->matrix = matrix;
1331 
1332     registerSurfaceControlForCallback(sc);
1333     return *this;
1334 }
1335 
setCrop(const sp<SurfaceControl> & sc,const Rect & crop)1336 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
1337         const sp<SurfaceControl>& sc, const Rect& crop) {
1338     layer_state_t* s = getLayerState(sc);
1339     if (!s) {
1340         mStatus = BAD_INDEX;
1341         return *this;
1342     }
1343     s->what |= layer_state_t::eCropChanged;
1344     s->crop = crop;
1345 
1346     registerSurfaceControlForCallback(sc);
1347     return *this;
1348 }
1349 
setCornerRadius(const sp<SurfaceControl> & sc,float cornerRadius)1350 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCornerRadius(
1351         const sp<SurfaceControl>& sc, float cornerRadius) {
1352     layer_state_t* s = getLayerState(sc);
1353     if (!s) {
1354         mStatus = BAD_INDEX;
1355         return *this;
1356     }
1357     s->what |= layer_state_t::eCornerRadiusChanged;
1358     s->cornerRadius = cornerRadius;
1359     return *this;
1360 }
1361 
setBackgroundBlurRadius(const sp<SurfaceControl> & sc,int backgroundBlurRadius)1362 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundBlurRadius(
1363         const sp<SurfaceControl>& sc, int backgroundBlurRadius) {
1364     layer_state_t* s = getLayerState(sc);
1365     if (!s) {
1366         mStatus = BAD_INDEX;
1367         return *this;
1368     }
1369     s->what |= layer_state_t::eBackgroundBlurRadiusChanged;
1370     s->backgroundBlurRadius = backgroundBlurRadius;
1371     return *this;
1372 }
1373 
setBlurRegions(const sp<SurfaceControl> & sc,const std::vector<BlurRegion> & blurRegions)1374 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBlurRegions(
1375         const sp<SurfaceControl>& sc, const std::vector<BlurRegion>& blurRegions) {
1376     layer_state_t* s = getLayerState(sc);
1377     if (!s) {
1378         mStatus = BAD_INDEX;
1379         return *this;
1380     }
1381     s->what |= layer_state_t::eBlurRegionsChanged;
1382     s->blurRegions = blurRegions;
1383     return *this;
1384 }
1385 
reparent(const sp<SurfaceControl> & sc,const sp<SurfaceControl> & newParent)1386 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
1387         const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
1388     layer_state_t* s = getLayerState(sc);
1389     if (!s) {
1390         mStatus = BAD_INDEX;
1391         return *this;
1392     }
1393     if (SurfaceControl::isSameSurface(sc, newParent)) {
1394         return *this;
1395     }
1396     s->what |= layer_state_t::eReparent;
1397     s->parentSurfaceControlForChild = newParent ? newParent->getParentingLayer() : nullptr;
1398 
1399     registerSurfaceControlForCallback(sc);
1400     return *this;
1401 }
1402 
setColor(const sp<SurfaceControl> & sc,const half3 & color)1403 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
1404         const sp<SurfaceControl>& sc,
1405         const half3& color) {
1406     layer_state_t* s = getLayerState(sc);
1407     if (!s) {
1408         mStatus = BAD_INDEX;
1409         return *this;
1410     }
1411     s->what |= layer_state_t::eColorChanged;
1412     s->color = color;
1413 
1414     registerSurfaceControlForCallback(sc);
1415     return *this;
1416 }
1417 
setBackgroundColor(const sp<SurfaceControl> & sc,const half3 & color,float alpha,ui::Dataspace dataspace)1418 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundColor(
1419         const sp<SurfaceControl>& sc, const half3& color, float alpha, ui::Dataspace dataspace) {
1420     layer_state_t* s = getLayerState(sc);
1421     if (!s) {
1422         mStatus = BAD_INDEX;
1423         return *this;
1424     }
1425 
1426     s->what |= layer_state_t::eBackgroundColorChanged;
1427     s->color = color;
1428     s->bgColorAlpha = alpha;
1429     s->bgColorDataspace = dataspace;
1430 
1431     registerSurfaceControlForCallback(sc);
1432     return *this;
1433 }
1434 
setTransform(const sp<SurfaceControl> & sc,uint32_t transform)1435 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransform(
1436         const sp<SurfaceControl>& sc, uint32_t transform) {
1437     layer_state_t* s = getLayerState(sc);
1438     if (!s) {
1439         mStatus = BAD_INDEX;
1440         return *this;
1441     }
1442     s->what |= layer_state_t::eTransformChanged;
1443     s->transform = transform;
1444 
1445     registerSurfaceControlForCallback(sc);
1446     return *this;
1447 }
1448 
1449 SurfaceComposerClient::Transaction&
setTransformToDisplayInverse(const sp<SurfaceControl> & sc,bool transformToDisplayInverse)1450 SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<SurfaceControl>& sc,
1451                                                                  bool transformToDisplayInverse) {
1452     layer_state_t* s = getLayerState(sc);
1453     if (!s) {
1454         mStatus = BAD_INDEX;
1455         return *this;
1456     }
1457     s->what |= layer_state_t::eTransformToDisplayInverseChanged;
1458     s->transformToDisplayInverse = transformToDisplayInverse;
1459 
1460     registerSurfaceControlForCallback(sc);
1461     return *this;
1462 }
1463 
getAndClearBuffer(const sp<SurfaceControl> & sc)1464 std::shared_ptr<BufferData> SurfaceComposerClient::Transaction::getAndClearBuffer(
1465         const sp<SurfaceControl>& sc) {
1466     layer_state_t* s = getLayerState(sc);
1467     if (!s) {
1468         return nullptr;
1469     }
1470     if (!(s->what & layer_state_t::eBufferChanged)) {
1471         return nullptr;
1472     }
1473 
1474     std::shared_ptr<BufferData> bufferData = std::move(s->bufferData);
1475 
1476     TransactionCompletedListener::getInstance()->removeReleaseBufferCallback(
1477             bufferData->generateReleaseCallbackId());
1478     s->what &= ~layer_state_t::eBufferChanged;
1479     s->bufferData = nullptr;
1480 
1481     mContainsBuffer = false;
1482     return bufferData;
1483 }
1484 
setBufferHasBarrier(const sp<SurfaceControl> & sc,uint64_t barrierFrameNumber)1485 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBufferHasBarrier(
1486         const sp<SurfaceControl>& sc, uint64_t barrierFrameNumber) {
1487     layer_state_t* s = getLayerState(sc);
1488     if (!s) {
1489         mStatus = BAD_INDEX;
1490         return *this;
1491     }
1492     s->bufferData->hasBarrier = true;
1493     s->bufferData->barrierFrameNumber = barrierFrameNumber;
1494     return *this;
1495 }
1496 
setBuffer(const sp<SurfaceControl> & sc,const sp<GraphicBuffer> & buffer,const std::optional<sp<Fence>> & fence,const std::optional<uint64_t> & optFrameNumber,ReleaseBufferCallback callback)1497 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
1498         const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
1499         const std::optional<sp<Fence>>& fence, const std::optional<uint64_t>& optFrameNumber,
1500         ReleaseBufferCallback callback) {
1501     layer_state_t* s = getLayerState(sc);
1502     if (!s) {
1503         mStatus = BAD_INDEX;
1504         return *this;
1505     }
1506 
1507     releaseBufferIfOverwriting(*s);
1508 
1509     if (buffer == nullptr) {
1510         s->what &= ~layer_state_t::eBufferChanged;
1511         s->bufferData = nullptr;
1512         mContainsBuffer = false;
1513         return *this;
1514     }
1515 
1516     std::shared_ptr<BufferData> bufferData = std::make_shared<BufferData>();
1517     bufferData->buffer = buffer;
1518     uint64_t frameNumber = sc->resolveFrameNumber(optFrameNumber);
1519     bufferData->frameNumber = frameNumber;
1520     bufferData->flags |= BufferData::BufferDataChange::frameNumberChanged;
1521     if (fence) {
1522         bufferData->acquireFence = *fence;
1523         bufferData->flags |= BufferData::BufferDataChange::fenceChanged;
1524     }
1525     bufferData->releaseBufferEndpoint =
1526             IInterface::asBinder(TransactionCompletedListener::getIInstance());
1527     if (mIsAutoTimestamp) {
1528         mDesiredPresentTime = systemTime();
1529     }
1530     setReleaseBufferCallback(bufferData.get(), callback);
1531     s->what |= layer_state_t::eBufferChanged;
1532     s->bufferData = std::move(bufferData);
1533     registerSurfaceControlForCallback(sc);
1534 
1535     // With the current infrastructure, a release callback will not be invoked if there's no
1536     // transaction callback in the case when a buffer is latched and not released early. This is
1537     // because the legacy implementation didn't have a release callback and sent releases in the
1538     // transaction callback. Because of this, we need to make sure to have a transaction callback
1539     // set up when a buffer is sent in a transaction to ensure the caller gets the release
1540     // callback, regardless if they set up a transaction callback.
1541     //
1542     // TODO (b/230380821): Remove when release callbacks are separated from transaction callbacks
1543     addTransactionCompletedCallback([](void*, nsecs_t, const sp<Fence>&,
1544                                        const std::vector<SurfaceControlStats>&) {},
1545                                     nullptr);
1546 
1547     mContainsBuffer = true;
1548     return *this;
1549 }
1550 
setReleaseBufferCallback(BufferData * bufferData,ReleaseBufferCallback callback)1551 void SurfaceComposerClient::Transaction::setReleaseBufferCallback(BufferData* bufferData,
1552                                                                   ReleaseBufferCallback callback) {
1553     if (!callback) {
1554         return;
1555     }
1556 
1557     if (!bufferData->buffer) {
1558         ALOGW("Transaction::setReleaseBufferCallback"
1559               "ignored trying to set a callback on a null buffer.");
1560         return;
1561     }
1562 
1563     bufferData->releaseBufferListener = TransactionCompletedListener::getIInstance();
1564     auto listener = TransactionCompletedListener::getInstance();
1565     listener->setReleaseBufferCallback(bufferData->generateReleaseCallbackId(), callback);
1566 }
1567 
setDataspace(const sp<SurfaceControl> & sc,ui::Dataspace dataspace)1568 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDataspace(
1569         const sp<SurfaceControl>& sc, ui::Dataspace dataspace) {
1570     layer_state_t* s = getLayerState(sc);
1571     if (!s) {
1572         mStatus = BAD_INDEX;
1573         return *this;
1574     }
1575     s->what |= layer_state_t::eDataspaceChanged;
1576     s->dataspace = dataspace;
1577 
1578     registerSurfaceControlForCallback(sc);
1579     return *this;
1580 }
1581 
setHdrMetadata(const sp<SurfaceControl> & sc,const HdrMetadata & hdrMetadata)1582 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMetadata(
1583         const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata) {
1584     layer_state_t* s = getLayerState(sc);
1585     if (!s) {
1586         mStatus = BAD_INDEX;
1587         return *this;
1588     }
1589     s->what |= layer_state_t::eHdrMetadataChanged;
1590     s->hdrMetadata = hdrMetadata;
1591 
1592     registerSurfaceControlForCallback(sc);
1593     return *this;
1594 }
1595 
setSurfaceDamageRegion(const sp<SurfaceControl> & sc,const Region & surfaceDamageRegion)1596 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSurfaceDamageRegion(
1597         const sp<SurfaceControl>& sc, const Region& surfaceDamageRegion) {
1598     layer_state_t* s = getLayerState(sc);
1599     if (!s) {
1600         mStatus = BAD_INDEX;
1601         return *this;
1602     }
1603     s->what |= layer_state_t::eSurfaceDamageRegionChanged;
1604     s->surfaceDamageRegion = surfaceDamageRegion;
1605 
1606     registerSurfaceControlForCallback(sc);
1607     return *this;
1608 }
1609 
setApi(const sp<SurfaceControl> & sc,int32_t api)1610 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApi(
1611         const sp<SurfaceControl>& sc, int32_t api) {
1612     layer_state_t* s = getLayerState(sc);
1613     if (!s) {
1614         mStatus = BAD_INDEX;
1615         return *this;
1616     }
1617     s->what |= layer_state_t::eApiChanged;
1618     s->api = api;
1619 
1620     registerSurfaceControlForCallback(sc);
1621     return *this;
1622 }
1623 
setSidebandStream(const sp<SurfaceControl> & sc,const sp<NativeHandle> & sidebandStream)1624 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSidebandStream(
1625         const sp<SurfaceControl>& sc, const sp<NativeHandle>& sidebandStream) {
1626     layer_state_t* s = getLayerState(sc);
1627     if (!s) {
1628         mStatus = BAD_INDEX;
1629         return *this;
1630     }
1631     s->what |= layer_state_t::eSidebandStreamChanged;
1632     s->sidebandStream = sidebandStream;
1633 
1634     registerSurfaceControlForCallback(sc);
1635     return *this;
1636 }
1637 
setDesiredPresentTime(nsecs_t desiredPresentTime)1638 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDesiredPresentTime(
1639         nsecs_t desiredPresentTime) {
1640     mDesiredPresentTime = desiredPresentTime;
1641     mIsAutoTimestamp = false;
1642     return *this;
1643 }
1644 
setColorSpaceAgnostic(const sp<SurfaceControl> & sc,const bool agnostic)1645 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorSpaceAgnostic(
1646         const sp<SurfaceControl>& sc, const bool agnostic) {
1647     layer_state_t* s = getLayerState(sc);
1648     if (!s) {
1649         mStatus = BAD_INDEX;
1650         return *this;
1651     }
1652     s->what |= layer_state_t::eColorSpaceAgnosticChanged;
1653     s->colorSpaceAgnostic = agnostic;
1654 
1655     registerSurfaceControlForCallback(sc);
1656     return *this;
1657 }
1658 
1659 SurfaceComposerClient::Transaction&
setFrameRateSelectionPriority(const sp<SurfaceControl> & sc,int32_t priority)1660 SurfaceComposerClient::Transaction::setFrameRateSelectionPriority(const sp<SurfaceControl>& sc,
1661                                                                   int32_t priority) {
1662     layer_state_t* s = getLayerState(sc);
1663     if (!s) {
1664         mStatus = BAD_INDEX;
1665         return *this;
1666     }
1667 
1668     s->what |= layer_state_t::eFrameRateSelectionPriority;
1669     s->frameRateSelectionPriority = priority;
1670 
1671     registerSurfaceControlForCallback(sc);
1672     return *this;
1673 }
1674 
addTransactionCallback(TransactionCompletedCallbackTakesContext callback,void * callbackContext,CallbackId::Type callbackType)1675 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::addTransactionCallback(
1676         TransactionCompletedCallbackTakesContext callback, void* callbackContext,
1677         CallbackId::Type callbackType) {
1678     auto listener = TransactionCompletedListener::getInstance();
1679 
1680     auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
1681                                          std::placeholders::_2, std::placeholders::_3);
1682     const auto& surfaceControls =
1683             mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;
1684 
1685     CallbackId callbackId =
1686             listener->addCallbackFunction(callbackWithContext, surfaceControls, callbackType);
1687 
1688     mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
1689             callbackId);
1690     return *this;
1691 }
1692 
1693 SurfaceComposerClient::Transaction&
addTransactionCompletedCallback(TransactionCompletedCallbackTakesContext callback,void * callbackContext)1694 SurfaceComposerClient::Transaction::addTransactionCompletedCallback(
1695         TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
1696     return addTransactionCallback(callback, callbackContext, CallbackId::Type::ON_COMPLETE);
1697 }
1698 
1699 SurfaceComposerClient::Transaction&
addTransactionCommittedCallback(TransactionCompletedCallbackTakesContext callback,void * callbackContext)1700 SurfaceComposerClient::Transaction::addTransactionCommittedCallback(
1701         TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
1702     return addTransactionCallback(callback, callbackContext, CallbackId::Type::ON_COMMIT);
1703 }
1704 
notifyProducerDisconnect(const sp<SurfaceControl> & sc)1705 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::notifyProducerDisconnect(
1706         const sp<SurfaceControl>& sc) {
1707     layer_state_t* s = getLayerState(sc);
1708     if (!s) {
1709         mStatus = BAD_INDEX;
1710         return *this;
1711     }
1712 
1713     s->what |= layer_state_t::eProducerDisconnect;
1714     return *this;
1715 }
1716 
setInputWindowInfo(const sp<SurfaceControl> & sc,const WindowInfo & info)1717 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setInputWindowInfo(
1718         const sp<SurfaceControl>& sc, const WindowInfo& info) {
1719     layer_state_t* s = getLayerState(sc);
1720     if (!s) {
1721         mStatus = BAD_INDEX;
1722         return *this;
1723     }
1724     s->windowInfoHandle = new WindowInfoHandle(info);
1725     s->what |= layer_state_t::eInputInfoChanged;
1726     return *this;
1727 }
1728 
setFocusedWindow(const FocusRequest & request)1729 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFocusedWindow(
1730         const FocusRequest& request) {
1731     mInputWindowCommands.focusRequests.push_back(request);
1732     return *this;
1733 }
1734 
syncInputWindows()1735 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
1736     mInputWindowCommands.syncInputWindows = true;
1737     return *this;
1738 }
1739 
setColorTransform(const sp<SurfaceControl> & sc,const mat3 & matrix,const vec3 & translation)1740 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
1741     const sp<SurfaceControl>& sc, const mat3& matrix, const vec3& translation) {
1742     layer_state_t* s = getLayerState(sc);
1743     if (!s) {
1744         mStatus = BAD_INDEX;
1745         return *this;
1746     }
1747     s->what |= layer_state_t::eColorTransformChanged;
1748     s->colorTransform = mat4(matrix, translation);
1749 
1750     registerSurfaceControlForCallback(sc);
1751     return *this;
1752 }
1753 
setGeometry(const sp<SurfaceControl> & sc,const Rect & source,const Rect & dst,int transform)1754 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometry(
1755         const sp<SurfaceControl>& sc, const Rect& source, const Rect& dst, int transform) {
1756     setCrop(sc, source);
1757 
1758     int x = dst.left;
1759     int y = dst.top;
1760 
1761     float sourceWidth = source.getWidth();
1762     float sourceHeight = source.getHeight();
1763 
1764     float xScale = sourceWidth < 0 ? 1.0f : dst.getWidth() / sourceWidth;
1765     float yScale = sourceHeight < 0 ? 1.0f : dst.getHeight() / sourceHeight;
1766     float matrix[4] = {1, 0, 0, 1};
1767 
1768     switch (transform) {
1769         case NATIVE_WINDOW_TRANSFORM_FLIP_H:
1770             matrix[0] = -xScale; matrix[1] = 0;
1771             matrix[2] = 0; matrix[3] = yScale;
1772             x += source.getWidth();
1773             break;
1774         case NATIVE_WINDOW_TRANSFORM_FLIP_V:
1775             matrix[0] = xScale; matrix[1] = 0;
1776             matrix[2] = 0; matrix[3] = -yScale;
1777             y += source.getHeight();
1778             break;
1779         case NATIVE_WINDOW_TRANSFORM_ROT_90:
1780             matrix[0] = 0; matrix[1] = -yScale;
1781             matrix[2] = xScale; matrix[3] = 0;
1782             x += source.getHeight();
1783             break;
1784         case NATIVE_WINDOW_TRANSFORM_ROT_180:
1785             matrix[0] = -xScale; matrix[1] = 0;
1786             matrix[2] = 0; matrix[3] = -yScale;
1787             x += source.getWidth();
1788             y += source.getHeight();
1789             break;
1790         case NATIVE_WINDOW_TRANSFORM_ROT_270:
1791             matrix[0] = 0; matrix[1] = yScale;
1792             matrix[2] = -xScale; matrix[3] = 0;
1793             y += source.getWidth();
1794             break;
1795         default:
1796             matrix[0] = xScale; matrix[1] = 0;
1797             matrix[2] = 0; matrix[3] = yScale;
1798             break;
1799     }
1800     setMatrix(sc, matrix[0], matrix[1], matrix[2], matrix[3]);
1801     float offsetX = xScale * source.left;
1802     float offsetY = yScale * source.top;
1803     setPosition(sc, x - offsetX, y - offsetY);
1804 
1805     return *this;
1806 }
1807 
setShadowRadius(const sp<SurfaceControl> & sc,float shadowRadius)1808 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setShadowRadius(
1809         const sp<SurfaceControl>& sc, float shadowRadius) {
1810     layer_state_t* s = getLayerState(sc);
1811     if (!s) {
1812         mStatus = BAD_INDEX;
1813         return *this;
1814     }
1815     s->what |= layer_state_t::eShadowRadiusChanged;
1816     s->shadowRadius = shadowRadius;
1817     return *this;
1818 }
1819 
setFrameRate(const sp<SurfaceControl> & sc,float frameRate,int8_t compatibility,int8_t changeFrameRateStrategy)1820 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameRate(
1821         const sp<SurfaceControl>& sc, float frameRate, int8_t compatibility,
1822         int8_t changeFrameRateStrategy) {
1823     layer_state_t* s = getLayerState(sc);
1824     if (!s) {
1825         mStatus = BAD_INDEX;
1826         return *this;
1827     }
1828     // Allow privileged values as well here, those will be ignored by SF if
1829     // the caller is not privileged
1830     if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,
1831                            "Transaction::setFrameRate",
1832                            /*privileged=*/true)) {
1833         mStatus = BAD_VALUE;
1834         return *this;
1835     }
1836     s->what |= layer_state_t::eFrameRateChanged;
1837     s->frameRate = frameRate;
1838     s->frameRateCompatibility = compatibility;
1839     s->changeFrameRateStrategy = changeFrameRateStrategy;
1840     return *this;
1841 }
1842 
setFixedTransformHint(const sp<SurfaceControl> & sc,int32_t fixedTransformHint)1843 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFixedTransformHint(
1844         const sp<SurfaceControl>& sc, int32_t fixedTransformHint) {
1845     layer_state_t* s = getLayerState(sc);
1846     if (!s) {
1847         mStatus = BAD_INDEX;
1848         return *this;
1849     }
1850 
1851     const ui::Transform::RotationFlags transform = fixedTransformHint == -1
1852             ? ui::Transform::ROT_INVALID
1853             : ui::Transform::toRotationFlags(static_cast<ui::Rotation>(fixedTransformHint));
1854     s->what |= layer_state_t::eFixedTransformHintChanged;
1855     s->fixedTransformHint = transform;
1856     return *this;
1857 }
1858 
setFrameTimelineInfo(const FrameTimelineInfo & frameTimelineInfo)1859 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1860         const FrameTimelineInfo& frameTimelineInfo) {
1861     mFrameTimelineInfo.merge(frameTimelineInfo);
1862     return *this;
1863 }
1864 
setAutoRefresh(const sp<SurfaceControl> & sc,bool autoRefresh)1865 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAutoRefresh(
1866         const sp<SurfaceControl>& sc, bool autoRefresh) {
1867     layer_state_t* s = getLayerState(sc);
1868     if (!s) {
1869         mStatus = BAD_INDEX;
1870         return *this;
1871     }
1872 
1873     s->what |= layer_state_t::eAutoRefreshChanged;
1874     s->autoRefresh = autoRefresh;
1875     return *this;
1876 }
1877 
setTrustedOverlay(const sp<SurfaceControl> & sc,bool isTrustedOverlay)1878 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTrustedOverlay(
1879         const sp<SurfaceControl>& sc, bool isTrustedOverlay) {
1880     layer_state_t* s = getLayerState(sc);
1881     if (!s) {
1882         mStatus = BAD_INDEX;
1883         return *this;
1884     }
1885 
1886     s->what |= layer_state_t::eTrustedOverlayChanged;
1887     s->isTrustedOverlay = isTrustedOverlay;
1888     return *this;
1889 }
1890 
setApplyToken(const sp<IBinder> & applyToken)1891 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApplyToken(
1892         const sp<IBinder>& applyToken) {
1893     mApplyToken = applyToken;
1894     return *this;
1895 }
1896 
setStretchEffect(const sp<SurfaceControl> & sc,const StretchEffect & stretchEffect)1897 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setStretchEffect(
1898     const sp<SurfaceControl>& sc, const StretchEffect& stretchEffect) {
1899     layer_state_t* s = getLayerState(sc);
1900     if (!s) {
1901         mStatus = BAD_INDEX;
1902         return *this;
1903     }
1904 
1905     s->what |= layer_state_t::eStretchChanged;
1906     s->stretchEffect = stretchEffect;
1907     return *this;
1908 }
1909 
setBufferCrop(const sp<SurfaceControl> & sc,const Rect & bufferCrop)1910 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBufferCrop(
1911         const sp<SurfaceControl>& sc, const Rect& bufferCrop) {
1912     layer_state_t* s = getLayerState(sc);
1913     if (!s) {
1914         mStatus = BAD_INDEX;
1915         return *this;
1916     }
1917 
1918     s->what |= layer_state_t::eBufferCropChanged;
1919     s->bufferCrop = bufferCrop;
1920 
1921     registerSurfaceControlForCallback(sc);
1922     return *this;
1923 }
1924 
setDestinationFrame(const sp<SurfaceControl> & sc,const Rect & destinationFrame)1925 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDestinationFrame(
1926         const sp<SurfaceControl>& sc, const Rect& destinationFrame) {
1927     layer_state_t* s = getLayerState(sc);
1928     if (!s) {
1929         mStatus = BAD_INDEX;
1930         return *this;
1931     }
1932 
1933     s->what |= layer_state_t::eDestinationFrameChanged;
1934     s->destinationFrame = destinationFrame;
1935 
1936     registerSurfaceControlForCallback(sc);
1937     return *this;
1938 }
1939 
setDropInputMode(const sp<SurfaceControl> & sc,gui::DropInputMode mode)1940 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDropInputMode(
1941         const sp<SurfaceControl>& sc, gui::DropInputMode mode) {
1942     layer_state_t* s = getLayerState(sc);
1943     if (!s) {
1944         mStatus = BAD_INDEX;
1945         return *this;
1946     }
1947 
1948     s->what |= layer_state_t::eDropInputModeChanged;
1949     s->dropInputMode = mode;
1950 
1951     registerSurfaceControlForCallback(sc);
1952     return *this;
1953 }
1954 
1955 // ---------------------------------------------------------------------------
1956 
getDisplayState(const sp<IBinder> & token)1957 DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
1958     DisplayState s;
1959     s.token = token;
1960     ssize_t index = mDisplayStates.indexOf(s);
1961     if (index < 0) {
1962         // we don't have it, add an initialized layer_state to our list
1963         s.what = 0;
1964         index = mDisplayStates.add(s);
1965     }
1966     return mDisplayStates.editItemAt(static_cast<size_t>(index));
1967 }
1968 
setDisplaySurface(const sp<IBinder> & token,const sp<IGraphicBufferProducer> & bufferProducer)1969 status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
1970         const sp<IGraphicBufferProducer>& bufferProducer) {
1971     if (bufferProducer.get() != nullptr) {
1972         // Make sure that composition can never be stalled by a virtual display
1973         // consumer that isn't processing buffers fast enough.
1974         status_t err = bufferProducer->setAsyncMode(true);
1975         if (err != NO_ERROR) {
1976             ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
1977                     "BufferQueue. This BufferQueue cannot be used for virtual "
1978                     "display. (%d)", err);
1979             return err;
1980         }
1981     }
1982     DisplayState& s(getDisplayState(token));
1983     s.surface = bufferProducer;
1984     s.what |= DisplayState::eSurfaceChanged;
1985     return NO_ERROR;
1986 }
1987 
setDisplayLayerStack(const sp<IBinder> & token,ui::LayerStack layerStack)1988 void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
1989                                                               ui::LayerStack layerStack) {
1990     DisplayState& s(getDisplayState(token));
1991     s.layerStack = layerStack;
1992     s.what |= DisplayState::eLayerStackChanged;
1993 }
1994 
setDisplayFlags(const sp<IBinder> & token,uint32_t flags)1995 void SurfaceComposerClient::Transaction::setDisplayFlags(const sp<IBinder>& token, uint32_t flags) {
1996     DisplayState& s(getDisplayState(token));
1997     s.flags = flags;
1998     s.what |= DisplayState::eFlagsChanged;
1999 }
2000 
setDisplayProjection(const sp<IBinder> & token,ui::Rotation orientation,const Rect & layerStackRect,const Rect & displayRect)2001 void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
2002                                                               ui::Rotation orientation,
2003                                                               const Rect& layerStackRect,
2004                                                               const Rect& displayRect) {
2005     DisplayState& s(getDisplayState(token));
2006     s.orientation = orientation;
2007     s.layerStackSpaceRect = layerStackRect;
2008     s.orientedDisplaySpaceRect = displayRect;
2009     s.what |= DisplayState::eDisplayProjectionChanged;
2010     mForceSynchronous = true; // TODO: do we actually still need this?
2011 }
2012 
setDisplaySize(const sp<IBinder> & token,uint32_t width,uint32_t height)2013 void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
2014     DisplayState& s(getDisplayState(token));
2015     s.width = width;
2016     s.height = height;
2017     s.what |= DisplayState::eDisplaySizeChanged;
2018 }
2019 
2020 // ---------------------------------------------------------------------------
2021 
SurfaceComposerClient()2022 SurfaceComposerClient::SurfaceComposerClient() : mStatus(NO_INIT) {}
2023 
SurfaceComposerClient(const sp<ISurfaceComposerClient> & client)2024 SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
2025       : mStatus(NO_ERROR), mClient(client) {}
2026 
onFirstRef()2027 void SurfaceComposerClient::onFirstRef() {
2028     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2029     if (sf != nullptr && mStatus == NO_INIT) {
2030         sp<ISurfaceComposerClient> conn;
2031         conn = sf->createConnection();
2032         if (conn != nullptr) {
2033             mClient = conn;
2034             mStatus = NO_ERROR;
2035         }
2036     }
2037 }
2038 
~SurfaceComposerClient()2039 SurfaceComposerClient::~SurfaceComposerClient() {
2040     dispose();
2041 }
2042 
initCheck() const2043 status_t SurfaceComposerClient::initCheck() const {
2044     return mStatus;
2045 }
2046 
connection() const2047 sp<IBinder> SurfaceComposerClient::connection() const {
2048     return IInterface::asBinder(mClient);
2049 }
2050 
linkToComposerDeath(const sp<IBinder::DeathRecipient> & recipient,void * cookie,uint32_t flags)2051 status_t SurfaceComposerClient::linkToComposerDeath(
2052         const sp<IBinder::DeathRecipient>& recipient,
2053         void* cookie, uint32_t flags) {
2054     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2055     return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
2056 }
2057 
dispose()2058 void SurfaceComposerClient::dispose() {
2059     // this can be called more than once.
2060     sp<ISurfaceComposerClient> client;
2061     Mutex::Autolock _lm(mLock);
2062     if (mClient != nullptr) {
2063         client = mClient; // hold ref while lock is held
2064         mClient.clear();
2065     }
2066     mStatus = NO_INIT;
2067 }
2068 
createSurface(const String8 & name,uint32_t w,uint32_t h,PixelFormat format,uint32_t flags,const sp<IBinder> & parentHandle,LayerMetadata metadata,uint32_t * outTransformHint)2069 sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
2070                                                         PixelFormat format, uint32_t flags,
2071                                                         const sp<IBinder>& parentHandle,
2072                                                         LayerMetadata metadata,
2073                                                         uint32_t* outTransformHint) {
2074     sp<SurfaceControl> s;
2075     createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
2076                          outTransformHint);
2077     return s;
2078 }
2079 
createWithSurfaceParent(const String8 & name,uint32_t w,uint32_t h,PixelFormat format,uint32_t flags,Surface * parent,LayerMetadata metadata,uint32_t * outTransformHint)2080 sp<SurfaceControl> SurfaceComposerClient::createWithSurfaceParent(const String8& name, uint32_t w,
2081                                                                   uint32_t h, PixelFormat format,
2082                                                                   uint32_t flags, Surface* parent,
2083                                                                   LayerMetadata metadata,
2084                                                                   uint32_t* outTransformHint) {
2085     sp<SurfaceControl> sur;
2086     status_t err = mStatus;
2087 
2088     if (mStatus == NO_ERROR) {
2089         sp<IBinder> handle;
2090         sp<IGraphicBufferProducer> parentGbp = parent->getIGraphicBufferProducer();
2091         sp<IGraphicBufferProducer> gbp;
2092 
2093         uint32_t transformHint = 0;
2094         int32_t id = -1;
2095         err = mClient->createWithSurfaceParent(name, w, h, format, flags, parentGbp,
2096                                                std::move(metadata), &handle, &gbp, &id,
2097                                                &transformHint);
2098         if (outTransformHint) {
2099             *outTransformHint = transformHint;
2100         }
2101         ALOGE_IF(err, "SurfaceComposerClient::createWithSurfaceParent error %s", strerror(-err));
2102         if (err == NO_ERROR) {
2103             return new SurfaceControl(this, handle, gbp, id, transformHint);
2104         }
2105     }
2106     return nullptr;
2107 }
2108 
createSurfaceChecked(const String8 & name,uint32_t w,uint32_t h,PixelFormat format,sp<SurfaceControl> * outSurface,uint32_t flags,const sp<IBinder> & parentHandle,LayerMetadata metadata,uint32_t * outTransformHint)2109 status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
2110                                                      PixelFormat format,
2111                                                      sp<SurfaceControl>* outSurface, uint32_t flags,
2112                                                      const sp<IBinder>& parentHandle,
2113                                                      LayerMetadata metadata,
2114                                                      uint32_t* outTransformHint) {
2115     sp<SurfaceControl> sur;
2116     status_t err = mStatus;
2117 
2118     if (mStatus == NO_ERROR) {
2119         sp<IBinder> handle;
2120         sp<IGraphicBufferProducer> gbp;
2121 
2122         uint32_t transformHint = 0;
2123         int32_t id = -1;
2124         err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
2125                                      &handle, &gbp, &id, &transformHint);
2126 
2127         if (outTransformHint) {
2128             *outTransformHint = transformHint;
2129         }
2130         ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
2131         if (err == NO_ERROR) {
2132             *outSurface =
2133                     new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
2134         }
2135     }
2136     return err;
2137 }
2138 
mirrorSurface(SurfaceControl * mirrorFromSurface)2139 sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface) {
2140     if (mirrorFromSurface == nullptr) {
2141         return nullptr;
2142     }
2143 
2144     sp<IBinder> handle;
2145     sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
2146     int32_t layer_id = -1;
2147     status_t err = mClient->mirrorSurface(mirrorFromHandle, &handle, &layer_id);
2148     if (err == NO_ERROR) {
2149         return new SurfaceControl(this, handle, nullptr, layer_id, true /* owned */);
2150     }
2151     return nullptr;
2152 }
2153 
clearLayerFrameStats(const sp<IBinder> & token) const2154 status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
2155     if (mStatus != NO_ERROR) {
2156         return mStatus;
2157     }
2158     return mClient->clearLayerFrameStats(token);
2159 }
2160 
getLayerFrameStats(const sp<IBinder> & token,FrameStats * outStats) const2161 status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
2162         FrameStats* outStats) const {
2163     if (mStatus != NO_ERROR) {
2164         return mStatus;
2165     }
2166     return mClient->getLayerFrameStats(token, outStats);
2167 }
2168 
2169 // ----------------------------------------------------------------------------
2170 
enableVSyncInjections(bool enable)2171 status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
2172     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2173     return sf->enableVSyncInjections(enable);
2174 }
2175 
injectVSync(nsecs_t when)2176 status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
2177     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2178     return sf->injectVSync(when);
2179 }
2180 
getDisplayState(const sp<IBinder> & display,ui::DisplayState * state)2181 status_t SurfaceComposerClient::getDisplayState(const sp<IBinder>& display,
2182                                                 ui::DisplayState* state) {
2183     gui::DisplayState ds;
2184     binder::Status status =
2185             ComposerServiceAIDL::getComposerService()->getDisplayState(display, &ds);
2186     if (status.isOk()) {
2187         state->layerStack = ui::LayerStack::fromValue(ds.layerStack);
2188         state->orientation = static_cast<ui::Rotation>(ds.orientation);
2189         state->layerStackSpaceRect =
2190                 ui::Size(ds.layerStackSpaceRect.width, ds.layerStackSpaceRect.height);
2191     }
2192     return status.transactionError();
2193 }
2194 
getStaticDisplayInfo(const sp<IBinder> & display,ui::StaticDisplayInfo * info)2195 status_t SurfaceComposerClient::getStaticDisplayInfo(const sp<IBinder>& display,
2196                                                      ui::StaticDisplayInfo* info) {
2197     return ComposerService::getComposerService()->getStaticDisplayInfo(display, info);
2198 }
2199 
getDynamicDisplayInfo(const sp<IBinder> & display,ui::DynamicDisplayInfo * info)2200 status_t SurfaceComposerClient::getDynamicDisplayInfo(const sp<IBinder>& display,
2201                                                       ui::DynamicDisplayInfo* info) {
2202     return ComposerService::getComposerService()->getDynamicDisplayInfo(display, info);
2203 }
2204 
getActiveDisplayMode(const sp<IBinder> & display,ui::DisplayMode * mode)2205 status_t SurfaceComposerClient::getActiveDisplayMode(const sp<IBinder>& display,
2206                                                      ui::DisplayMode* mode) {
2207     ui::DynamicDisplayInfo info;
2208     status_t result = getDynamicDisplayInfo(display, &info);
2209     if (result != NO_ERROR) {
2210         return result;
2211     }
2212 
2213     if (const auto activeMode = info.getActiveDisplayMode()) {
2214         *mode = *activeMode;
2215         return NO_ERROR;
2216     }
2217 
2218     ALOGE("Active display mode not found.");
2219     return NAME_NOT_FOUND;
2220 }
2221 
setDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,ui::DisplayModeId defaultMode,bool allowGroupSwitching,float primaryRefreshRateMin,float primaryRefreshRateMax,float appRequestRefreshRateMin,float appRequestRefreshRateMax)2222 status_t SurfaceComposerClient::setDesiredDisplayModeSpecs(
2223         const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching,
2224         float primaryRefreshRateMin, float primaryRefreshRateMax, float appRequestRefreshRateMin,
2225         float appRequestRefreshRateMax) {
2226     return ComposerService::getComposerService()
2227             ->setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
2228                                          primaryRefreshRateMin, primaryRefreshRateMax,
2229                                          appRequestRefreshRateMin, appRequestRefreshRateMax);
2230 }
2231 
getDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,ui::DisplayModeId * outDefaultMode,bool * outAllowGroupSwitching,float * outPrimaryRefreshRateMin,float * outPrimaryRefreshRateMax,float * outAppRequestRefreshRateMin,float * outAppRequestRefreshRateMax)2232 status_t SurfaceComposerClient::getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
2233                                                            ui::DisplayModeId* outDefaultMode,
2234                                                            bool* outAllowGroupSwitching,
2235                                                            float* outPrimaryRefreshRateMin,
2236                                                            float* outPrimaryRefreshRateMax,
2237                                                            float* outAppRequestRefreshRateMin,
2238                                                            float* outAppRequestRefreshRateMax) {
2239     return ComposerService::getComposerService()
2240             ->getDesiredDisplayModeSpecs(displayToken, outDefaultMode, outAllowGroupSwitching,
2241                                          outPrimaryRefreshRateMin, outPrimaryRefreshRateMax,
2242                                          outAppRequestRefreshRateMin, outAppRequestRefreshRateMax);
2243 }
2244 
getDisplayNativePrimaries(const sp<IBinder> & display,ui::DisplayPrimaries & outPrimaries)2245 status_t SurfaceComposerClient::getDisplayNativePrimaries(const sp<IBinder>& display,
2246         ui::DisplayPrimaries& outPrimaries) {
2247     return ComposerService::getComposerService()->getDisplayNativePrimaries(display, outPrimaries);
2248 }
2249 
setActiveColorMode(const sp<IBinder> & display,ColorMode colorMode)2250 status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
2251         ColorMode colorMode) {
2252     return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
2253 }
2254 
getBootDisplayModeSupport(bool * support)2255 status_t SurfaceComposerClient::getBootDisplayModeSupport(bool* support) {
2256     binder::Status status =
2257             ComposerServiceAIDL::getComposerService()->getBootDisplayModeSupport(support);
2258     return status.transactionError();
2259 }
2260 
setBootDisplayMode(const sp<IBinder> & display,ui::DisplayModeId displayModeId)2261 status_t SurfaceComposerClient::setBootDisplayMode(const sp<IBinder>& display,
2262                                                    ui::DisplayModeId displayModeId) {
2263     return ComposerService::getComposerService()->setBootDisplayMode(display, displayModeId);
2264 }
2265 
clearBootDisplayMode(const sp<IBinder> & display)2266 status_t SurfaceComposerClient::clearBootDisplayMode(const sp<IBinder>& display) {
2267     binder::Status status =
2268             ComposerServiceAIDL::getComposerService()->clearBootDisplayMode(display);
2269     return status.transactionError();
2270 }
2271 
setOverrideFrameRate(uid_t uid,float frameRate)2272 status_t SurfaceComposerClient::setOverrideFrameRate(uid_t uid, float frameRate) {
2273     return ComposerService::getComposerService()->setOverrideFrameRate(uid, frameRate);
2274 }
2275 
setAutoLowLatencyMode(const sp<IBinder> & display,bool on)2276 void SurfaceComposerClient::setAutoLowLatencyMode(const sp<IBinder>& display, bool on) {
2277     ComposerServiceAIDL::getComposerService()->setAutoLowLatencyMode(display, on);
2278 }
2279 
setGameContentType(const sp<IBinder> & display,bool on)2280 void SurfaceComposerClient::setGameContentType(const sp<IBinder>& display, bool on) {
2281     ComposerServiceAIDL::getComposerService()->setGameContentType(display, on);
2282 }
2283 
setDisplayPowerMode(const sp<IBinder> & token,int mode)2284 void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
2285         int mode) {
2286     ComposerServiceAIDL::getComposerService()->setPowerMode(token, mode);
2287 }
2288 
getCompositionPreference(ui::Dataspace * defaultDataspace,ui::PixelFormat * defaultPixelFormat,ui::Dataspace * wideColorGamutDataspace,ui::PixelFormat * wideColorGamutPixelFormat)2289 status_t SurfaceComposerClient::getCompositionPreference(
2290         ui::Dataspace* defaultDataspace, ui::PixelFormat* defaultPixelFormat,
2291         ui::Dataspace* wideColorGamutDataspace, ui::PixelFormat* wideColorGamutPixelFormat) {
2292     return ComposerService::getComposerService()
2293             ->getCompositionPreference(defaultDataspace, defaultPixelFormat,
2294                                        wideColorGamutDataspace, wideColorGamutPixelFormat);
2295 }
2296 
getProtectedContentSupport()2297 bool SurfaceComposerClient::getProtectedContentSupport() {
2298     bool supported = false;
2299     ComposerService::getComposerService()->getProtectedContentSupport(&supported);
2300     return supported;
2301 }
2302 
clearAnimationFrameStats()2303 status_t SurfaceComposerClient::clearAnimationFrameStats() {
2304     return ComposerService::getComposerService()->clearAnimationFrameStats();
2305 }
2306 
getAnimationFrameStats(FrameStats * outStats)2307 status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
2308     return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
2309 }
2310 
overrideHdrTypes(const sp<IBinder> & display,const std::vector<ui::Hdr> & hdrTypes)2311 status_t SurfaceComposerClient::overrideHdrTypes(const sp<IBinder>& display,
2312                                                  const std::vector<ui::Hdr>& hdrTypes) {
2313     return ComposerService::getComposerService()->overrideHdrTypes(display, hdrTypes);
2314 }
2315 
onPullAtom(const int32_t atomId,std::string * outData,bool * success)2316 status_t SurfaceComposerClient::onPullAtom(const int32_t atomId, std::string* outData,
2317                                            bool* success) {
2318     return ComposerService::getComposerService()->onPullAtom(atomId, outData, success);
2319 }
2320 
getDisplayedContentSamplingAttributes(const sp<IBinder> & display,ui::PixelFormat * outFormat,ui::Dataspace * outDataspace,uint8_t * outComponentMask)2321 status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
2322                                                                       ui::PixelFormat* outFormat,
2323                                                                       ui::Dataspace* outDataspace,
2324                                                                       uint8_t* outComponentMask) {
2325     return ComposerService::getComposerService()
2326             ->getDisplayedContentSamplingAttributes(display, outFormat, outDataspace,
2327                                                     outComponentMask);
2328 }
2329 
setDisplayContentSamplingEnabled(const sp<IBinder> & display,bool enable,uint8_t componentMask,uint64_t maxFrames)2330 status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display,
2331                                                                  bool enable, uint8_t componentMask,
2332                                                                  uint64_t maxFrames) {
2333     return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable,
2334                                                                                    componentMask,
2335                                                                                    maxFrames);
2336 }
2337 
getDisplayedContentSample(const sp<IBinder> & display,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats)2338 status_t SurfaceComposerClient::getDisplayedContentSample(const sp<IBinder>& display,
2339                                                           uint64_t maxFrames, uint64_t timestamp,
2340                                                           DisplayedFrameStats* outStats) {
2341     return ComposerService::getComposerService()->getDisplayedContentSample(display, maxFrames,
2342                                                                             timestamp, outStats);
2343 }
2344 
isWideColorDisplay(const sp<IBinder> & display,bool * outIsWideColorDisplay)2345 status_t SurfaceComposerClient::isWideColorDisplay(const sp<IBinder>& display,
2346                                                    bool* outIsWideColorDisplay) {
2347     binder::Status status =
2348             ComposerServiceAIDL::getComposerService()->isWideColorDisplay(display,
2349                                                                           outIsWideColorDisplay);
2350     return status.transactionError();
2351 }
2352 
addRegionSamplingListener(const Rect & samplingArea,const sp<IBinder> & stopLayerHandle,const sp<IRegionSamplingListener> & listener)2353 status_t SurfaceComposerClient::addRegionSamplingListener(
2354         const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
2355         const sp<IRegionSamplingListener>& listener) {
2356     return ComposerService::getComposerService()->addRegionSamplingListener(samplingArea,
2357                                                                             stopLayerHandle,
2358                                                                             listener);
2359 }
2360 
removeRegionSamplingListener(const sp<IRegionSamplingListener> & listener)2361 status_t SurfaceComposerClient::removeRegionSamplingListener(
2362         const sp<IRegionSamplingListener>& listener) {
2363     return ComposerService::getComposerService()->removeRegionSamplingListener(listener);
2364 }
2365 
addFpsListener(int32_t taskId,const sp<gui::IFpsListener> & listener)2366 status_t SurfaceComposerClient::addFpsListener(int32_t taskId,
2367                                                const sp<gui::IFpsListener>& listener) {
2368     return ComposerService::getComposerService()->addFpsListener(taskId, listener);
2369 }
2370 
removeFpsListener(const sp<gui::IFpsListener> & listener)2371 status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& listener) {
2372     return ComposerService::getComposerService()->removeFpsListener(listener);
2373 }
2374 
addTunnelModeEnabledListener(const sp<gui::ITunnelModeEnabledListener> & listener)2375 status_t SurfaceComposerClient::addTunnelModeEnabledListener(
2376         const sp<gui::ITunnelModeEnabledListener>& listener) {
2377     return ComposerService::getComposerService()->addTunnelModeEnabledListener(listener);
2378 }
2379 
removeTunnelModeEnabledListener(const sp<gui::ITunnelModeEnabledListener> & listener)2380 status_t SurfaceComposerClient::removeTunnelModeEnabledListener(
2381         const sp<gui::ITunnelModeEnabledListener>& listener) {
2382     return ComposerService::getComposerService()->removeTunnelModeEnabledListener(listener);
2383 }
2384 
getDisplayBrightnessSupport(const sp<IBinder> & displayToken)2385 bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) {
2386     bool support = false;
2387     binder::Status status =
2388             ComposerServiceAIDL::getComposerService()->getDisplayBrightnessSupport(displayToken,
2389                                                                                    &support);
2390     return status.isOk() ? support : false;
2391 }
2392 
setDisplayBrightness(const sp<IBinder> & displayToken,const gui::DisplayBrightness & brightness)2393 status_t SurfaceComposerClient::setDisplayBrightness(const sp<IBinder>& displayToken,
2394                                                      const gui::DisplayBrightness& brightness) {
2395     binder::Status status =
2396             ComposerServiceAIDL::getComposerService()->setDisplayBrightness(displayToken,
2397                                                                             brightness);
2398     return status.transactionError();
2399 }
2400 
addHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)2401 status_t SurfaceComposerClient::addHdrLayerInfoListener(
2402         const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
2403     binder::Status status =
2404             ComposerServiceAIDL::getComposerService()->addHdrLayerInfoListener(displayToken,
2405                                                                                listener);
2406     return status.transactionError();
2407 }
2408 
removeHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)2409 status_t SurfaceComposerClient::removeHdrLayerInfoListener(
2410         const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
2411     binder::Status status =
2412             ComposerServiceAIDL::getComposerService()->removeHdrLayerInfoListener(displayToken,
2413                                                                                   listener);
2414     return status.transactionError();
2415 }
2416 
notifyPowerBoost(int32_t boostId)2417 status_t SurfaceComposerClient::notifyPowerBoost(int32_t boostId) {
2418     binder::Status status = ComposerServiceAIDL::getComposerService()->notifyPowerBoost(boostId);
2419     return status.transactionError();
2420 }
2421 
setGlobalShadowSettings(const half4 & ambientColor,const half4 & spotColor,float lightPosY,float lightPosZ,float lightRadius)2422 status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColor,
2423                                                         const half4& spotColor, float lightPosY,
2424                                                         float lightPosZ, float lightRadius) {
2425     return ComposerService::getComposerService()->setGlobalShadowSettings(ambientColor, spotColor,
2426                                                                           lightPosY, lightPosZ,
2427                                                                           lightRadius);
2428 }
2429 
getDisplayDecorationSupport(const sp<IBinder> & displayToken)2430 std::optional<DisplayDecorationSupport> SurfaceComposerClient::getDisplayDecorationSupport(
2431         const sp<IBinder>& displayToken) {
2432     std::optional<DisplayDecorationSupport> support;
2433     ComposerService::getComposerService()->getDisplayDecorationSupport(displayToken, &support);
2434     return support;
2435 }
2436 
getGPUContextPriority()2437 int SurfaceComposerClient::getGPUContextPriority() {
2438     return ComposerService::getComposerService()->getGPUContextPriority();
2439 }
2440 
addWindowInfosListener(const sp<WindowInfosListener> & windowInfosListener,std::pair<std::vector<gui::WindowInfo>,std::vector<gui::DisplayInfo>> * outInitialInfo)2441 status_t SurfaceComposerClient::addWindowInfosListener(
2442         const sp<WindowInfosListener>& windowInfosListener,
2443         std::pair<std::vector<gui::WindowInfo>, std::vector<gui::DisplayInfo>>* outInitialInfo) {
2444     return WindowInfosListenerReporter::getInstance()
2445             ->addWindowInfosListener(windowInfosListener, ComposerService::getComposerService(),
2446                                      outInitialInfo);
2447 }
2448 
removeWindowInfosListener(const sp<WindowInfosListener> & windowInfosListener)2449 status_t SurfaceComposerClient::removeWindowInfosListener(
2450         const sp<WindowInfosListener>& windowInfosListener) {
2451     return WindowInfosListenerReporter::getInstance()
2452             ->removeWindowInfosListener(windowInfosListener, ComposerService::getComposerService());
2453 }
2454 
2455 // ----------------------------------------------------------------------------
2456 
captureDisplay(const DisplayCaptureArgs & captureArgs,const sp<IScreenCaptureListener> & captureListener)2457 status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs,
2458                                           const sp<IScreenCaptureListener>& captureListener) {
2459     sp<gui::ISurfaceComposer> s(ComposerServiceAIDL::getComposerService());
2460     if (s == nullptr) return NO_INIT;
2461 
2462     binder::Status status = s->captureDisplay(captureArgs, captureListener);
2463     return status.transactionError();
2464 }
2465 
captureDisplay(DisplayId displayId,const sp<IScreenCaptureListener> & captureListener)2466 status_t ScreenshotClient::captureDisplay(DisplayId displayId,
2467                                           const sp<IScreenCaptureListener>& captureListener) {
2468     sp<gui::ISurfaceComposer> s(ComposerServiceAIDL::getComposerService());
2469     if (s == nullptr) return NO_INIT;
2470 
2471     binder::Status status = s->captureDisplayById(displayId.value, captureListener);
2472     return status.transactionError();
2473 }
2474 
captureLayers(const LayerCaptureArgs & captureArgs,const sp<IScreenCaptureListener> & captureListener)2475 status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs,
2476                                          const sp<IScreenCaptureListener>& captureListener) {
2477     sp<gui::ISurfaceComposer> s(ComposerServiceAIDL::getComposerService());
2478     if (s == nullptr) return NO_INIT;
2479 
2480     binder::Status status = s->captureLayers(captureArgs, captureListener);
2481     return status.transactionError();
2482 }
2483 
2484 // ---------------------------------------------------------------------------------
2485 
addReleaseCallback(const ReleaseCallbackId callbackId,sp<Fence> releaseFence)2486 void ReleaseCallbackThread::addReleaseCallback(const ReleaseCallbackId callbackId,
2487                                                sp<Fence> releaseFence) {
2488     std::scoped_lock<std::mutex> lock(mMutex);
2489     if (!mStarted) {
2490         mThread = std::thread(&ReleaseCallbackThread::threadMain, this);
2491         mStarted = true;
2492     }
2493 
2494     mCallbackInfos.emplace(callbackId, std::move(releaseFence));
2495     mReleaseCallbackPending.notify_one();
2496 }
2497 
threadMain()2498 void ReleaseCallbackThread::threadMain() {
2499     const auto listener = TransactionCompletedListener::getInstance();
2500     std::queue<std::tuple<const ReleaseCallbackId, const sp<Fence>>> callbackInfos;
2501     while (true) {
2502         {
2503             std::unique_lock<std::mutex> lock(mMutex);
2504             callbackInfos = std::move(mCallbackInfos);
2505             mCallbackInfos = {};
2506         }
2507 
2508         while (!callbackInfos.empty()) {
2509             auto [callbackId, releaseFence] = callbackInfos.front();
2510             listener->onReleaseBuffer(callbackId, std::move(releaseFence), UINT_MAX);
2511             callbackInfos.pop();
2512         }
2513 
2514         {
2515             std::unique_lock<std::mutex> lock(mMutex);
2516             if (mCallbackInfos.size() == 0) {
2517                 mReleaseCallbackPending.wait(lock);
2518             }
2519         }
2520     }
2521 }
2522 
2523 } // namespace android
2524