blob: 663944005033c01c75240a85810d5f97c361862c [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
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>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080020#include <sys/types.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080022#include <utils/Errors.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080023#include <utils/Log.h>
Mathias Agopiana67932f2011-04-20 14:20:59 -070024#include <utils/SortedVector.h>
25#include <utils/String8.h>
26#include <utils/threads.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080027
Marissa Wall7a9b6ff2018-08-21 17:26:20 -070028#include <binder/IPCThreadState.h>
Mathias Agopiana67932f2011-04-20 14:20:59 -070029#include <binder/IServiceManager.h>
Marissa Wall7a9b6ff2018-08-21 17:26:20 -070030#include <binder/ProcessState.h>
Mathias Agopian9cce3252010-02-09 17:46:37 -080031
Michael Wright28f24d02016-07-12 13:30:53 -070032#include <system/graphics.h>
33
Robert Carr673134e2017-01-09 19:48:38 -080034#include <gui/BufferItemConsumer.h>
Mathias Agopianabe815d2013-03-19 22:22:21 -070035#include <gui/CpuConsumer.h>
Mathias Agopiane3c697f2013-02-14 17:11:02 -080036#include <gui/IGraphicBufferProducer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080037#include <gui/ISurfaceComposer.h>
38#include <gui/ISurfaceComposerClient.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070039#include <gui/LayerState.h>
Robert Carr0d480722017-01-10 16:42:54 -080040#include <gui/Surface.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080041#include <gui/SurfaceComposerClient.h>
Marin Shalamanova7fe3042021-01-29 21:02:08 +010042#include <ui/DisplayMode.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010043#include <ui/DynamicDisplayInfo.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080044
Robert Carr2c358bf2018-08-08 15:58:15 -070045#ifndef NO_INPUT
46#include <input/InputWindow.h>
47#endif
48
Mathias Agopian41f673c2011-11-17 17:48:35 -080049#include <private/gui/ComposerService.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080050
Marissa Wall73411622019-01-25 10:45:41 -080051// This server size should always be smaller than the server cache size
52#define BUFFER_CACHE_MAX_SIZE 64
53
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080054namespace android {
Peiyong Lin9f034472018-03-28 15:29:00 -070055
56using ui::ColorMode;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080057// ---------------------------------------------------------------------------
58
Mathias Agopian7e27f052010-05-28 14:22:23 -070059ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
60
Mathias Agopianb7e930d2010-06-01 15:12:58 -070061ComposerService::ComposerService()
62: Singleton<ComposerService>() {
Andy McFadden6652b3e2012-09-06 18:45:56 -070063 Mutex::Autolock _l(mLock);
64 connectLocked();
65}
66
67void ComposerService::connectLocked() {
Mathias Agopianb7e930d2010-06-01 15:12:58 -070068 const String16 name("SurfaceFlinger");
69 while (getService(name, &mComposerService) != NO_ERROR) {
70 usleep(250000);
71 }
Yi Konga03e0442018-07-17 11:16:57 -070072 assert(mComposerService != nullptr);
Andy McFadden6652b3e2012-09-06 18:45:56 -070073
74 // Create the death listener.
75 class DeathObserver : public IBinder::DeathRecipient {
76 ComposerService& mComposerService;
77 virtual void binderDied(const wp<IBinder>& who) {
78 ALOGW("ComposerService remote (surfaceflinger) died [%p]",
79 who.unsafe_get());
80 mComposerService.composerServiceDied();
81 }
82 public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070083 explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
Andy McFadden6652b3e2012-09-06 18:45:56 -070084 };
85
86 mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
Marco Nelissen2ea926b2014-11-14 08:01:01 -080087 IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
Mathias Agopianb7e930d2010-06-01 15:12:58 -070088}
89
Andy McFadden6652b3e2012-09-06 18:45:56 -070090/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
91 ComposerService& instance = ComposerService::getInstance();
92 Mutex::Autolock _l(instance.mLock);
Yi Kong48a619f2018-06-05 16:34:59 -070093 if (instance.mComposerService == nullptr) {
Andy McFadden6652b3e2012-09-06 18:45:56 -070094 ComposerService::getInstance().connectLocked();
Yi Konga03e0442018-07-17 11:16:57 -070095 assert(instance.mComposerService != nullptr);
Andy McFadden6652b3e2012-09-06 18:45:56 -070096 ALOGD("ComposerService reconnected");
97 }
98 return instance.mComposerService;
99}
100
101void ComposerService::composerServiceDied()
102{
103 Mutex::Autolock _l(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -0700104 mComposerService = nullptr;
105 mDeathObserver = nullptr;
Mathias Agopianb7e930d2010-06-01 15:12:58 -0700106}
107
Robert Carrfb4d58b2019-01-15 09:21:27 -0800108class DefaultComposerClient: public Singleton<DefaultComposerClient> {
109 Mutex mLock;
110 sp<SurfaceComposerClient> mClient;
111 friend class Singleton<ComposerService>;
112public:
113 static sp<SurfaceComposerClient> getComposerClient() {
114 DefaultComposerClient& dc = DefaultComposerClient::getInstance();
115 Mutex::Autolock _l(dc.mLock);
116 if (dc.mClient == nullptr) {
117 dc.mClient = new SurfaceComposerClient;
118 }
119 return dc.mClient;
120 }
121};
122ANDROID_SINGLETON_STATIC_INSTANCE(DefaultComposerClient);
123
124
125sp<SurfaceComposerClient> SurfaceComposerClient::getDefault() {
126 return DefaultComposerClient::getComposerClient();
127}
128
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100129JankDataListener::~JankDataListener() {
130}
131
Mathias Agopian7e27f052010-05-28 14:22:23 -0700132// ---------------------------------------------------------------------------
133
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700134// TransactionCompletedListener does not use ANDROID_SINGLETON_STATIC_INSTANCE because it needs
135// to be able to return a sp<> to its instance to pass to SurfaceFlinger.
136// ANDROID_SINGLETON_STATIC_INSTANCE only allows a reference to an instance.
137
Marissa Wallc837b5e2018-10-12 10:04:44 -0700138// 0 is an invalid callback id
139TransactionCompletedListener::TransactionCompletedListener() : mCallbackIdCounter(1) {}
140
141CallbackId TransactionCompletedListener::getNextIdLocked() {
142 return mCallbackIdCounter++;
143}
144
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700145sp<TransactionCompletedListener> TransactionCompletedListener::getInstance() {
146 static sp<TransactionCompletedListener> sInstance = new TransactionCompletedListener;
147 return sInstance;
148}
149
Marissa Wallc837b5e2018-10-12 10:04:44 -0700150sp<ITransactionCompletedListener> TransactionCompletedListener::getIInstance() {
151 return static_cast<sp<ITransactionCompletedListener>>(getInstance());
152}
153
154void TransactionCompletedListener::startListeningLocked() {
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700155 if (mListening) {
156 return;
157 }
158 ProcessState::self()->startThreadPool();
159 mListening = true;
160}
161
Marissa Wall80d94ad2019-01-18 16:04:36 -0800162CallbackId TransactionCompletedListener::addCallbackFunction(
163 const TransactionCompletedCallback& callbackFunction,
164 const std::unordered_set<sp<SurfaceControl>, SurfaceComposerClient::SCHash>&
165 surfaceControls) {
Marissa Wallc837b5e2018-10-12 10:04:44 -0700166 std::lock_guard<std::mutex> lock(mMutex);
167 startListeningLocked();
168
169 CallbackId callbackId = getNextIdLocked();
Marissa Wall80d94ad2019-01-18 16:04:36 -0800170 mCallbacks[callbackId].callbackFunction = callbackFunction;
171
172 auto& callbackSurfaceControls = mCallbacks[callbackId].surfaceControls;
173
174 for (const auto& surfaceControl : surfaceControls) {
175 callbackSurfaceControls[surfaceControl->getHandle()] = surfaceControl;
176 }
177
Marissa Wallc837b5e2018-10-12 10:04:44 -0700178 return callbackId;
179}
180
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100181void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
182 sp<SurfaceControl> surfaceControl) {
183 std::lock_guard<std::mutex> lock(mMutex);
184 mJankListeners.insert({surfaceControl->getHandle(), listener});
185}
186
187void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) {
188 std::lock_guard<std::mutex> lock(mMutex);
189 for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {
190 if (it->second == listener) {
191 it = mJankListeners.erase(it);
192 } else {
193 it++;
194 }
195 }
196}
197
Jorim Jaggif51775d2021-01-14 23:44:15 +0100198void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
199 sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
200 std::lock_guard<std::mutex> lock(mMutex);
201 mSurfaceStatsListeners.insert({surfaceControl->getHandle(),
202 SurfaceStatsCallbackEntry(context, cookie, listener)});
203}
204
205void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) {
206 std::lock_guard<std::mutex> lock(mMutex);
207 for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) {
208 auto [itContext, itCookie, itListener] = it->second;
209 if (itContext == context && itCookie == cookie) {
210 it = mSurfaceStatsListeners.erase(it);
211 } else {
212 it++;
213 }
214 }
215}
216
Marissa Wall80d94ad2019-01-18 16:04:36 -0800217void TransactionCompletedListener::addSurfaceControlToCallbacks(
218 const sp<SurfaceControl>& surfaceControl,
219 const std::unordered_set<CallbackId>& callbackIds) {
220 std::lock_guard<std::mutex> lock(mMutex);
221
222 for (auto callbackId : callbackIds) {
223 mCallbacks[callbackId].surfaceControls.emplace(std::piecewise_construct,
224 std::forward_as_tuple(
225 surfaceControl->getHandle()),
226 std::forward_as_tuple(surfaceControl));
227 }
228}
229
Marissa Walle2ffb422018-10-12 11:33:52 -0700230void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800231 std::unordered_map<CallbackId, CallbackTranslation> callbacksMap;
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100232 std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100233 std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> surfaceListeners;
Valerie Haud3b90d22019-11-06 09:37:31 -0800234 {
235 std::lock_guard<std::mutex> lock(mMutex);
Marissa Walle2ffb422018-10-12 11:33:52 -0700236
Valerie Haud3b90d22019-11-06 09:37:31 -0800237 /* This listener knows all the sp<IBinder> to sp<SurfaceControl> for all its registered
238 * callbackIds, except for when Transactions are merged together. This probably cannot be
239 * solved before this point because the Transactions could be merged together and applied in
240 * a different process.
241 *
242 * Fortunately, we get all the callbacks for this listener for the same frame together at
243 * the same time. This means if any Transactions were merged together, we will get their
244 * callbacks at the same time. We can combine all the sp<IBinder> to sp<SurfaceControl> maps
245 * for all the callbackIds to generate one super map that contains all the sp<IBinder> to
246 * sp<SurfaceControl> that could possibly exist for the callbacks.
247 */
248 callbacksMap = mCallbacks;
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100249 jankListenersMap = mJankListeners;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100250 surfaceListeners = mSurfaceStatsListeners;
Valerie Haud3b90d22019-11-06 09:37:31 -0800251 for (const auto& transactionStats : listenerStats.transactionStats) {
252 for (auto& callbackId : transactionStats.callbackIds) {
253 mCallbacks.erase(callbackId);
254 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800255 }
256 }
Marissa Walld600d572019-03-26 15:38:50 -0700257 for (const auto& transactionStats : listenerStats.transactionStats) {
258 for (auto callbackId : transactionStats.callbackIds) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800259 auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
Marissa Wall80d94ad2019-01-18 16:04:36 -0800260 if (!callbackFunction) {
Marissa Walle2ffb422018-10-12 11:33:52 -0700261 ALOGE("cannot call null callback function, skipping");
262 continue;
263 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800264 std::vector<SurfaceControlStats> surfaceControlStats;
265 for (const auto& surfaceStats : transactionStats.surfaceStats) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800266 surfaceControlStats
267 .emplace_back(callbacksMap[callbackId]
268 .surfaceControls[surfaceStats.surfaceControl],
Valerie Hau871d6352020-01-29 08:44:02 -0800269 transactionStats.latchTime, surfaceStats.acquireTime,
270 transactionStats.presentFence,
271 surfaceStats.previousReleaseFence, surfaceStats.transformHint,
272 surfaceStats.eventStats);
Valerie Hau84d87ff2020-01-08 17:23:21 -0800273 if (callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl]) {
274 callbacksMap[callbackId]
275 .surfaceControls[surfaceStats.surfaceControl]
276 ->setTransformHint(surfaceStats.transformHint);
277 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800278 }
279
280 callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
281 surfaceControlStats);
Marissa Walle2ffb422018-10-12 11:33:52 -0700282 }
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100283 for (const auto& surfaceStats : transactionStats.surfaceStats) {
Jorim Jaggif51775d2021-01-14 23:44:15 +0100284 auto listenerRange = surfaceListeners.equal_range(surfaceStats.surfaceControl);
285 for (auto it = listenerRange.first; it != listenerRange.second; it++) {
286 auto entry = it->second;
287 entry.callback(entry.context, transactionStats.latchTime,
288 transactionStats.presentFence, surfaceStats);
289 }
290
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100291 if (surfaceStats.jankData.empty()) continue;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100292 auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl);
293 for (auto it = jankRange.first; it != jankRange.second; it++) {
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100294 it->second->onJankDataAvailable(surfaceStats.jankData);
295 }
296 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700297 }
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700298}
299
300// ---------------------------------------------------------------------------
301
Robert Carre06ad2b2020-04-10 15:09:33 -0700302void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId);
Marissa Wall78b72202019-03-15 14:58:34 -0700303
Robert Carre06ad2b2020-04-10 15:09:33 -0700304/**
305 * We use the BufferCache to reduce the overhead of exchanging GraphicBuffers with
306 * the server. If we were to simply parcel the GraphicBuffer we would pay two overheads
307 * 1. Cost of sending the FD
308 * 2. Cost of importing the GraphicBuffer with the mapper in the receiving process.
309 * To ease this cost we implement the following scheme of caching buffers to integers,
310 * or said-otherwise, naming them with integers. This is the scheme known as slots in
311 * the legacy BufferQueue system.
312 * 1. When sending Buffers to SurfaceFlinger we look up the Buffer in the cache.
313 * 2. If there is a cache-hit we remove the Buffer from the Transaction and instead
314 * send the cached integer.
315 * 3. If there is a cache miss, we cache the new buffer and send the integer
316 * along with the Buffer, SurfaceFlinger on it's side creates a new cache
317 * entry, and we use the integer for further communication.
318 * A few details about lifetime:
319 * 1. The cache evicts by LRU. The server side cache is keyed by BufferCache::getToken
320 * which is per process Unique. The server side cache is larger than the client side
321 * cache so that the server will never evict entries before the client.
322 * 2. When the client evicts an entry it notifies the server via an uncacheBuffer
323 * transaction.
324 * 3. The client only references the Buffers by ID, and uses buffer->addDeathCallback
325 * to auto-evict destroyed buffers.
326 */
Marissa Wall73411622019-01-25 10:45:41 -0800327class BufferCache : public Singleton<BufferCache> {
328public:
329 BufferCache() : token(new BBinder()) {}
330
331 sp<IBinder> getToken() {
332 return IInterface::asBinder(TransactionCompletedListener::getIInstance());
333 }
334
Marissa Wall78b72202019-03-15 14:58:34 -0700335 status_t getCacheId(const sp<GraphicBuffer>& buffer, uint64_t* cacheId) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800336 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800337
Marissa Wall78b72202019-03-15 14:58:34 -0700338 auto itr = mBuffers.find(buffer->getId());
Marissa Wall73411622019-01-25 10:45:41 -0800339 if (itr == mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700340 return BAD_VALUE;
Marissa Wall73411622019-01-25 10:45:41 -0800341 }
Marissa Wall78b72202019-03-15 14:58:34 -0700342 itr->second = getCounter();
343 *cacheId = buffer->getId();
344 return NO_ERROR;
Marissa Wall73411622019-01-25 10:45:41 -0800345 }
346
Marissa Wall78b72202019-03-15 14:58:34 -0700347 uint64_t cache(const sp<GraphicBuffer>& buffer) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800348 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800349
Marissa Wall78b72202019-03-15 14:58:34 -0700350 if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) {
351 evictLeastRecentlyUsedBuffer();
352 }
Marissa Wall73411622019-01-25 10:45:41 -0800353
Robert Carre06ad2b2020-04-10 15:09:33 -0700354 buffer->addDeathCallback(removeDeadBufferCallback, nullptr);
Marissa Wall78b72202019-03-15 14:58:34 -0700355
356 mBuffers[buffer->getId()] = getCounter();
357 return buffer->getId();
358 }
359
360 void uncache(uint64_t cacheId) {
361 std::lock_guard<std::mutex> lock(mMutex);
362 uncacheLocked(cacheId);
363 }
364
365 void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) {
366 mBuffers.erase(cacheId);
367 SurfaceComposerClient::doUncacheBufferTransaction(cacheId);
Marissa Wall73411622019-01-25 10:45:41 -0800368 }
369
370private:
Marissa Wall78b72202019-03-15 14:58:34 -0700371 void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) {
Marissa Wall73411622019-01-25 10:45:41 -0800372 auto itr = mBuffers.begin();
Marissa Wall78b72202019-03-15 14:58:34 -0700373 uint64_t minCounter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800374 auto minBuffer = itr;
375 itr++;
376
377 while (itr != mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700378 uint64_t counter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800379 if (counter < minCounter) {
380 minCounter = counter;
381 minBuffer = itr;
382 }
383 itr++;
384 }
Marissa Wall78b72202019-03-15 14:58:34 -0700385 uncacheLocked(minBuffer->first);
Marissa Wall73411622019-01-25 10:45:41 -0800386 }
387
388 uint64_t getCounter() REQUIRES(mMutex) {
389 static uint64_t counter = 0;
390 return counter++;
391 }
392
Marissa Wall73411622019-01-25 10:45:41 -0800393 std::mutex mMutex;
Marissa Wall78b72202019-03-15 14:58:34 -0700394 std::map<uint64_t /*Cache id*/, uint64_t /*counter*/> mBuffers GUARDED_BY(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800395
396 // Used by ISurfaceComposer to identify which process is sending the cached buffer.
397 sp<IBinder> token;
398};
399
400ANDROID_SINGLETON_STATIC_INSTANCE(BufferCache);
401
Robert Carre06ad2b2020-04-10 15:09:33 -0700402void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId) {
Marissa Wall78b72202019-03-15 14:58:34 -0700403 // GraphicBuffer id's are used as the cache ids.
404 BufferCache::getInstance().uncache(graphicBufferId);
405}
406
Marissa Wall73411622019-01-25 10:45:41 -0800407// ---------------------------------------------------------------------------
408
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000409// Initialize transaction id counter used to generate transaction ids
410// Transactions will start counting at 1, 0 is used for invalid transactions
411std::atomic<uint32_t> SurfaceComposerClient::Transaction::idCounter = 1;
412
413SurfaceComposerClient::Transaction::Transaction() {
414 mId = generateId();
415}
416
Marissa Wall17b4e452018-12-26 16:32:34 -0800417SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000418 : mId(other.mId),
419 mForceSynchronous(other.mForceSynchronous),
Marissa Wall17b4e452018-12-26 16:32:34 -0800420 mTransactionNestCount(other.mTransactionNestCount),
421 mAnimation(other.mAnimation),
422 mEarlyWakeup(other.mEarlyWakeup),
Ady Abrahambf1349c2020-06-12 14:26:18 -0700423 mExplicitEarlyWakeupStart(other.mExplicitEarlyWakeupStart),
424 mExplicitEarlyWakeupEnd(other.mExplicitEarlyWakeupEnd),
Vishnu Nair621102e2019-06-12 14:16:57 -0700425 mContainsBuffer(other.mContainsBuffer),
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700426 mDesiredPresentTime(other.mDesiredPresentTime),
Ady Abrahamf0c56492020-12-17 18:04:15 -0800427 mIsAutoTimestamp(other.mIsAutoTimestamp),
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000428 mFrameTimelineInfo(other.mFrameTimelineInfo),
Vishnu Nair277142c2021-01-05 18:35:29 -0800429 mApplyToken(other.mApplyToken) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700430 mDisplayStates = other.mDisplayStates;
431 mComposerStates = other.mComposerStates;
chaviw273171b2018-12-26 11:46:30 -0800432 mInputWindowCommands = other.mInputWindowCommands;
Vishnu Nair621102e2019-06-12 14:16:57 -0700433 mListenerCallbacks = other.mListenerCallbacks;
434}
435
436std::unique_ptr<SurfaceComposerClient::Transaction>
437SurfaceComposerClient::Transaction::createFromParcel(const Parcel* parcel) {
438 auto transaction = std::make_unique<Transaction>();
439 if (transaction->readFromParcel(parcel) == NO_ERROR) {
440 return transaction;
441 }
442 return nullptr;
443}
444
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000445int64_t SurfaceComposerClient::Transaction::generateId() {
446 return (((int64_t)getpid()) << 32) | idCounter++;
447}
448
Vishnu Nair621102e2019-06-12 14:16:57 -0700449status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel) {
450 const uint32_t forceSynchronous = parcel->readUint32();
451 const uint32_t transactionNestCount = parcel->readUint32();
452 const bool animation = parcel->readBool();
453 const bool earlyWakeup = parcel->readBool();
Ady Abrahambf1349c2020-06-12 14:26:18 -0700454 const bool explicitEarlyWakeupStart = parcel->readBool();
455 const bool explicitEarlyWakeupEnd = parcel->readBool();
Vishnu Nair621102e2019-06-12 14:16:57 -0700456 const bool containsBuffer = parcel->readBool();
457 const int64_t desiredPresentTime = parcel->readInt64();
Ady Abrahamf0c56492020-12-17 18:04:15 -0800458 const bool isAutoTimestamp = parcel->readBool();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000459 FrameTimelineInfo frameTimelineInfo;
460 SAFE_PARCEL(frameTimelineInfo.read, *parcel);
461
Vishnu Nair277142c2021-01-05 18:35:29 -0800462 sp<IBinder> applyToken;
463 parcel->readNullableStrongBinder(&applyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700464 size_t count = static_cast<size_t>(parcel->readUint32());
465 if (count > parcel->dataSize()) {
466 return BAD_VALUE;
467 }
468 SortedVector<DisplayState> displayStates;
469 displayStates.setCapacity(count);
470 for (size_t i = 0; i < count; i++) {
471 DisplayState displayState;
472 if (displayState.read(*parcel) == BAD_VALUE) {
473 return BAD_VALUE;
474 }
475 displayStates.add(displayState);
476 }
477
478 count = static_cast<size_t>(parcel->readUint32());
479 if (count > parcel->dataSize()) {
480 return BAD_VALUE;
481 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700482 std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> listenerCallbacks;
483 listenerCallbacks.reserve(count);
484 for (size_t i = 0; i < count; i++) {
485 sp<ITransactionCompletedListener> listener =
486 interface_cast<ITransactionCompletedListener>(parcel->readStrongBinder());
487 size_t numCallbackIds = parcel->readUint32();
488 if (numCallbackIds > parcel->dataSize()) {
489 return BAD_VALUE;
490 }
491 for (size_t j = 0; j < numCallbackIds; j++) {
492 listenerCallbacks[listener].callbackIds.insert(parcel->readInt64());
493 }
494 size_t numSurfaces = parcel->readUint32();
495 if (numSurfaces > parcel->dataSize()) {
496 return BAD_VALUE;
497 }
498 for (size_t j = 0; j < numSurfaces; j++) {
499 sp<SurfaceControl> surface;
Pablo Gamito421dfd52020-09-22 18:11:45 +0000500 SAFE_PARCEL(SurfaceControl::readFromParcel, *parcel, &surface);
Valerie Hau9dab9732019-08-20 09:29:25 -0700501 listenerCallbacks[listener].surfaceControls.insert(surface);
502 }
503 }
504
505 count = static_cast<size_t>(parcel->readUint32());
506 if (count > parcel->dataSize()) {
507 return BAD_VALUE;
508 }
Vishnu Nairf03652d2019-07-16 17:56:56 -0700509 std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> composerStates;
Vishnu Nair621102e2019-06-12 14:16:57 -0700510 composerStates.reserve(count);
511 for (size_t i = 0; i < count; i++) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000512 sp<IBinder> surfaceControlHandle;
513 SAFE_PARCEL(parcel->readStrongBinder, &surfaceControlHandle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700514
515 ComposerState composerState;
516 if (composerState.read(*parcel) == BAD_VALUE) {
517 return BAD_VALUE;
518 }
Pablo Gamitodbc31672020-09-01 18:28:58 +0000519
Vishnu Nairf03652d2019-07-16 17:56:56 -0700520 composerStates[surfaceControlHandle] = composerState;
Vishnu Nair621102e2019-06-12 14:16:57 -0700521 }
522
523 InputWindowCommands inputWindowCommands;
524 inputWindowCommands.read(*parcel);
525
526 // Parsing was successful. Update the object.
527 mForceSynchronous = forceSynchronous;
528 mTransactionNestCount = transactionNestCount;
529 mAnimation = animation;
530 mEarlyWakeup = earlyWakeup;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700531 mExplicitEarlyWakeupStart = explicitEarlyWakeupStart;
532 mExplicitEarlyWakeupEnd = explicitEarlyWakeupEnd;
Vishnu Nair621102e2019-06-12 14:16:57 -0700533 mContainsBuffer = containsBuffer;
534 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800535 mIsAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000536 mFrameTimelineInfo = frameTimelineInfo;
Vishnu Nair621102e2019-06-12 14:16:57 -0700537 mDisplayStates = displayStates;
Valerie Hau9dab9732019-08-20 09:29:25 -0700538 mListenerCallbacks = listenerCallbacks;
Vishnu Nair621102e2019-06-12 14:16:57 -0700539 mComposerStates = composerStates;
540 mInputWindowCommands = inputWindowCommands;
Vishnu Nair277142c2021-01-05 18:35:29 -0800541 mApplyToken = applyToken;
Vishnu Nair621102e2019-06-12 14:16:57 -0700542 return NO_ERROR;
543}
544
545status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const {
Robert Carr158531d2020-04-08 10:53:30 -0700546 // If we write the Transaction to a parcel, we want to ensure the Buffers are cached
547 // before crossing the IPC boundary. Otherwise the receiving party will cache the buffers
548 // but is unlikely to use them again as they are owned by the other process.
549 // You may be asking yourself, is this const cast safe? Const cast is safe up
550 // until the point where you try and write to an object that was originally const at which
551 // point we enter undefined behavior. In this case we are safe though, because there are
552 // two possibilities:
553 // 1. The SurfaceComposerClient::Transaction was originally non-const. Safe.
554 // 2. It was originall const! In this case not only was it useless, but it by definition
555 // contains no composer states and so cacheBuffers will not perform any writes.
556
557 const_cast<SurfaceComposerClient::Transaction*>(this)->cacheBuffers();
558
Vishnu Nair621102e2019-06-12 14:16:57 -0700559 parcel->writeUint32(mForceSynchronous);
560 parcel->writeUint32(mTransactionNestCount);
561 parcel->writeBool(mAnimation);
562 parcel->writeBool(mEarlyWakeup);
Ady Abrahambf1349c2020-06-12 14:26:18 -0700563 parcel->writeBool(mExplicitEarlyWakeupStart);
564 parcel->writeBool(mExplicitEarlyWakeupEnd);
Vishnu Nair621102e2019-06-12 14:16:57 -0700565 parcel->writeBool(mContainsBuffer);
566 parcel->writeInt64(mDesiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -0800567 parcel->writeBool(mIsAutoTimestamp);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000568 SAFE_PARCEL(mFrameTimelineInfo.write, *parcel);
Vishnu Nair277142c2021-01-05 18:35:29 -0800569 parcel->writeStrongBinder(mApplyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700570 parcel->writeUint32(static_cast<uint32_t>(mDisplayStates.size()));
571 for (auto const& displayState : mDisplayStates) {
572 displayState.write(*parcel);
573 }
574
Valerie Hau9dab9732019-08-20 09:29:25 -0700575 parcel->writeUint32(static_cast<uint32_t>(mListenerCallbacks.size()));
576 for (auto const& [listener, callbackInfo] : mListenerCallbacks) {
577 parcel->writeStrongBinder(ITransactionCompletedListener::asBinder(listener));
578 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.callbackIds.size()));
579 for (auto callbackId : callbackInfo.callbackIds) {
580 parcel->writeInt64(callbackId);
581 }
582 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.surfaceControls.size()));
583 for (auto surfaceControl : callbackInfo.surfaceControls) {
Pablo Gamito421dfd52020-09-22 18:11:45 +0000584 SAFE_PARCEL(surfaceControl->writeToParcel, *parcel);
Valerie Hau9dab9732019-08-20 09:29:25 -0700585 }
586 }
587
Vishnu Nair621102e2019-06-12 14:16:57 -0700588 parcel->writeUint32(static_cast<uint32_t>(mComposerStates.size()));
Pablo Gamitodbc31672020-09-01 18:28:58 +0000589 for (auto const& [handle, composerState] : mComposerStates) {
590 SAFE_PARCEL(parcel->writeStrongBinder, handle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700591 composerState.write(*parcel);
592 }
593
594 mInputWindowCommands.write(*parcel);
595 return NO_ERROR;
Mathias Agopian698c0872011-06-28 19:09:31 -0700596}
597
Robert Carr2c5f6d22017-09-26 12:30:35 -0700598SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000599 for (auto const& [handle, composerState] : other.mComposerStates) {
600 if (mComposerStates.count(handle) == 0) {
601 mComposerStates[handle] = composerState;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700602 } else {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000603 mComposerStates[handle].state.merge(composerState.state);
Robert Carr2c5f6d22017-09-26 12:30:35 -0700604 }
605 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700606
607 for (auto const& state : other.mDisplayStates) {
608 ssize_t index = mDisplayStates.indexOf(state);
609 if (index < 0) {
610 mDisplayStates.add(state);
611 } else {
612 mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
613 }
614 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700615
Marissa Wallc837b5e2018-10-12 10:04:44 -0700616 for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
617 auto& [callbackIds, surfaceControls] = callbackInfo;
618 mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
619 callbackIds.begin()),
620 std::make_move_iterator(callbackIds.end()));
Valerie Hau9dab9732019-08-20 09:29:25 -0700621
Valerie Hau236eba32020-01-03 16:53:39 -0800622 mListenerCallbacks[listener].surfaceControls.insert(surfaceControls.begin(),
623 surfaceControls.end());
624
625 auto& currentProcessCallbackInfo =
626 mListenerCallbacks[TransactionCompletedListener::getIInstance()];
627 currentProcessCallbackInfo.surfaceControls
628 .insert(std::make_move_iterator(surfaceControls.begin()),
629 std::make_move_iterator(surfaceControls.end()));
630
631 // register all surface controls for all callbackIds for this listener that is merging
632 for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
633 TransactionCompletedListener::getInstance()
634 ->addSurfaceControlToCallbacks(surfaceControl,
635 currentProcessCallbackInfo.callbackIds);
636 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700637 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700638
chaviw273171b2018-12-26 11:46:30 -0800639 mInputWindowCommands.merge(other.mInputWindowCommands);
640
Robert Carrbbc85622020-04-08 10:45:12 -0700641 mContainsBuffer |= other.mContainsBuffer;
Jorim Jaggie3b57002019-07-22 17:18:52 +0200642 mEarlyWakeup = mEarlyWakeup || other.mEarlyWakeup;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700643 mExplicitEarlyWakeupStart = mExplicitEarlyWakeupStart || other.mExplicitEarlyWakeupStart;
644 mExplicitEarlyWakeupEnd = mExplicitEarlyWakeupEnd || other.mExplicitEarlyWakeupEnd;
Vishnu Nair277142c2021-01-05 18:35:29 -0800645 mApplyToken = other.mApplyToken;
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700646
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000647 mFrameTimelineInfo.merge(other.mFrameTimelineInfo);
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700648
Vishnu Nairfef244e2019-06-17 18:07:51 -0700649 other.clear();
Robert Carr2c5f6d22017-09-26 12:30:35 -0700650 return *this;
651}
652
Vishnu Nairfef244e2019-06-17 18:07:51 -0700653void SurfaceComposerClient::Transaction::clear() {
654 mComposerStates.clear();
655 mDisplayStates.clear();
656 mListenerCallbacks.clear();
657 mInputWindowCommands.clear();
658 mContainsBuffer = false;
659 mForceSynchronous = 0;
660 mTransactionNestCount = 0;
661 mAnimation = false;
662 mEarlyWakeup = false;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700663 mExplicitEarlyWakeupStart = false;
664 mExplicitEarlyWakeupEnd = false;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800665 mDesiredPresentTime = 0;
666 mIsAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000667 mFrameTimelineInfo.clear();
Vishnu Nair277142c2021-01-05 18:35:29 -0800668 mApplyToken = nullptr;
Vishnu Nairfef244e2019-06-17 18:07:51 -0700669}
670
Marissa Wall78b72202019-03-15 14:58:34 -0700671void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) {
672 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
673
Marissa Wall947d34e2019-03-29 14:03:53 -0700674 client_cache_t uncacheBuffer;
Marissa Wall78b72202019-03-15 14:58:34 -0700675 uncacheBuffer.token = BufferCache::getInstance().getToken();
Marissa Wall947d34e2019-03-29 14:03:53 -0700676 uncacheBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700677
Valerie Haufa889122019-04-15 13:56:05 -0700678 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000679 sf->setTransactionState(FrameTimelineInfo{}, {}, {}, 0, applyToken, {}, systemTime(), true,
680 uncacheBuffer, false, {}, 0 /* Undefined transactionId */);
Marissa Wall78b72202019-03-15 14:58:34 -0700681}
682
683void SurfaceComposerClient::Transaction::cacheBuffers() {
684 if (!mContainsBuffer) {
685 return;
686 }
687
688 size_t count = 0;
Vishnu Nairf03652d2019-07-16 17:56:56 -0700689 for (auto& [handle, cs] : mComposerStates) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000690 layer_state_t* s = &(mComposerStates[handle].state);
Marissa Wall78b72202019-03-15 14:58:34 -0700691 if (!(s->what & layer_state_t::eBufferChanged)) {
692 continue;
Robert Carr28037922020-04-08 10:57:07 -0700693 } else if (s->what & layer_state_t::eCachedBufferChanged) {
694 // If eBufferChanged and eCachedBufferChanged are both trued then that means
695 // we already cached the buffer in a previous call to cacheBuffers, perhaps
696 // from writeToParcel on a Transaction that was merged in to this one.
697 continue;
Marissa Wall78b72202019-03-15 14:58:34 -0700698 }
699
Marissa Wall00597242019-03-27 10:35:19 -0700700 // Don't try to cache a null buffer. Sending null buffers is cheap so we shouldn't waste
701 // time trying to cache them.
702 if (!s->buffer) {
703 continue;
704 }
705
Marissa Wall78b72202019-03-15 14:58:34 -0700706 uint64_t cacheId = 0;
707 status_t ret = BufferCache::getInstance().getCacheId(s->buffer, &cacheId);
708 if (ret == NO_ERROR) {
Robert Carre06ad2b2020-04-10 15:09:33 -0700709 // Cache-hit. Strip the buffer and send only the id.
Marissa Walla141abe2019-03-27 16:28:07 -0700710 s->what &= ~static_cast<uint64_t>(layer_state_t::eBufferChanged);
Marissa Wall78b72202019-03-15 14:58:34 -0700711 s->buffer = nullptr;
712 } else {
Robert Carre06ad2b2020-04-10 15:09:33 -0700713 // Cache-miss. Include the buffer and send the new cacheId.
Marissa Wall78b72202019-03-15 14:58:34 -0700714 cacheId = BufferCache::getInstance().cache(s->buffer);
715 }
716 s->what |= layer_state_t::eCachedBufferChanged;
717 s->cachedBuffer.token = BufferCache::getInstance().getToken();
Marissa Wall947d34e2019-03-29 14:03:53 -0700718 s->cachedBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700719
720 // If we have more buffers than the size of the cache, we should stop caching so we don't
721 // evict other buffers in this transaction
722 count++;
723 if (count >= BUFFER_CACHE_MAX_SIZE) {
724 break;
725 }
726 }
Robert Carr6fb1a7e2018-12-11 12:07:25 -0800727}
728
Robert Carr4cdc58f2017-08-23 14:22:20 -0700729status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {
730 if (mStatus != NO_ERROR) {
731 return mStatus;
732 }
733
734 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
735
Valerie Hau9dab9732019-08-20 09:29:25 -0700736 bool hasListenerCallbacks = !mListenerCallbacks.empty();
Marissa Wall3dad52d2019-03-22 14:03:19 -0700737 std::vector<ListenerCallbacks> listenerCallbacks;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700738 // For every listener with registered callbacks
739 for (const auto& [listener, callbackInfo] : mListenerCallbacks) {
740 auto& [callbackIds, surfaceControls] = callbackInfo;
741 if (callbackIds.empty()) {
742 continue;
743 }
744
Valerie Hau9dab9732019-08-20 09:29:25 -0700745 if (surfaceControls.empty()) {
746 listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));
747 } else {
748 // If the listener has any SurfaceControls set on this Transaction update the surface
749 // state
750 for (const auto& surfaceControl : surfaceControls) {
751 layer_state_t* s = getLayerState(surfaceControl);
752 if (!s) {
753 ALOGE("failed to get layer state");
754 continue;
755 }
756 std::vector<CallbackId> callbacks(callbackIds.begin(), callbackIds.end());
757 s->what |= layer_state_t::eHasListenerCallbacksChanged;
758 s->listeners.emplace_back(IInterface::asBinder(listener), callbacks);
Marissa Wallc837b5e2018-10-12 10:04:44 -0700759 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700760 }
761 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700762
Marissa Wall78b72202019-03-15 14:58:34 -0700763 cacheBuffers();
764
Robert Carr4cdc58f2017-08-23 14:22:20 -0700765 Vector<ComposerState> composerStates;
766 Vector<DisplayState> displayStates;
767 uint32_t flags = 0;
768
769 mForceSynchronous |= synchronous;
770
chaviw8e3fe5d2018-02-22 10:55:42 -0800771 for (auto const& kv : mComposerStates){
772 composerStates.add(kv.second);
773 }
774
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700775 displayStates = std::move(mDisplayStates);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700776
777 if (mForceSynchronous) {
778 flags |= ISurfaceComposer::eSynchronous;
779 }
780 if (mAnimation) {
781 flags |= ISurfaceComposer::eAnimation;
782 }
Dan Stoza84d619e2018-03-28 17:07:36 -0700783 if (mEarlyWakeup) {
784 flags |= ISurfaceComposer::eEarlyWakeup;
785 }
Robert Carr4cdc58f2017-08-23 14:22:20 -0700786
Ady Abrahambf1349c2020-06-12 14:26:18 -0700787 // If both mExplicitEarlyWakeupStart and mExplicitEarlyWakeupEnd are set
788 // it is equivalent for none
789 if (mExplicitEarlyWakeupStart && !mExplicitEarlyWakeupEnd) {
790 flags |= ISurfaceComposer::eExplicitEarlyWakeupStart;
791 }
792 if (mExplicitEarlyWakeupEnd && !mExplicitEarlyWakeupStart) {
793 flags |= ISurfaceComposer::eExplicitEarlyWakeupEnd;
794 }
795
Vishnu Nair277142c2021-01-05 18:35:29 -0800796 sp<IBinder> applyToken = mApplyToken
797 ? mApplyToken
798 : IInterface::asBinder(TransactionCompletedListener::getIInstance());
799
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000800 sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800801 mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
Marissa Wall3dad52d2019-03-22 14:03:19 -0700802 {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700803 hasListenerCallbacks, listenerCallbacks, mId);
804 mId = generateId();
805
806 // Clear the current states and flags
807 clear();
808
Robert Carr4cdc58f2017-08-23 14:22:20 -0700809 mStatus = NO_ERROR;
810 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700811}
812
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800813// ---------------------------------------------------------------------------
814
Robert Carr4cdc58f2017-08-23 14:22:20 -0700815sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
Jamie Gennisdd3cb842012-10-19 18:19:11 -0700816 return ComposerService::getComposerService()->createDisplay(displayName,
817 secure);
Mathias Agopiane57f2922012-08-09 16:29:12 -0700818}
819
Robert Carr4cdc58f2017-08-23 14:22:20 -0700820void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
Jesse Hall6c913be2013-08-08 12:15:49 -0700821 return ComposerService::getComposerService()->destroyDisplay(display);
822}
823
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800824std::vector<PhysicalDisplayId> SurfaceComposerClient::getPhysicalDisplayIds() {
825 return ComposerService::getComposerService()->getPhysicalDisplayIds();
826}
827
828std::optional<PhysicalDisplayId> SurfaceComposerClient::getInternalDisplayId() {
829 return ComposerService::getComposerService()->getInternalDisplayId();
830}
831
832sp<IBinder> SurfaceComposerClient::getPhysicalDisplayToken(PhysicalDisplayId displayId) {
833 return ComposerService::getComposerService()->getPhysicalDisplayToken(displayId);
834}
835
836sp<IBinder> SurfaceComposerClient::getInternalDisplayToken() {
837 return ComposerService::getComposerService()->getInternalDisplayToken();
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700838}
839
Robert Carr4cdc58f2017-08-23 14:22:20 -0700840void SurfaceComposerClient::Transaction::setAnimationTransaction() {
Jamie Gennis2d5e2302012-10-15 18:24:43 -0700841 mAnimation = true;
842}
843
Dan Stoza84d619e2018-03-28 17:07:36 -0700844void SurfaceComposerClient::Transaction::setEarlyWakeup() {
845 mEarlyWakeup = true;
846}
847
Ady Abrahambf1349c2020-06-12 14:26:18 -0700848void SurfaceComposerClient::Transaction::setExplicitEarlyWakeupStart() {
849 mExplicitEarlyWakeupStart = true;
850}
851
852void SurfaceComposerClient::Transaction::setExplicitEarlyWakeupEnd() {
853 mExplicitEarlyWakeupEnd = true;
854}
855
Pablo Gamitodbc31672020-09-01 18:28:58 +0000856layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
857 auto handle = sc->getHandle();
858
Vishnu Nairf03652d2019-07-16 17:56:56 -0700859 if (mComposerStates.count(handle) == 0) {
Mathias Agopian698c0872011-06-28 19:09:31 -0700860 // we don't have it, add an initialized layer_state to our list
chaviw8e3fe5d2018-02-22 10:55:42 -0800861 ComposerState s;
Pablo Gamitodbc31672020-09-01 18:28:58 +0000862
Vishnu Nairf03652d2019-07-16 17:56:56 -0700863 s.state.surface = handle;
Pablo Gamitodbc31672020-09-01 18:28:58 +0000864 s.state.layerId = sc->getLayerId();
865
Vishnu Nairf03652d2019-07-16 17:56:56 -0700866 mComposerStates[handle] = s;
Mathias Agopian698c0872011-06-28 19:09:31 -0700867 }
868
Vishnu Nairf03652d2019-07-16 17:56:56 -0700869 return &(mComposerStates[handle].state);
Mathias Agopian698c0872011-06-28 19:09:31 -0700870}
871
Marissa Wallc837b5e2018-10-12 10:04:44 -0700872void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
873 const sp<SurfaceControl>& sc) {
Marissa Wall80d94ad2019-01-18 16:04:36 -0800874 auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
875 callbackInfo.surfaceControls.insert(sc);
876
877 TransactionCompletedListener::getInstance()
878 ->addSurfaceControlToCallbacks(sc, callbackInfo.callbackIds);
Marissa Wallc837b5e2018-10-12 10:04:44 -0700879}
880
Robert Carr4cdc58f2017-08-23 14:22:20 -0700881SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
882 const sp<SurfaceControl>& sc, float x, float y) {
chaviw763ef572018-02-22 16:04:57 -0800883 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700884 if (!s) {
885 mStatus = BAD_INDEX;
886 return *this;
887 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700888 s->what |= layer_state_t::ePositionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700889 s->x = x;
890 s->y = y;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700891
892 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700893 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700894}
895
Robert Carr4cdc58f2017-08-23 14:22:20 -0700896SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
897 const sp<SurfaceControl>& sc) {
898 return setFlags(sc, 0, layer_state_t::eLayerHidden);
899}
900
901SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
902 const sp<SurfaceControl>& sc) {
903 return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
904}
905
906SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
907 const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
chaviw763ef572018-02-22 16:04:57 -0800908 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700909 if (!s) {
910 mStatus = BAD_INDEX;
911 return *this;
912 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700913 s->what |= layer_state_t::eSizeChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700914 s->w = w;
915 s->h = h;
Jamie Gennis28378392011-10-12 17:39:00 -0700916
Marissa Wallc837b5e2018-10-12 10:04:44 -0700917 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700918 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700919}
920
Robert Carr4cdc58f2017-08-23 14:22:20 -0700921SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
922 const sp<SurfaceControl>& sc, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800923 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700924 if (!s) {
925 mStatus = BAD_INDEX;
926 return *this;
927 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700928 s->what |= layer_state_t::eLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700929 s->what &= ~layer_state_t::eRelativeLayerChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700930 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700931
932 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700933 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700934}
935
Pablo Gamito11dcc222020-09-12 15:49:39 +0000936SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(
937 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& relativeTo, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800938 layer_state_t* s = getLayerState(sc);
Robert Carrdb66e622017-04-10 16:55:57 -0700939 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700940 mStatus = BAD_INDEX;
Robert Carr30c8d902019-04-04 13:12:49 -0700941 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -0700942 }
943 s->what |= layer_state_t::eRelativeLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700944 s->what &= ~layer_state_t::eLayerChanged;
Pablo Gamito11dcc222020-09-12 15:49:39 +0000945 s->relativeLayerSurfaceControl = relativeTo;
Robert Carrdb66e622017-04-10 16:55:57 -0700946 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700947
948 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700949 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -0700950}
951
Robert Carr4cdc58f2017-08-23 14:22:20 -0700952SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
953 const sp<SurfaceControl>& sc, uint32_t flags,
Mathias Agopian698c0872011-06-28 19:09:31 -0700954 uint32_t mask) {
chaviw763ef572018-02-22 16:04:57 -0800955 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700956 if (!s) {
957 mStatus = BAD_INDEX;
958 return *this;
959 }
chaviwc5676c62020-09-18 15:01:04 -0700960 if ((mask & layer_state_t::eLayerOpaque) || (mask & layer_state_t::eLayerHidden) ||
Vishnu Nairf6eddb62021-01-27 22:02:11 -0800961 (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) ||
962 (mask & layer_state_t::eEnableBackpressure)) {
Dan Stoza23116082015-06-18 14:58:39 -0700963 s->what |= layer_state_t::eFlagsChanged;
Andy McFadden4125a4f2014-01-29 17:17:11 -0800964 }
Mathias Agopian698c0872011-06-28 19:09:31 -0700965 s->flags &= ~mask;
966 s->flags |= (flags & mask);
967 s->mask |= mask;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700968
969 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700970 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700971}
972
Robert Carr4cdc58f2017-08-23 14:22:20 -0700973SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
974 const sp<SurfaceControl>& sc,
Mathias Agopian698c0872011-06-28 19:09:31 -0700975 const Region& transparentRegion) {
chaviw763ef572018-02-22 16:04:57 -0800976 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700977 if (!s) {
978 mStatus = BAD_INDEX;
979 return *this;
980 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700981 s->what |= layer_state_t::eTransparentRegionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700982 s->transparentRegion = transparentRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700983
984 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700985 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700986}
987
Robert Carr4cdc58f2017-08-23 14:22:20 -0700988SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
989 const sp<SurfaceControl>& sc, float alpha) {
chaviw763ef572018-02-22 16:04:57 -0800990 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700991 if (!s) {
992 mStatus = BAD_INDEX;
993 return *this;
994 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700995 s->what |= layer_state_t::eAlphaChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700996 s->alpha = alpha;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700997
998 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700999 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001000}
1001
Robert Carr4cdc58f2017-08-23 14:22:20 -07001002SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
1003 const sp<SurfaceControl>& sc, uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001004 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001005 if (!s) {
1006 mStatus = BAD_INDEX;
1007 return *this;
1008 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001009 s->what |= layer_state_t::eLayerStackChanged;
Mathias Agopian87855782012-07-24 21:41:09 -07001010 s->layerStack = layerStack;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001011
1012 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001013 return *this;
Mathias Agopian87855782012-07-24 21:41:09 -07001014}
1015
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001016SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMetadata(
Garfield Tan01a56132019-08-05 16:44:21 -07001017 const sp<SurfaceControl>& sc, uint32_t key, const Parcel& p) {
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001018 layer_state_t* s = getLayerState(sc);
1019 if (!s) {
1020 mStatus = BAD_INDEX;
1021 return *this;
1022 }
1023 s->what |= layer_state_t::eMetadataChanged;
Garfield Tan01a56132019-08-05 16:44:21 -07001024
1025 s->metadata.mMap[key] = {p.data(), p.data() + p.dataSize()};
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001026
1027 registerSurfaceControlForCallback(sc);
1028 return *this;
1029}
1030
Robert Carr4cdc58f2017-08-23 14:22:20 -07001031SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
1032 const sp<SurfaceControl>& sc, float dsdx, float dtdx,
Robert Carrcb6e1e32017-02-21 19:48:26 -08001033 float dtdy, float dsdy) {
chaviw763ef572018-02-22 16:04:57 -08001034 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001035 if (!s) {
1036 mStatus = BAD_INDEX;
1037 return *this;
1038 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001039 s->what |= layer_state_t::eMatrixChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001040 layer_state_t::matrix22_t matrix;
1041 matrix.dsdx = dsdx;
1042 matrix.dtdx = dtdx;
1043 matrix.dsdy = dsdy;
1044 matrix.dtdy = dtdy;
1045 s->matrix = matrix;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001046
1047 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001048 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001049}
1050
Marissa Wallf58c14b2018-07-24 10:50:43 -07001051SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop_legacy(
Robert Carr4cdc58f2017-08-23 14:22:20 -07001052 const sp<SurfaceControl>& sc, const Rect& crop) {
chaviw763ef572018-02-22 16:04:57 -08001053 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001054 if (!s) {
1055 mStatus = BAD_INDEX;
1056 return *this;
1057 }
Marissa Wallf58c14b2018-07-24 10:50:43 -07001058 s->what |= layer_state_t::eCropChanged_legacy;
1059 s->crop_legacy = crop;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001060
1061 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001062 return *this;
Jamie Gennisf15a83f2012-05-10 20:43:55 -07001063}
1064
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001065SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCornerRadius(
1066 const sp<SurfaceControl>& sc, float cornerRadius) {
1067 layer_state_t* s = getLayerState(sc);
1068 if (!s) {
1069 mStatus = BAD_INDEX;
1070 return *this;
1071 }
1072 s->what |= layer_state_t::eCornerRadiusChanged;
1073 s->cornerRadius = cornerRadius;
1074 return *this;
1075}
1076
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001077SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundBlurRadius(
1078 const sp<SurfaceControl>& sc, int backgroundBlurRadius) {
1079 layer_state_t* s = getLayerState(sc);
1080 if (!s) {
1081 mStatus = BAD_INDEX;
1082 return *this;
1083 }
1084 s->what |= layer_state_t::eBackgroundBlurRadiusChanged;
1085 s->backgroundBlurRadius = backgroundBlurRadius;
1086 return *this;
1087}
1088
Lucas Dupinc3800b82020-10-02 16:24:48 -07001089SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBlurRegions(
1090 const sp<SurfaceControl>& sc, const std::vector<BlurRegion>& blurRegions) {
1091 layer_state_t* s = getLayerState(sc);
1092 if (!s) {
1093 mStatus = BAD_INDEX;
1094 return *this;
1095 }
1096 s->what |= layer_state_t::eBlurRegionsChanged;
1097 s->blurRegions = blurRegions;
1098 return *this;
1099}
1100
Marissa Wallf58c14b2018-07-24 10:50:43 -07001101SurfaceComposerClient::Transaction&
Pablo Gamito11dcc222020-09-12 15:49:39 +00001102SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(
1103 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& barrierSurfaceControl,
1104 uint64_t frameNumber) {
chaviw763ef572018-02-22 16:04:57 -08001105 layer_state_t* s = getLayerState(sc);
Dan Stoza7dde5992015-05-22 09:51:44 -07001106 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001107 mStatus = BAD_INDEX;
1108 return *this;
Dan Stoza7dde5992015-05-22 09:51:44 -07001109 }
Marissa Wallf58c14b2018-07-24 10:50:43 -07001110 s->what |= layer_state_t::eDeferTransaction_legacy;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001111 s->barrierSurfaceControl_legacy = barrierSurfaceControl;
Vishnu Nair6b7c5c92020-09-29 17:27:05 -07001112 s->barrierFrameNumber = frameNumber;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001113
1114 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001115 return *this;
Robert Carr0d480722017-01-10 16:42:54 -08001116}
1117
Robert Carr4cdc58f2017-08-23 14:22:20 -07001118SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparentChildren(
Pablo Gamito11dcc222020-09-12 15:49:39 +00001119 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
chaviw763ef572018-02-22 16:04:57 -08001120 layer_state_t* s = getLayerState(sc);
Robert Carr1db73f62016-12-21 12:58:51 -08001121 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001122 mStatus = BAD_INDEX;
1123 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -08001124 }
1125 s->what |= layer_state_t::eReparentChildren;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001126 s->reparentSurfaceControl = newParent;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001127
1128 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001129 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -08001130}
1131
Robert Carr4cdc58f2017-08-23 14:22:20 -07001132SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
Pablo Gamito11dcc222020-09-12 15:49:39 +00001133 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
chaviw763ef572018-02-22 16:04:57 -08001134 layer_state_t* s = getLayerState(sc);
chaviw06178942017-07-27 10:25:59 -07001135 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001136 mStatus = BAD_INDEX;
1137 return *this;
chaviw06178942017-07-27 10:25:59 -07001138 }
chaviwf1961f72017-09-18 16:41:07 -07001139 s->what |= layer_state_t::eReparent;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001140 s->parentSurfaceControlForChild = newParent;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001141
1142 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001143 return *this;
chaviw06178942017-07-27 10:25:59 -07001144}
1145
Robert Carr4cdc58f2017-08-23 14:22:20 -07001146SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
1147 const sp<SurfaceControl>& sc,
1148 const half3& color) {
chaviw763ef572018-02-22 16:04:57 -08001149 layer_state_t* s = getLayerState(sc);
Robert Carr9524cb32017-02-13 11:32:32 -08001150 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001151 mStatus = BAD_INDEX;
1152 return *this;
1153 }
1154 s->what |= layer_state_t::eColorChanged;
1155 s->color = color;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001156
1157 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001158 return *this;
1159}
1160
Valerie Haudd0b7572019-01-29 14:59:27 -08001161SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundColor(
1162 const sp<SurfaceControl>& sc, const half3& color, float alpha, ui::Dataspace dataspace) {
Valerie Haued54efa2019-01-11 20:03:14 -08001163 layer_state_t* s = getLayerState(sc);
1164 if (!s) {
1165 mStatus = BAD_INDEX;
1166 return *this;
1167 }
1168
Valerie Haudd0b7572019-01-29 14:59:27 -08001169 s->what |= layer_state_t::eBackgroundColorChanged;
1170 s->color = color;
1171 s->bgColorAlpha = alpha;
1172 s->bgColorDataspace = dataspace;
Valerie Haued54efa2019-01-11 20:03:14 -08001173
1174 registerSurfaceControlForCallback(sc);
1175 return *this;
1176}
1177
Marissa Wall61c58622018-07-18 10:12:20 -07001178SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransform(
1179 const sp<SurfaceControl>& sc, uint32_t transform) {
1180 layer_state_t* s = getLayerState(sc);
1181 if (!s) {
1182 mStatus = BAD_INDEX;
1183 return *this;
1184 }
1185 s->what |= layer_state_t::eTransformChanged;
1186 s->transform = transform;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001187
1188 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001189 return *this;
1190}
1191
1192SurfaceComposerClient::Transaction&
1193SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<SurfaceControl>& sc,
1194 bool transformToDisplayInverse) {
1195 layer_state_t* s = getLayerState(sc);
1196 if (!s) {
1197 mStatus = BAD_INDEX;
1198 return *this;
1199 }
1200 s->what |= layer_state_t::eTransformToDisplayInverseChanged;
1201 s->transformToDisplayInverse = transformToDisplayInverse;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001202
1203 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001204 return *this;
1205}
1206
1207SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
1208 const sp<SurfaceControl>& sc, const Rect& crop) {
1209 layer_state_t* s = getLayerState(sc);
1210 if (!s) {
1211 mStatus = BAD_INDEX;
1212 return *this;
1213 }
1214 s->what |= layer_state_t::eCropChanged;
1215 s->crop = crop;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001216
1217 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001218 return *this;
1219}
1220
Marissa Wall861616d2018-10-22 12:52:23 -07001221SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrame(
1222 const sp<SurfaceControl>& sc, const Rect& frame) {
1223 layer_state_t* s = getLayerState(sc);
1224 if (!s) {
1225 mStatus = BAD_INDEX;
1226 return *this;
1227 }
1228 s->what |= layer_state_t::eFrameChanged;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +02001229 s->orientedDisplaySpaceRect = frame;
Marissa Wall861616d2018-10-22 12:52:23 -07001230
1231 registerSurfaceControlForCallback(sc);
1232 return *this;
1233}
1234
Marissa Wall61c58622018-07-18 10:12:20 -07001235SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
1236 const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer) {
1237 layer_state_t* s = getLayerState(sc);
1238 if (!s) {
1239 mStatus = BAD_INDEX;
1240 return *this;
1241 }
Marissa Wall78b72202019-03-15 14:58:34 -07001242 s->what |= layer_state_t::eBufferChanged;
1243 s->buffer = buffer;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001244 if (mIsAutoTimestamp) {
1245 mDesiredPresentTime = systemTime();
1246 }
Marissa Wallebc2c052019-01-16 19:16:55 -08001247
1248 registerSurfaceControlForCallback(sc);
Marissa Wall78b72202019-03-15 14:58:34 -07001249
1250 mContainsBuffer = true;
Marissa Wallebc2c052019-01-16 19:16:55 -08001251 return *this;
1252}
1253
Marissa Wall61c58622018-07-18 10:12:20 -07001254SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAcquireFence(
1255 const sp<SurfaceControl>& sc, const sp<Fence>& fence) {
1256 layer_state_t* s = getLayerState(sc);
1257 if (!s) {
1258 mStatus = BAD_INDEX;
1259 return *this;
1260 }
1261 s->what |= layer_state_t::eAcquireFenceChanged;
1262 s->acquireFence = fence;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001263
1264 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001265 return *this;
1266}
1267
1268SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDataspace(
1269 const sp<SurfaceControl>& sc, ui::Dataspace dataspace) {
1270 layer_state_t* s = getLayerState(sc);
1271 if (!s) {
1272 mStatus = BAD_INDEX;
1273 return *this;
1274 }
1275 s->what |= layer_state_t::eDataspaceChanged;
1276 s->dataspace = dataspace;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001277
1278 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001279 return *this;
1280}
1281
1282SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMetadata(
1283 const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata) {
1284 layer_state_t* s = getLayerState(sc);
1285 if (!s) {
1286 mStatus = BAD_INDEX;
1287 return *this;
1288 }
1289 s->what |= layer_state_t::eHdrMetadataChanged;
1290 s->hdrMetadata = hdrMetadata;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001291
1292 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001293 return *this;
1294}
1295
1296SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSurfaceDamageRegion(
1297 const sp<SurfaceControl>& sc, const Region& surfaceDamageRegion) {
1298 layer_state_t* s = getLayerState(sc);
1299 if (!s) {
1300 mStatus = BAD_INDEX;
1301 return *this;
1302 }
1303 s->what |= layer_state_t::eSurfaceDamageRegionChanged;
1304 s->surfaceDamageRegion = surfaceDamageRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001305
1306 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001307 return *this;
1308}
1309
1310SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApi(
1311 const sp<SurfaceControl>& sc, int32_t api) {
1312 layer_state_t* s = getLayerState(sc);
1313 if (!s) {
1314 mStatus = BAD_INDEX;
1315 return *this;
1316 }
1317 s->what |= layer_state_t::eApiChanged;
1318 s->api = api;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001319
1320 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001321 return *this;
1322}
1323
1324SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSidebandStream(
1325 const sp<SurfaceControl>& sc, const sp<NativeHandle>& sidebandStream) {
1326 layer_state_t* s = getLayerState(sc);
1327 if (!s) {
1328 mStatus = BAD_INDEX;
1329 return *this;
1330 }
1331 s->what |= layer_state_t::eSidebandStreamChanged;
1332 s->sidebandStream = sidebandStream;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001333
1334 registerSurfaceControlForCallback(sc);
1335 return *this;
1336}
1337
Marissa Wall17b4e452018-12-26 16:32:34 -08001338SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDesiredPresentTime(
1339 nsecs_t desiredPresentTime) {
1340 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001341 mIsAutoTimestamp = false;
Marissa Wall17b4e452018-12-26 16:32:34 -08001342 return *this;
1343}
1344
Peiyong Linc502cb72019-03-01 15:00:23 -08001345SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorSpaceAgnostic(
1346 const sp<SurfaceControl>& sc, const bool agnostic) {
1347 layer_state_t* s = getLayerState(sc);
1348 if (!s) {
1349 mStatus = BAD_INDEX;
1350 return *this;
1351 }
1352 s->what |= layer_state_t::eColorSpaceAgnosticChanged;
1353 s->colorSpaceAgnostic = agnostic;
1354
1355 registerSurfaceControlForCallback(sc);
1356 return *this;
1357}
1358
Marissa Wallc837b5e2018-10-12 10:04:44 -07001359SurfaceComposerClient::Transaction&
Ana Krulecc84d09b2019-11-02 23:10:29 +01001360SurfaceComposerClient::Transaction::setFrameRateSelectionPriority(const sp<SurfaceControl>& sc,
1361 int32_t priority) {
1362 layer_state_t* s = getLayerState(sc);
1363 if (!s) {
1364 mStatus = BAD_INDEX;
1365 return *this;
1366 }
1367
1368 s->what |= layer_state_t::eFrameRateSelectionPriority;
1369 s->frameRateSelectionPriority = priority;
1370
1371 registerSurfaceControlForCallback(sc);
1372 return *this;
1373}
1374
1375SurfaceComposerClient::Transaction&
Marissa Wallc837b5e2018-10-12 10:04:44 -07001376SurfaceComposerClient::Transaction::addTransactionCompletedCallback(
Marissa Walle2ffb422018-10-12 11:33:52 -07001377 TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
Marissa Wallc837b5e2018-10-12 10:04:44 -07001378 auto listener = TransactionCompletedListener::getInstance();
1379
Marissa Wall80d94ad2019-01-18 16:04:36 -08001380 auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
1381 std::placeholders::_2, std::placeholders::_3);
1382 const auto& surfaceControls =
1383 mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001384
Marissa Wall80d94ad2019-01-18 16:04:36 -08001385 CallbackId callbackId = listener->addCallbackFunction(callbackWithContext, surfaceControls);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001386
1387 mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
1388 callbackId);
Marissa Wall61c58622018-07-18 10:12:20 -07001389 return *this;
1390}
1391
Valerie Hau871d6352020-01-29 08:44:02 -08001392SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::notifyProducerDisconnect(
1393 const sp<SurfaceControl>& sc) {
1394 layer_state_t* s = getLayerState(sc);
1395 if (!s) {
1396 mStatus = BAD_INDEX;
1397 return *this;
1398 }
1399
1400 s->what |= layer_state_t::eProducerDisconnect;
1401 return *this;
1402}
1403
Vishnu Nair6b7c5c92020-09-29 17:27:05 -07001404SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameNumber(
1405 const sp<SurfaceControl>& sc, uint64_t frameNumber) {
1406 layer_state_t* s = getLayerState(sc);
1407 if (!s) {
1408 mStatus = BAD_INDEX;
1409 return *this;
1410 }
1411
1412 s->what |= layer_state_t::eFrameNumberChanged;
1413 s->frameNumber = frameNumber;
1414
1415 return *this;
1416}
1417
Robert Carr2c358bf2018-08-08 15:58:15 -07001418#ifndef NO_INPUT
1419SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setInputWindowInfo(
1420 const sp<SurfaceControl>& sc,
1421 const InputWindowInfo& info) {
1422 layer_state_t* s = getLayerState(sc);
1423 if (!s) {
1424 mStatus = BAD_INDEX;
1425 return *this;
1426 }
Chris Ye0783e992020-06-02 21:34:49 -07001427 s->inputHandle = new InputWindowHandle(info);
Robert Carr2c358bf2018-08-08 15:58:15 -07001428 s->what |= layer_state_t::eInputInfoChanged;
1429 return *this;
1430}
chaviw273171b2018-12-26 11:46:30 -08001431
Vishnu Naire798b472020-07-23 13:52:21 -07001432SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFocusedWindow(
Vishnu Naire798b472020-07-23 13:52:21 -07001433 const FocusRequest& request) {
1434 mInputWindowCommands.focusRequests.push_back(request);
1435 return *this;
1436}
1437
chaviwa911b102019-02-14 10:18:33 -08001438SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
1439 mInputWindowCommands.syncInputWindows = true;
1440 return *this;
1441}
1442
Robert Carr2c358bf2018-08-08 15:58:15 -07001443#endif
1444
Peiyong Lind3788632018-09-18 16:01:31 -07001445SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
1446 const sp<SurfaceControl>& sc, const mat3& matrix, const vec3& translation) {
1447 layer_state_t* s = getLayerState(sc);
1448 if (!s) {
1449 mStatus = BAD_INDEX;
1450 return *this;
1451 }
1452 s->what |= layer_state_t::eColorTransformChanged;
1453 s->colorTransform = mat4(matrix, translation);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001454
1455 registerSurfaceControlForCallback(sc);
Peiyong Lind3788632018-09-18 16:01:31 -07001456 return *this;
1457}
1458
Robert Carrfb4d58b2019-01-15 09:21:27 -08001459SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometry(
1460 const sp<SurfaceControl>& sc, const Rect& source, const Rect& dst, int transform) {
1461 setCrop_legacy(sc, source);
1462
1463 int x = dst.left;
1464 int y = dst.top;
Robert Carr66365e42019-04-08 16:58:04 -07001465
1466 float sourceWidth = source.getWidth();
1467 float sourceHeight = source.getHeight();
1468
1469 float xScale = sourceWidth < 0 ? 1.0f : dst.getWidth() / sourceWidth;
1470 float yScale = sourceHeight < 0 ? 1.0f : dst.getHeight() / sourceHeight;
Robert Carrfb4d58b2019-01-15 09:21:27 -08001471 float matrix[4] = {1, 0, 0, 1};
1472
1473 switch (transform) {
1474 case NATIVE_WINDOW_TRANSFORM_FLIP_H:
1475 matrix[0] = -xScale; matrix[1] = 0;
1476 matrix[2] = 0; matrix[3] = yScale;
1477 x += source.getWidth();
1478 break;
1479 case NATIVE_WINDOW_TRANSFORM_FLIP_V:
1480 matrix[0] = xScale; matrix[1] = 0;
1481 matrix[2] = 0; matrix[3] = -yScale;
1482 y += source.getHeight();
1483 break;
1484 case NATIVE_WINDOW_TRANSFORM_ROT_90:
1485 matrix[0] = 0; matrix[1] = -yScale;
1486 matrix[2] = xScale; matrix[3] = 0;
1487 x += source.getHeight();
1488 break;
1489 case NATIVE_WINDOW_TRANSFORM_ROT_180:
1490 matrix[0] = -xScale; matrix[1] = 0;
1491 matrix[2] = 0; matrix[3] = -yScale;
1492 x += source.getWidth();
1493 y += source.getHeight();
1494 break;
1495 case NATIVE_WINDOW_TRANSFORM_ROT_270:
1496 matrix[0] = 0; matrix[1] = yScale;
1497 matrix[2] = -xScale; matrix[3] = 0;
1498 y += source.getWidth();
1499 break;
1500 default:
1501 matrix[0] = xScale; matrix[1] = 0;
1502 matrix[2] = 0; matrix[3] = yScale;
1503 break;
1504 }
1505 setMatrix(sc, matrix[0], matrix[1], matrix[2], matrix[3]);
chaviw76f5f2f2019-09-23 10:15:51 -07001506 float offsetX = xScale * source.left;
1507 float offsetY = yScale * source.top;
1508 setPosition(sc, x - offsetX, y - offsetY);
Robert Carrfb4d58b2019-01-15 09:21:27 -08001509
1510 return *this;
1511}
1512
Vishnu Nairc97b8db2019-10-29 18:19:35 -07001513SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setShadowRadius(
1514 const sp<SurfaceControl>& sc, float shadowRadius) {
1515 layer_state_t* s = getLayerState(sc);
1516 if (!s) {
1517 mStatus = BAD_INDEX;
1518 return *this;
1519 }
1520 s->what |= layer_state_t::eShadowRadiusChanged;
1521 s->shadowRadius = shadowRadius;
1522 return *this;
1523}
1524
Steven Thomas3172e202020-01-06 19:25:30 -08001525SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameRate(
Marin Shalamanov46084422020-10-13 12:33:42 +02001526 const sp<SurfaceControl>& sc, float frameRate, int8_t compatibility,
1527 bool shouldBeSeamless) {
Steven Thomas3172e202020-01-06 19:25:30 -08001528 layer_state_t* s = getLayerState(sc);
1529 if (!s) {
1530 mStatus = BAD_INDEX;
1531 return *this;
1532 }
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001533 // Allow privileged values as well here, those will be ignored by SF if
1534 // the caller is not privileged
1535 if (!ValidateFrameRate(frameRate, compatibility, "Transaction::setFrameRate",
1536 /*privileged=*/true)) {
Steven Thomas62a4cf82020-01-31 12:04:03 -08001537 mStatus = BAD_VALUE;
1538 return *this;
1539 }
Steven Thomas3172e202020-01-06 19:25:30 -08001540 s->what |= layer_state_t::eFrameRateChanged;
1541 s->frameRate = frameRate;
Steven Thomas62a4cf82020-01-31 12:04:03 -08001542 s->frameRateCompatibility = compatibility;
Marin Shalamanov46084422020-10-13 12:33:42 +02001543 s->shouldBeSeamless = shouldBeSeamless;
Steven Thomas3172e202020-01-06 19:25:30 -08001544 return *this;
1545}
1546
Vishnu Nair6213bd92020-05-08 17:42:25 -07001547SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFixedTransformHint(
1548 const sp<SurfaceControl>& sc, int32_t fixedTransformHint) {
1549 layer_state_t* s = getLayerState(sc);
1550 if (!s) {
1551 mStatus = BAD_INDEX;
1552 return *this;
1553 }
1554
1555 const ui::Transform::RotationFlags transform = fixedTransformHint == -1
1556 ? ui::Transform::ROT_INVALID
1557 : ui::Transform::toRotationFlags(static_cast<ui::Rotation>(fixedTransformHint));
1558 s->what |= layer_state_t::eFixedTransformHintChanged;
1559 s->fixedTransformHint = transform;
1560 return *this;
1561}
1562
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001563SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1564 const FrameTimelineInfo& frameTimelineInfo) {
1565 mFrameTimelineInfo = frameTimelineInfo;
Ady Abraham22c7b5c2020-09-22 19:33:40 -07001566 return *this;
1567}
1568
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001569SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1570 const sp<SurfaceControl>& sc, const FrameTimelineInfo& frameTimelineInfo) {
Robert Carr9b611b72020-10-19 12:00:23 -07001571 layer_state_t* s = getLayerState(sc);
1572 if (!s) {
1573 mStatus = BAD_INDEX;
1574 return *this;
1575 }
1576
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001577 s->what |= layer_state_t::eFrameTimelineInfoChanged;
1578 s->frameTimelineInfo = frameTimelineInfo;
Robert Carr9b611b72020-10-19 12:00:23 -07001579 return *this;
1580}
1581
Vishnu Naircf26a0a2020-11-13 12:56:20 -08001582SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAutoRefresh(
1583 const sp<SurfaceControl>& sc, bool autoRefresh) {
1584 layer_state_t* s = getLayerState(sc);
1585 if (!s) {
1586 mStatus = BAD_INDEX;
1587 return *this;
1588 }
1589
1590 s->what |= layer_state_t::eAutoRefreshChanged;
1591 s->autoRefresh = autoRefresh;
1592 return *this;
1593}
1594
Vishnu Nair277142c2021-01-05 18:35:29 -08001595SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApplyToken(
1596 const sp<IBinder>& applyToken) {
1597 mApplyToken = applyToken;
1598 return *this;
1599}
1600
John Reckcdb4ed72021-02-04 13:39:33 -05001601SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setStretchEffect(
1602 const sp<SurfaceControl>& sc, float left, float top, float right, float bottom, float vecX,
1603 float vecY, float maxAmount) {
1604 layer_state_t* s = getLayerState(sc);
1605 if (!s) {
1606 mStatus = BAD_INDEX;
1607 return *this;
1608 }
1609
1610 s->what |= layer_state_t::eStretchChanged;
1611 s->stretchEffect = StretchEffect{.area = {left, top, right, bottom},
1612 .vectorX = vecX,
1613 .vectorY = vecY,
1614 .maxAmount = maxAmount};
1615 return *this;
1616}
1617
Mathias Agopian698c0872011-06-28 19:09:31 -07001618// ---------------------------------------------------------------------------
1619
chaviw763ef572018-02-22 16:04:57 -08001620DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
Mathias Agopiane57f2922012-08-09 16:29:12 -07001621 DisplayState s;
1622 s.token = token;
1623 ssize_t index = mDisplayStates.indexOf(s);
1624 if (index < 0) {
1625 // we don't have it, add an initialized layer_state to our list
1626 s.what = 0;
1627 index = mDisplayStates.add(s);
1628 }
Dan Stozad723bd72014-11-18 10:24:03 -08001629 return mDisplayStates.editItemAt(static_cast<size_t>(index));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001630}
1631
Robert Carr4cdc58f2017-08-23 14:22:20 -07001632status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
1633 const sp<IGraphicBufferProducer>& bufferProducer) {
Pablo Ceballoseddbef82016-09-01 11:21:21 -07001634 if (bufferProducer.get() != nullptr) {
1635 // Make sure that composition can never be stalled by a virtual display
1636 // consumer that isn't processing buffers fast enough.
1637 status_t err = bufferProducer->setAsyncMode(true);
1638 if (err != NO_ERROR) {
1639 ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
1640 "BufferQueue. This BufferQueue cannot be used for virtual "
1641 "display. (%d)", err);
1642 return err;
1643 }
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001644 }
chaviw763ef572018-02-22 16:04:57 -08001645 DisplayState& s(getDisplayState(token));
Andy McFadden2adaf042012-12-18 09:49:45 -08001646 s.surface = bufferProducer;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001647 s.what |= DisplayState::eSurfaceChanged;
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001648 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001649}
1650
Robert Carr4cdc58f2017-08-23 14:22:20 -07001651void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
Mathias Agopiane57f2922012-08-09 16:29:12 -07001652 uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001653 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001654 s.layerStack = layerStack;
1655 s.what |= DisplayState::eLayerStackChanged;
1656}
1657
Robert Carr4cdc58f2017-08-23 14:22:20 -07001658void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
Dominik Laskowski718f9602019-11-09 20:01:35 -08001659 ui::Rotation orientation,
1660 const Rect& layerStackRect,
1661 const Rect& displayRect) {
chaviw763ef572018-02-22 16:04:57 -08001662 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001663 s.orientation = orientation;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +02001664 s.layerStackSpaceRect = layerStackRect;
1665 s.orientedDisplaySpaceRect = displayRect;
Mathias Agopian00e8c7a2012-09-04 19:30:46 -07001666 s.what |= DisplayState::eDisplayProjectionChanged;
Jorim Jaggi092123c2016-04-13 01:40:35 +00001667 mForceSynchronous = true; // TODO: do we actually still need this?
Mathias Agopiane57f2922012-08-09 16:29:12 -07001668}
1669
Robert Carr4cdc58f2017-08-23 14:22:20 -07001670void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
chaviw763ef572018-02-22 16:04:57 -08001671 DisplayState& s(getDisplayState(token));
Michael Wright1f6078a2014-06-26 16:01:02 -07001672 s.width = width;
1673 s.height = height;
1674 s.what |= DisplayState::eDisplaySizeChanged;
1675}
1676
Mathias Agopiane57f2922012-08-09 16:29:12 -07001677// ---------------------------------------------------------------------------
1678
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001679SurfaceComposerClient::SurfaceComposerClient()
Robert Carr4cdc58f2017-08-23 14:22:20 -07001680 : mStatus(NO_INIT)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001681{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001682}
1683
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +01001684SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
1685 : mStatus(NO_ERROR), mClient(client)
1686{
1687}
1688
Mathias Agopian698c0872011-06-28 19:09:31 -07001689void SurfaceComposerClient::onFirstRef() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001690 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07001691 if (sf != nullptr && mStatus == NO_INIT) {
Robert Carr1db73f62016-12-21 12:58:51 -08001692 sp<ISurfaceComposerClient> conn;
Robert Carrb89ea9d2018-12-10 13:01:14 -08001693 conn = sf->createConnection();
Yi Kong48a619f2018-06-05 16:34:59 -07001694 if (conn != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001695 mClient = conn;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001696 mStatus = NO_ERROR;
1697 }
1698 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001699}
1700
Mathias Agopian698c0872011-06-28 19:09:31 -07001701SurfaceComposerClient::~SurfaceComposerClient() {
Mathias Agopian631f3582010-05-25 17:51:34 -07001702 dispose();
1703}
Mathias Agopiandd3423c2009-09-23 15:44:05 -07001704
Mathias Agopian698c0872011-06-28 19:09:31 -07001705status_t SurfaceComposerClient::initCheck() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001706 return mStatus;
1707}
1708
Mathias Agopian698c0872011-06-28 19:09:31 -07001709sp<IBinder> SurfaceComposerClient::connection() const {
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001710 return IInterface::asBinder(mClient);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001711}
1712
Mathias Agopiand4784a32010-05-27 19:41:15 -07001713status_t SurfaceComposerClient::linkToComposerDeath(
1714 const sp<IBinder::DeathRecipient>& recipient,
Mathias Agopian698c0872011-06-28 19:09:31 -07001715 void* cookie, uint32_t flags) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001716 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1717 return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001718}
1719
Mathias Agopian698c0872011-06-28 19:09:31 -07001720void SurfaceComposerClient::dispose() {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001721 // this can be called more than once.
Mathias Agopian7e27f052010-05-28 14:22:23 -07001722 sp<ISurfaceComposerClient> client;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001723 Mutex::Autolock _lm(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -07001724 if (mClient != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001725 client = mClient; // hold ref while lock is held
1726 mClient.clear();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001727 }
Mathias Agopiand4784a32010-05-27 19:41:15 -07001728 mStatus = NO_INIT;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001729}
1730
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001731sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
1732 PixelFormat format, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001733 const sp<IBinder>& parentHandle,
Valerie Hau1acd6962019-10-28 16:35:48 -07001734 LayerMetadata metadata,
1735 uint32_t* outTransformHint) {
Robert Carr3b382ed2018-03-14 13:49:41 -07001736 sp<SurfaceControl> s;
Vishnu Nair992496b2020-10-22 17:27:21 -07001737 createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
Valerie Hau1acd6962019-10-28 16:35:48 -07001738 outTransformHint);
Robert Carr3b382ed2018-03-14 13:49:41 -07001739 return s;
1740}
1741
Marissa Wall35187b32019-01-08 10:08:52 -08001742sp<SurfaceControl> SurfaceComposerClient::createWithSurfaceParent(const String8& name, uint32_t w,
1743 uint32_t h, PixelFormat format,
1744 uint32_t flags, Surface* parent,
Valerie Hau1acd6962019-10-28 16:35:48 -07001745 LayerMetadata metadata,
1746 uint32_t* outTransformHint) {
Marissa Wall35187b32019-01-08 10:08:52 -08001747 sp<SurfaceControl> sur;
1748 status_t err = mStatus;
1749
1750 if (mStatus == NO_ERROR) {
1751 sp<IBinder> handle;
1752 sp<IGraphicBufferProducer> parentGbp = parent->getIGraphicBufferProducer();
1753 sp<IGraphicBufferProducer> gbp;
1754
Valerie Hau1acd6962019-10-28 16:35:48 -07001755 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001756 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001757 err = mClient->createWithSurfaceParent(name, w, h, format, flags, parentGbp,
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001758 std::move(metadata), &handle, &gbp, &id,
1759 &transformHint);
Valerie Hau1acd6962019-10-28 16:35:48 -07001760 if (outTransformHint) {
1761 *outTransformHint = transformHint;
1762 }
Marissa Wall35187b32019-01-08 10:08:52 -08001763 ALOGE_IF(err, "SurfaceComposerClient::createWithSurfaceParent error %s", strerror(-err));
1764 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001765 return new SurfaceControl(this, handle, gbp, id, transformHint);
Marissa Wall35187b32019-01-08 10:08:52 -08001766 }
1767 }
1768 return nullptr;
1769}
1770
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001771status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
1772 PixelFormat format,
1773 sp<SurfaceControl>* outSurface, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001774 const sp<IBinder>& parentHandle,
1775 LayerMetadata metadata,
Valerie Hau1acd6962019-10-28 16:35:48 -07001776 uint32_t* outTransformHint) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001777 sp<SurfaceControl> sur;
Robert Carr740eaf02018-03-27 12:59:18 -07001778 status_t err = mStatus;
Robert Carr3b382ed2018-03-14 13:49:41 -07001779
Mathias Agopian698c0872011-06-28 19:09:31 -07001780 if (mStatus == NO_ERROR) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001781 sp<IBinder> handle;
1782 sp<IGraphicBufferProducer> gbp;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001783
Valerie Hau1acd6962019-10-28 16:35:48 -07001784 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001785 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001786 err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001787 &handle, &gbp, &id, &transformHint);
1788
Valerie Hau1acd6962019-10-28 16:35:48 -07001789 if (outTransformHint) {
1790 *outTransformHint = transformHint;
1791 }
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001792 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
1793 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001794 *outSurface = new SurfaceControl(this, handle, gbp, id, transformHint);
Mathias Agopian698c0872011-06-28 19:09:31 -07001795 }
1796 }
Robert Carr3b382ed2018-03-14 13:49:41 -07001797 return err;
Mathias Agopian698c0872011-06-28 19:09:31 -07001798}
1799
chaviwfe94a222019-08-21 13:52:59 -07001800sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface) {
1801 if (mirrorFromSurface == nullptr) {
1802 return nullptr;
1803 }
1804
1805 sp<IBinder> handle;
1806 sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001807 int32_t layer_id = -1;
1808 status_t err = mClient->mirrorSurface(mirrorFromHandle, &handle, &layer_id);
chaviwfe94a222019-08-21 13:52:59 -07001809 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001810 return new SurfaceControl(this, handle, nullptr, layer_id, true /* owned */);
chaviwfe94a222019-08-21 13:52:59 -07001811 }
1812 return nullptr;
1813}
1814
Svetoslavd85084b2014-03-20 10:28:31 -07001815status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
1816 if (mStatus != NO_ERROR) {
1817 return mStatus;
1818 }
1819 return mClient->clearLayerFrameStats(token);
1820}
1821
1822status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
1823 FrameStats* outStats) const {
1824 if (mStatus != NO_ERROR) {
1825 return mStatus;
1826 }
1827 return mClient->getLayerFrameStats(token, outStats);
1828}
1829
Mathias Agopian698c0872011-06-28 19:09:31 -07001830// ----------------------------------------------------------------------------
1831
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001832status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001833 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1834 return sf->enableVSyncInjections(enable);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001835}
1836
1837status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001838 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1839 return sf->injectVSync(when);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001840}
1841
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001842status_t SurfaceComposerClient::getDisplayState(const sp<IBinder>& display,
1843 ui::DisplayState* state) {
1844 return ComposerService::getComposerService()->getDisplayState(display, state);
1845}
1846
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001847status_t SurfaceComposerClient::getStaticDisplayInfo(const sp<IBinder>& display,
1848 ui::StaticDisplayInfo* info) {
1849 return ComposerService::getComposerService()->getStaticDisplayInfo(display, info);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001850}
1851
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001852status_t SurfaceComposerClient::getDynamicDisplayInfo(const sp<IBinder>& display,
1853 ui::DynamicDisplayInfo* info) {
1854 return ComposerService::getComposerService()->getDynamicDisplayInfo(display, info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001855}
1856
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001857status_t SurfaceComposerClient::getActiveDisplayMode(const sp<IBinder>& display,
1858 ui::DisplayMode* mode) {
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001859 ui::DynamicDisplayInfo info;
1860 status_t result = getDynamicDisplayInfo(display, &info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001861 if (result != NO_ERROR) {
1862 return result;
1863 }
1864
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001865 if (const auto activeMode = info.getActiveDisplayMode()) {
1866 *mode = *activeMode;
1867 return NO_ERROR;
Dan Stoza7f7da322014-05-02 15:26:25 -07001868 }
1869
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001870 ALOGE("Active display mode not found.");
1871 return NAME_NOT_FOUND;
Dan Stoza7f7da322014-05-02 15:26:25 -07001872}
1873
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001874status_t SurfaceComposerClient::setDesiredDisplayModeSpecs(
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001875 const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching,
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001876 float primaryRefreshRateMin, float primaryRefreshRateMax, float appRequestRefreshRateMin,
1877 float appRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07001878 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001879 ->setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
1880 primaryRefreshRateMin, primaryRefreshRateMax,
1881 appRequestRefreshRateMin, appRequestRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001882}
1883
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001884status_t SurfaceComposerClient::getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
1885 ui::DisplayModeId* outDefaultMode,
1886 bool* outAllowGroupSwitching,
1887 float* outPrimaryRefreshRateMin,
1888 float* outPrimaryRefreshRateMax,
1889 float* outAppRequestRefreshRateMin,
1890 float* outAppRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07001891 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001892 ->getDesiredDisplayModeSpecs(displayToken, outDefaultMode, outAllowGroupSwitching,
1893 outPrimaryRefreshRateMin, outPrimaryRefreshRateMax,
1894 outAppRequestRefreshRateMin, outAppRequestRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001895}
1896
Daniel Solomon42d04562019-01-20 21:03:19 -08001897status_t SurfaceComposerClient::getDisplayNativePrimaries(const sp<IBinder>& display,
1898 ui::DisplayPrimaries& outPrimaries) {
1899 return ComposerService::getComposerService()->getDisplayNativePrimaries(display, outPrimaries);
1900}
1901
Michael Wright28f24d02016-07-12 13:30:53 -07001902status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
Peiyong Lina52f0292018-03-14 17:26:31 -07001903 ColorMode colorMode) {
Michael Wright28f24d02016-07-12 13:30:53 -07001904 return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
1905}
1906
Galia Peycheva5492cb52019-10-30 14:13:16 +01001907void SurfaceComposerClient::setAutoLowLatencyMode(const sp<IBinder>& display, bool on) {
1908 ComposerService::getComposerService()->setAutoLowLatencyMode(display, on);
1909}
1910
Galia Peycheva5492cb52019-10-30 14:13:16 +01001911void SurfaceComposerClient::setGameContentType(const sp<IBinder>& display, bool on) {
1912 ComposerService::getComposerService()->setGameContentType(display, on);
1913}
1914
Prashant Malani2c9b11f2014-05-25 01:36:31 -07001915void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
1916 int mode) {
1917 ComposerService::getComposerService()->setPowerMode(token, mode);
Jeff Brown2a09bb32012-10-08 19:13:57 -07001918}
1919
Peiyong Linc6780972018-10-28 15:24:08 -07001920status_t SurfaceComposerClient::getCompositionPreference(
1921 ui::Dataspace* defaultDataspace, ui::PixelFormat* defaultPixelFormat,
1922 ui::Dataspace* wideColorGamutDataspace, ui::PixelFormat* wideColorGamutPixelFormat) {
1923 return ComposerService::getComposerService()
1924 ->getCompositionPreference(defaultDataspace, defaultPixelFormat,
1925 wideColorGamutDataspace, wideColorGamutPixelFormat);
Peiyong Lin0256f722018-08-31 15:45:10 -07001926}
1927
Peiyong Lin08d10512019-01-16 13:27:35 -08001928bool SurfaceComposerClient::getProtectedContentSupport() {
1929 bool supported = false;
1930 ComposerService::getComposerService()->getProtectedContentSupport(&supported);
1931 return supported;
1932}
1933
Svetoslavd85084b2014-03-20 10:28:31 -07001934status_t SurfaceComposerClient::clearAnimationFrameStats() {
1935 return ComposerService::getComposerService()->clearAnimationFrameStats();
1936}
1937
1938status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
1939 return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
1940}
1941
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001942status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
1943 ui::PixelFormat* outFormat,
1944 ui::Dataspace* outDataspace,
1945 uint8_t* outComponentMask) {
1946 return ComposerService::getComposerService()
1947 ->getDisplayedContentSamplingAttributes(display, outFormat, outDataspace,
1948 outComponentMask);
1949}
1950
Kevin DuBois74e53772018-11-19 10:52:38 -08001951status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display,
1952 bool enable, uint8_t componentMask,
1953 uint64_t maxFrames) {
1954 return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable,
1955 componentMask,
1956 maxFrames);
1957}
1958
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001959status_t SurfaceComposerClient::getDisplayedContentSample(const sp<IBinder>& display,
1960 uint64_t maxFrames, uint64_t timestamp,
1961 DisplayedFrameStats* outStats) {
1962 return ComposerService::getComposerService()->getDisplayedContentSample(display, maxFrames,
1963 timestamp, outStats);
1964}
Marissa Wall35187b32019-01-08 10:08:52 -08001965
Peiyong Lin4f3fddf2019-01-24 17:21:24 -08001966status_t SurfaceComposerClient::isWideColorDisplay(const sp<IBinder>& display,
1967 bool* outIsWideColorDisplay) {
1968 return ComposerService::getComposerService()->isWideColorDisplay(display,
1969 outIsWideColorDisplay);
1970}
1971
Kevin DuBois00c66832019-02-18 16:21:31 -08001972status_t SurfaceComposerClient::addRegionSamplingListener(
1973 const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
1974 const sp<IRegionSamplingListener>& listener) {
1975 return ComposerService::getComposerService()->addRegionSamplingListener(samplingArea,
1976 stopLayerHandle,
1977 listener);
1978}
1979
1980status_t SurfaceComposerClient::removeRegionSamplingListener(
1981 const sp<IRegionSamplingListener>& listener) {
1982 return ComposerService::getComposerService()->removeRegionSamplingListener(listener);
1983}
1984
Alec Mouria9a68a62021-03-04 19:14:50 -08001985status_t SurfaceComposerClient::addFpsListener(int32_t taskId,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001986 const sp<gui::IFpsListener>& listener) {
Alec Mouria9a68a62021-03-04 19:14:50 -08001987 return ComposerService::getComposerService()->addFpsListener(taskId, listener);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001988}
1989
1990status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& listener) {
1991 return ComposerService::getComposerService()->removeFpsListener(listener);
1992}
1993
Dan Gittik57e63c52019-01-18 16:37:54 +00001994bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) {
1995 bool support = false;
1996 ComposerService::getComposerService()->getDisplayBrightnessSupport(displayToken, &support);
1997 return support;
1998}
1999
2000status_t SurfaceComposerClient::setDisplayBrightness(const sp<IBinder>& displayToken,
John Reck22be6962021-03-10 12:59:54 -05002001 const gui::DisplayBrightness& brightness) {
Dan Gittik57e63c52019-01-18 16:37:54 +00002002 return ComposerService::getComposerService()->setDisplayBrightness(displayToken, brightness);
2003}
2004
Lais Andrade3a6e47d2020-04-02 11:20:16 +01002005status_t SurfaceComposerClient::notifyPowerBoost(int32_t boostId) {
2006 return ComposerService::getComposerService()->notifyPowerBoost(boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07002007}
2008
Vishnu Nairb13bb952019-11-15 10:24:08 -08002009status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColor,
2010 const half4& spotColor, float lightPosY,
2011 float lightPosZ, float lightRadius) {
2012 return ComposerService::getComposerService()->setGlobalShadowSettings(ambientColor, spotColor,
2013 lightPosY, lightPosZ,
2014 lightRadius);
2015}
2016
Ana Krulec31f2b3c2020-12-14 14:30:09 -08002017int SurfaceComposerClient::getGPUContextPriority() {
2018 return ComposerService::getComposerService()->getGPUContextPriority();
2019}
2020
Mathias Agopian698c0872011-06-28 19:09:31 -07002021// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08002022
chaviw690db382020-07-27 16:46:46 -07002023status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002024 const sp<IScreenCaptureListener>& captureListener) {
Mathias Agopian2a9fc492013-03-01 13:42:57 -08002025 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002026 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002027
chaviwe7b9f272020-08-18 16:08:59 -07002028 return s->captureDisplay(captureArgs, captureListener);
Robert Carr673134e2017-01-09 19:48:38 -08002029}
2030
chaviw690db382020-07-27 16:46:46 -07002031status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack,
chaviwe7b9f272020-08-18 16:08:59 -07002032 const sp<IScreenCaptureListener>& captureListener) {
chaviw93df2ea2019-04-30 16:45:12 -07002033 sp<ISurfaceComposer> s(ComposerService::getComposerService());
2034 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002035
chaviwe7b9f272020-08-18 16:08:59 -07002036 return s->captureDisplay(displayOrLayerStack, captureListener);
chaviw93df2ea2019-04-30 16:45:12 -07002037}
2038
chaviw26c52482020-07-28 16:25:52 -07002039status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002040 const sp<IScreenCaptureListener>& captureListener) {
chaviwa76b2712017-09-20 12:02:26 -07002041 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002042 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002043
chaviwe7b9f272020-08-18 16:08:59 -07002044 return s->captureLayers(captureArgs, captureListener);
chaviwa76b2712017-09-20 12:02:26 -07002045}
Dominik Laskowski718f9602019-11-09 20:01:35 -08002046
2047} // namespace android