blob: 7dc5e85c4d8eb5863965a733d08d92c96dff803f [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 Shalamanov3b1f7bc2021-03-16 15:51:53 +010042#include <private/gui/ParcelUtils.h>
Marin Shalamanova7fe3042021-01-29 21:02:08 +010043#include <ui/DisplayMode.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010044#include <ui/DynamicDisplayInfo.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080045
Robert Carr2c358bf2018-08-08 15:58:15 -070046#ifndef NO_INPUT
47#include <input/InputWindow.h>
48#endif
49
Mathias Agopian41f673c2011-11-17 17:48:35 -080050#include <private/gui/ComposerService.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080051
Marissa Wall73411622019-01-25 10:45:41 -080052// This server size should always be smaller than the server cache size
53#define BUFFER_CACHE_MAX_SIZE 64
54
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080055namespace android {
Peiyong Lin9f034472018-03-28 15:29:00 -070056
57using ui::ColorMode;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080058// ---------------------------------------------------------------------------
59
Mathias Agopian7e27f052010-05-28 14:22:23 -070060ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
61
Mathias Agopianb7e930d2010-06-01 15:12:58 -070062ComposerService::ComposerService()
63: Singleton<ComposerService>() {
Andy McFadden6652b3e2012-09-06 18:45:56 -070064 Mutex::Autolock _l(mLock);
65 connectLocked();
66}
67
68void ComposerService::connectLocked() {
Mathias Agopianb7e930d2010-06-01 15:12:58 -070069 const String16 name("SurfaceFlinger");
70 while (getService(name, &mComposerService) != NO_ERROR) {
71 usleep(250000);
72 }
Yi Konga03e0442018-07-17 11:16:57 -070073 assert(mComposerService != nullptr);
Andy McFadden6652b3e2012-09-06 18:45:56 -070074
75 // Create the death listener.
76 class DeathObserver : public IBinder::DeathRecipient {
77 ComposerService& mComposerService;
78 virtual void binderDied(const wp<IBinder>& who) {
79 ALOGW("ComposerService remote (surfaceflinger) died [%p]",
80 who.unsafe_get());
81 mComposerService.composerServiceDied();
82 }
83 public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070084 explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
Andy McFadden6652b3e2012-09-06 18:45:56 -070085 };
86
87 mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
Marco Nelissen2ea926b2014-11-14 08:01:01 -080088 IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
Mathias Agopianb7e930d2010-06-01 15:12:58 -070089}
90
Andy McFadden6652b3e2012-09-06 18:45:56 -070091/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
92 ComposerService& instance = ComposerService::getInstance();
93 Mutex::Autolock _l(instance.mLock);
Yi Kong48a619f2018-06-05 16:34:59 -070094 if (instance.mComposerService == nullptr) {
Andy McFadden6652b3e2012-09-06 18:45:56 -070095 ComposerService::getInstance().connectLocked();
Yi Konga03e0442018-07-17 11:16:57 -070096 assert(instance.mComposerService != nullptr);
Andy McFadden6652b3e2012-09-06 18:45:56 -070097 ALOGD("ComposerService reconnected");
98 }
99 return instance.mComposerService;
100}
101
102void ComposerService::composerServiceDied()
103{
104 Mutex::Autolock _l(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -0700105 mComposerService = nullptr;
106 mDeathObserver = nullptr;
Mathias Agopianb7e930d2010-06-01 15:12:58 -0700107}
108
Robert Carrfb4d58b2019-01-15 09:21:27 -0800109class DefaultComposerClient: public Singleton<DefaultComposerClient> {
110 Mutex mLock;
111 sp<SurfaceComposerClient> mClient;
112 friend class Singleton<ComposerService>;
113public:
114 static sp<SurfaceComposerClient> getComposerClient() {
115 DefaultComposerClient& dc = DefaultComposerClient::getInstance();
116 Mutex::Autolock _l(dc.mLock);
117 if (dc.mClient == nullptr) {
118 dc.mClient = new SurfaceComposerClient;
119 }
120 return dc.mClient;
121 }
122};
123ANDROID_SINGLETON_STATIC_INSTANCE(DefaultComposerClient);
124
125
126sp<SurfaceComposerClient> SurfaceComposerClient::getDefault() {
127 return DefaultComposerClient::getComposerClient();
128}
129
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100130JankDataListener::~JankDataListener() {
131}
132
Mathias Agopian7e27f052010-05-28 14:22:23 -0700133// ---------------------------------------------------------------------------
134
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700135// TransactionCompletedListener does not use ANDROID_SINGLETON_STATIC_INSTANCE because it needs
136// to be able to return a sp<> to its instance to pass to SurfaceFlinger.
137// ANDROID_SINGLETON_STATIC_INSTANCE only allows a reference to an instance.
138
Marissa Wallc837b5e2018-10-12 10:04:44 -0700139// 0 is an invalid callback id
140TransactionCompletedListener::TransactionCompletedListener() : mCallbackIdCounter(1) {}
141
142CallbackId TransactionCompletedListener::getNextIdLocked() {
143 return mCallbackIdCounter++;
144}
145
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700146sp<TransactionCompletedListener> TransactionCompletedListener::getInstance() {
147 static sp<TransactionCompletedListener> sInstance = new TransactionCompletedListener;
148 return sInstance;
149}
150
Marissa Wallc837b5e2018-10-12 10:04:44 -0700151sp<ITransactionCompletedListener> TransactionCompletedListener::getIInstance() {
152 return static_cast<sp<ITransactionCompletedListener>>(getInstance());
153}
154
155void TransactionCompletedListener::startListeningLocked() {
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700156 if (mListening) {
157 return;
158 }
159 ProcessState::self()->startThreadPool();
160 mListening = true;
161}
162
Marissa Wall80d94ad2019-01-18 16:04:36 -0800163CallbackId TransactionCompletedListener::addCallbackFunction(
164 const TransactionCompletedCallback& callbackFunction,
165 const std::unordered_set<sp<SurfaceControl>, SurfaceComposerClient::SCHash>&
166 surfaceControls) {
Marissa Wallc837b5e2018-10-12 10:04:44 -0700167 std::lock_guard<std::mutex> lock(mMutex);
168 startListeningLocked();
169
170 CallbackId callbackId = getNextIdLocked();
Marissa Wall80d94ad2019-01-18 16:04:36 -0800171 mCallbacks[callbackId].callbackFunction = callbackFunction;
172
173 auto& callbackSurfaceControls = mCallbacks[callbackId].surfaceControls;
174
175 for (const auto& surfaceControl : surfaceControls) {
176 callbackSurfaceControls[surfaceControl->getHandle()] = surfaceControl;
177 }
178
Marissa Wallc837b5e2018-10-12 10:04:44 -0700179 return callbackId;
180}
181
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100182void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
183 sp<SurfaceControl> surfaceControl) {
184 std::lock_guard<std::mutex> lock(mMutex);
185 mJankListeners.insert({surfaceControl->getHandle(), listener});
186}
187
188void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) {
189 std::lock_guard<std::mutex> lock(mMutex);
190 for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {
191 if (it->second == listener) {
192 it = mJankListeners.erase(it);
193 } else {
194 it++;
195 }
196 }
197}
198
Vishnu Nair1506b182021-02-22 14:35:15 -0800199void TransactionCompletedListener::setReleaseBufferCallback(uint64_t graphicBufferId,
200 ReleaseBufferCallback listener) {
201 std::scoped_lock<std::mutex> lock(mMutex);
202 mReleaseBufferCallbacks[graphicBufferId] = listener;
203}
204
205void TransactionCompletedListener::removeReleaseBufferCallback(uint64_t graphicBufferId) {
206 std::scoped_lock<std::mutex> lock(mMutex);
207 mReleaseBufferCallbacks.erase(graphicBufferId);
208}
209
Jorim Jaggif51775d2021-01-14 23:44:15 +0100210void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
211 sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
212 std::lock_guard<std::mutex> lock(mMutex);
213 mSurfaceStatsListeners.insert({surfaceControl->getHandle(),
214 SurfaceStatsCallbackEntry(context, cookie, listener)});
215}
216
217void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) {
218 std::lock_guard<std::mutex> lock(mMutex);
219 for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) {
220 auto [itContext, itCookie, itListener] = it->second;
221 if (itContext == context && itCookie == cookie) {
222 it = mSurfaceStatsListeners.erase(it);
223 } else {
224 it++;
225 }
226 }
227}
228
Marissa Wall80d94ad2019-01-18 16:04:36 -0800229void TransactionCompletedListener::addSurfaceControlToCallbacks(
230 const sp<SurfaceControl>& surfaceControl,
231 const std::unordered_set<CallbackId>& callbackIds) {
232 std::lock_guard<std::mutex> lock(mMutex);
233
234 for (auto callbackId : callbackIds) {
235 mCallbacks[callbackId].surfaceControls.emplace(std::piecewise_construct,
236 std::forward_as_tuple(
237 surfaceControl->getHandle()),
238 std::forward_as_tuple(surfaceControl));
239 }
240}
241
Marissa Walle2ffb422018-10-12 11:33:52 -0700242void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800243 std::unordered_map<CallbackId, CallbackTranslation> callbacksMap;
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100244 std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100245 std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> surfaceListeners;
Valerie Haud3b90d22019-11-06 09:37:31 -0800246 {
247 std::lock_guard<std::mutex> lock(mMutex);
Marissa Walle2ffb422018-10-12 11:33:52 -0700248
Valerie Haud3b90d22019-11-06 09:37:31 -0800249 /* This listener knows all the sp<IBinder> to sp<SurfaceControl> for all its registered
250 * callbackIds, except for when Transactions are merged together. This probably cannot be
251 * solved before this point because the Transactions could be merged together and applied in
252 * a different process.
253 *
254 * Fortunately, we get all the callbacks for this listener for the same frame together at
255 * the same time. This means if any Transactions were merged together, we will get their
256 * callbacks at the same time. We can combine all the sp<IBinder> to sp<SurfaceControl> maps
257 * for all the callbackIds to generate one super map that contains all the sp<IBinder> to
258 * sp<SurfaceControl> that could possibly exist for the callbacks.
259 */
260 callbacksMap = mCallbacks;
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100261 jankListenersMap = mJankListeners;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100262 surfaceListeners = mSurfaceStatsListeners;
Valerie Haud3b90d22019-11-06 09:37:31 -0800263 for (const auto& transactionStats : listenerStats.transactionStats) {
264 for (auto& callbackId : transactionStats.callbackIds) {
265 mCallbacks.erase(callbackId);
266 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800267 }
268 }
Marissa Walld600d572019-03-26 15:38:50 -0700269 for (const auto& transactionStats : listenerStats.transactionStats) {
270 for (auto callbackId : transactionStats.callbackIds) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800271 auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
Marissa Wall80d94ad2019-01-18 16:04:36 -0800272 if (!callbackFunction) {
Marissa Walle2ffb422018-10-12 11:33:52 -0700273 ALOGE("cannot call null callback function, skipping");
274 continue;
275 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800276 std::vector<SurfaceControlStats> surfaceControlStats;
277 for (const auto& surfaceStats : transactionStats.surfaceStats) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800278 surfaceControlStats
279 .emplace_back(callbacksMap[callbackId]
280 .surfaceControls[surfaceStats.surfaceControl],
Valerie Hau871d6352020-01-29 08:44:02 -0800281 transactionStats.latchTime, surfaceStats.acquireTime,
282 transactionStats.presentFence,
283 surfaceStats.previousReleaseFence, surfaceStats.transformHint,
284 surfaceStats.eventStats);
Valerie Hau84d87ff2020-01-08 17:23:21 -0800285 if (callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl]) {
286 callbacksMap[callbackId]
287 .surfaceControls[surfaceStats.surfaceControl]
288 ->setTransformHint(surfaceStats.transformHint);
289 }
Vishnu Nair1506b182021-02-22 14:35:15 -0800290 // If there is buffer id set, we look up any pending client release buffer callbacks
291 // and call them. This is a performance optimization when we have a transaction
292 // callback and a release buffer callback happening at the same time to avoid an
293 // additional ipc call from the server.
294 if (surfaceStats.previousBufferId) {
295 ReleaseBufferCallback callback =
296 popReleaseBufferCallbackLocked(surfaceStats.previousBufferId);
297 if (callback) {
298 callback(surfaceStats.previousBufferId,
299 surfaceStats.previousReleaseFence
300 ? surfaceStats.previousReleaseFence
301 : Fence::NO_FENCE);
302 }
303 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800304 }
305
306 callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
307 surfaceControlStats);
Marissa Walle2ffb422018-10-12 11:33:52 -0700308 }
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100309 for (const auto& surfaceStats : transactionStats.surfaceStats) {
Jorim Jaggif51775d2021-01-14 23:44:15 +0100310 auto listenerRange = surfaceListeners.equal_range(surfaceStats.surfaceControl);
311 for (auto it = listenerRange.first; it != listenerRange.second; it++) {
312 auto entry = it->second;
313 entry.callback(entry.context, transactionStats.latchTime,
314 transactionStats.presentFence, surfaceStats);
315 }
316
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100317 if (surfaceStats.jankData.empty()) continue;
Jorim Jaggif51775d2021-01-14 23:44:15 +0100318 auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl);
319 for (auto it = jankRange.first; it != jankRange.second; it++) {
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100320 it->second->onJankDataAvailable(surfaceStats.jankData);
321 }
322 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700323 }
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700324}
325
Vishnu Nair1506b182021-02-22 14:35:15 -0800326void TransactionCompletedListener::onReleaseBuffer(uint64_t graphicBufferId,
327 sp<Fence> releaseFence) {
328 ReleaseBufferCallback callback;
329 {
330 std::scoped_lock<std::mutex> lock(mMutex);
331 callback = popReleaseBufferCallbackLocked(graphicBufferId);
332 }
333 if (!callback) {
334 ALOGE("Could not call release buffer callback, buffer not found %" PRIu64, graphicBufferId);
335 return;
336 }
337 callback(graphicBufferId, releaseFence);
338}
339
340ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked(
341 uint64_t graphicBufferId) {
342 ReleaseBufferCallback callback;
343 auto itr = mReleaseBufferCallbacks.find(graphicBufferId);
344 if (itr == mReleaseBufferCallbacks.end()) {
345 return nullptr;
346 }
347 callback = itr->second;
348 mReleaseBufferCallbacks.erase(itr);
349 return callback;
350}
351
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700352// ---------------------------------------------------------------------------
353
Robert Carre06ad2b2020-04-10 15:09:33 -0700354void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId);
Marissa Wall78b72202019-03-15 14:58:34 -0700355
Robert Carre06ad2b2020-04-10 15:09:33 -0700356/**
357 * We use the BufferCache to reduce the overhead of exchanging GraphicBuffers with
358 * the server. If we were to simply parcel the GraphicBuffer we would pay two overheads
359 * 1. Cost of sending the FD
360 * 2. Cost of importing the GraphicBuffer with the mapper in the receiving process.
361 * To ease this cost we implement the following scheme of caching buffers to integers,
362 * or said-otherwise, naming them with integers. This is the scheme known as slots in
363 * the legacy BufferQueue system.
364 * 1. When sending Buffers to SurfaceFlinger we look up the Buffer in the cache.
365 * 2. If there is a cache-hit we remove the Buffer from the Transaction and instead
366 * send the cached integer.
367 * 3. If there is a cache miss, we cache the new buffer and send the integer
368 * along with the Buffer, SurfaceFlinger on it's side creates a new cache
369 * entry, and we use the integer for further communication.
370 * A few details about lifetime:
371 * 1. The cache evicts by LRU. The server side cache is keyed by BufferCache::getToken
372 * which is per process Unique. The server side cache is larger than the client side
373 * cache so that the server will never evict entries before the client.
374 * 2. When the client evicts an entry it notifies the server via an uncacheBuffer
375 * transaction.
376 * 3. The client only references the Buffers by ID, and uses buffer->addDeathCallback
377 * to auto-evict destroyed buffers.
378 */
Marissa Wall73411622019-01-25 10:45:41 -0800379class BufferCache : public Singleton<BufferCache> {
380public:
381 BufferCache() : token(new BBinder()) {}
382
383 sp<IBinder> getToken() {
384 return IInterface::asBinder(TransactionCompletedListener::getIInstance());
385 }
386
Marissa Wall78b72202019-03-15 14:58:34 -0700387 status_t getCacheId(const sp<GraphicBuffer>& buffer, uint64_t* cacheId) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800388 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800389
Marissa Wall78b72202019-03-15 14:58:34 -0700390 auto itr = mBuffers.find(buffer->getId());
Marissa Wall73411622019-01-25 10:45:41 -0800391 if (itr == mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700392 return BAD_VALUE;
Marissa Wall73411622019-01-25 10:45:41 -0800393 }
Marissa Wall78b72202019-03-15 14:58:34 -0700394 itr->second = getCounter();
395 *cacheId = buffer->getId();
396 return NO_ERROR;
Marissa Wall73411622019-01-25 10:45:41 -0800397 }
398
Marissa Wall78b72202019-03-15 14:58:34 -0700399 uint64_t cache(const sp<GraphicBuffer>& buffer) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800400 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800401
Marissa Wall78b72202019-03-15 14:58:34 -0700402 if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) {
403 evictLeastRecentlyUsedBuffer();
404 }
Marissa Wall73411622019-01-25 10:45:41 -0800405
Robert Carre06ad2b2020-04-10 15:09:33 -0700406 buffer->addDeathCallback(removeDeadBufferCallback, nullptr);
Marissa Wall78b72202019-03-15 14:58:34 -0700407
408 mBuffers[buffer->getId()] = getCounter();
409 return buffer->getId();
410 }
411
412 void uncache(uint64_t cacheId) {
413 std::lock_guard<std::mutex> lock(mMutex);
414 uncacheLocked(cacheId);
415 }
416
417 void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) {
418 mBuffers.erase(cacheId);
419 SurfaceComposerClient::doUncacheBufferTransaction(cacheId);
Marissa Wall73411622019-01-25 10:45:41 -0800420 }
421
422private:
Marissa Wall78b72202019-03-15 14:58:34 -0700423 void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) {
Marissa Wall73411622019-01-25 10:45:41 -0800424 auto itr = mBuffers.begin();
Marissa Wall78b72202019-03-15 14:58:34 -0700425 uint64_t minCounter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800426 auto minBuffer = itr;
427 itr++;
428
429 while (itr != mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700430 uint64_t counter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800431 if (counter < minCounter) {
432 minCounter = counter;
433 minBuffer = itr;
434 }
435 itr++;
436 }
Marissa Wall78b72202019-03-15 14:58:34 -0700437 uncacheLocked(minBuffer->first);
Marissa Wall73411622019-01-25 10:45:41 -0800438 }
439
440 uint64_t getCounter() REQUIRES(mMutex) {
441 static uint64_t counter = 0;
442 return counter++;
443 }
444
Marissa Wall73411622019-01-25 10:45:41 -0800445 std::mutex mMutex;
Marissa Wall78b72202019-03-15 14:58:34 -0700446 std::map<uint64_t /*Cache id*/, uint64_t /*counter*/> mBuffers GUARDED_BY(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800447
448 // Used by ISurfaceComposer to identify which process is sending the cached buffer.
449 sp<IBinder> token;
450};
451
452ANDROID_SINGLETON_STATIC_INSTANCE(BufferCache);
453
Robert Carre06ad2b2020-04-10 15:09:33 -0700454void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId) {
Marissa Wall78b72202019-03-15 14:58:34 -0700455 // GraphicBuffer id's are used as the cache ids.
456 BufferCache::getInstance().uncache(graphicBufferId);
457}
458
Marissa Wall73411622019-01-25 10:45:41 -0800459// ---------------------------------------------------------------------------
460
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000461// Initialize transaction id counter used to generate transaction ids
462// Transactions will start counting at 1, 0 is used for invalid transactions
463std::atomic<uint32_t> SurfaceComposerClient::Transaction::idCounter = 1;
464
465SurfaceComposerClient::Transaction::Transaction() {
466 mId = generateId();
467}
468
Marissa Wall17b4e452018-12-26 16:32:34 -0800469SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000470 : mId(other.mId),
471 mForceSynchronous(other.mForceSynchronous),
Marissa Wall17b4e452018-12-26 16:32:34 -0800472 mTransactionNestCount(other.mTransactionNestCount),
473 mAnimation(other.mAnimation),
Ady Abraham8cbd3072021-03-15 16:39:06 -0700474 mEarlyWakeupStart(other.mEarlyWakeupStart),
475 mEarlyWakeupEnd(other.mEarlyWakeupEnd),
Vishnu Nair621102e2019-06-12 14:16:57 -0700476 mContainsBuffer(other.mContainsBuffer),
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700477 mDesiredPresentTime(other.mDesiredPresentTime),
Ady Abrahamf0c56492020-12-17 18:04:15 -0800478 mIsAutoTimestamp(other.mIsAutoTimestamp),
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000479 mFrameTimelineInfo(other.mFrameTimelineInfo),
Vishnu Nair277142c2021-01-05 18:35:29 -0800480 mApplyToken(other.mApplyToken) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700481 mDisplayStates = other.mDisplayStates;
482 mComposerStates = other.mComposerStates;
chaviw273171b2018-12-26 11:46:30 -0800483 mInputWindowCommands = other.mInputWindowCommands;
Vishnu Nair621102e2019-06-12 14:16:57 -0700484 mListenerCallbacks = other.mListenerCallbacks;
485}
486
487std::unique_ptr<SurfaceComposerClient::Transaction>
488SurfaceComposerClient::Transaction::createFromParcel(const Parcel* parcel) {
489 auto transaction = std::make_unique<Transaction>();
490 if (transaction->readFromParcel(parcel) == NO_ERROR) {
491 return transaction;
492 }
493 return nullptr;
494}
495
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000496int64_t SurfaceComposerClient::Transaction::generateId() {
497 return (((int64_t)getpid()) << 32) | idCounter++;
498}
499
Vishnu Nair621102e2019-06-12 14:16:57 -0700500status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel) {
501 const uint32_t forceSynchronous = parcel->readUint32();
502 const uint32_t transactionNestCount = parcel->readUint32();
503 const bool animation = parcel->readBool();
Ady Abraham8cbd3072021-03-15 16:39:06 -0700504 const bool earlyWakeupStart = parcel->readBool();
505 const bool earlyWakeupEnd = parcel->readBool();
Vishnu Nair621102e2019-06-12 14:16:57 -0700506 const bool containsBuffer = parcel->readBool();
507 const int64_t desiredPresentTime = parcel->readInt64();
Ady Abrahamf0c56492020-12-17 18:04:15 -0800508 const bool isAutoTimestamp = parcel->readBool();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000509 FrameTimelineInfo frameTimelineInfo;
510 SAFE_PARCEL(frameTimelineInfo.read, *parcel);
511
Vishnu Nair277142c2021-01-05 18:35:29 -0800512 sp<IBinder> applyToken;
513 parcel->readNullableStrongBinder(&applyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700514 size_t count = static_cast<size_t>(parcel->readUint32());
515 if (count > parcel->dataSize()) {
516 return BAD_VALUE;
517 }
518 SortedVector<DisplayState> displayStates;
519 displayStates.setCapacity(count);
520 for (size_t i = 0; i < count; i++) {
521 DisplayState displayState;
522 if (displayState.read(*parcel) == BAD_VALUE) {
523 return BAD_VALUE;
524 }
525 displayStates.add(displayState);
526 }
527
528 count = static_cast<size_t>(parcel->readUint32());
529 if (count > parcel->dataSize()) {
530 return BAD_VALUE;
531 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700532 std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> listenerCallbacks;
533 listenerCallbacks.reserve(count);
534 for (size_t i = 0; i < count; i++) {
535 sp<ITransactionCompletedListener> listener =
536 interface_cast<ITransactionCompletedListener>(parcel->readStrongBinder());
537 size_t numCallbackIds = parcel->readUint32();
538 if (numCallbackIds > parcel->dataSize()) {
539 return BAD_VALUE;
540 }
541 for (size_t j = 0; j < numCallbackIds; j++) {
542 listenerCallbacks[listener].callbackIds.insert(parcel->readInt64());
543 }
544 size_t numSurfaces = parcel->readUint32();
545 if (numSurfaces > parcel->dataSize()) {
546 return BAD_VALUE;
547 }
548 for (size_t j = 0; j < numSurfaces; j++) {
549 sp<SurfaceControl> surface;
Pablo Gamito421dfd52020-09-22 18:11:45 +0000550 SAFE_PARCEL(SurfaceControl::readFromParcel, *parcel, &surface);
Valerie Hau9dab9732019-08-20 09:29:25 -0700551 listenerCallbacks[listener].surfaceControls.insert(surface);
552 }
553 }
554
555 count = static_cast<size_t>(parcel->readUint32());
556 if (count > parcel->dataSize()) {
557 return BAD_VALUE;
558 }
Vishnu Nairf03652d2019-07-16 17:56:56 -0700559 std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> composerStates;
Vishnu Nair621102e2019-06-12 14:16:57 -0700560 composerStates.reserve(count);
561 for (size_t i = 0; i < count; i++) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000562 sp<IBinder> surfaceControlHandle;
563 SAFE_PARCEL(parcel->readStrongBinder, &surfaceControlHandle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700564
565 ComposerState composerState;
566 if (composerState.read(*parcel) == BAD_VALUE) {
567 return BAD_VALUE;
568 }
Pablo Gamitodbc31672020-09-01 18:28:58 +0000569
Vishnu Nairf03652d2019-07-16 17:56:56 -0700570 composerStates[surfaceControlHandle] = composerState;
Vishnu Nair621102e2019-06-12 14:16:57 -0700571 }
572
573 InputWindowCommands inputWindowCommands;
574 inputWindowCommands.read(*parcel);
575
576 // Parsing was successful. Update the object.
577 mForceSynchronous = forceSynchronous;
578 mTransactionNestCount = transactionNestCount;
579 mAnimation = animation;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700580 mEarlyWakeupStart = earlyWakeupStart;
581 mEarlyWakeupEnd = earlyWakeupEnd;
Vishnu Nair621102e2019-06-12 14:16:57 -0700582 mContainsBuffer = containsBuffer;
583 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800584 mIsAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000585 mFrameTimelineInfo = frameTimelineInfo;
Vishnu Nair621102e2019-06-12 14:16:57 -0700586 mDisplayStates = displayStates;
Valerie Hau9dab9732019-08-20 09:29:25 -0700587 mListenerCallbacks = listenerCallbacks;
Vishnu Nair621102e2019-06-12 14:16:57 -0700588 mComposerStates = composerStates;
589 mInputWindowCommands = inputWindowCommands;
Vishnu Nair277142c2021-01-05 18:35:29 -0800590 mApplyToken = applyToken;
Vishnu Nair621102e2019-06-12 14:16:57 -0700591 return NO_ERROR;
592}
593
594status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const {
Robert Carr158531d2020-04-08 10:53:30 -0700595 // If we write the Transaction to a parcel, we want to ensure the Buffers are cached
596 // before crossing the IPC boundary. Otherwise the receiving party will cache the buffers
597 // but is unlikely to use them again as they are owned by the other process.
598 // You may be asking yourself, is this const cast safe? Const cast is safe up
599 // until the point where you try and write to an object that was originally const at which
600 // point we enter undefined behavior. In this case we are safe though, because there are
601 // two possibilities:
602 // 1. The SurfaceComposerClient::Transaction was originally non-const. Safe.
603 // 2. It was originall const! In this case not only was it useless, but it by definition
604 // contains no composer states and so cacheBuffers will not perform any writes.
605
606 const_cast<SurfaceComposerClient::Transaction*>(this)->cacheBuffers();
607
Vishnu Nair621102e2019-06-12 14:16:57 -0700608 parcel->writeUint32(mForceSynchronous);
609 parcel->writeUint32(mTransactionNestCount);
610 parcel->writeBool(mAnimation);
Ady Abraham8cbd3072021-03-15 16:39:06 -0700611 parcel->writeBool(mEarlyWakeupStart);
612 parcel->writeBool(mEarlyWakeupEnd);
Vishnu Nair621102e2019-06-12 14:16:57 -0700613 parcel->writeBool(mContainsBuffer);
614 parcel->writeInt64(mDesiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -0800615 parcel->writeBool(mIsAutoTimestamp);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000616 SAFE_PARCEL(mFrameTimelineInfo.write, *parcel);
Vishnu Nair277142c2021-01-05 18:35:29 -0800617 parcel->writeStrongBinder(mApplyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700618 parcel->writeUint32(static_cast<uint32_t>(mDisplayStates.size()));
619 for (auto const& displayState : mDisplayStates) {
620 displayState.write(*parcel);
621 }
622
Valerie Hau9dab9732019-08-20 09:29:25 -0700623 parcel->writeUint32(static_cast<uint32_t>(mListenerCallbacks.size()));
624 for (auto const& [listener, callbackInfo] : mListenerCallbacks) {
625 parcel->writeStrongBinder(ITransactionCompletedListener::asBinder(listener));
626 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.callbackIds.size()));
627 for (auto callbackId : callbackInfo.callbackIds) {
628 parcel->writeInt64(callbackId);
629 }
630 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.surfaceControls.size()));
631 for (auto surfaceControl : callbackInfo.surfaceControls) {
Pablo Gamito421dfd52020-09-22 18:11:45 +0000632 SAFE_PARCEL(surfaceControl->writeToParcel, *parcel);
Valerie Hau9dab9732019-08-20 09:29:25 -0700633 }
634 }
635
Vishnu Nair621102e2019-06-12 14:16:57 -0700636 parcel->writeUint32(static_cast<uint32_t>(mComposerStates.size()));
Pablo Gamitodbc31672020-09-01 18:28:58 +0000637 for (auto const& [handle, composerState] : mComposerStates) {
638 SAFE_PARCEL(parcel->writeStrongBinder, handle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700639 composerState.write(*parcel);
640 }
641
642 mInputWindowCommands.write(*parcel);
643 return NO_ERROR;
Mathias Agopian698c0872011-06-28 19:09:31 -0700644}
645
Robert Carr2c5f6d22017-09-26 12:30:35 -0700646SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000647 for (auto const& [handle, composerState] : other.mComposerStates) {
648 if (mComposerStates.count(handle) == 0) {
649 mComposerStates[handle] = composerState;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700650 } else {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000651 mComposerStates[handle].state.merge(composerState.state);
Robert Carr2c5f6d22017-09-26 12:30:35 -0700652 }
653 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700654
655 for (auto const& state : other.mDisplayStates) {
656 ssize_t index = mDisplayStates.indexOf(state);
657 if (index < 0) {
658 mDisplayStates.add(state);
659 } else {
660 mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
661 }
662 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700663
Marissa Wallc837b5e2018-10-12 10:04:44 -0700664 for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
665 auto& [callbackIds, surfaceControls] = callbackInfo;
666 mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
667 callbackIds.begin()),
668 std::make_move_iterator(callbackIds.end()));
Valerie Hau9dab9732019-08-20 09:29:25 -0700669
Valerie Hau236eba32020-01-03 16:53:39 -0800670 mListenerCallbacks[listener].surfaceControls.insert(surfaceControls.begin(),
671 surfaceControls.end());
672
673 auto& currentProcessCallbackInfo =
674 mListenerCallbacks[TransactionCompletedListener::getIInstance()];
675 currentProcessCallbackInfo.surfaceControls
676 .insert(std::make_move_iterator(surfaceControls.begin()),
677 std::make_move_iterator(surfaceControls.end()));
678
679 // register all surface controls for all callbackIds for this listener that is merging
680 for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
681 TransactionCompletedListener::getInstance()
682 ->addSurfaceControlToCallbacks(surfaceControl,
683 currentProcessCallbackInfo.callbackIds);
684 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700685 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700686
chaviw273171b2018-12-26 11:46:30 -0800687 mInputWindowCommands.merge(other.mInputWindowCommands);
688
Robert Carrbbc85622020-04-08 10:45:12 -0700689 mContainsBuffer |= other.mContainsBuffer;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700690 mEarlyWakeupStart = mEarlyWakeupStart || other.mEarlyWakeupStart;
691 mEarlyWakeupEnd = mEarlyWakeupEnd || other.mEarlyWakeupEnd;
Vishnu Nair277142c2021-01-05 18:35:29 -0800692 mApplyToken = other.mApplyToken;
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700693
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000694 mFrameTimelineInfo.merge(other.mFrameTimelineInfo);
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700695
Vishnu Nairfef244e2019-06-17 18:07:51 -0700696 other.clear();
Robert Carr2c5f6d22017-09-26 12:30:35 -0700697 return *this;
698}
699
Vishnu Nairfef244e2019-06-17 18:07:51 -0700700void SurfaceComposerClient::Transaction::clear() {
701 mComposerStates.clear();
702 mDisplayStates.clear();
703 mListenerCallbacks.clear();
704 mInputWindowCommands.clear();
705 mContainsBuffer = false;
706 mForceSynchronous = 0;
707 mTransactionNestCount = 0;
708 mAnimation = false;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700709 mEarlyWakeupStart = false;
710 mEarlyWakeupEnd = false;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800711 mDesiredPresentTime = 0;
712 mIsAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000713 mFrameTimelineInfo.clear();
Vishnu Nair277142c2021-01-05 18:35:29 -0800714 mApplyToken = nullptr;
Vishnu Nairfef244e2019-06-17 18:07:51 -0700715}
716
Marissa Wall78b72202019-03-15 14:58:34 -0700717void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) {
718 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
719
Marissa Wall947d34e2019-03-29 14:03:53 -0700720 client_cache_t uncacheBuffer;
Marissa Wall78b72202019-03-15 14:58:34 -0700721 uncacheBuffer.token = BufferCache::getInstance().getToken();
Marissa Wall947d34e2019-03-29 14:03:53 -0700722 uncacheBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700723
Valerie Haufa889122019-04-15 13:56:05 -0700724 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000725 sf->setTransactionState(FrameTimelineInfo{}, {}, {}, 0, applyToken, {}, systemTime(), true,
726 uncacheBuffer, false, {}, 0 /* Undefined transactionId */);
Marissa Wall78b72202019-03-15 14:58:34 -0700727}
728
729void SurfaceComposerClient::Transaction::cacheBuffers() {
730 if (!mContainsBuffer) {
731 return;
732 }
733
734 size_t count = 0;
Vishnu Nairf03652d2019-07-16 17:56:56 -0700735 for (auto& [handle, cs] : mComposerStates) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000736 layer_state_t* s = &(mComposerStates[handle].state);
Marissa Wall78b72202019-03-15 14:58:34 -0700737 if (!(s->what & layer_state_t::eBufferChanged)) {
738 continue;
Robert Carr28037922020-04-08 10:57:07 -0700739 } else if (s->what & layer_state_t::eCachedBufferChanged) {
740 // If eBufferChanged and eCachedBufferChanged are both trued then that means
741 // we already cached the buffer in a previous call to cacheBuffers, perhaps
742 // from writeToParcel on a Transaction that was merged in to this one.
743 continue;
Marissa Wall78b72202019-03-15 14:58:34 -0700744 }
745
Marissa Wall00597242019-03-27 10:35:19 -0700746 // Don't try to cache a null buffer. Sending null buffers is cheap so we shouldn't waste
747 // time trying to cache them.
748 if (!s->buffer) {
749 continue;
750 }
751
Marissa Wall78b72202019-03-15 14:58:34 -0700752 uint64_t cacheId = 0;
753 status_t ret = BufferCache::getInstance().getCacheId(s->buffer, &cacheId);
754 if (ret == NO_ERROR) {
Robert Carre06ad2b2020-04-10 15:09:33 -0700755 // Cache-hit. Strip the buffer and send only the id.
Marissa Walla141abe2019-03-27 16:28:07 -0700756 s->what &= ~static_cast<uint64_t>(layer_state_t::eBufferChanged);
Marissa Wall78b72202019-03-15 14:58:34 -0700757 s->buffer = nullptr;
758 } else {
Robert Carre06ad2b2020-04-10 15:09:33 -0700759 // Cache-miss. Include the buffer and send the new cacheId.
Marissa Wall78b72202019-03-15 14:58:34 -0700760 cacheId = BufferCache::getInstance().cache(s->buffer);
761 }
762 s->what |= layer_state_t::eCachedBufferChanged;
763 s->cachedBuffer.token = BufferCache::getInstance().getToken();
Marissa Wall947d34e2019-03-29 14:03:53 -0700764 s->cachedBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700765
766 // If we have more buffers than the size of the cache, we should stop caching so we don't
767 // evict other buffers in this transaction
768 count++;
769 if (count >= BUFFER_CACHE_MAX_SIZE) {
770 break;
771 }
772 }
Robert Carr6fb1a7e2018-12-11 12:07:25 -0800773}
774
Robert Carr4cdc58f2017-08-23 14:22:20 -0700775status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {
776 if (mStatus != NO_ERROR) {
777 return mStatus;
778 }
779
780 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
781
Valerie Hau9dab9732019-08-20 09:29:25 -0700782 bool hasListenerCallbacks = !mListenerCallbacks.empty();
Marissa Wall3dad52d2019-03-22 14:03:19 -0700783 std::vector<ListenerCallbacks> listenerCallbacks;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700784 // For every listener with registered callbacks
785 for (const auto& [listener, callbackInfo] : mListenerCallbacks) {
786 auto& [callbackIds, surfaceControls] = callbackInfo;
787 if (callbackIds.empty()) {
788 continue;
789 }
790
Valerie Hau9dab9732019-08-20 09:29:25 -0700791 if (surfaceControls.empty()) {
792 listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));
793 } else {
794 // If the listener has any SurfaceControls set on this Transaction update the surface
795 // state
796 for (const auto& surfaceControl : surfaceControls) {
797 layer_state_t* s = getLayerState(surfaceControl);
798 if (!s) {
799 ALOGE("failed to get layer state");
800 continue;
801 }
802 std::vector<CallbackId> callbacks(callbackIds.begin(), callbackIds.end());
803 s->what |= layer_state_t::eHasListenerCallbacksChanged;
804 s->listeners.emplace_back(IInterface::asBinder(listener), callbacks);
Marissa Wallc837b5e2018-10-12 10:04:44 -0700805 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700806 }
807 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700808
Marissa Wall78b72202019-03-15 14:58:34 -0700809 cacheBuffers();
810
Robert Carr4cdc58f2017-08-23 14:22:20 -0700811 Vector<ComposerState> composerStates;
812 Vector<DisplayState> displayStates;
813 uint32_t flags = 0;
814
815 mForceSynchronous |= synchronous;
816
chaviw8e3fe5d2018-02-22 10:55:42 -0800817 for (auto const& kv : mComposerStates){
818 composerStates.add(kv.second);
819 }
820
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700821 displayStates = std::move(mDisplayStates);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700822
823 if (mForceSynchronous) {
824 flags |= ISurfaceComposer::eSynchronous;
825 }
826 if (mAnimation) {
827 flags |= ISurfaceComposer::eAnimation;
828 }
829
Ady Abraham8cbd3072021-03-15 16:39:06 -0700830 // If both mEarlyWakeupStart and mEarlyWakeupEnd are set
Ady Abrahambf1349c2020-06-12 14:26:18 -0700831 // it is equivalent for none
Ady Abraham8cbd3072021-03-15 16:39:06 -0700832 if (mEarlyWakeupStart && !mEarlyWakeupEnd) {
833 flags |= ISurfaceComposer::eEarlyWakeupStart;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700834 }
Ady Abraham8cbd3072021-03-15 16:39:06 -0700835 if (mEarlyWakeupEnd && !mEarlyWakeupStart) {
836 flags |= ISurfaceComposer::eEarlyWakeupEnd;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700837 }
838
Vishnu Nair277142c2021-01-05 18:35:29 -0800839 sp<IBinder> applyToken = mApplyToken
840 ? mApplyToken
841 : IInterface::asBinder(TransactionCompletedListener::getIInstance());
842
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000843 sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800844 mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
Marissa Wall3dad52d2019-03-22 14:03:19 -0700845 {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700846 hasListenerCallbacks, listenerCallbacks, mId);
847 mId = generateId();
848
849 // Clear the current states and flags
850 clear();
851
Robert Carr4cdc58f2017-08-23 14:22:20 -0700852 mStatus = NO_ERROR;
853 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700854}
855
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800856// ---------------------------------------------------------------------------
857
Robert Carr4cdc58f2017-08-23 14:22:20 -0700858sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
Jamie Gennisdd3cb842012-10-19 18:19:11 -0700859 return ComposerService::getComposerService()->createDisplay(displayName,
860 secure);
Mathias Agopiane57f2922012-08-09 16:29:12 -0700861}
862
Robert Carr4cdc58f2017-08-23 14:22:20 -0700863void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
Jesse Hall6c913be2013-08-08 12:15:49 -0700864 return ComposerService::getComposerService()->destroyDisplay(display);
865}
866
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800867std::vector<PhysicalDisplayId> SurfaceComposerClient::getPhysicalDisplayIds() {
868 return ComposerService::getComposerService()->getPhysicalDisplayIds();
869}
870
871std::optional<PhysicalDisplayId> SurfaceComposerClient::getInternalDisplayId() {
872 return ComposerService::getComposerService()->getInternalDisplayId();
873}
874
875sp<IBinder> SurfaceComposerClient::getPhysicalDisplayToken(PhysicalDisplayId displayId) {
876 return ComposerService::getComposerService()->getPhysicalDisplayToken(displayId);
877}
878
879sp<IBinder> SurfaceComposerClient::getInternalDisplayToken() {
880 return ComposerService::getComposerService()->getInternalDisplayToken();
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700881}
882
Robert Carr4cdc58f2017-08-23 14:22:20 -0700883void SurfaceComposerClient::Transaction::setAnimationTransaction() {
Jamie Gennis2d5e2302012-10-15 18:24:43 -0700884 mAnimation = true;
885}
886
Ady Abraham8cbd3072021-03-15 16:39:06 -0700887void SurfaceComposerClient::Transaction::setEarlyWakeupStart() {
888 mEarlyWakeupStart = true;
Dan Stoza84d619e2018-03-28 17:07:36 -0700889}
890
Ady Abraham8cbd3072021-03-15 16:39:06 -0700891void SurfaceComposerClient::Transaction::setEarlyWakeupEnd() {
892 mEarlyWakeupEnd = true;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700893}
894
Pablo Gamitodbc31672020-09-01 18:28:58 +0000895layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
896 auto handle = sc->getHandle();
897
Vishnu Nairf03652d2019-07-16 17:56:56 -0700898 if (mComposerStates.count(handle) == 0) {
Mathias Agopian698c0872011-06-28 19:09:31 -0700899 // we don't have it, add an initialized layer_state to our list
chaviw8e3fe5d2018-02-22 10:55:42 -0800900 ComposerState s;
Pablo Gamitodbc31672020-09-01 18:28:58 +0000901
Vishnu Nairf03652d2019-07-16 17:56:56 -0700902 s.state.surface = handle;
Pablo Gamitodbc31672020-09-01 18:28:58 +0000903 s.state.layerId = sc->getLayerId();
904
Vishnu Nairf03652d2019-07-16 17:56:56 -0700905 mComposerStates[handle] = s;
Mathias Agopian698c0872011-06-28 19:09:31 -0700906 }
907
Vishnu Nairf03652d2019-07-16 17:56:56 -0700908 return &(mComposerStates[handle].state);
Mathias Agopian698c0872011-06-28 19:09:31 -0700909}
910
Marissa Wallc837b5e2018-10-12 10:04:44 -0700911void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
912 const sp<SurfaceControl>& sc) {
Marissa Wall80d94ad2019-01-18 16:04:36 -0800913 auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
914 callbackInfo.surfaceControls.insert(sc);
915
916 TransactionCompletedListener::getInstance()
917 ->addSurfaceControlToCallbacks(sc, callbackInfo.callbackIds);
Marissa Wallc837b5e2018-10-12 10:04:44 -0700918}
919
Robert Carr4cdc58f2017-08-23 14:22:20 -0700920SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
921 const sp<SurfaceControl>& sc, float x, float y) {
chaviw763ef572018-02-22 16:04:57 -0800922 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700923 if (!s) {
924 mStatus = BAD_INDEX;
925 return *this;
926 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700927 s->what |= layer_state_t::ePositionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700928 s->x = x;
929 s->y = y;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700930
931 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700932 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700933}
934
Robert Carr4cdc58f2017-08-23 14:22:20 -0700935SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
936 const sp<SurfaceControl>& sc) {
937 return setFlags(sc, 0, layer_state_t::eLayerHidden);
938}
939
940SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
941 const sp<SurfaceControl>& sc) {
942 return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
943}
944
945SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
946 const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
chaviw763ef572018-02-22 16:04:57 -0800947 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700948 if (!s) {
949 mStatus = BAD_INDEX;
950 return *this;
951 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700952 s->what |= layer_state_t::eSizeChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700953 s->w = w;
954 s->h = h;
Jamie Gennis28378392011-10-12 17:39:00 -0700955
Marissa Wallc837b5e2018-10-12 10:04:44 -0700956 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700957 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700958}
959
Robert Carr4cdc58f2017-08-23 14:22:20 -0700960SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
961 const sp<SurfaceControl>& sc, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800962 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700963 if (!s) {
964 mStatus = BAD_INDEX;
965 return *this;
966 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700967 s->what |= layer_state_t::eLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700968 s->what &= ~layer_state_t::eRelativeLayerChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700969 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700970
971 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700972 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700973}
974
Pablo Gamito11dcc222020-09-12 15:49:39 +0000975SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(
976 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& relativeTo, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800977 layer_state_t* s = getLayerState(sc);
Robert Carrdb66e622017-04-10 16:55:57 -0700978 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700979 mStatus = BAD_INDEX;
Robert Carr30c8d902019-04-04 13:12:49 -0700980 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -0700981 }
982 s->what |= layer_state_t::eRelativeLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700983 s->what &= ~layer_state_t::eLayerChanged;
Pablo Gamito11dcc222020-09-12 15:49:39 +0000984 s->relativeLayerSurfaceControl = relativeTo;
Robert Carrdb66e622017-04-10 16:55:57 -0700985 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700986
987 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700988 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -0700989}
990
Robert Carr4cdc58f2017-08-23 14:22:20 -0700991SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
992 const sp<SurfaceControl>& sc, uint32_t flags,
Mathias Agopian698c0872011-06-28 19:09:31 -0700993 uint32_t mask) {
chaviw763ef572018-02-22 16:04:57 -0800994 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700995 if (!s) {
996 mStatus = BAD_INDEX;
997 return *this;
998 }
chaviwc5676c62020-09-18 15:01:04 -0700999 if ((mask & layer_state_t::eLayerOpaque) || (mask & layer_state_t::eLayerHidden) ||
Vishnu Nairf6eddb62021-01-27 22:02:11 -08001000 (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) ||
1001 (mask & layer_state_t::eEnableBackpressure)) {
Dan Stoza23116082015-06-18 14:58:39 -07001002 s->what |= layer_state_t::eFlagsChanged;
Andy McFadden4125a4f2014-01-29 17:17:11 -08001003 }
Mathias Agopian698c0872011-06-28 19:09:31 -07001004 s->flags &= ~mask;
1005 s->flags |= (flags & mask);
1006 s->mask |= mask;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001007
1008 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001009 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001010}
1011
Robert Carr4cdc58f2017-08-23 14:22:20 -07001012SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
1013 const sp<SurfaceControl>& sc,
Mathias Agopian698c0872011-06-28 19:09:31 -07001014 const Region& transparentRegion) {
chaviw763ef572018-02-22 16:04:57 -08001015 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001016 if (!s) {
1017 mStatus = BAD_INDEX;
1018 return *this;
1019 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001020 s->what |= layer_state_t::eTransparentRegionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001021 s->transparentRegion = transparentRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001022
1023 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001024 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001025}
1026
Robert Carr4cdc58f2017-08-23 14:22:20 -07001027SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
1028 const sp<SurfaceControl>& sc, float alpha) {
chaviw763ef572018-02-22 16:04:57 -08001029 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001030 if (!s) {
1031 mStatus = BAD_INDEX;
1032 return *this;
1033 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001034 s->what |= layer_state_t::eAlphaChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001035 s->alpha = alpha;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001036
1037 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001038 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001039}
1040
Robert Carr4cdc58f2017-08-23 14:22:20 -07001041SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
1042 const sp<SurfaceControl>& sc, uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001043 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001044 if (!s) {
1045 mStatus = BAD_INDEX;
1046 return *this;
1047 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001048 s->what |= layer_state_t::eLayerStackChanged;
Mathias Agopian87855782012-07-24 21:41:09 -07001049 s->layerStack = layerStack;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001050
1051 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001052 return *this;
Mathias Agopian87855782012-07-24 21:41:09 -07001053}
1054
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001055SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMetadata(
Garfield Tan01a56132019-08-05 16:44:21 -07001056 const sp<SurfaceControl>& sc, uint32_t key, const Parcel& p) {
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001057 layer_state_t* s = getLayerState(sc);
1058 if (!s) {
1059 mStatus = BAD_INDEX;
1060 return *this;
1061 }
1062 s->what |= layer_state_t::eMetadataChanged;
Garfield Tan01a56132019-08-05 16:44:21 -07001063
1064 s->metadata.mMap[key] = {p.data(), p.data() + p.dataSize()};
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001065
1066 registerSurfaceControlForCallback(sc);
1067 return *this;
1068}
1069
Robert Carr4cdc58f2017-08-23 14:22:20 -07001070SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
1071 const sp<SurfaceControl>& sc, float dsdx, float dtdx,
Robert Carrcb6e1e32017-02-21 19:48:26 -08001072 float dtdy, float dsdy) {
chaviw763ef572018-02-22 16:04:57 -08001073 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001074 if (!s) {
1075 mStatus = BAD_INDEX;
1076 return *this;
1077 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001078 s->what |= layer_state_t::eMatrixChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001079 layer_state_t::matrix22_t matrix;
1080 matrix.dsdx = dsdx;
1081 matrix.dtdx = dtdx;
1082 matrix.dsdy = dsdy;
1083 matrix.dtdy = dtdy;
1084 s->matrix = matrix;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001085
1086 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001087 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001088}
1089
chaviw25714502021-02-11 10:01:08 -08001090SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
Robert Carr4cdc58f2017-08-23 14:22:20 -07001091 const sp<SurfaceControl>& sc, const Rect& crop) {
chaviw763ef572018-02-22 16:04:57 -08001092 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001093 if (!s) {
1094 mStatus = BAD_INDEX;
1095 return *this;
1096 }
chaviw25714502021-02-11 10:01:08 -08001097 s->what |= layer_state_t::eCropChanged;
1098 s->crop = crop;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001099
1100 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001101 return *this;
Jamie Gennisf15a83f2012-05-10 20:43:55 -07001102}
1103
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001104SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCornerRadius(
1105 const sp<SurfaceControl>& sc, float cornerRadius) {
1106 layer_state_t* s = getLayerState(sc);
1107 if (!s) {
1108 mStatus = BAD_INDEX;
1109 return *this;
1110 }
1111 s->what |= layer_state_t::eCornerRadiusChanged;
1112 s->cornerRadius = cornerRadius;
1113 return *this;
1114}
1115
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001116SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundBlurRadius(
1117 const sp<SurfaceControl>& sc, int backgroundBlurRadius) {
1118 layer_state_t* s = getLayerState(sc);
1119 if (!s) {
1120 mStatus = BAD_INDEX;
1121 return *this;
1122 }
1123 s->what |= layer_state_t::eBackgroundBlurRadiusChanged;
1124 s->backgroundBlurRadius = backgroundBlurRadius;
1125 return *this;
1126}
1127
Lucas Dupinc3800b82020-10-02 16:24:48 -07001128SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBlurRegions(
1129 const sp<SurfaceControl>& sc, const std::vector<BlurRegion>& blurRegions) {
1130 layer_state_t* s = getLayerState(sc);
1131 if (!s) {
1132 mStatus = BAD_INDEX;
1133 return *this;
1134 }
1135 s->what |= layer_state_t::eBlurRegionsChanged;
1136 s->blurRegions = blurRegions;
1137 return *this;
1138}
1139
Marissa Wallf58c14b2018-07-24 10:50:43 -07001140SurfaceComposerClient::Transaction&
Pablo Gamito11dcc222020-09-12 15:49:39 +00001141SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(
1142 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& barrierSurfaceControl,
1143 uint64_t frameNumber) {
chaviw763ef572018-02-22 16:04:57 -08001144 layer_state_t* s = getLayerState(sc);
Dan Stoza7dde5992015-05-22 09:51:44 -07001145 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001146 mStatus = BAD_INDEX;
1147 return *this;
Dan Stoza7dde5992015-05-22 09:51:44 -07001148 }
Marissa Wallf58c14b2018-07-24 10:50:43 -07001149 s->what |= layer_state_t::eDeferTransaction_legacy;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001150 s->barrierSurfaceControl_legacy = barrierSurfaceControl;
Vishnu Nair6b7c5c92020-09-29 17:27:05 -07001151 s->barrierFrameNumber = frameNumber;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001152
1153 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001154 return *this;
Robert Carr0d480722017-01-10 16:42:54 -08001155}
1156
Robert Carr4cdc58f2017-08-23 14:22:20 -07001157SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparentChildren(
Pablo Gamito11dcc222020-09-12 15:49:39 +00001158 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
chaviw763ef572018-02-22 16:04:57 -08001159 layer_state_t* s = getLayerState(sc);
Robert Carr1db73f62016-12-21 12:58:51 -08001160 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001161 mStatus = BAD_INDEX;
1162 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -08001163 }
1164 s->what |= layer_state_t::eReparentChildren;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001165 s->reparentSurfaceControl = newParent;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001166
1167 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001168 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -08001169}
1170
Robert Carr4cdc58f2017-08-23 14:22:20 -07001171SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
Pablo Gamito11dcc222020-09-12 15:49:39 +00001172 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
chaviw763ef572018-02-22 16:04:57 -08001173 layer_state_t* s = getLayerState(sc);
chaviw06178942017-07-27 10:25:59 -07001174 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001175 mStatus = BAD_INDEX;
1176 return *this;
chaviw06178942017-07-27 10:25:59 -07001177 }
chaviwf1961f72017-09-18 16:41:07 -07001178 s->what |= layer_state_t::eReparent;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001179 s->parentSurfaceControlForChild = newParent;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001180
1181 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001182 return *this;
chaviw06178942017-07-27 10:25:59 -07001183}
1184
Robert Carr4cdc58f2017-08-23 14:22:20 -07001185SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
1186 const sp<SurfaceControl>& sc,
1187 const half3& color) {
chaviw763ef572018-02-22 16:04:57 -08001188 layer_state_t* s = getLayerState(sc);
Robert Carr9524cb32017-02-13 11:32:32 -08001189 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001190 mStatus = BAD_INDEX;
1191 return *this;
1192 }
1193 s->what |= layer_state_t::eColorChanged;
1194 s->color = color;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001195
1196 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001197 return *this;
1198}
1199
Valerie Haudd0b7572019-01-29 14:59:27 -08001200SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundColor(
1201 const sp<SurfaceControl>& sc, const half3& color, float alpha, ui::Dataspace dataspace) {
Valerie Haued54efa2019-01-11 20:03:14 -08001202 layer_state_t* s = getLayerState(sc);
1203 if (!s) {
1204 mStatus = BAD_INDEX;
1205 return *this;
1206 }
1207
Valerie Haudd0b7572019-01-29 14:59:27 -08001208 s->what |= layer_state_t::eBackgroundColorChanged;
1209 s->color = color;
1210 s->bgColorAlpha = alpha;
1211 s->bgColorDataspace = dataspace;
Valerie Haued54efa2019-01-11 20:03:14 -08001212
1213 registerSurfaceControlForCallback(sc);
1214 return *this;
1215}
1216
Marissa Wall61c58622018-07-18 10:12:20 -07001217SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransform(
1218 const sp<SurfaceControl>& sc, uint32_t transform) {
1219 layer_state_t* s = getLayerState(sc);
1220 if (!s) {
1221 mStatus = BAD_INDEX;
1222 return *this;
1223 }
1224 s->what |= layer_state_t::eTransformChanged;
1225 s->transform = transform;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001226
1227 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001228 return *this;
1229}
1230
1231SurfaceComposerClient::Transaction&
1232SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<SurfaceControl>& sc,
1233 bool transformToDisplayInverse) {
1234 layer_state_t* s = getLayerState(sc);
1235 if (!s) {
1236 mStatus = BAD_INDEX;
1237 return *this;
1238 }
1239 s->what |= layer_state_t::eTransformToDisplayInverseChanged;
1240 s->transformToDisplayInverse = transformToDisplayInverse;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001241
1242 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001243 return *this;
1244}
1245
Marissa Wall861616d2018-10-22 12:52:23 -07001246SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrame(
1247 const sp<SurfaceControl>& sc, const Rect& frame) {
1248 layer_state_t* s = getLayerState(sc);
1249 if (!s) {
1250 mStatus = BAD_INDEX;
1251 return *this;
1252 }
1253 s->what |= layer_state_t::eFrameChanged;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +02001254 s->orientedDisplaySpaceRect = frame;
Marissa Wall861616d2018-10-22 12:52:23 -07001255
1256 registerSurfaceControlForCallback(sc);
1257 return *this;
1258}
1259
Marissa Wall61c58622018-07-18 10:12:20 -07001260SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
Vishnu Nair1506b182021-02-22 14:35:15 -08001261 const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
1262 ReleaseBufferCallback callback) {
Marissa Wall61c58622018-07-18 10:12:20 -07001263 layer_state_t* s = getLayerState(sc);
1264 if (!s) {
1265 mStatus = BAD_INDEX;
1266 return *this;
1267 }
Vishnu Nair1506b182021-02-22 14:35:15 -08001268 removeReleaseBufferCallback(s);
Marissa Wall78b72202019-03-15 14:58:34 -07001269 s->what |= layer_state_t::eBufferChanged;
1270 s->buffer = buffer;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001271 if (mIsAutoTimestamp) {
1272 mDesiredPresentTime = systemTime();
1273 }
Vishnu Nair1506b182021-02-22 14:35:15 -08001274 setReleaseBufferCallback(s, callback);
Marissa Wallebc2c052019-01-16 19:16:55 -08001275
1276 registerSurfaceControlForCallback(sc);
Marissa Wall78b72202019-03-15 14:58:34 -07001277
1278 mContainsBuffer = true;
Marissa Wallebc2c052019-01-16 19:16:55 -08001279 return *this;
1280}
1281
Vishnu Nair1506b182021-02-22 14:35:15 -08001282void SurfaceComposerClient::Transaction::removeReleaseBufferCallback(layer_state_t* s) {
1283 if (!s->releaseBufferListener) {
1284 return;
1285 }
1286
1287 s->what &= ~static_cast<uint64_t>(layer_state_t::eReleaseBufferListenerChanged);
1288 s->releaseBufferListener = nullptr;
1289 TransactionCompletedListener::getInstance()->removeReleaseBufferCallback(s->buffer->getId());
1290}
1291
1292void SurfaceComposerClient::Transaction::setReleaseBufferCallback(layer_state_t* s,
1293 ReleaseBufferCallback callback) {
1294 if (!callback) {
1295 return;
1296 }
1297
1298 if (!s->buffer) {
1299 ALOGW("Transaction::setReleaseBufferCallback"
1300 "ignored trying to set a callback on a null buffer.");
1301 return;
1302 }
1303
1304 s->what |= layer_state_t::eReleaseBufferListenerChanged;
1305 s->releaseBufferListener = TransactionCompletedListener::getIInstance();
1306 auto listener = TransactionCompletedListener::getInstance();
1307 listener->setReleaseBufferCallback(s->buffer->getId(), callback);
1308}
1309
Marissa Wall61c58622018-07-18 10:12:20 -07001310SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAcquireFence(
1311 const sp<SurfaceControl>& sc, const sp<Fence>& fence) {
1312 layer_state_t* s = getLayerState(sc);
1313 if (!s) {
1314 mStatus = BAD_INDEX;
1315 return *this;
1316 }
1317 s->what |= layer_state_t::eAcquireFenceChanged;
1318 s->acquireFence = fence;
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::setDataspace(
1325 const sp<SurfaceControl>& sc, ui::Dataspace dataspace) {
1326 layer_state_t* s = getLayerState(sc);
1327 if (!s) {
1328 mStatus = BAD_INDEX;
1329 return *this;
1330 }
1331 s->what |= layer_state_t::eDataspaceChanged;
1332 s->dataspace = dataspace;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001333
1334 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001335 return *this;
1336}
1337
1338SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMetadata(
1339 const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata) {
1340 layer_state_t* s = getLayerState(sc);
1341 if (!s) {
1342 mStatus = BAD_INDEX;
1343 return *this;
1344 }
1345 s->what |= layer_state_t::eHdrMetadataChanged;
1346 s->hdrMetadata = hdrMetadata;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001347
1348 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001349 return *this;
1350}
1351
1352SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSurfaceDamageRegion(
1353 const sp<SurfaceControl>& sc, const Region& surfaceDamageRegion) {
1354 layer_state_t* s = getLayerState(sc);
1355 if (!s) {
1356 mStatus = BAD_INDEX;
1357 return *this;
1358 }
1359 s->what |= layer_state_t::eSurfaceDamageRegionChanged;
1360 s->surfaceDamageRegion = surfaceDamageRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001361
1362 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001363 return *this;
1364}
1365
1366SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApi(
1367 const sp<SurfaceControl>& sc, int32_t api) {
1368 layer_state_t* s = getLayerState(sc);
1369 if (!s) {
1370 mStatus = BAD_INDEX;
1371 return *this;
1372 }
1373 s->what |= layer_state_t::eApiChanged;
1374 s->api = api;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001375
1376 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001377 return *this;
1378}
1379
1380SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSidebandStream(
1381 const sp<SurfaceControl>& sc, const sp<NativeHandle>& sidebandStream) {
1382 layer_state_t* s = getLayerState(sc);
1383 if (!s) {
1384 mStatus = BAD_INDEX;
1385 return *this;
1386 }
1387 s->what |= layer_state_t::eSidebandStreamChanged;
1388 s->sidebandStream = sidebandStream;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001389
1390 registerSurfaceControlForCallback(sc);
1391 return *this;
1392}
1393
Marissa Wall17b4e452018-12-26 16:32:34 -08001394SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDesiredPresentTime(
1395 nsecs_t desiredPresentTime) {
1396 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001397 mIsAutoTimestamp = false;
Marissa Wall17b4e452018-12-26 16:32:34 -08001398 return *this;
1399}
1400
Peiyong Linc502cb72019-03-01 15:00:23 -08001401SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorSpaceAgnostic(
1402 const sp<SurfaceControl>& sc, const bool agnostic) {
1403 layer_state_t* s = getLayerState(sc);
1404 if (!s) {
1405 mStatus = BAD_INDEX;
1406 return *this;
1407 }
1408 s->what |= layer_state_t::eColorSpaceAgnosticChanged;
1409 s->colorSpaceAgnostic = agnostic;
1410
1411 registerSurfaceControlForCallback(sc);
1412 return *this;
1413}
1414
Marissa Wallc837b5e2018-10-12 10:04:44 -07001415SurfaceComposerClient::Transaction&
Ana Krulecc84d09b2019-11-02 23:10:29 +01001416SurfaceComposerClient::Transaction::setFrameRateSelectionPriority(const sp<SurfaceControl>& sc,
1417 int32_t priority) {
1418 layer_state_t* s = getLayerState(sc);
1419 if (!s) {
1420 mStatus = BAD_INDEX;
1421 return *this;
1422 }
1423
1424 s->what |= layer_state_t::eFrameRateSelectionPriority;
1425 s->frameRateSelectionPriority = priority;
1426
1427 registerSurfaceControlForCallback(sc);
1428 return *this;
1429}
1430
1431SurfaceComposerClient::Transaction&
Marissa Wallc837b5e2018-10-12 10:04:44 -07001432SurfaceComposerClient::Transaction::addTransactionCompletedCallback(
Marissa Walle2ffb422018-10-12 11:33:52 -07001433 TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
Marissa Wallc837b5e2018-10-12 10:04:44 -07001434 auto listener = TransactionCompletedListener::getInstance();
1435
Marissa Wall80d94ad2019-01-18 16:04:36 -08001436 auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
1437 std::placeholders::_2, std::placeholders::_3);
1438 const auto& surfaceControls =
1439 mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001440
Marissa Wall80d94ad2019-01-18 16:04:36 -08001441 CallbackId callbackId = listener->addCallbackFunction(callbackWithContext, surfaceControls);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001442
1443 mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
1444 callbackId);
Marissa Wall61c58622018-07-18 10:12:20 -07001445 return *this;
1446}
1447
Valerie Hau871d6352020-01-29 08:44:02 -08001448SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::notifyProducerDisconnect(
1449 const sp<SurfaceControl>& sc) {
1450 layer_state_t* s = getLayerState(sc);
1451 if (!s) {
1452 mStatus = BAD_INDEX;
1453 return *this;
1454 }
1455
1456 s->what |= layer_state_t::eProducerDisconnect;
1457 return *this;
1458}
1459
Vishnu Nair6b7c5c92020-09-29 17:27:05 -07001460SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameNumber(
1461 const sp<SurfaceControl>& sc, uint64_t frameNumber) {
1462 layer_state_t* s = getLayerState(sc);
1463 if (!s) {
1464 mStatus = BAD_INDEX;
1465 return *this;
1466 }
1467
1468 s->what |= layer_state_t::eFrameNumberChanged;
1469 s->frameNumber = frameNumber;
1470
1471 return *this;
1472}
1473
Robert Carr2c358bf2018-08-08 15:58:15 -07001474#ifndef NO_INPUT
1475SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setInputWindowInfo(
1476 const sp<SurfaceControl>& sc,
1477 const InputWindowInfo& info) {
1478 layer_state_t* s = getLayerState(sc);
1479 if (!s) {
1480 mStatus = BAD_INDEX;
1481 return *this;
1482 }
Chris Ye0783e992020-06-02 21:34:49 -07001483 s->inputHandle = new InputWindowHandle(info);
Robert Carr2c358bf2018-08-08 15:58:15 -07001484 s->what |= layer_state_t::eInputInfoChanged;
1485 return *this;
1486}
chaviw273171b2018-12-26 11:46:30 -08001487
Vishnu Naire798b472020-07-23 13:52:21 -07001488SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFocusedWindow(
Vishnu Naire798b472020-07-23 13:52:21 -07001489 const FocusRequest& request) {
1490 mInputWindowCommands.focusRequests.push_back(request);
1491 return *this;
1492}
1493
chaviwa911b102019-02-14 10:18:33 -08001494SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
1495 mInputWindowCommands.syncInputWindows = true;
1496 return *this;
1497}
1498
Robert Carr2c358bf2018-08-08 15:58:15 -07001499#endif
1500
Peiyong Lind3788632018-09-18 16:01:31 -07001501SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
1502 const sp<SurfaceControl>& sc, const mat3& matrix, const vec3& translation) {
1503 layer_state_t* s = getLayerState(sc);
1504 if (!s) {
1505 mStatus = BAD_INDEX;
1506 return *this;
1507 }
1508 s->what |= layer_state_t::eColorTransformChanged;
1509 s->colorTransform = mat4(matrix, translation);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001510
1511 registerSurfaceControlForCallback(sc);
Peiyong Lind3788632018-09-18 16:01:31 -07001512 return *this;
1513}
1514
Robert Carrfb4d58b2019-01-15 09:21:27 -08001515SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometry(
1516 const sp<SurfaceControl>& sc, const Rect& source, const Rect& dst, int transform) {
chaviw25714502021-02-11 10:01:08 -08001517 setCrop(sc, source);
Robert Carrfb4d58b2019-01-15 09:21:27 -08001518
1519 int x = dst.left;
1520 int y = dst.top;
Robert Carr66365e42019-04-08 16:58:04 -07001521
1522 float sourceWidth = source.getWidth();
1523 float sourceHeight = source.getHeight();
1524
1525 float xScale = sourceWidth < 0 ? 1.0f : dst.getWidth() / sourceWidth;
1526 float yScale = sourceHeight < 0 ? 1.0f : dst.getHeight() / sourceHeight;
Robert Carrfb4d58b2019-01-15 09:21:27 -08001527 float matrix[4] = {1, 0, 0, 1};
1528
1529 switch (transform) {
1530 case NATIVE_WINDOW_TRANSFORM_FLIP_H:
1531 matrix[0] = -xScale; matrix[1] = 0;
1532 matrix[2] = 0; matrix[3] = yScale;
1533 x += source.getWidth();
1534 break;
1535 case NATIVE_WINDOW_TRANSFORM_FLIP_V:
1536 matrix[0] = xScale; matrix[1] = 0;
1537 matrix[2] = 0; matrix[3] = -yScale;
1538 y += source.getHeight();
1539 break;
1540 case NATIVE_WINDOW_TRANSFORM_ROT_90:
1541 matrix[0] = 0; matrix[1] = -yScale;
1542 matrix[2] = xScale; matrix[3] = 0;
1543 x += source.getHeight();
1544 break;
1545 case NATIVE_WINDOW_TRANSFORM_ROT_180:
1546 matrix[0] = -xScale; matrix[1] = 0;
1547 matrix[2] = 0; matrix[3] = -yScale;
1548 x += source.getWidth();
1549 y += source.getHeight();
1550 break;
1551 case NATIVE_WINDOW_TRANSFORM_ROT_270:
1552 matrix[0] = 0; matrix[1] = yScale;
1553 matrix[2] = -xScale; matrix[3] = 0;
1554 y += source.getWidth();
1555 break;
1556 default:
1557 matrix[0] = xScale; matrix[1] = 0;
1558 matrix[2] = 0; matrix[3] = yScale;
1559 break;
1560 }
1561 setMatrix(sc, matrix[0], matrix[1], matrix[2], matrix[3]);
chaviw76f5f2f2019-09-23 10:15:51 -07001562 float offsetX = xScale * source.left;
1563 float offsetY = yScale * source.top;
1564 setPosition(sc, x - offsetX, y - offsetY);
Robert Carrfb4d58b2019-01-15 09:21:27 -08001565
1566 return *this;
1567}
1568
Vishnu Nairc97b8db2019-10-29 18:19:35 -07001569SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setShadowRadius(
1570 const sp<SurfaceControl>& sc, float shadowRadius) {
1571 layer_state_t* s = getLayerState(sc);
1572 if (!s) {
1573 mStatus = BAD_INDEX;
1574 return *this;
1575 }
1576 s->what |= layer_state_t::eShadowRadiusChanged;
1577 s->shadowRadius = shadowRadius;
1578 return *this;
1579}
1580
Steven Thomas3172e202020-01-06 19:25:30 -08001581SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameRate(
Marin Shalamanov46084422020-10-13 12:33:42 +02001582 const sp<SurfaceControl>& sc, float frameRate, int8_t compatibility,
1583 bool shouldBeSeamless) {
Steven Thomas3172e202020-01-06 19:25:30 -08001584 layer_state_t* s = getLayerState(sc);
1585 if (!s) {
1586 mStatus = BAD_INDEX;
1587 return *this;
1588 }
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001589 // Allow privileged values as well here, those will be ignored by SF if
1590 // the caller is not privileged
1591 if (!ValidateFrameRate(frameRate, compatibility, "Transaction::setFrameRate",
1592 /*privileged=*/true)) {
Steven Thomas62a4cf82020-01-31 12:04:03 -08001593 mStatus = BAD_VALUE;
1594 return *this;
1595 }
Steven Thomas3172e202020-01-06 19:25:30 -08001596 s->what |= layer_state_t::eFrameRateChanged;
1597 s->frameRate = frameRate;
Steven Thomas62a4cf82020-01-31 12:04:03 -08001598 s->frameRateCompatibility = compatibility;
Marin Shalamanov46084422020-10-13 12:33:42 +02001599 s->shouldBeSeamless = shouldBeSeamless;
Steven Thomas3172e202020-01-06 19:25:30 -08001600 return *this;
1601}
1602
Vishnu Nair6213bd92020-05-08 17:42:25 -07001603SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFixedTransformHint(
1604 const sp<SurfaceControl>& sc, int32_t fixedTransformHint) {
1605 layer_state_t* s = getLayerState(sc);
1606 if (!s) {
1607 mStatus = BAD_INDEX;
1608 return *this;
1609 }
1610
1611 const ui::Transform::RotationFlags transform = fixedTransformHint == -1
1612 ? ui::Transform::ROT_INVALID
1613 : ui::Transform::toRotationFlags(static_cast<ui::Rotation>(fixedTransformHint));
1614 s->what |= layer_state_t::eFixedTransformHintChanged;
1615 s->fixedTransformHint = transform;
1616 return *this;
1617}
1618
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001619SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1620 const FrameTimelineInfo& frameTimelineInfo) {
1621 mFrameTimelineInfo = frameTimelineInfo;
Ady Abraham22c7b5c2020-09-22 19:33:40 -07001622 return *this;
1623}
1624
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001625SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1626 const sp<SurfaceControl>& sc, const FrameTimelineInfo& frameTimelineInfo) {
Robert Carr9b611b72020-10-19 12:00:23 -07001627 layer_state_t* s = getLayerState(sc);
1628 if (!s) {
1629 mStatus = BAD_INDEX;
1630 return *this;
1631 }
1632
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001633 s->what |= layer_state_t::eFrameTimelineInfoChanged;
1634 s->frameTimelineInfo = frameTimelineInfo;
Robert Carr9b611b72020-10-19 12:00:23 -07001635 return *this;
1636}
1637
Vishnu Naircf26a0a2020-11-13 12:56:20 -08001638SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAutoRefresh(
1639 const sp<SurfaceControl>& sc, bool autoRefresh) {
1640 layer_state_t* s = getLayerState(sc);
1641 if (!s) {
1642 mStatus = BAD_INDEX;
1643 return *this;
1644 }
1645
1646 s->what |= layer_state_t::eAutoRefreshChanged;
1647 s->autoRefresh = autoRefresh;
1648 return *this;
1649}
1650
Vishnu Nair277142c2021-01-05 18:35:29 -08001651SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApplyToken(
1652 const sp<IBinder>& applyToken) {
1653 mApplyToken = applyToken;
1654 return *this;
1655}
1656
John Reckcdb4ed72021-02-04 13:39:33 -05001657SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setStretchEffect(
1658 const sp<SurfaceControl>& sc, float left, float top, float right, float bottom, float vecX,
1659 float vecY, float maxAmount) {
1660 layer_state_t* s = getLayerState(sc);
1661 if (!s) {
1662 mStatus = BAD_INDEX;
1663 return *this;
1664 }
1665
1666 s->what |= layer_state_t::eStretchChanged;
1667 s->stretchEffect = StretchEffect{.area = {left, top, right, bottom},
1668 .vectorX = vecX,
1669 .vectorY = vecY,
1670 .maxAmount = maxAmount};
1671 return *this;
1672}
1673
Mathias Agopian698c0872011-06-28 19:09:31 -07001674// ---------------------------------------------------------------------------
1675
chaviw763ef572018-02-22 16:04:57 -08001676DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
Mathias Agopiane57f2922012-08-09 16:29:12 -07001677 DisplayState s;
1678 s.token = token;
1679 ssize_t index = mDisplayStates.indexOf(s);
1680 if (index < 0) {
1681 // we don't have it, add an initialized layer_state to our list
1682 s.what = 0;
1683 index = mDisplayStates.add(s);
1684 }
Dan Stozad723bd72014-11-18 10:24:03 -08001685 return mDisplayStates.editItemAt(static_cast<size_t>(index));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001686}
1687
Robert Carr4cdc58f2017-08-23 14:22:20 -07001688status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
1689 const sp<IGraphicBufferProducer>& bufferProducer) {
Pablo Ceballoseddbef82016-09-01 11:21:21 -07001690 if (bufferProducer.get() != nullptr) {
1691 // Make sure that composition can never be stalled by a virtual display
1692 // consumer that isn't processing buffers fast enough.
1693 status_t err = bufferProducer->setAsyncMode(true);
1694 if (err != NO_ERROR) {
1695 ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
1696 "BufferQueue. This BufferQueue cannot be used for virtual "
1697 "display. (%d)", err);
1698 return err;
1699 }
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001700 }
chaviw763ef572018-02-22 16:04:57 -08001701 DisplayState& s(getDisplayState(token));
Andy McFadden2adaf042012-12-18 09:49:45 -08001702 s.surface = bufferProducer;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001703 s.what |= DisplayState::eSurfaceChanged;
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001704 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001705}
1706
Robert Carr4cdc58f2017-08-23 14:22:20 -07001707void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
Mathias Agopiane57f2922012-08-09 16:29:12 -07001708 uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001709 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001710 s.layerStack = layerStack;
1711 s.what |= DisplayState::eLayerStackChanged;
1712}
1713
Robert Carr4cdc58f2017-08-23 14:22:20 -07001714void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
Dominik Laskowski718f9602019-11-09 20:01:35 -08001715 ui::Rotation orientation,
1716 const Rect& layerStackRect,
1717 const Rect& displayRect) {
chaviw763ef572018-02-22 16:04:57 -08001718 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001719 s.orientation = orientation;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +02001720 s.layerStackSpaceRect = layerStackRect;
1721 s.orientedDisplaySpaceRect = displayRect;
Mathias Agopian00e8c7a2012-09-04 19:30:46 -07001722 s.what |= DisplayState::eDisplayProjectionChanged;
Jorim Jaggi092123c2016-04-13 01:40:35 +00001723 mForceSynchronous = true; // TODO: do we actually still need this?
Mathias Agopiane57f2922012-08-09 16:29:12 -07001724}
1725
Robert Carr4cdc58f2017-08-23 14:22:20 -07001726void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
chaviw763ef572018-02-22 16:04:57 -08001727 DisplayState& s(getDisplayState(token));
Michael Wright1f6078a2014-06-26 16:01:02 -07001728 s.width = width;
1729 s.height = height;
1730 s.what |= DisplayState::eDisplaySizeChanged;
1731}
1732
Mathias Agopiane57f2922012-08-09 16:29:12 -07001733// ---------------------------------------------------------------------------
1734
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001735SurfaceComposerClient::SurfaceComposerClient()
Robert Carr4cdc58f2017-08-23 14:22:20 -07001736 : mStatus(NO_INIT)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001737{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001738}
1739
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +01001740SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
1741 : mStatus(NO_ERROR), mClient(client)
1742{
1743}
1744
Mathias Agopian698c0872011-06-28 19:09:31 -07001745void SurfaceComposerClient::onFirstRef() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001746 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07001747 if (sf != nullptr && mStatus == NO_INIT) {
Robert Carr1db73f62016-12-21 12:58:51 -08001748 sp<ISurfaceComposerClient> conn;
Robert Carrb89ea9d2018-12-10 13:01:14 -08001749 conn = sf->createConnection();
Yi Kong48a619f2018-06-05 16:34:59 -07001750 if (conn != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001751 mClient = conn;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001752 mStatus = NO_ERROR;
1753 }
1754 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001755}
1756
Mathias Agopian698c0872011-06-28 19:09:31 -07001757SurfaceComposerClient::~SurfaceComposerClient() {
Mathias Agopian631f3582010-05-25 17:51:34 -07001758 dispose();
1759}
Mathias Agopiandd3423c2009-09-23 15:44:05 -07001760
Mathias Agopian698c0872011-06-28 19:09:31 -07001761status_t SurfaceComposerClient::initCheck() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001762 return mStatus;
1763}
1764
Mathias Agopian698c0872011-06-28 19:09:31 -07001765sp<IBinder> SurfaceComposerClient::connection() const {
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001766 return IInterface::asBinder(mClient);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001767}
1768
Mathias Agopiand4784a32010-05-27 19:41:15 -07001769status_t SurfaceComposerClient::linkToComposerDeath(
1770 const sp<IBinder::DeathRecipient>& recipient,
Mathias Agopian698c0872011-06-28 19:09:31 -07001771 void* cookie, uint32_t flags) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001772 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1773 return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001774}
1775
Mathias Agopian698c0872011-06-28 19:09:31 -07001776void SurfaceComposerClient::dispose() {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001777 // this can be called more than once.
Mathias Agopian7e27f052010-05-28 14:22:23 -07001778 sp<ISurfaceComposerClient> client;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001779 Mutex::Autolock _lm(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -07001780 if (mClient != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001781 client = mClient; // hold ref while lock is held
1782 mClient.clear();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001783 }
Mathias Agopiand4784a32010-05-27 19:41:15 -07001784 mStatus = NO_INIT;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001785}
1786
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001787sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
1788 PixelFormat format, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001789 const sp<IBinder>& parentHandle,
Valerie Hau1acd6962019-10-28 16:35:48 -07001790 LayerMetadata metadata,
1791 uint32_t* outTransformHint) {
Robert Carr3b382ed2018-03-14 13:49:41 -07001792 sp<SurfaceControl> s;
Vishnu Nair992496b2020-10-22 17:27:21 -07001793 createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
Valerie Hau1acd6962019-10-28 16:35:48 -07001794 outTransformHint);
Robert Carr3b382ed2018-03-14 13:49:41 -07001795 return s;
1796}
1797
Marissa Wall35187b32019-01-08 10:08:52 -08001798sp<SurfaceControl> SurfaceComposerClient::createWithSurfaceParent(const String8& name, uint32_t w,
1799 uint32_t h, PixelFormat format,
1800 uint32_t flags, Surface* parent,
Valerie Hau1acd6962019-10-28 16:35:48 -07001801 LayerMetadata metadata,
1802 uint32_t* outTransformHint) {
Marissa Wall35187b32019-01-08 10:08:52 -08001803 sp<SurfaceControl> sur;
1804 status_t err = mStatus;
1805
1806 if (mStatus == NO_ERROR) {
1807 sp<IBinder> handle;
1808 sp<IGraphicBufferProducer> parentGbp = parent->getIGraphicBufferProducer();
1809 sp<IGraphicBufferProducer> gbp;
1810
Valerie Hau1acd6962019-10-28 16:35:48 -07001811 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001812 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001813 err = mClient->createWithSurfaceParent(name, w, h, format, flags, parentGbp,
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001814 std::move(metadata), &handle, &gbp, &id,
1815 &transformHint);
Valerie Hau1acd6962019-10-28 16:35:48 -07001816 if (outTransformHint) {
1817 *outTransformHint = transformHint;
1818 }
Marissa Wall35187b32019-01-08 10:08:52 -08001819 ALOGE_IF(err, "SurfaceComposerClient::createWithSurfaceParent error %s", strerror(-err));
1820 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001821 return new SurfaceControl(this, handle, gbp, id, transformHint);
Marissa Wall35187b32019-01-08 10:08:52 -08001822 }
1823 }
1824 return nullptr;
1825}
1826
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001827status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
1828 PixelFormat format,
1829 sp<SurfaceControl>* outSurface, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001830 const sp<IBinder>& parentHandle,
1831 LayerMetadata metadata,
Valerie Hau1acd6962019-10-28 16:35:48 -07001832 uint32_t* outTransformHint) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001833 sp<SurfaceControl> sur;
Robert Carr740eaf02018-03-27 12:59:18 -07001834 status_t err = mStatus;
Robert Carr3b382ed2018-03-14 13:49:41 -07001835
Mathias Agopian698c0872011-06-28 19:09:31 -07001836 if (mStatus == NO_ERROR) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001837 sp<IBinder> handle;
1838 sp<IGraphicBufferProducer> gbp;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001839
Valerie Hau1acd6962019-10-28 16:35:48 -07001840 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001841 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001842 err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001843 &handle, &gbp, &id, &transformHint);
1844
Valerie Hau1acd6962019-10-28 16:35:48 -07001845 if (outTransformHint) {
1846 *outTransformHint = transformHint;
1847 }
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001848 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
1849 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001850 *outSurface = new SurfaceControl(this, handle, gbp, id, transformHint);
Mathias Agopian698c0872011-06-28 19:09:31 -07001851 }
1852 }
Robert Carr3b382ed2018-03-14 13:49:41 -07001853 return err;
Mathias Agopian698c0872011-06-28 19:09:31 -07001854}
1855
chaviwfe94a222019-08-21 13:52:59 -07001856sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface) {
1857 if (mirrorFromSurface == nullptr) {
1858 return nullptr;
1859 }
1860
1861 sp<IBinder> handle;
1862 sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001863 int32_t layer_id = -1;
1864 status_t err = mClient->mirrorSurface(mirrorFromHandle, &handle, &layer_id);
chaviwfe94a222019-08-21 13:52:59 -07001865 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001866 return new SurfaceControl(this, handle, nullptr, layer_id, true /* owned */);
chaviwfe94a222019-08-21 13:52:59 -07001867 }
1868 return nullptr;
1869}
1870
Svetoslavd85084b2014-03-20 10:28:31 -07001871status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
1872 if (mStatus != NO_ERROR) {
1873 return mStatus;
1874 }
1875 return mClient->clearLayerFrameStats(token);
1876}
1877
1878status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
1879 FrameStats* outStats) const {
1880 if (mStatus != NO_ERROR) {
1881 return mStatus;
1882 }
1883 return mClient->getLayerFrameStats(token, outStats);
1884}
1885
Mathias Agopian698c0872011-06-28 19:09:31 -07001886// ----------------------------------------------------------------------------
1887
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001888status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001889 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1890 return sf->enableVSyncInjections(enable);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001891}
1892
1893status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001894 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1895 return sf->injectVSync(when);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001896}
1897
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001898status_t SurfaceComposerClient::getDisplayState(const sp<IBinder>& display,
1899 ui::DisplayState* state) {
1900 return ComposerService::getComposerService()->getDisplayState(display, state);
1901}
1902
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001903status_t SurfaceComposerClient::getStaticDisplayInfo(const sp<IBinder>& display,
1904 ui::StaticDisplayInfo* info) {
1905 return ComposerService::getComposerService()->getStaticDisplayInfo(display, info);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001906}
1907
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001908status_t SurfaceComposerClient::getDynamicDisplayInfo(const sp<IBinder>& display,
1909 ui::DynamicDisplayInfo* info) {
1910 return ComposerService::getComposerService()->getDynamicDisplayInfo(display, info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001911}
1912
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001913status_t SurfaceComposerClient::getActiveDisplayMode(const sp<IBinder>& display,
1914 ui::DisplayMode* mode) {
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001915 ui::DynamicDisplayInfo info;
1916 status_t result = getDynamicDisplayInfo(display, &info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001917 if (result != NO_ERROR) {
1918 return result;
1919 }
1920
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001921 if (const auto activeMode = info.getActiveDisplayMode()) {
1922 *mode = *activeMode;
1923 return NO_ERROR;
Dan Stoza7f7da322014-05-02 15:26:25 -07001924 }
1925
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001926 ALOGE("Active display mode not found.");
1927 return NAME_NOT_FOUND;
Dan Stoza7f7da322014-05-02 15:26:25 -07001928}
1929
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001930status_t SurfaceComposerClient::setDesiredDisplayModeSpecs(
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001931 const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching,
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001932 float primaryRefreshRateMin, float primaryRefreshRateMax, float appRequestRefreshRateMin,
1933 float appRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07001934 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001935 ->setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
1936 primaryRefreshRateMin, primaryRefreshRateMax,
1937 appRequestRefreshRateMin, appRequestRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001938}
1939
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001940status_t SurfaceComposerClient::getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
1941 ui::DisplayModeId* outDefaultMode,
1942 bool* outAllowGroupSwitching,
1943 float* outPrimaryRefreshRateMin,
1944 float* outPrimaryRefreshRateMax,
1945 float* outAppRequestRefreshRateMin,
1946 float* outAppRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07001947 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001948 ->getDesiredDisplayModeSpecs(displayToken, outDefaultMode, outAllowGroupSwitching,
1949 outPrimaryRefreshRateMin, outPrimaryRefreshRateMax,
1950 outAppRequestRefreshRateMin, outAppRequestRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001951}
1952
Daniel Solomon42d04562019-01-20 21:03:19 -08001953status_t SurfaceComposerClient::getDisplayNativePrimaries(const sp<IBinder>& display,
1954 ui::DisplayPrimaries& outPrimaries) {
1955 return ComposerService::getComposerService()->getDisplayNativePrimaries(display, outPrimaries);
1956}
1957
Michael Wright28f24d02016-07-12 13:30:53 -07001958status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
Peiyong Lina52f0292018-03-14 17:26:31 -07001959 ColorMode colorMode) {
Michael Wright28f24d02016-07-12 13:30:53 -07001960 return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
1961}
1962
Galia Peycheva5492cb52019-10-30 14:13:16 +01001963void SurfaceComposerClient::setAutoLowLatencyMode(const sp<IBinder>& display, bool on) {
1964 ComposerService::getComposerService()->setAutoLowLatencyMode(display, on);
1965}
1966
Galia Peycheva5492cb52019-10-30 14:13:16 +01001967void SurfaceComposerClient::setGameContentType(const sp<IBinder>& display, bool on) {
1968 ComposerService::getComposerService()->setGameContentType(display, on);
1969}
1970
Prashant Malani2c9b11f2014-05-25 01:36:31 -07001971void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
1972 int mode) {
1973 ComposerService::getComposerService()->setPowerMode(token, mode);
Jeff Brown2a09bb32012-10-08 19:13:57 -07001974}
1975
Peiyong Linc6780972018-10-28 15:24:08 -07001976status_t SurfaceComposerClient::getCompositionPreference(
1977 ui::Dataspace* defaultDataspace, ui::PixelFormat* defaultPixelFormat,
1978 ui::Dataspace* wideColorGamutDataspace, ui::PixelFormat* wideColorGamutPixelFormat) {
1979 return ComposerService::getComposerService()
1980 ->getCompositionPreference(defaultDataspace, defaultPixelFormat,
1981 wideColorGamutDataspace, wideColorGamutPixelFormat);
Peiyong Lin0256f722018-08-31 15:45:10 -07001982}
1983
Peiyong Lin08d10512019-01-16 13:27:35 -08001984bool SurfaceComposerClient::getProtectedContentSupport() {
1985 bool supported = false;
1986 ComposerService::getComposerService()->getProtectedContentSupport(&supported);
1987 return supported;
1988}
1989
Svetoslavd85084b2014-03-20 10:28:31 -07001990status_t SurfaceComposerClient::clearAnimationFrameStats() {
1991 return ComposerService::getComposerService()->clearAnimationFrameStats();
1992}
1993
1994status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
1995 return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
1996}
1997
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001998status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
1999 ui::PixelFormat* outFormat,
2000 ui::Dataspace* outDataspace,
2001 uint8_t* outComponentMask) {
2002 return ComposerService::getComposerService()
2003 ->getDisplayedContentSamplingAttributes(display, outFormat, outDataspace,
2004 outComponentMask);
2005}
2006
Kevin DuBois74e53772018-11-19 10:52:38 -08002007status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display,
2008 bool enable, uint8_t componentMask,
2009 uint64_t maxFrames) {
2010 return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable,
2011 componentMask,
2012 maxFrames);
2013}
2014
Kevin DuBois1d4249a2018-08-29 10:45:14 -07002015status_t SurfaceComposerClient::getDisplayedContentSample(const sp<IBinder>& display,
2016 uint64_t maxFrames, uint64_t timestamp,
2017 DisplayedFrameStats* outStats) {
2018 return ComposerService::getComposerService()->getDisplayedContentSample(display, maxFrames,
2019 timestamp, outStats);
2020}
Marissa Wall35187b32019-01-08 10:08:52 -08002021
Peiyong Lin4f3fddf2019-01-24 17:21:24 -08002022status_t SurfaceComposerClient::isWideColorDisplay(const sp<IBinder>& display,
2023 bool* outIsWideColorDisplay) {
2024 return ComposerService::getComposerService()->isWideColorDisplay(display,
2025 outIsWideColorDisplay);
2026}
2027
Kevin DuBois00c66832019-02-18 16:21:31 -08002028status_t SurfaceComposerClient::addRegionSamplingListener(
2029 const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
2030 const sp<IRegionSamplingListener>& listener) {
2031 return ComposerService::getComposerService()->addRegionSamplingListener(samplingArea,
2032 stopLayerHandle,
2033 listener);
2034}
2035
2036status_t SurfaceComposerClient::removeRegionSamplingListener(
2037 const sp<IRegionSamplingListener>& listener) {
2038 return ComposerService::getComposerService()->removeRegionSamplingListener(listener);
2039}
2040
Alec Mouria9a68a62021-03-04 19:14:50 -08002041status_t SurfaceComposerClient::addFpsListener(int32_t taskId,
Alec Mouriadebf5c2021-01-05 12:57:36 -08002042 const sp<gui::IFpsListener>& listener) {
Alec Mouria9a68a62021-03-04 19:14:50 -08002043 return ComposerService::getComposerService()->addFpsListener(taskId, listener);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002044}
2045
2046status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& listener) {
2047 return ComposerService::getComposerService()->removeFpsListener(listener);
2048}
2049
Dan Gittik57e63c52019-01-18 16:37:54 +00002050bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) {
2051 bool support = false;
2052 ComposerService::getComposerService()->getDisplayBrightnessSupport(displayToken, &support);
2053 return support;
2054}
2055
2056status_t SurfaceComposerClient::setDisplayBrightness(const sp<IBinder>& displayToken,
John Reck22be6962021-03-10 12:59:54 -05002057 const gui::DisplayBrightness& brightness) {
Dan Gittik57e63c52019-01-18 16:37:54 +00002058 return ComposerService::getComposerService()->setDisplayBrightness(displayToken, brightness);
2059}
2060
Lais Andrade3a6e47d2020-04-02 11:20:16 +01002061status_t SurfaceComposerClient::notifyPowerBoost(int32_t boostId) {
2062 return ComposerService::getComposerService()->notifyPowerBoost(boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07002063}
2064
Vishnu Nairb13bb952019-11-15 10:24:08 -08002065status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColor,
2066 const half4& spotColor, float lightPosY,
2067 float lightPosZ, float lightRadius) {
2068 return ComposerService::getComposerService()->setGlobalShadowSettings(ambientColor, spotColor,
2069 lightPosY, lightPosZ,
2070 lightRadius);
2071}
2072
Ana Krulec31f2b3c2020-12-14 14:30:09 -08002073int SurfaceComposerClient::getGPUContextPriority() {
2074 return ComposerService::getComposerService()->getGPUContextPriority();
2075}
2076
Mathias Agopian698c0872011-06-28 19:09:31 -07002077// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08002078
chaviw690db382020-07-27 16:46:46 -07002079status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002080 const sp<IScreenCaptureListener>& captureListener) {
Mathias Agopian2a9fc492013-03-01 13:42:57 -08002081 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002082 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002083
chaviwe7b9f272020-08-18 16:08:59 -07002084 return s->captureDisplay(captureArgs, captureListener);
Robert Carr673134e2017-01-09 19:48:38 -08002085}
2086
chaviw690db382020-07-27 16:46:46 -07002087status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack,
chaviwe7b9f272020-08-18 16:08:59 -07002088 const sp<IScreenCaptureListener>& captureListener) {
chaviw93df2ea2019-04-30 16:45:12 -07002089 sp<ISurfaceComposer> s(ComposerService::getComposerService());
2090 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002091
chaviwe7b9f272020-08-18 16:08:59 -07002092 return s->captureDisplay(displayOrLayerStack, captureListener);
chaviw93df2ea2019-04-30 16:45:12 -07002093}
2094
chaviw26c52482020-07-28 16:25:52 -07002095status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002096 const sp<IScreenCaptureListener>& captureListener) {
chaviwa76b2712017-09-20 12:02:26 -07002097 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002098 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002099
chaviwe7b9f272020-08-18 16:08:59 -07002100 return s->captureLayers(captureArgs, captureListener);
chaviwa76b2712017-09-20 12:02:26 -07002101}
Dominik Laskowski718f9602019-11-09 20:01:35 -08002102
2103} // namespace android