blob: e1fe26aa7f0cd66f14dd1c0edb1d9a65e6279295 [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
chaviw60c9d3e2021-06-04 12:52:17 -050022#include <android/gui/IWindowInfosListener.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080023#include <utils/Errors.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080024#include <utils/Log.h>
Mathias Agopiana67932f2011-04-20 14:20:59 -070025#include <utils/SortedVector.h>
26#include <utils/String8.h>
27#include <utils/threads.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080028
Marissa Wall7a9b6ff2018-08-21 17:26:20 -070029#include <binder/IPCThreadState.h>
Mathias Agopiana67932f2011-04-20 14:20:59 -070030#include <binder/IServiceManager.h>
Marissa Wall7a9b6ff2018-08-21 17:26:20 -070031#include <binder/ProcessState.h>
Mathias Agopian9cce3252010-02-09 17:46:37 -080032
Michael Wright28f24d02016-07-12 13:30:53 -070033#include <system/graphics.h>
34
Robert Carr673134e2017-01-09 19:48:38 -080035#include <gui/BufferItemConsumer.h>
Mathias Agopianabe815d2013-03-19 22:22:21 -070036#include <gui/CpuConsumer.h>
Mathias Agopiane3c697f2013-02-14 17:11:02 -080037#include <gui/IGraphicBufferProducer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080038#include <gui/ISurfaceComposer.h>
39#include <gui/ISurfaceComposerClient.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070040#include <gui/LayerState.h>
Robert Carr0d480722017-01-10 16:42:54 -080041#include <gui/Surface.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080042#include <gui/SurfaceComposerClient.h>
chaviw98318de2021-05-19 16:45:23 -050043#include <gui/WindowInfo.h>
Marin Shalamanov3b1f7bc2021-03-16 15:51:53 +010044#include <private/gui/ParcelUtils.h>
Marin Shalamanova7fe3042021-01-29 21:02:08 +010045#include <ui/DisplayMode.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010046#include <ui/DynamicDisplayInfo.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080047
Mathias Agopian41f673c2011-11-17 17:48:35 -080048#include <private/gui/ComposerService.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080049
Marissa Wall73411622019-01-25 10:45:41 -080050// This server size should always be smaller than the server cache size
51#define BUFFER_CACHE_MAX_SIZE 64
52
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080053namespace android {
Peiyong Lin9f034472018-03-28 15:29:00 -070054
chaviw98318de2021-05-19 16:45:23 -050055using gui::FocusRequest;
Huihong Luoecc1f902021-11-20 11:55:05 -080056using gui::IRegionSamplingListener;
chaviw98318de2021-05-19 16:45:23 -050057using gui::WindowInfo;
58using gui::WindowInfoHandle;
chaviw60c9d3e2021-06-04 12:52:17 -050059using gui::WindowInfosListener;
Peiyong Lin9f034472018-03-28 15:29:00 -070060using ui::ColorMode;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080061// ---------------------------------------------------------------------------
62
Mathias Agopian7e27f052010-05-28 14:22:23 -070063ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
64
Mathias Agopianb7e930d2010-06-01 15:12:58 -070065ComposerService::ComposerService()
66: Singleton<ComposerService>() {
Andy McFadden6652b3e2012-09-06 18:45:56 -070067 Mutex::Autolock _l(mLock);
68 connectLocked();
69}
70
Brian Lindahl9b85a192021-05-10 09:56:33 +000071bool ComposerService::connectLocked() {
Mathias Agopianb7e930d2010-06-01 15:12:58 -070072 const String16 name("SurfaceFlinger");
Brian Lindahl9b85a192021-05-10 09:56:33 +000073 mComposerService = waitForService<ISurfaceComposer>(name);
74 if (mComposerService == nullptr) {
75 return false; // fatal error or permission problem
Mathias Agopianb7e930d2010-06-01 15:12:58 -070076 }
Andy McFadden6652b3e2012-09-06 18:45:56 -070077
78 // Create the death listener.
79 class DeathObserver : public IBinder::DeathRecipient {
80 ComposerService& mComposerService;
81 virtual void binderDied(const wp<IBinder>& who) {
82 ALOGW("ComposerService remote (surfaceflinger) died [%p]",
83 who.unsafe_get());
84 mComposerService.composerServiceDied();
85 }
86 public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070087 explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
Andy McFadden6652b3e2012-09-06 18:45:56 -070088 };
89
90 mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
Marco Nelissen2ea926b2014-11-14 08:01:01 -080091 IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
Brian Lindahl9b85a192021-05-10 09:56:33 +000092 return true;
Mathias Agopianb7e930d2010-06-01 15:12:58 -070093}
94
Andy McFadden6652b3e2012-09-06 18:45:56 -070095/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
96 ComposerService& instance = ComposerService::getInstance();
97 Mutex::Autolock _l(instance.mLock);
Yi Kong48a619f2018-06-05 16:34:59 -070098 if (instance.mComposerService == nullptr) {
Brian Lindahl9b85a192021-05-10 09:56:33 +000099 if (ComposerService::getInstance().connectLocked()) {
100 ALOGD("ComposerService reconnected");
chaviw60c9d3e2021-06-04 12:52:17 -0500101 WindowInfosListenerReporter::getInstance()->reconnect(instance.mComposerService);
Brian Lindahl9b85a192021-05-10 09:56:33 +0000102 }
Andy McFadden6652b3e2012-09-06 18:45:56 -0700103 }
104 return instance.mComposerService;
105}
106
107void ComposerService::composerServiceDied()
108{
109 Mutex::Autolock _l(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -0700110 mComposerService = nullptr;
111 mDeathObserver = nullptr;
Mathias Agopianb7e930d2010-06-01 15:12:58 -0700112}
113
Robert Carrfb4d58b2019-01-15 09:21:27 -0800114class DefaultComposerClient: public Singleton<DefaultComposerClient> {
115 Mutex mLock;
116 sp<SurfaceComposerClient> mClient;
117 friend class Singleton<ComposerService>;
118public:
119 static sp<SurfaceComposerClient> getComposerClient() {
120 DefaultComposerClient& dc = DefaultComposerClient::getInstance();
121 Mutex::Autolock _l(dc.mLock);
122 if (dc.mClient == nullptr) {
123 dc.mClient = new SurfaceComposerClient;
124 }
125 return dc.mClient;
126 }
127};
128ANDROID_SINGLETON_STATIC_INSTANCE(DefaultComposerClient);
129
130
131sp<SurfaceComposerClient> SurfaceComposerClient::getDefault() {
132 return DefaultComposerClient::getComposerClient();
133}
134
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100135JankDataListener::~JankDataListener() {
136}
137
Mathias Agopian7e27f052010-05-28 14:22:23 -0700138// ---------------------------------------------------------------------------
139
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700140// TransactionCompletedListener does not use ANDROID_SINGLETON_STATIC_INSTANCE because it needs
141// to be able to return a sp<> to its instance to pass to SurfaceFlinger.
142// ANDROID_SINGLETON_STATIC_INSTANCE only allows a reference to an instance.
143
Marissa Wallc837b5e2018-10-12 10:04:44 -0700144// 0 is an invalid callback id
145TransactionCompletedListener::TransactionCompletedListener() : mCallbackIdCounter(1) {}
146
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700147int64_t TransactionCompletedListener::getNextIdLocked() {
Marissa Wallc837b5e2018-10-12 10:04:44 -0700148 return mCallbackIdCounter++;
149}
150
chaviw0b06a8d2021-08-06 11:49:08 -0500151sp<TransactionCompletedListener> TransactionCompletedListener::sInstance = nullptr;
152
153void TransactionCompletedListener::setInstance(const sp<TransactionCompletedListener>& listener) {
154 sInstance = listener;
155}
156
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700157sp<TransactionCompletedListener> TransactionCompletedListener::getInstance() {
chaviw0b06a8d2021-08-06 11:49:08 -0500158 if (sInstance == nullptr) {
159 sInstance = new TransactionCompletedListener;
160 }
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700161 return sInstance;
162}
163
Marissa Wallc837b5e2018-10-12 10:04:44 -0700164sp<ITransactionCompletedListener> TransactionCompletedListener::getIInstance() {
165 return static_cast<sp<ITransactionCompletedListener>>(getInstance());
166}
167
168void TransactionCompletedListener::startListeningLocked() {
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700169 if (mListening) {
170 return;
171 }
172 ProcessState::self()->startThreadPool();
173 mListening = true;
174}
175
Marissa Wall80d94ad2019-01-18 16:04:36 -0800176CallbackId TransactionCompletedListener::addCallbackFunction(
177 const TransactionCompletedCallback& callbackFunction,
178 const std::unordered_set<sp<SurfaceControl>, SurfaceComposerClient::SCHash>&
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700179 surfaceControls,
180 CallbackId::Type callbackType) {
Marissa Wallc837b5e2018-10-12 10:04:44 -0700181 std::lock_guard<std::mutex> lock(mMutex);
182 startListeningLocked();
183
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700184 CallbackId callbackId(getNextIdLocked(), callbackType);
Marissa Wall80d94ad2019-01-18 16:04:36 -0800185 mCallbacks[callbackId].callbackFunction = callbackFunction;
Marissa Wall80d94ad2019-01-18 16:04:36 -0800186 auto& callbackSurfaceControls = mCallbacks[callbackId].surfaceControls;
187
188 for (const auto& surfaceControl : surfaceControls) {
189 callbackSurfaceControls[surfaceControl->getHandle()] = surfaceControl;
190 }
191
Marissa Wallc837b5e2018-10-12 10:04:44 -0700192 return callbackId;
193}
194
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100195void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
196 sp<SurfaceControl> surfaceControl) {
Jorim Jaggi39f4b1c2021-06-23 13:39:41 +0200197 std::lock_guard<std::mutex> lock(mMutex);
chaviw29bc5362021-09-07 16:17:13 -0500198 mJankListeners.insert({surfaceControl->getLayerId(), listener});
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100199}
200
201void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) {
Jorim Jaggi39f4b1c2021-06-23 13:39:41 +0200202 std::lock_guard<std::mutex> lock(mMutex);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100203 for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {
204 if (it->second == listener) {
205 it = mJankListeners.erase(it);
206 } else {
207 it++;
208 }
209 }
210}
211
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700212void TransactionCompletedListener::setReleaseBufferCallback(const ReleaseCallbackId& callbackId,
Vishnu Nair1506b182021-02-22 14:35:15 -0800213 ReleaseBufferCallback listener) {
214 std::scoped_lock<std::mutex> lock(mMutex);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700215 mReleaseBufferCallbacks[callbackId] = listener;
Vishnu Nair1506b182021-02-22 14:35:15 -0800216}
217
Jorim Jaggif51775d2021-01-14 23:44:15 +0100218void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
219 sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
Jorim Jaggi6ed2ea82021-06-16 17:49:08 +0200220 std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
chaviw29bc5362021-09-07 16:17:13 -0500221 mSurfaceStatsListeners.insert(
222 {surfaceControl->getLayerId(), SurfaceStatsCallbackEntry(context, cookie, listener)});
Jorim Jaggif51775d2021-01-14 23:44:15 +0100223}
224
225void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) {
Jorim Jaggi6ed2ea82021-06-16 17:49:08 +0200226 std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
Jorim Jaggif51775d2021-01-14 23:44:15 +0100227 for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) {
228 auto [itContext, itCookie, itListener] = it->second;
229 if (itContext == context && itCookie == cookie) {
230 it = mSurfaceStatsListeners.erase(it);
231 } else {
232 it++;
233 }
234 }
235}
236
Marissa Wall80d94ad2019-01-18 16:04:36 -0800237void TransactionCompletedListener::addSurfaceControlToCallbacks(
238 const sp<SurfaceControl>& surfaceControl,
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700239 const std::unordered_set<CallbackId, CallbackIdHash>& callbackIds) {
Marissa Wall80d94ad2019-01-18 16:04:36 -0800240 std::lock_guard<std::mutex> lock(mMutex);
241
242 for (auto callbackId : callbackIds) {
243 mCallbacks[callbackId].surfaceControls.emplace(std::piecewise_construct,
244 std::forward_as_tuple(
245 surfaceControl->getHandle()),
246 std::forward_as_tuple(surfaceControl));
247 }
248}
249
Marissa Walle2ffb422018-10-12 11:33:52 -0700250void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700251 std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap;
chaviw29bc5362021-09-07 16:17:13 -0500252 std::multimap<int32_t, sp<JankDataListener>> jankListenersMap;
Valerie Haud3b90d22019-11-06 09:37:31 -0800253 {
254 std::lock_guard<std::mutex> lock(mMutex);
Marissa Walle2ffb422018-10-12 11:33:52 -0700255
Valerie Haud3b90d22019-11-06 09:37:31 -0800256 /* This listener knows all the sp<IBinder> to sp<SurfaceControl> for all its registered
257 * callbackIds, except for when Transactions are merged together. This probably cannot be
258 * solved before this point because the Transactions could be merged together and applied in
259 * a different process.
260 *
261 * Fortunately, we get all the callbacks for this listener for the same frame together at
262 * the same time. This means if any Transactions were merged together, we will get their
263 * callbacks at the same time. We can combine all the sp<IBinder> to sp<SurfaceControl> maps
264 * for all the callbackIds to generate one super map that contains all the sp<IBinder> to
265 * sp<SurfaceControl> that could possibly exist for the callbacks.
266 */
267 callbacksMap = mCallbacks;
Jorim Jaggi39f4b1c2021-06-23 13:39:41 +0200268 jankListenersMap = mJankListeners;
Valerie Haud3b90d22019-11-06 09:37:31 -0800269 for (const auto& transactionStats : listenerStats.transactionStats) {
270 for (auto& callbackId : transactionStats.callbackIds) {
271 mCallbacks.erase(callbackId);
272 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800273 }
274 }
Marissa Walld600d572019-03-26 15:38:50 -0700275 for (const auto& transactionStats : listenerStats.transactionStats) {
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700276 // handle on commit callbacks
Marissa Walld600d572019-03-26 15:38:50 -0700277 for (auto callbackId : transactionStats.callbackIds) {
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700278 if (callbackId.type != CallbackId::Type::ON_COMMIT) {
279 continue;
280 }
281 auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
282 if (!callbackFunction) {
283 ALOGE("cannot call null callback function, skipping");
284 continue;
285 }
286 std::vector<SurfaceControlStats> surfaceControlStats;
287 for (const auto& surfaceStats : transactionStats.surfaceStats) {
288 surfaceControlStats
289 .emplace_back(callbacksMap[callbackId]
290 .surfaceControls[surfaceStats.surfaceControl],
291 transactionStats.latchTime, surfaceStats.acquireTime,
292 transactionStats.presentFence,
293 surfaceStats.previousReleaseFence, surfaceStats.transformHint,
294 surfaceStats.eventStats);
295 }
296
297 callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
298 surfaceControlStats);
299 }
300
301 // handle on complete callbacks
302 for (auto callbackId : transactionStats.callbackIds) {
303 if (callbackId.type != CallbackId::Type::ON_COMPLETE) {
304 continue;
305 }
Valerie Haud3b90d22019-11-06 09:37:31 -0800306 auto& [callbackFunction, callbackSurfaceControls] = callbacksMap[callbackId];
Marissa Wall80d94ad2019-01-18 16:04:36 -0800307 if (!callbackFunction) {
Marissa Walle2ffb422018-10-12 11:33:52 -0700308 ALOGE("cannot call null callback function, skipping");
309 continue;
310 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800311 std::vector<SurfaceControlStats> surfaceControlStats;
312 for (const auto& surfaceStats : transactionStats.surfaceStats) {
Valerie Haud3b90d22019-11-06 09:37:31 -0800313 surfaceControlStats
314 .emplace_back(callbacksMap[callbackId]
315 .surfaceControls[surfaceStats.surfaceControl],
Valerie Hau871d6352020-01-29 08:44:02 -0800316 transactionStats.latchTime, surfaceStats.acquireTime,
317 transactionStats.presentFence,
318 surfaceStats.previousReleaseFence, surfaceStats.transformHint,
319 surfaceStats.eventStats);
Valerie Hau84d87ff2020-01-08 17:23:21 -0800320 if (callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl]) {
321 callbacksMap[callbackId]
322 .surfaceControls[surfaceStats.surfaceControl]
323 ->setTransformHint(surfaceStats.transformHint);
324 }
Vishnu Nair1506b182021-02-22 14:35:15 -0800325 // If there is buffer id set, we look up any pending client release buffer callbacks
326 // and call them. This is a performance optimization when we have a transaction
327 // callback and a release buffer callback happening at the same time to avoid an
328 // additional ipc call from the server.
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700329 if (surfaceStats.previousReleaseCallbackId != ReleaseCallbackId::INVALID_ID) {
Vishnu Nair5faedf52021-03-22 11:32:58 -0700330 ReleaseBufferCallback callback;
331 {
332 std::scoped_lock<std::mutex> lock(mMutex);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700333 callback = popReleaseBufferCallbackLocked(
334 surfaceStats.previousReleaseCallbackId);
Vishnu Nair5faedf52021-03-22 11:32:58 -0700335 }
Vishnu Nair1506b182021-02-22 14:35:15 -0800336 if (callback) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700337 callback(surfaceStats.previousReleaseCallbackId,
Vishnu Nair1506b182021-02-22 14:35:15 -0800338 surfaceStats.previousReleaseFence
339 ? surfaceStats.previousReleaseFence
Robert Carr97e7cc02021-06-07 10:45:40 -0700340 : Fence::NO_FENCE,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700341 surfaceStats.currentMaxAcquiredBufferCount);
Vishnu Nair1506b182021-02-22 14:35:15 -0800342 }
343 }
Marissa Wall80d94ad2019-01-18 16:04:36 -0800344 }
345
346 callbackFunction(transactionStats.latchTime, transactionStats.presentFence,
347 surfaceControlStats);
Marissa Walle2ffb422018-10-12 11:33:52 -0700348 }
chaviw29bc5362021-09-07 16:17:13 -0500349
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100350 for (const auto& surfaceStats : transactionStats.surfaceStats) {
chaviw29bc5362021-09-07 16:17:13 -0500351 // The callbackMap contains the SurfaceControl object, which we need to look up the
352 // layerId. Since we don't know which callback contains the SurfaceControl, iterate
353 // through all until the SC is found.
354 int32_t layerId = -1;
355 for (auto callbackId : transactionStats.callbackIds) {
Pablo Gamito10026472021-11-22 22:16:45 +0100356 if (callbackId.type != CallbackId::Type::ON_COMPLETE) {
357 // We only want to run the stats callback for ON_COMPLETE
358 continue;
359 }
chaviw29bc5362021-09-07 16:17:13 -0500360 sp<SurfaceControl> sc =
361 callbacksMap[callbackId].surfaceControls[surfaceStats.surfaceControl];
362 if (sc != nullptr) {
363 layerId = sc->getLayerId();
364 break;
365 }
366 }
367
Pablo Gamito10026472021-11-22 22:16:45 +0100368 if (layerId != -1) {
Jorim Jaggi6ed2ea82021-06-16 17:49:08 +0200369 // Acquire surface stats listener lock such that we guarantee that after calling
370 // unregister, there won't be any further callback.
371 std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
chaviw29bc5362021-09-07 16:17:13 -0500372 auto listenerRange = mSurfaceStatsListeners.equal_range(layerId);
Jorim Jaggi6ed2ea82021-06-16 17:49:08 +0200373 for (auto it = listenerRange.first; it != listenerRange.second; it++) {
374 auto entry = it->second;
375 entry.callback(entry.context, transactionStats.latchTime,
376 transactionStats.presentFence, surfaceStats);
377 }
Jorim Jaggif51775d2021-01-14 23:44:15 +0100378 }
379
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100380 if (surfaceStats.jankData.empty()) continue;
chaviw29bc5362021-09-07 16:17:13 -0500381 auto jankRange = jankListenersMap.equal_range(layerId);
Jorim Jaggif51775d2021-01-14 23:44:15 +0100382 for (auto it = jankRange.first; it != jankRange.second; it++) {
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100383 it->second->onJankDataAvailable(surfaceStats.jankData);
384 }
385 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700386 }
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700387}
388
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700389void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId,
chaviw69058fb2021-09-27 09:37:30 -0500390 sp<Fence> releaseFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700391 uint32_t currentMaxAcquiredBufferCount) {
Vishnu Nair1506b182021-02-22 14:35:15 -0800392 ReleaseBufferCallback callback;
393 {
394 std::scoped_lock<std::mutex> lock(mMutex);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700395 callback = popReleaseBufferCallbackLocked(callbackId);
Vishnu Nair1506b182021-02-22 14:35:15 -0800396 }
397 if (!callback) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700398 ALOGE("Could not call release buffer callback, buffer not found %s",
399 callbackId.to_string().c_str());
Vishnu Nair1506b182021-02-22 14:35:15 -0800400 return;
401 }
chaviw69058fb2021-09-27 09:37:30 -0500402 std::optional<uint32_t> optionalMaxAcquiredBufferCount =
403 currentMaxAcquiredBufferCount == UINT_MAX
404 ? std::nullopt
405 : std::make_optional<uint32_t>(currentMaxAcquiredBufferCount);
406 callback(callbackId, releaseFence, optionalMaxAcquiredBufferCount);
Vishnu Nair1506b182021-02-22 14:35:15 -0800407}
408
409ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked(
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700410 const ReleaseCallbackId& callbackId) {
Vishnu Nair1506b182021-02-22 14:35:15 -0800411 ReleaseBufferCallback callback;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700412 auto itr = mReleaseBufferCallbacks.find(callbackId);
Vishnu Nair1506b182021-02-22 14:35:15 -0800413 if (itr == mReleaseBufferCallbacks.end()) {
414 return nullptr;
415 }
416 callback = itr->second;
417 mReleaseBufferCallbacks.erase(itr);
418 return callback;
419}
420
chaviw0acd33a2021-11-02 11:55:37 -0500421void TransactionCompletedListener::removeReleaseBufferCallback(
422 const ReleaseCallbackId& callbackId) {
423 {
424 std::scoped_lock<std::mutex> lock(mMutex);
425 popReleaseBufferCallbackLocked(callbackId);
426 }
427}
428
Marissa Wall7a9b6ff2018-08-21 17:26:20 -0700429// ---------------------------------------------------------------------------
430
Robert Carre06ad2b2020-04-10 15:09:33 -0700431void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId);
Marissa Wall78b72202019-03-15 14:58:34 -0700432
Robert Carre06ad2b2020-04-10 15:09:33 -0700433/**
434 * We use the BufferCache to reduce the overhead of exchanging GraphicBuffers with
435 * the server. If we were to simply parcel the GraphicBuffer we would pay two overheads
436 * 1. Cost of sending the FD
437 * 2. Cost of importing the GraphicBuffer with the mapper in the receiving process.
438 * To ease this cost we implement the following scheme of caching buffers to integers,
439 * or said-otherwise, naming them with integers. This is the scheme known as slots in
440 * the legacy BufferQueue system.
441 * 1. When sending Buffers to SurfaceFlinger we look up the Buffer in the cache.
442 * 2. If there is a cache-hit we remove the Buffer from the Transaction and instead
443 * send the cached integer.
444 * 3. If there is a cache miss, we cache the new buffer and send the integer
445 * along with the Buffer, SurfaceFlinger on it's side creates a new cache
446 * entry, and we use the integer for further communication.
447 * A few details about lifetime:
448 * 1. The cache evicts by LRU. The server side cache is keyed by BufferCache::getToken
449 * which is per process Unique. The server side cache is larger than the client side
450 * cache so that the server will never evict entries before the client.
451 * 2. When the client evicts an entry it notifies the server via an uncacheBuffer
452 * transaction.
453 * 3. The client only references the Buffers by ID, and uses buffer->addDeathCallback
454 * to auto-evict destroyed buffers.
455 */
Marissa Wall73411622019-01-25 10:45:41 -0800456class BufferCache : public Singleton<BufferCache> {
457public:
458 BufferCache() : token(new BBinder()) {}
459
460 sp<IBinder> getToken() {
461 return IInterface::asBinder(TransactionCompletedListener::getIInstance());
462 }
463
Marissa Wall78b72202019-03-15 14:58:34 -0700464 status_t getCacheId(const sp<GraphicBuffer>& buffer, uint64_t* cacheId) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800465 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800466
Marissa Wall78b72202019-03-15 14:58:34 -0700467 auto itr = mBuffers.find(buffer->getId());
Marissa Wall73411622019-01-25 10:45:41 -0800468 if (itr == mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700469 return BAD_VALUE;
Marissa Wall73411622019-01-25 10:45:41 -0800470 }
Marissa Wall78b72202019-03-15 14:58:34 -0700471 itr->second = getCounter();
472 *cacheId = buffer->getId();
473 return NO_ERROR;
Marissa Wall73411622019-01-25 10:45:41 -0800474 }
475
Marissa Wall78b72202019-03-15 14:58:34 -0700476 uint64_t cache(const sp<GraphicBuffer>& buffer) {
Yi Kongd2639aa2019-02-28 11:58:32 -0800477 std::lock_guard<std::mutex> lock(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800478
Marissa Wall78b72202019-03-15 14:58:34 -0700479 if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) {
480 evictLeastRecentlyUsedBuffer();
481 }
Marissa Wall73411622019-01-25 10:45:41 -0800482
Robert Carre06ad2b2020-04-10 15:09:33 -0700483 buffer->addDeathCallback(removeDeadBufferCallback, nullptr);
Marissa Wall78b72202019-03-15 14:58:34 -0700484
485 mBuffers[buffer->getId()] = getCounter();
486 return buffer->getId();
487 }
488
489 void uncache(uint64_t cacheId) {
490 std::lock_guard<std::mutex> lock(mMutex);
491 uncacheLocked(cacheId);
492 }
493
494 void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) {
495 mBuffers.erase(cacheId);
496 SurfaceComposerClient::doUncacheBufferTransaction(cacheId);
Marissa Wall73411622019-01-25 10:45:41 -0800497 }
498
499private:
Marissa Wall78b72202019-03-15 14:58:34 -0700500 void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) {
Marissa Wall73411622019-01-25 10:45:41 -0800501 auto itr = mBuffers.begin();
Marissa Wall78b72202019-03-15 14:58:34 -0700502 uint64_t minCounter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800503 auto minBuffer = itr;
504 itr++;
505
506 while (itr != mBuffers.end()) {
Marissa Wall78b72202019-03-15 14:58:34 -0700507 uint64_t counter = itr->second;
Marissa Wall73411622019-01-25 10:45:41 -0800508 if (counter < minCounter) {
509 minCounter = counter;
510 minBuffer = itr;
511 }
512 itr++;
513 }
Marissa Wall78b72202019-03-15 14:58:34 -0700514 uncacheLocked(minBuffer->first);
Marissa Wall73411622019-01-25 10:45:41 -0800515 }
516
517 uint64_t getCounter() REQUIRES(mMutex) {
518 static uint64_t counter = 0;
519 return counter++;
520 }
521
Marissa Wall73411622019-01-25 10:45:41 -0800522 std::mutex mMutex;
Marissa Wall78b72202019-03-15 14:58:34 -0700523 std::map<uint64_t /*Cache id*/, uint64_t /*counter*/> mBuffers GUARDED_BY(mMutex);
Marissa Wall73411622019-01-25 10:45:41 -0800524
525 // Used by ISurfaceComposer to identify which process is sending the cached buffer.
526 sp<IBinder> token;
527};
528
529ANDROID_SINGLETON_STATIC_INSTANCE(BufferCache);
530
Robert Carre06ad2b2020-04-10 15:09:33 -0700531void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId) {
Marissa Wall78b72202019-03-15 14:58:34 -0700532 // GraphicBuffer id's are used as the cache ids.
533 BufferCache::getInstance().uncache(graphicBufferId);
534}
535
Marissa Wall73411622019-01-25 10:45:41 -0800536// ---------------------------------------------------------------------------
537
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000538// Initialize transaction id counter used to generate transaction ids
539// Transactions will start counting at 1, 0 is used for invalid transactions
540std::atomic<uint32_t> SurfaceComposerClient::Transaction::idCounter = 1;
541
542SurfaceComposerClient::Transaction::Transaction() {
543 mId = generateId();
544}
545
Marissa Wall17b4e452018-12-26 16:32:34 -0800546SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000547 : mId(other.mId),
548 mForceSynchronous(other.mForceSynchronous),
Marissa Wall17b4e452018-12-26 16:32:34 -0800549 mTransactionNestCount(other.mTransactionNestCount),
550 mAnimation(other.mAnimation),
Ady Abraham8cbd3072021-03-15 16:39:06 -0700551 mEarlyWakeupStart(other.mEarlyWakeupStart),
552 mEarlyWakeupEnd(other.mEarlyWakeupEnd),
Vishnu Nair621102e2019-06-12 14:16:57 -0700553 mContainsBuffer(other.mContainsBuffer),
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700554 mDesiredPresentTime(other.mDesiredPresentTime),
Ady Abrahamf0c56492020-12-17 18:04:15 -0800555 mIsAutoTimestamp(other.mIsAutoTimestamp),
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000556 mFrameTimelineInfo(other.mFrameTimelineInfo),
Vishnu Nair277142c2021-01-05 18:35:29 -0800557 mApplyToken(other.mApplyToken) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700558 mDisplayStates = other.mDisplayStates;
559 mComposerStates = other.mComposerStates;
chaviw273171b2018-12-26 11:46:30 -0800560 mInputWindowCommands = other.mInputWindowCommands;
Vishnu Nair621102e2019-06-12 14:16:57 -0700561 mListenerCallbacks = other.mListenerCallbacks;
562}
563
564std::unique_ptr<SurfaceComposerClient::Transaction>
565SurfaceComposerClient::Transaction::createFromParcel(const Parcel* parcel) {
566 auto transaction = std::make_unique<Transaction>();
567 if (transaction->readFromParcel(parcel) == NO_ERROR) {
568 return transaction;
569 }
570 return nullptr;
571}
572
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000573int64_t SurfaceComposerClient::Transaction::generateId() {
574 return (((int64_t)getpid()) << 32) | idCounter++;
575}
576
Vishnu Nair621102e2019-06-12 14:16:57 -0700577status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel) {
578 const uint32_t forceSynchronous = parcel->readUint32();
579 const uint32_t transactionNestCount = parcel->readUint32();
580 const bool animation = parcel->readBool();
Ady Abraham8cbd3072021-03-15 16:39:06 -0700581 const bool earlyWakeupStart = parcel->readBool();
582 const bool earlyWakeupEnd = parcel->readBool();
Vishnu Nair621102e2019-06-12 14:16:57 -0700583 const bool containsBuffer = parcel->readBool();
584 const int64_t desiredPresentTime = parcel->readInt64();
Ady Abrahamf0c56492020-12-17 18:04:15 -0800585 const bool isAutoTimestamp = parcel->readBool();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000586 FrameTimelineInfo frameTimelineInfo;
587 SAFE_PARCEL(frameTimelineInfo.read, *parcel);
588
Vishnu Nair277142c2021-01-05 18:35:29 -0800589 sp<IBinder> applyToken;
590 parcel->readNullableStrongBinder(&applyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700591 size_t count = static_cast<size_t>(parcel->readUint32());
592 if (count > parcel->dataSize()) {
593 return BAD_VALUE;
594 }
595 SortedVector<DisplayState> displayStates;
596 displayStates.setCapacity(count);
597 for (size_t i = 0; i < count; i++) {
598 DisplayState displayState;
599 if (displayState.read(*parcel) == BAD_VALUE) {
600 return BAD_VALUE;
601 }
602 displayStates.add(displayState);
603 }
604
605 count = static_cast<size_t>(parcel->readUint32());
606 if (count > parcel->dataSize()) {
607 return BAD_VALUE;
608 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700609 std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> listenerCallbacks;
610 listenerCallbacks.reserve(count);
611 for (size_t i = 0; i < count; i++) {
612 sp<ITransactionCompletedListener> listener =
613 interface_cast<ITransactionCompletedListener>(parcel->readStrongBinder());
614 size_t numCallbackIds = parcel->readUint32();
615 if (numCallbackIds > parcel->dataSize()) {
616 return BAD_VALUE;
617 }
618 for (size_t j = 0; j < numCallbackIds; j++) {
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700619 CallbackId id;
620 parcel->readParcelable(&id);
621 listenerCallbacks[listener].callbackIds.insert(id);
Valerie Hau9dab9732019-08-20 09:29:25 -0700622 }
623 size_t numSurfaces = parcel->readUint32();
624 if (numSurfaces > parcel->dataSize()) {
625 return BAD_VALUE;
626 }
627 for (size_t j = 0; j < numSurfaces; j++) {
628 sp<SurfaceControl> surface;
Pablo Gamito421dfd52020-09-22 18:11:45 +0000629 SAFE_PARCEL(SurfaceControl::readFromParcel, *parcel, &surface);
Valerie Hau9dab9732019-08-20 09:29:25 -0700630 listenerCallbacks[listener].surfaceControls.insert(surface);
631 }
632 }
633
634 count = static_cast<size_t>(parcel->readUint32());
635 if (count > parcel->dataSize()) {
636 return BAD_VALUE;
637 }
Vishnu Nairf03652d2019-07-16 17:56:56 -0700638 std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> composerStates;
Vishnu Nair621102e2019-06-12 14:16:57 -0700639 composerStates.reserve(count);
640 for (size_t i = 0; i < count; i++) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000641 sp<IBinder> surfaceControlHandle;
642 SAFE_PARCEL(parcel->readStrongBinder, &surfaceControlHandle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700643
644 ComposerState composerState;
645 if (composerState.read(*parcel) == BAD_VALUE) {
646 return BAD_VALUE;
647 }
Pablo Gamitodbc31672020-09-01 18:28:58 +0000648
Vishnu Nairf03652d2019-07-16 17:56:56 -0700649 composerStates[surfaceControlHandle] = composerState;
Vishnu Nair621102e2019-06-12 14:16:57 -0700650 }
651
652 InputWindowCommands inputWindowCommands;
653 inputWindowCommands.read(*parcel);
654
655 // Parsing was successful. Update the object.
656 mForceSynchronous = forceSynchronous;
657 mTransactionNestCount = transactionNestCount;
658 mAnimation = animation;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700659 mEarlyWakeupStart = earlyWakeupStart;
660 mEarlyWakeupEnd = earlyWakeupEnd;
Vishnu Nair621102e2019-06-12 14:16:57 -0700661 mContainsBuffer = containsBuffer;
662 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800663 mIsAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000664 mFrameTimelineInfo = frameTimelineInfo;
Vishnu Nair621102e2019-06-12 14:16:57 -0700665 mDisplayStates = displayStates;
Valerie Hau9dab9732019-08-20 09:29:25 -0700666 mListenerCallbacks = listenerCallbacks;
Vishnu Nair621102e2019-06-12 14:16:57 -0700667 mComposerStates = composerStates;
668 mInputWindowCommands = inputWindowCommands;
Vishnu Nair277142c2021-01-05 18:35:29 -0800669 mApplyToken = applyToken;
Vishnu Nair621102e2019-06-12 14:16:57 -0700670 return NO_ERROR;
671}
672
673status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const {
Robert Carr158531d2020-04-08 10:53:30 -0700674 // If we write the Transaction to a parcel, we want to ensure the Buffers are cached
675 // before crossing the IPC boundary. Otherwise the receiving party will cache the buffers
676 // but is unlikely to use them again as they are owned by the other process.
677 // You may be asking yourself, is this const cast safe? Const cast is safe up
678 // until the point where you try and write to an object that was originally const at which
679 // point we enter undefined behavior. In this case we are safe though, because there are
680 // two possibilities:
681 // 1. The SurfaceComposerClient::Transaction was originally non-const. Safe.
682 // 2. It was originall const! In this case not only was it useless, but it by definition
683 // contains no composer states and so cacheBuffers will not perform any writes.
684
685 const_cast<SurfaceComposerClient::Transaction*>(this)->cacheBuffers();
686
Vishnu Nair621102e2019-06-12 14:16:57 -0700687 parcel->writeUint32(mForceSynchronous);
688 parcel->writeUint32(mTransactionNestCount);
689 parcel->writeBool(mAnimation);
Ady Abraham8cbd3072021-03-15 16:39:06 -0700690 parcel->writeBool(mEarlyWakeupStart);
691 parcel->writeBool(mEarlyWakeupEnd);
Vishnu Nair621102e2019-06-12 14:16:57 -0700692 parcel->writeBool(mContainsBuffer);
693 parcel->writeInt64(mDesiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -0800694 parcel->writeBool(mIsAutoTimestamp);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000695 SAFE_PARCEL(mFrameTimelineInfo.write, *parcel);
Vishnu Nair277142c2021-01-05 18:35:29 -0800696 parcel->writeStrongBinder(mApplyToken);
Vishnu Nair621102e2019-06-12 14:16:57 -0700697 parcel->writeUint32(static_cast<uint32_t>(mDisplayStates.size()));
698 for (auto const& displayState : mDisplayStates) {
699 displayState.write(*parcel);
700 }
701
Valerie Hau9dab9732019-08-20 09:29:25 -0700702 parcel->writeUint32(static_cast<uint32_t>(mListenerCallbacks.size()));
703 for (auto const& [listener, callbackInfo] : mListenerCallbacks) {
704 parcel->writeStrongBinder(ITransactionCompletedListener::asBinder(listener));
705 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.callbackIds.size()));
706 for (auto callbackId : callbackInfo.callbackIds) {
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700707 parcel->writeParcelable(callbackId);
Valerie Hau9dab9732019-08-20 09:29:25 -0700708 }
709 parcel->writeUint32(static_cast<uint32_t>(callbackInfo.surfaceControls.size()));
710 for (auto surfaceControl : callbackInfo.surfaceControls) {
Pablo Gamito421dfd52020-09-22 18:11:45 +0000711 SAFE_PARCEL(surfaceControl->writeToParcel, *parcel);
Valerie Hau9dab9732019-08-20 09:29:25 -0700712 }
713 }
714
Vishnu Nair621102e2019-06-12 14:16:57 -0700715 parcel->writeUint32(static_cast<uint32_t>(mComposerStates.size()));
Pablo Gamitodbc31672020-09-01 18:28:58 +0000716 for (auto const& [handle, composerState] : mComposerStates) {
717 SAFE_PARCEL(parcel->writeStrongBinder, handle);
Vishnu Nair621102e2019-06-12 14:16:57 -0700718 composerState.write(*parcel);
719 }
720
721 mInputWindowCommands.write(*parcel);
722 return NO_ERROR;
Mathias Agopian698c0872011-06-28 19:09:31 -0700723}
724
chaviw69058fb2021-09-27 09:37:30 -0500725void SurfaceComposerClient::Transaction::releaseBufferIfOverwriting(const layer_state_t& state) {
726 if (!(state.what & layer_state_t::eBufferChanged)) {
727 return;
728 }
729
730 auto listener = state.bufferData.releaseBufferListener;
731 sp<Fence> fence =
732 state.bufferData.acquireFence ? state.bufferData.acquireFence : Fence::NO_FENCE;
733 if (state.bufferData.releaseBufferEndpoint ==
734 IInterface::asBinder(TransactionCompletedListener::getIInstance())) {
735 // if the callback is in process, run on a different thread to avoid any lock contigency
736 // issues in the client.
737 SurfaceComposerClient::getDefault()
738 ->mReleaseCallbackThread.addReleaseCallback(state.bufferData.releaseCallbackId,
739 fence);
740 } else {
741 listener->onReleaseBuffer(state.bufferData.releaseCallbackId, fence, UINT_MAX);
742 }
743}
744
Robert Carr2c5f6d22017-09-26 12:30:35 -0700745SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000746 for (auto const& [handle, composerState] : other.mComposerStates) {
747 if (mComposerStates.count(handle) == 0) {
748 mComposerStates[handle] = composerState;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700749 } else {
chaviw69058fb2021-09-27 09:37:30 -0500750 if (composerState.state.what & layer_state_t::eBufferChanged) {
751 releaseBufferIfOverwriting(mComposerStates[handle].state);
752 }
Pablo Gamitodbc31672020-09-01 18:28:58 +0000753 mComposerStates[handle].state.merge(composerState.state);
Robert Carr2c5f6d22017-09-26 12:30:35 -0700754 }
755 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700756
757 for (auto const& state : other.mDisplayStates) {
758 ssize_t index = mDisplayStates.indexOf(state);
759 if (index < 0) {
760 mDisplayStates.add(state);
761 } else {
762 mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
763 }
764 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700765
Marissa Wallc837b5e2018-10-12 10:04:44 -0700766 for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
767 auto& [callbackIds, surfaceControls] = callbackInfo;
768 mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
769 callbackIds.begin()),
770 std::make_move_iterator(callbackIds.end()));
Valerie Hau9dab9732019-08-20 09:29:25 -0700771
Valerie Hau236eba32020-01-03 16:53:39 -0800772 mListenerCallbacks[listener].surfaceControls.insert(surfaceControls.begin(),
773 surfaceControls.end());
774
775 auto& currentProcessCallbackInfo =
776 mListenerCallbacks[TransactionCompletedListener::getIInstance()];
777 currentProcessCallbackInfo.surfaceControls
778 .insert(std::make_move_iterator(surfaceControls.begin()),
779 std::make_move_iterator(surfaceControls.end()));
780
781 // register all surface controls for all callbackIds for this listener that is merging
782 for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
783 TransactionCompletedListener::getInstance()
784 ->addSurfaceControlToCallbacks(surfaceControl,
785 currentProcessCallbackInfo.callbackIds);
786 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700787 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700788
chaviw273171b2018-12-26 11:46:30 -0800789 mInputWindowCommands.merge(other.mInputWindowCommands);
790
Robert Carrbbc85622020-04-08 10:45:12 -0700791 mContainsBuffer |= other.mContainsBuffer;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700792 mEarlyWakeupStart = mEarlyWakeupStart || other.mEarlyWakeupStart;
793 mEarlyWakeupEnd = mEarlyWakeupEnd || other.mEarlyWakeupEnd;
Vishnu Nair277142c2021-01-05 18:35:29 -0800794 mApplyToken = other.mApplyToken;
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700795
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000796 mFrameTimelineInfo.merge(other.mFrameTimelineInfo);
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700797
Vishnu Nairfef244e2019-06-17 18:07:51 -0700798 other.clear();
Robert Carr2c5f6d22017-09-26 12:30:35 -0700799 return *this;
800}
801
Vishnu Nairfef244e2019-06-17 18:07:51 -0700802void SurfaceComposerClient::Transaction::clear() {
803 mComposerStates.clear();
804 mDisplayStates.clear();
805 mListenerCallbacks.clear();
806 mInputWindowCommands.clear();
807 mContainsBuffer = false;
808 mForceSynchronous = 0;
809 mTransactionNestCount = 0;
810 mAnimation = false;
Ady Abraham8cbd3072021-03-15 16:39:06 -0700811 mEarlyWakeupStart = false;
812 mEarlyWakeupEnd = false;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800813 mDesiredPresentTime = 0;
814 mIsAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000815 mFrameTimelineInfo.clear();
Vishnu Nair277142c2021-01-05 18:35:29 -0800816 mApplyToken = nullptr;
Vishnu Nairfef244e2019-06-17 18:07:51 -0700817}
818
Marissa Wall78b72202019-03-15 14:58:34 -0700819void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) {
820 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
821
Marissa Wall947d34e2019-03-29 14:03:53 -0700822 client_cache_t uncacheBuffer;
Marissa Wall78b72202019-03-15 14:58:34 -0700823 uncacheBuffer.token = BufferCache::getInstance().getToken();
Marissa Wall947d34e2019-03-29 14:03:53 -0700824 uncacheBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700825
Valerie Haufa889122019-04-15 13:56:05 -0700826 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000827 sf->setTransactionState(FrameTimelineInfo{}, {}, {}, 0, applyToken, {}, systemTime(), true,
828 uncacheBuffer, false, {}, 0 /* Undefined transactionId */);
Marissa Wall78b72202019-03-15 14:58:34 -0700829}
830
831void SurfaceComposerClient::Transaction::cacheBuffers() {
832 if (!mContainsBuffer) {
833 return;
834 }
835
836 size_t count = 0;
Vishnu Nairf03652d2019-07-16 17:56:56 -0700837 for (auto& [handle, cs] : mComposerStates) {
Pablo Gamitodbc31672020-09-01 18:28:58 +0000838 layer_state_t* s = &(mComposerStates[handle].state);
Marissa Wall78b72202019-03-15 14:58:34 -0700839 if (!(s->what & layer_state_t::eBufferChanged)) {
840 continue;
chaviwba4320c2021-09-15 15:20:53 -0500841 } else if (s->bufferData.flags.test(BufferData::BufferDataChange::cachedBufferChanged)) {
Robert Carr28037922020-04-08 10:57:07 -0700842 // If eBufferChanged and eCachedBufferChanged are both trued then that means
843 // we already cached the buffer in a previous call to cacheBuffers, perhaps
844 // from writeToParcel on a Transaction that was merged in to this one.
845 continue;
Marissa Wall78b72202019-03-15 14:58:34 -0700846 }
847
Marissa Wall00597242019-03-27 10:35:19 -0700848 // Don't try to cache a null buffer. Sending null buffers is cheap so we shouldn't waste
849 // time trying to cache them.
chaviwba4320c2021-09-15 15:20:53 -0500850 if (!s->bufferData.buffer) {
Marissa Wall00597242019-03-27 10:35:19 -0700851 continue;
852 }
853
Marissa Wall78b72202019-03-15 14:58:34 -0700854 uint64_t cacheId = 0;
chaviwba4320c2021-09-15 15:20:53 -0500855 status_t ret = BufferCache::getInstance().getCacheId(s->bufferData.buffer, &cacheId);
Marissa Wall78b72202019-03-15 14:58:34 -0700856 if (ret == NO_ERROR) {
Robert Carre06ad2b2020-04-10 15:09:33 -0700857 // Cache-hit. Strip the buffer and send only the id.
chaviwba4320c2021-09-15 15:20:53 -0500858 s->bufferData.buffer = nullptr;
Marissa Wall78b72202019-03-15 14:58:34 -0700859 } else {
Robert Carre06ad2b2020-04-10 15:09:33 -0700860 // Cache-miss. Include the buffer and send the new cacheId.
chaviwba4320c2021-09-15 15:20:53 -0500861 cacheId = BufferCache::getInstance().cache(s->bufferData.buffer);
Marissa Wall78b72202019-03-15 14:58:34 -0700862 }
chaviwba4320c2021-09-15 15:20:53 -0500863 s->bufferData.flags |= BufferData::BufferDataChange::cachedBufferChanged;
864 s->bufferData.cachedBuffer.token = BufferCache::getInstance().getToken();
865 s->bufferData.cachedBuffer.id = cacheId;
Marissa Wall78b72202019-03-15 14:58:34 -0700866
867 // If we have more buffers than the size of the cache, we should stop caching so we don't
868 // evict other buffers in this transaction
869 count++;
870 if (count >= BUFFER_CACHE_MAX_SIZE) {
871 break;
872 }
873 }
Robert Carr6fb1a7e2018-12-11 12:07:25 -0800874}
875
Robert Carr4cdc58f2017-08-23 14:22:20 -0700876status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {
877 if (mStatus != NO_ERROR) {
878 return mStatus;
879 }
880
881 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
882
Valerie Hau9dab9732019-08-20 09:29:25 -0700883 bool hasListenerCallbacks = !mListenerCallbacks.empty();
Marissa Wall3dad52d2019-03-22 14:03:19 -0700884 std::vector<ListenerCallbacks> listenerCallbacks;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700885 // For every listener with registered callbacks
886 for (const auto& [listener, callbackInfo] : mListenerCallbacks) {
887 auto& [callbackIds, surfaceControls] = callbackInfo;
888 if (callbackIds.empty()) {
889 continue;
890 }
891
Valerie Hau9dab9732019-08-20 09:29:25 -0700892 if (surfaceControls.empty()) {
893 listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));
894 } else {
895 // If the listener has any SurfaceControls set on this Transaction update the surface
896 // state
897 for (const auto& surfaceControl : surfaceControls) {
898 layer_state_t* s = getLayerState(surfaceControl);
899 if (!s) {
900 ALOGE("failed to get layer state");
901 continue;
902 }
903 std::vector<CallbackId> callbacks(callbackIds.begin(), callbackIds.end());
904 s->what |= layer_state_t::eHasListenerCallbacksChanged;
905 s->listeners.emplace_back(IInterface::asBinder(listener), callbacks);
Marissa Wallc837b5e2018-10-12 10:04:44 -0700906 }
Marissa Wallc837b5e2018-10-12 10:04:44 -0700907 }
908 }
Valerie Hau9dab9732019-08-20 09:29:25 -0700909
Marissa Wall78b72202019-03-15 14:58:34 -0700910 cacheBuffers();
911
Robert Carr4cdc58f2017-08-23 14:22:20 -0700912 Vector<ComposerState> composerStates;
913 Vector<DisplayState> displayStates;
914 uint32_t flags = 0;
915
916 mForceSynchronous |= synchronous;
917
chaviw8e3fe5d2018-02-22 10:55:42 -0800918 for (auto const& kv : mComposerStates){
919 composerStates.add(kv.second);
920 }
921
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700922 displayStates = std::move(mDisplayStates);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700923
924 if (mForceSynchronous) {
925 flags |= ISurfaceComposer::eSynchronous;
926 }
927 if (mAnimation) {
928 flags |= ISurfaceComposer::eAnimation;
929 }
930
Ady Abraham8cbd3072021-03-15 16:39:06 -0700931 // If both mEarlyWakeupStart and mEarlyWakeupEnd are set
Ady Abrahambf1349c2020-06-12 14:26:18 -0700932 // it is equivalent for none
Ady Abraham8cbd3072021-03-15 16:39:06 -0700933 if (mEarlyWakeupStart && !mEarlyWakeupEnd) {
934 flags |= ISurfaceComposer::eEarlyWakeupStart;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700935 }
Ady Abraham8cbd3072021-03-15 16:39:06 -0700936 if (mEarlyWakeupEnd && !mEarlyWakeupStart) {
937 flags |= ISurfaceComposer::eEarlyWakeupEnd;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700938 }
939
Vishnu Nair277142c2021-01-05 18:35:29 -0800940 sp<IBinder> applyToken = mApplyToken
941 ? mApplyToken
942 : IInterface::asBinder(TransactionCompletedListener::getIInstance());
943
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000944 sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800945 mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
Marissa Wall3dad52d2019-03-22 14:03:19 -0700946 {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,
Adithya Srinivasand3efcb32020-10-20 18:08:22 -0700947 hasListenerCallbacks, listenerCallbacks, mId);
948 mId = generateId();
949
950 // Clear the current states and flags
951 clear();
952
Robert Carr4cdc58f2017-08-23 14:22:20 -0700953 mStatus = NO_ERROR;
954 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700955}
956
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800957// ---------------------------------------------------------------------------
958
Robert Carr4cdc58f2017-08-23 14:22:20 -0700959sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
Jamie Gennisdd3cb842012-10-19 18:19:11 -0700960 return ComposerService::getComposerService()->createDisplay(displayName,
961 secure);
Mathias Agopiane57f2922012-08-09 16:29:12 -0700962}
963
Robert Carr4cdc58f2017-08-23 14:22:20 -0700964void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
Jesse Hall6c913be2013-08-08 12:15:49 -0700965 return ComposerService::getComposerService()->destroyDisplay(display);
966}
967
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800968std::vector<PhysicalDisplayId> SurfaceComposerClient::getPhysicalDisplayIds() {
969 return ComposerService::getComposerService()->getPhysicalDisplayIds();
970}
971
Vishnu Nair8c8db542021-09-17 19:51:45 -0700972status_t SurfaceComposerClient::getPrimaryPhysicalDisplayId(PhysicalDisplayId* id) {
973 return ComposerService::getComposerService()->getPrimaryPhysicalDisplayId(id);
974}
975
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800976std::optional<PhysicalDisplayId> SurfaceComposerClient::getInternalDisplayId() {
977 return ComposerService::getComposerService()->getInternalDisplayId();
978}
979
980sp<IBinder> SurfaceComposerClient::getPhysicalDisplayToken(PhysicalDisplayId displayId) {
981 return ComposerService::getComposerService()->getPhysicalDisplayToken(displayId);
982}
983
984sp<IBinder> SurfaceComposerClient::getInternalDisplayToken() {
985 return ComposerService::getComposerService()->getInternalDisplayToken();
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700986}
987
Robert Carr4cdc58f2017-08-23 14:22:20 -0700988void SurfaceComposerClient::Transaction::setAnimationTransaction() {
Jamie Gennis2d5e2302012-10-15 18:24:43 -0700989 mAnimation = true;
990}
991
Ady Abraham8cbd3072021-03-15 16:39:06 -0700992void SurfaceComposerClient::Transaction::setEarlyWakeupStart() {
993 mEarlyWakeupStart = true;
Dan Stoza84d619e2018-03-28 17:07:36 -0700994}
995
Ady Abraham8cbd3072021-03-15 16:39:06 -0700996void SurfaceComposerClient::Transaction::setEarlyWakeupEnd() {
997 mEarlyWakeupEnd = true;
Ady Abrahambf1349c2020-06-12 14:26:18 -0700998}
999
Pablo Gamitodbc31672020-09-01 18:28:58 +00001000layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
Robert Carr5b3b9142021-02-22 12:27:32 -08001001 auto handle = sc->getLayerStateHandle();
Pablo Gamitodbc31672020-09-01 18:28:58 +00001002
Vishnu Nairf03652d2019-07-16 17:56:56 -07001003 if (mComposerStates.count(handle) == 0) {
Mathias Agopian698c0872011-06-28 19:09:31 -07001004 // we don't have it, add an initialized layer_state to our list
chaviw8e3fe5d2018-02-22 10:55:42 -08001005 ComposerState s;
Pablo Gamitodbc31672020-09-01 18:28:58 +00001006
Vishnu Nairf03652d2019-07-16 17:56:56 -07001007 s.state.surface = handle;
Pablo Gamitodbc31672020-09-01 18:28:58 +00001008 s.state.layerId = sc->getLayerId();
1009
Vishnu Nairf03652d2019-07-16 17:56:56 -07001010 mComposerStates[handle] = s;
Mathias Agopian698c0872011-06-28 19:09:31 -07001011 }
1012
Vishnu Nairf03652d2019-07-16 17:56:56 -07001013 return &(mComposerStates[handle].state);
Mathias Agopian698c0872011-06-28 19:09:31 -07001014}
1015
Marissa Wallc837b5e2018-10-12 10:04:44 -07001016void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
1017 const sp<SurfaceControl>& sc) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08001018 auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
1019 callbackInfo.surfaceControls.insert(sc);
1020
1021 TransactionCompletedListener::getInstance()
1022 ->addSurfaceControlToCallbacks(sc, callbackInfo.callbackIds);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001023}
1024
Robert Carr4cdc58f2017-08-23 14:22:20 -07001025SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
1026 const sp<SurfaceControl>& sc, float x, float y) {
chaviw763ef572018-02-22 16:04:57 -08001027 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001028 if (!s) {
1029 mStatus = BAD_INDEX;
1030 return *this;
1031 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001032 s->what |= layer_state_t::ePositionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001033 s->x = x;
1034 s->y = y;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001035
1036 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001037 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001038}
1039
Robert Carr4cdc58f2017-08-23 14:22:20 -07001040SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
1041 const sp<SurfaceControl>& sc) {
1042 return setFlags(sc, 0, layer_state_t::eLayerHidden);
1043}
1044
1045SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
1046 const sp<SurfaceControl>& sc) {
1047 return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
1048}
1049
1050SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
1051 const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
chaviw763ef572018-02-22 16:04:57 -08001052 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001053 if (!s) {
1054 mStatus = BAD_INDEX;
1055 return *this;
1056 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001057 s->what |= layer_state_t::eSizeChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001058 s->w = w;
1059 s->h = h;
Jamie Gennis28378392011-10-12 17:39:00 -07001060
Marissa Wallc837b5e2018-10-12 10:04:44 -07001061 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001062 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001063}
1064
Robert Carr4cdc58f2017-08-23 14:22:20 -07001065SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
1066 const sp<SurfaceControl>& sc, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -08001067 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001068 if (!s) {
1069 mStatus = BAD_INDEX;
1070 return *this;
1071 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001072 s->what |= layer_state_t::eLayerChanged;
chaviw32377582019-05-13 11:15:19 -07001073 s->what &= ~layer_state_t::eRelativeLayerChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001074 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001075
1076 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001077 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001078}
1079
Pablo Gamito11dcc222020-09-12 15:49:39 +00001080SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(
1081 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& relativeTo, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -08001082 layer_state_t* s = getLayerState(sc);
Robert Carrdb66e622017-04-10 16:55:57 -07001083 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001084 mStatus = BAD_INDEX;
Robert Carr30c8d902019-04-04 13:12:49 -07001085 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -07001086 }
1087 s->what |= layer_state_t::eRelativeLayerChanged;
chaviw32377582019-05-13 11:15:19 -07001088 s->what &= ~layer_state_t::eLayerChanged;
Pablo Gamito11dcc222020-09-12 15:49:39 +00001089 s->relativeLayerSurfaceControl = relativeTo;
Robert Carrdb66e622017-04-10 16:55:57 -07001090 s->z = z;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001091
1092 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001093 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -07001094}
1095
Robert Carr4cdc58f2017-08-23 14:22:20 -07001096SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
1097 const sp<SurfaceControl>& sc, uint32_t flags,
Mathias Agopian698c0872011-06-28 19:09:31 -07001098 uint32_t mask) {
chaviw763ef572018-02-22 16:04:57 -08001099 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001100 if (!s) {
1101 mStatus = BAD_INDEX;
1102 return *this;
1103 }
chaviwc5676c62020-09-18 15:01:04 -07001104 if ((mask & layer_state_t::eLayerOpaque) || (mask & layer_state_t::eLayerHidden) ||
Vishnu Nairf6eddb62021-01-27 22:02:11 -08001105 (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) ||
1106 (mask & layer_state_t::eEnableBackpressure)) {
Dan Stoza23116082015-06-18 14:58:39 -07001107 s->what |= layer_state_t::eFlagsChanged;
Andy McFadden4125a4f2014-01-29 17:17:11 -08001108 }
Mathias Agopian698c0872011-06-28 19:09:31 -07001109 s->flags &= ~mask;
1110 s->flags |= (flags & mask);
1111 s->mask |= mask;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001112
1113 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001114 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001115}
1116
Robert Carr4cdc58f2017-08-23 14:22:20 -07001117SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
1118 const sp<SurfaceControl>& sc,
Mathias Agopian698c0872011-06-28 19:09:31 -07001119 const Region& transparentRegion) {
chaviw763ef572018-02-22 16:04:57 -08001120 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001121 if (!s) {
1122 mStatus = BAD_INDEX;
1123 return *this;
1124 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001125 s->what |= layer_state_t::eTransparentRegionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001126 s->transparentRegion = transparentRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001127
1128 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001129 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001130}
1131
Robert Carr4cdc58f2017-08-23 14:22:20 -07001132SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
1133 const sp<SurfaceControl>& sc, float alpha) {
chaviw763ef572018-02-22 16:04:57 -08001134 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001135 if (!s) {
1136 mStatus = BAD_INDEX;
1137 return *this;
1138 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001139 s->what |= layer_state_t::eAlphaChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001140 s->alpha = alpha;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001141
1142 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001143 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001144}
1145
Robert Carr4cdc58f2017-08-23 14:22:20 -07001146SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
Dominik Laskowski29fa1462021-04-27 15:51:50 -07001147 const sp<SurfaceControl>& sc, ui::LayerStack layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001148 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001149 if (!s) {
1150 mStatus = BAD_INDEX;
1151 return *this;
1152 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001153 s->what |= layer_state_t::eLayerStackChanged;
Mathias Agopian87855782012-07-24 21:41:09 -07001154 s->layerStack = layerStack;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001155
1156 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001157 return *this;
Mathias Agopian87855782012-07-24 21:41:09 -07001158}
1159
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001160SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMetadata(
Garfield Tan01a56132019-08-05 16:44:21 -07001161 const sp<SurfaceControl>& sc, uint32_t key, const Parcel& p) {
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001162 layer_state_t* s = getLayerState(sc);
1163 if (!s) {
1164 mStatus = BAD_INDEX;
1165 return *this;
1166 }
1167 s->what |= layer_state_t::eMetadataChanged;
Garfield Tan01a56132019-08-05 16:44:21 -07001168
1169 s->metadata.mMap[key] = {p.data(), p.data() + p.dataSize()};
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001170
1171 registerSurfaceControlForCallback(sc);
1172 return *this;
1173}
1174
Robert Carr4cdc58f2017-08-23 14:22:20 -07001175SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
1176 const sp<SurfaceControl>& sc, float dsdx, float dtdx,
Robert Carrcb6e1e32017-02-21 19:48:26 -08001177 float dtdy, float dsdy) {
chaviw763ef572018-02-22 16:04:57 -08001178 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001179 if (!s) {
1180 mStatus = BAD_INDEX;
1181 return *this;
1182 }
Mathias Agopian3165cc22012-08-08 19:42:09 -07001183 s->what |= layer_state_t::eMatrixChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -07001184 layer_state_t::matrix22_t matrix;
1185 matrix.dsdx = dsdx;
1186 matrix.dtdx = dtdx;
1187 matrix.dsdy = dsdy;
1188 matrix.dtdy = dtdy;
1189 s->matrix = matrix;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001190
1191 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001192 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -07001193}
1194
chaviw25714502021-02-11 10:01:08 -08001195SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
Robert Carr4cdc58f2017-08-23 14:22:20 -07001196 const sp<SurfaceControl>& sc, const Rect& crop) {
chaviw763ef572018-02-22 16:04:57 -08001197 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001198 if (!s) {
1199 mStatus = BAD_INDEX;
1200 return *this;
1201 }
chaviw25714502021-02-11 10:01:08 -08001202 s->what |= layer_state_t::eCropChanged;
1203 s->crop = crop;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001204
1205 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001206 return *this;
Jamie Gennisf15a83f2012-05-10 20:43:55 -07001207}
1208
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001209SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCornerRadius(
1210 const sp<SurfaceControl>& sc, float cornerRadius) {
1211 layer_state_t* s = getLayerState(sc);
1212 if (!s) {
1213 mStatus = BAD_INDEX;
1214 return *this;
1215 }
1216 s->what |= layer_state_t::eCornerRadiusChanged;
1217 s->cornerRadius = cornerRadius;
1218 return *this;
1219}
1220
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001221SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundBlurRadius(
1222 const sp<SurfaceControl>& sc, int backgroundBlurRadius) {
1223 layer_state_t* s = getLayerState(sc);
1224 if (!s) {
1225 mStatus = BAD_INDEX;
1226 return *this;
1227 }
1228 s->what |= layer_state_t::eBackgroundBlurRadiusChanged;
1229 s->backgroundBlurRadius = backgroundBlurRadius;
1230 return *this;
1231}
1232
Lucas Dupinc3800b82020-10-02 16:24:48 -07001233SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBlurRegions(
1234 const sp<SurfaceControl>& sc, const std::vector<BlurRegion>& blurRegions) {
1235 layer_state_t* s = getLayerState(sc);
1236 if (!s) {
1237 mStatus = BAD_INDEX;
1238 return *this;
1239 }
1240 s->what |= layer_state_t::eBlurRegionsChanged;
1241 s->blurRegions = blurRegions;
1242 return *this;
1243}
1244
Robert Carr4cdc58f2017-08-23 14:22:20 -07001245SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
Pablo Gamito11dcc222020-09-12 15:49:39 +00001246 const sp<SurfaceControl>& sc, const sp<SurfaceControl>& newParent) {
chaviw763ef572018-02-22 16:04:57 -08001247 layer_state_t* s = getLayerState(sc);
chaviw06178942017-07-27 10:25:59 -07001248 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001249 mStatus = BAD_INDEX;
1250 return *this;
chaviw06178942017-07-27 10:25:59 -07001251 }
Robert Carr5b3b9142021-02-22 12:27:32 -08001252 if (SurfaceControl::isSameSurface(sc, newParent)) {
1253 return *this;
1254 }
chaviwf1961f72017-09-18 16:41:07 -07001255 s->what |= layer_state_t::eReparent;
Robert Carr5b3b9142021-02-22 12:27:32 -08001256 s->parentSurfaceControlForChild = newParent ? newParent->getParentingLayer() : nullptr;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001257
1258 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001259 return *this;
chaviw06178942017-07-27 10:25:59 -07001260}
1261
Robert Carr4cdc58f2017-08-23 14:22:20 -07001262SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
1263 const sp<SurfaceControl>& sc,
1264 const half3& color) {
chaviw763ef572018-02-22 16:04:57 -08001265 layer_state_t* s = getLayerState(sc);
Robert Carr9524cb32017-02-13 11:32:32 -08001266 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001267 mStatus = BAD_INDEX;
1268 return *this;
1269 }
1270 s->what |= layer_state_t::eColorChanged;
1271 s->color = color;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001272
1273 registerSurfaceControlForCallback(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -07001274 return *this;
1275}
1276
Valerie Haudd0b7572019-01-29 14:59:27 -08001277SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBackgroundColor(
1278 const sp<SurfaceControl>& sc, const half3& color, float alpha, ui::Dataspace dataspace) {
Valerie Haued54efa2019-01-11 20:03:14 -08001279 layer_state_t* s = getLayerState(sc);
1280 if (!s) {
1281 mStatus = BAD_INDEX;
1282 return *this;
1283 }
1284
Valerie Haudd0b7572019-01-29 14:59:27 -08001285 s->what |= layer_state_t::eBackgroundColorChanged;
1286 s->color = color;
1287 s->bgColorAlpha = alpha;
1288 s->bgColorDataspace = dataspace;
Valerie Haued54efa2019-01-11 20:03:14 -08001289
1290 registerSurfaceControlForCallback(sc);
1291 return *this;
1292}
1293
Marissa Wall61c58622018-07-18 10:12:20 -07001294SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransform(
1295 const sp<SurfaceControl>& sc, uint32_t transform) {
1296 layer_state_t* s = getLayerState(sc);
1297 if (!s) {
1298 mStatus = BAD_INDEX;
1299 return *this;
1300 }
1301 s->what |= layer_state_t::eTransformChanged;
1302 s->transform = transform;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001303
1304 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001305 return *this;
1306}
1307
1308SurfaceComposerClient::Transaction&
1309SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<SurfaceControl>& sc,
1310 bool transformToDisplayInverse) {
1311 layer_state_t* s = getLayerState(sc);
1312 if (!s) {
1313 mStatus = BAD_INDEX;
1314 return *this;
1315 }
1316 s->what |= layer_state_t::eTransformToDisplayInverseChanged;
1317 s->transformToDisplayInverse = transformToDisplayInverse;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001318
1319 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001320 return *this;
1321}
1322
chaviw0acd33a2021-11-02 11:55:37 -05001323std::optional<BufferData> SurfaceComposerClient::Transaction::getAndClearBuffer(
1324 const sp<SurfaceControl>& sc) {
1325 layer_state_t* s = getLayerState(sc);
1326 if (!s) {
1327 return std::nullopt;
1328 }
1329 if (!(s->what & layer_state_t::eBufferChanged)) {
1330 return std::nullopt;
1331 }
1332
1333 BufferData bufferData = s->bufferData;
1334
1335 TransactionCompletedListener::getInstance()->removeReleaseBufferCallback(
1336 bufferData.releaseCallbackId);
1337 BufferData emptyBufferData;
1338 s->what &= ~layer_state_t::eBufferChanged;
1339 s->bufferData = emptyBufferData;
1340
1341 mContainsBuffer = false;
1342 return bufferData;
1343}
1344
Marissa Wall61c58622018-07-18 10:12:20 -07001345SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
chaviwba4320c2021-09-15 15:20:53 -05001346 const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
1347 const std::optional<sp<Fence>>& fence, const std::optional<uint64_t>& frameNumber,
1348 const ReleaseCallbackId& id, ReleaseBufferCallback callback) {
Marissa Wall61c58622018-07-18 10:12:20 -07001349 layer_state_t* s = getLayerState(sc);
1350 if (!s) {
1351 mStatus = BAD_INDEX;
1352 return *this;
1353 }
chaviw69058fb2021-09-27 09:37:30 -05001354
1355 releaseBufferIfOverwriting(*s);
1356
chaviwba4320c2021-09-15 15:20:53 -05001357 BufferData bufferData;
1358 bufferData.buffer = buffer;
1359 if (frameNumber) {
1360 bufferData.frameNumber = *frameNumber;
1361 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
1362 }
1363 if (fence) {
1364 bufferData.acquireFence = *fence;
1365 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
1366 }
1367 bufferData.releaseBufferEndpoint =
1368 IInterface::asBinder(TransactionCompletedListener::getIInstance());
Ady Abrahamf0c56492020-12-17 18:04:15 -08001369 if (mIsAutoTimestamp) {
1370 mDesiredPresentTime = systemTime();
1371 }
chaviwba4320c2021-09-15 15:20:53 -05001372 setReleaseBufferCallback(&bufferData, id, callback);
1373 s->what |= layer_state_t::eBufferChanged;
1374 s->bufferData = bufferData;
Marissa Wallebc2c052019-01-16 19:16:55 -08001375 registerSurfaceControlForCallback(sc);
Marissa Wall78b72202019-03-15 14:58:34 -07001376
1377 mContainsBuffer = true;
Marissa Wallebc2c052019-01-16 19:16:55 -08001378 return *this;
1379}
1380
chaviwba4320c2021-09-15 15:20:53 -05001381void SurfaceComposerClient::Transaction::setReleaseBufferCallback(BufferData* bufferData,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -07001382 const ReleaseCallbackId& id,
Vishnu Nair1506b182021-02-22 14:35:15 -08001383 ReleaseBufferCallback callback) {
1384 if (!callback) {
1385 return;
1386 }
1387
chaviwba4320c2021-09-15 15:20:53 -05001388 if (!bufferData->buffer) {
Vishnu Nair1506b182021-02-22 14:35:15 -08001389 ALOGW("Transaction::setReleaseBufferCallback"
1390 "ignored trying to set a callback on a null buffer.");
1391 return;
1392 }
1393
chaviwba4320c2021-09-15 15:20:53 -05001394 bufferData->releaseBufferListener = TransactionCompletedListener::getIInstance();
1395 bufferData->releaseCallbackId = id;
Vishnu Nair1506b182021-02-22 14:35:15 -08001396 auto listener = TransactionCompletedListener::getInstance();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -07001397 listener->setReleaseBufferCallback(id, callback);
Vishnu Nair1506b182021-02-22 14:35:15 -08001398}
1399
Marissa Wall61c58622018-07-18 10:12:20 -07001400SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDataspace(
1401 const sp<SurfaceControl>& sc, ui::Dataspace dataspace) {
1402 layer_state_t* s = getLayerState(sc);
1403 if (!s) {
1404 mStatus = BAD_INDEX;
1405 return *this;
1406 }
1407 s->what |= layer_state_t::eDataspaceChanged;
1408 s->dataspace = dataspace;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001409
1410 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001411 return *this;
1412}
1413
1414SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMetadata(
1415 const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata) {
1416 layer_state_t* s = getLayerState(sc);
1417 if (!s) {
1418 mStatus = BAD_INDEX;
1419 return *this;
1420 }
1421 s->what |= layer_state_t::eHdrMetadataChanged;
1422 s->hdrMetadata = hdrMetadata;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001423
1424 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001425 return *this;
1426}
1427
1428SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSurfaceDamageRegion(
1429 const sp<SurfaceControl>& sc, const Region& surfaceDamageRegion) {
1430 layer_state_t* s = getLayerState(sc);
1431 if (!s) {
1432 mStatus = BAD_INDEX;
1433 return *this;
1434 }
1435 s->what |= layer_state_t::eSurfaceDamageRegionChanged;
1436 s->surfaceDamageRegion = surfaceDamageRegion;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001437
1438 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001439 return *this;
1440}
1441
1442SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApi(
1443 const sp<SurfaceControl>& sc, int32_t api) {
1444 layer_state_t* s = getLayerState(sc);
1445 if (!s) {
1446 mStatus = BAD_INDEX;
1447 return *this;
1448 }
1449 s->what |= layer_state_t::eApiChanged;
1450 s->api = api;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001451
1452 registerSurfaceControlForCallback(sc);
Marissa Wall61c58622018-07-18 10:12:20 -07001453 return *this;
1454}
1455
1456SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSidebandStream(
1457 const sp<SurfaceControl>& sc, const sp<NativeHandle>& sidebandStream) {
1458 layer_state_t* s = getLayerState(sc);
1459 if (!s) {
1460 mStatus = BAD_INDEX;
1461 return *this;
1462 }
1463 s->what |= layer_state_t::eSidebandStreamChanged;
1464 s->sidebandStream = sidebandStream;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001465
1466 registerSurfaceControlForCallback(sc);
1467 return *this;
1468}
1469
Marissa Wall17b4e452018-12-26 16:32:34 -08001470SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDesiredPresentTime(
1471 nsecs_t desiredPresentTime) {
1472 mDesiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001473 mIsAutoTimestamp = false;
Marissa Wall17b4e452018-12-26 16:32:34 -08001474 return *this;
1475}
1476
Peiyong Linc502cb72019-03-01 15:00:23 -08001477SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorSpaceAgnostic(
1478 const sp<SurfaceControl>& sc, const bool agnostic) {
1479 layer_state_t* s = getLayerState(sc);
1480 if (!s) {
1481 mStatus = BAD_INDEX;
1482 return *this;
1483 }
1484 s->what |= layer_state_t::eColorSpaceAgnosticChanged;
1485 s->colorSpaceAgnostic = agnostic;
1486
1487 registerSurfaceControlForCallback(sc);
1488 return *this;
1489}
1490
Marissa Wallc837b5e2018-10-12 10:04:44 -07001491SurfaceComposerClient::Transaction&
Ana Krulecc84d09b2019-11-02 23:10:29 +01001492SurfaceComposerClient::Transaction::setFrameRateSelectionPriority(const sp<SurfaceControl>& sc,
1493 int32_t priority) {
1494 layer_state_t* s = getLayerState(sc);
1495 if (!s) {
1496 mStatus = BAD_INDEX;
1497 return *this;
1498 }
1499
1500 s->what |= layer_state_t::eFrameRateSelectionPriority;
1501 s->frameRateSelectionPriority = priority;
1502
1503 registerSurfaceControlForCallback(sc);
1504 return *this;
1505}
1506
Vishnu Nairfc46c1e2021-04-21 08:31:32 -07001507SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::addTransactionCallback(
1508 TransactionCompletedCallbackTakesContext callback, void* callbackContext,
1509 CallbackId::Type callbackType) {
Marissa Wallc837b5e2018-10-12 10:04:44 -07001510 auto listener = TransactionCompletedListener::getInstance();
1511
Marissa Wall80d94ad2019-01-18 16:04:36 -08001512 auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
1513 std::placeholders::_2, std::placeholders::_3);
1514 const auto& surfaceControls =
1515 mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;
Marissa Wallc837b5e2018-10-12 10:04:44 -07001516
Vishnu Nairfc46c1e2021-04-21 08:31:32 -07001517 CallbackId callbackId =
1518 listener->addCallbackFunction(callbackWithContext, surfaceControls, callbackType);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001519
1520 mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
1521 callbackId);
Marissa Wall61c58622018-07-18 10:12:20 -07001522 return *this;
1523}
1524
Vishnu Nairfc46c1e2021-04-21 08:31:32 -07001525SurfaceComposerClient::Transaction&
1526SurfaceComposerClient::Transaction::addTransactionCompletedCallback(
1527 TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
1528 return addTransactionCallback(callback, callbackContext, CallbackId::Type::ON_COMPLETE);
1529}
1530
1531SurfaceComposerClient::Transaction&
1532SurfaceComposerClient::Transaction::addTransactionCommittedCallback(
1533 TransactionCompletedCallbackTakesContext callback, void* callbackContext) {
1534 return addTransactionCallback(callback, callbackContext, CallbackId::Type::ON_COMMIT);
1535}
1536
Valerie Hau871d6352020-01-29 08:44:02 -08001537SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::notifyProducerDisconnect(
1538 const sp<SurfaceControl>& sc) {
1539 layer_state_t* s = getLayerState(sc);
1540 if (!s) {
1541 mStatus = BAD_INDEX;
1542 return *this;
1543 }
1544
1545 s->what |= layer_state_t::eProducerDisconnect;
1546 return *this;
1547}
1548
Robert Carr2c358bf2018-08-08 15:58:15 -07001549SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setInputWindowInfo(
chaviw98318de2021-05-19 16:45:23 -05001550 const sp<SurfaceControl>& sc, const WindowInfo& info) {
Robert Carr2c358bf2018-08-08 15:58:15 -07001551 layer_state_t* s = getLayerState(sc);
1552 if (!s) {
1553 mStatus = BAD_INDEX;
1554 return *this;
1555 }
chaviw98318de2021-05-19 16:45:23 -05001556 s->windowInfoHandle = new WindowInfoHandle(info);
Robert Carr2c358bf2018-08-08 15:58:15 -07001557 s->what |= layer_state_t::eInputInfoChanged;
1558 return *this;
1559}
chaviw273171b2018-12-26 11:46:30 -08001560
Vishnu Naire798b472020-07-23 13:52:21 -07001561SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFocusedWindow(
Vishnu Naire798b472020-07-23 13:52:21 -07001562 const FocusRequest& request) {
1563 mInputWindowCommands.focusRequests.push_back(request);
1564 return *this;
1565}
1566
chaviwa911b102019-02-14 10:18:33 -08001567SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
1568 mInputWindowCommands.syncInputWindows = true;
1569 return *this;
1570}
1571
Peiyong Lind3788632018-09-18 16:01:31 -07001572SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
1573 const sp<SurfaceControl>& sc, const mat3& matrix, const vec3& translation) {
1574 layer_state_t* s = getLayerState(sc);
1575 if (!s) {
1576 mStatus = BAD_INDEX;
1577 return *this;
1578 }
1579 s->what |= layer_state_t::eColorTransformChanged;
1580 s->colorTransform = mat4(matrix, translation);
Marissa Wallc837b5e2018-10-12 10:04:44 -07001581
1582 registerSurfaceControlForCallback(sc);
Peiyong Lind3788632018-09-18 16:01:31 -07001583 return *this;
1584}
1585
Robert Carrfb4d58b2019-01-15 09:21:27 -08001586SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometry(
1587 const sp<SurfaceControl>& sc, const Rect& source, const Rect& dst, int transform) {
chaviw25714502021-02-11 10:01:08 -08001588 setCrop(sc, source);
Robert Carrfb4d58b2019-01-15 09:21:27 -08001589
1590 int x = dst.left;
1591 int y = dst.top;
Robert Carr66365e42019-04-08 16:58:04 -07001592
1593 float sourceWidth = source.getWidth();
1594 float sourceHeight = source.getHeight();
1595
1596 float xScale = sourceWidth < 0 ? 1.0f : dst.getWidth() / sourceWidth;
1597 float yScale = sourceHeight < 0 ? 1.0f : dst.getHeight() / sourceHeight;
Robert Carrfb4d58b2019-01-15 09:21:27 -08001598 float matrix[4] = {1, 0, 0, 1};
1599
1600 switch (transform) {
1601 case NATIVE_WINDOW_TRANSFORM_FLIP_H:
1602 matrix[0] = -xScale; matrix[1] = 0;
1603 matrix[2] = 0; matrix[3] = yScale;
1604 x += source.getWidth();
1605 break;
1606 case NATIVE_WINDOW_TRANSFORM_FLIP_V:
1607 matrix[0] = xScale; matrix[1] = 0;
1608 matrix[2] = 0; matrix[3] = -yScale;
1609 y += source.getHeight();
1610 break;
1611 case NATIVE_WINDOW_TRANSFORM_ROT_90:
1612 matrix[0] = 0; matrix[1] = -yScale;
1613 matrix[2] = xScale; matrix[3] = 0;
1614 x += source.getHeight();
1615 break;
1616 case NATIVE_WINDOW_TRANSFORM_ROT_180:
1617 matrix[0] = -xScale; matrix[1] = 0;
1618 matrix[2] = 0; matrix[3] = -yScale;
1619 x += source.getWidth();
1620 y += source.getHeight();
1621 break;
1622 case NATIVE_WINDOW_TRANSFORM_ROT_270:
1623 matrix[0] = 0; matrix[1] = yScale;
1624 matrix[2] = -xScale; matrix[3] = 0;
1625 y += source.getWidth();
1626 break;
1627 default:
1628 matrix[0] = xScale; matrix[1] = 0;
1629 matrix[2] = 0; matrix[3] = yScale;
1630 break;
1631 }
1632 setMatrix(sc, matrix[0], matrix[1], matrix[2], matrix[3]);
chaviw76f5f2f2019-09-23 10:15:51 -07001633 float offsetX = xScale * source.left;
1634 float offsetY = yScale * source.top;
1635 setPosition(sc, x - offsetX, y - offsetY);
Robert Carrfb4d58b2019-01-15 09:21:27 -08001636
1637 return *this;
1638}
1639
Vishnu Nairc97b8db2019-10-29 18:19:35 -07001640SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setShadowRadius(
1641 const sp<SurfaceControl>& sc, float shadowRadius) {
1642 layer_state_t* s = getLayerState(sc);
1643 if (!s) {
1644 mStatus = BAD_INDEX;
1645 return *this;
1646 }
1647 s->what |= layer_state_t::eShadowRadiusChanged;
1648 s->shadowRadius = shadowRadius;
1649 return *this;
1650}
1651
Steven Thomas3172e202020-01-06 19:25:30 -08001652SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameRate(
Marin Shalamanov46084422020-10-13 12:33:42 +02001653 const sp<SurfaceControl>& sc, float frameRate, int8_t compatibility,
Marin Shalamanovc5986772021-03-16 16:09:49 +01001654 int8_t changeFrameRateStrategy) {
Steven Thomas3172e202020-01-06 19:25:30 -08001655 layer_state_t* s = getLayerState(sc);
1656 if (!s) {
1657 mStatus = BAD_INDEX;
1658 return *this;
1659 }
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001660 // Allow privileged values as well here, those will be ignored by SF if
1661 // the caller is not privileged
Marin Shalamanovc5986772021-03-16 16:09:49 +01001662 if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,
1663 "Transaction::setFrameRate",
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001664 /*privileged=*/true)) {
Steven Thomas62a4cf82020-01-31 12:04:03 -08001665 mStatus = BAD_VALUE;
1666 return *this;
1667 }
Steven Thomas3172e202020-01-06 19:25:30 -08001668 s->what |= layer_state_t::eFrameRateChanged;
1669 s->frameRate = frameRate;
Steven Thomas62a4cf82020-01-31 12:04:03 -08001670 s->frameRateCompatibility = compatibility;
Marin Shalamanovc5986772021-03-16 16:09:49 +01001671 s->changeFrameRateStrategy = changeFrameRateStrategy;
Steven Thomas3172e202020-01-06 19:25:30 -08001672 return *this;
1673}
1674
Vishnu Nair6213bd92020-05-08 17:42:25 -07001675SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFixedTransformHint(
1676 const sp<SurfaceControl>& sc, int32_t fixedTransformHint) {
1677 layer_state_t* s = getLayerState(sc);
1678 if (!s) {
1679 mStatus = BAD_INDEX;
1680 return *this;
1681 }
1682
1683 const ui::Transform::RotationFlags transform = fixedTransformHint == -1
1684 ? ui::Transform::ROT_INVALID
1685 : ui::Transform::toRotationFlags(static_cast<ui::Rotation>(fixedTransformHint));
1686 s->what |= layer_state_t::eFixedTransformHintChanged;
1687 s->fixedTransformHint = transform;
1688 return *this;
1689}
1690
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001691SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameTimelineInfo(
1692 const FrameTimelineInfo& frameTimelineInfo) {
Ady Abraham8db10102021-03-15 17:19:23 -07001693 mFrameTimelineInfo.merge(frameTimelineInfo);
Robert Carr9b611b72020-10-19 12:00:23 -07001694 return *this;
1695}
1696
Vishnu Naircf26a0a2020-11-13 12:56:20 -08001697SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAutoRefresh(
1698 const sp<SurfaceControl>& sc, bool autoRefresh) {
1699 layer_state_t* s = getLayerState(sc);
1700 if (!s) {
1701 mStatus = BAD_INDEX;
1702 return *this;
1703 }
1704
1705 s->what |= layer_state_t::eAutoRefreshChanged;
1706 s->autoRefresh = autoRefresh;
1707 return *this;
1708}
1709
Winson Chunga30f7c92021-06-29 15:42:56 -07001710SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTrustedOverlay(
1711 const sp<SurfaceControl>& sc, bool isTrustedOverlay) {
1712 layer_state_t* s = getLayerState(sc);
1713 if (!s) {
1714 mStatus = BAD_INDEX;
1715 return *this;
1716 }
1717
1718 s->what |= layer_state_t::eTrustedOverlayChanged;
1719 s->isTrustedOverlay = isTrustedOverlay;
1720 return *this;
1721}
1722
Vishnu Nair277142c2021-01-05 18:35:29 -08001723SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApplyToken(
1724 const sp<IBinder>& applyToken) {
1725 mApplyToken = applyToken;
1726 return *this;
1727}
1728
John Reckcdb4ed72021-02-04 13:39:33 -05001729SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setStretchEffect(
Nader Jawad2dfc98b2021-04-08 20:35:39 -07001730 const sp<SurfaceControl>& sc, const StretchEffect& stretchEffect) {
John Reckcdb4ed72021-02-04 13:39:33 -05001731 layer_state_t* s = getLayerState(sc);
1732 if (!s) {
1733 mStatus = BAD_INDEX;
1734 return *this;
1735 }
1736
1737 s->what |= layer_state_t::eStretchChanged;
Nader Jawad2dfc98b2021-04-08 20:35:39 -07001738 s->stretchEffect = stretchEffect;
John Reckcdb4ed72021-02-04 13:39:33 -05001739 return *this;
1740}
1741
chaviwf3f40fe2021-04-27 15:54:02 -05001742SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBufferCrop(
1743 const sp<SurfaceControl>& sc, const Rect& bufferCrop) {
1744 layer_state_t* s = getLayerState(sc);
1745 if (!s) {
1746 mStatus = BAD_INDEX;
1747 return *this;
1748 }
1749
1750 s->what |= layer_state_t::eBufferCropChanged;
1751 s->bufferCrop = bufferCrop;
1752
1753 registerSurfaceControlForCallback(sc);
1754 return *this;
1755}
1756
Vishnu Nair6bdec7d2021-05-10 15:01:13 -07001757SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDestinationFrame(
1758 const sp<SurfaceControl>& sc, const Rect& destinationFrame) {
1759 layer_state_t* s = getLayerState(sc);
1760 if (!s) {
1761 mStatus = BAD_INDEX;
1762 return *this;
1763 }
1764
1765 s->what |= layer_state_t::eDestinationFrameChanged;
1766 s->destinationFrame = destinationFrame;
1767
1768 registerSurfaceControlForCallback(sc);
1769 return *this;
1770}
1771
Vishnu Nair9cf4a4d2021-09-17 12:16:08 -07001772SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDropInputMode(
1773 const sp<SurfaceControl>& sc, gui::DropInputMode mode) {
1774 layer_state_t* s = getLayerState(sc);
1775 if (!s) {
1776 mStatus = BAD_INDEX;
1777 return *this;
1778 }
1779
1780 s->what |= layer_state_t::eDropInputModeChanged;
1781 s->dropInputMode = mode;
1782
1783 registerSurfaceControlForCallback(sc);
1784 return *this;
1785}
1786
Mathias Agopian698c0872011-06-28 19:09:31 -07001787// ---------------------------------------------------------------------------
1788
chaviw763ef572018-02-22 16:04:57 -08001789DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
Mathias Agopiane57f2922012-08-09 16:29:12 -07001790 DisplayState s;
1791 s.token = token;
1792 ssize_t index = mDisplayStates.indexOf(s);
1793 if (index < 0) {
1794 // we don't have it, add an initialized layer_state to our list
1795 s.what = 0;
1796 index = mDisplayStates.add(s);
1797 }
Dan Stozad723bd72014-11-18 10:24:03 -08001798 return mDisplayStates.editItemAt(static_cast<size_t>(index));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001799}
1800
Robert Carr4cdc58f2017-08-23 14:22:20 -07001801status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
1802 const sp<IGraphicBufferProducer>& bufferProducer) {
Pablo Ceballoseddbef82016-09-01 11:21:21 -07001803 if (bufferProducer.get() != nullptr) {
1804 // Make sure that composition can never be stalled by a virtual display
1805 // consumer that isn't processing buffers fast enough.
1806 status_t err = bufferProducer->setAsyncMode(true);
1807 if (err != NO_ERROR) {
1808 ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
1809 "BufferQueue. This BufferQueue cannot be used for virtual "
1810 "display. (%d)", err);
1811 return err;
1812 }
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001813 }
chaviw763ef572018-02-22 16:04:57 -08001814 DisplayState& s(getDisplayState(token));
Andy McFadden2adaf042012-12-18 09:49:45 -08001815 s.surface = bufferProducer;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001816 s.what |= DisplayState::eSurfaceChanged;
Pablo Ceballos1aad24c2016-08-04 10:24:22 -07001817 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -07001818}
1819
Robert Carr4cdc58f2017-08-23 14:22:20 -07001820void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
Dominik Laskowski29fa1462021-04-27 15:51:50 -07001821 ui::LayerStack layerStack) {
chaviw763ef572018-02-22 16:04:57 -08001822 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001823 s.layerStack = layerStack;
1824 s.what |= DisplayState::eLayerStackChanged;
1825}
1826
Evan Rosky2239b372021-05-20 13:43:47 -07001827void SurfaceComposerClient::Transaction::setDisplayFlags(const sp<IBinder>& token, uint32_t flags) {
1828 DisplayState& s(getDisplayState(token));
1829 s.flags = flags;
1830 s.what |= DisplayState::eFlagsChanged;
1831}
1832
Robert Carr4cdc58f2017-08-23 14:22:20 -07001833void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
Dominik Laskowski718f9602019-11-09 20:01:35 -08001834 ui::Rotation orientation,
1835 const Rect& layerStackRect,
1836 const Rect& displayRect) {
chaviw763ef572018-02-22 16:04:57 -08001837 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -07001838 s.orientation = orientation;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +02001839 s.layerStackSpaceRect = layerStackRect;
1840 s.orientedDisplaySpaceRect = displayRect;
Mathias Agopian00e8c7a2012-09-04 19:30:46 -07001841 s.what |= DisplayState::eDisplayProjectionChanged;
Jorim Jaggi092123c2016-04-13 01:40:35 +00001842 mForceSynchronous = true; // TODO: do we actually still need this?
Mathias Agopiane57f2922012-08-09 16:29:12 -07001843}
1844
Robert Carr4cdc58f2017-08-23 14:22:20 -07001845void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
chaviw763ef572018-02-22 16:04:57 -08001846 DisplayState& s(getDisplayState(token));
Michael Wright1f6078a2014-06-26 16:01:02 -07001847 s.width = width;
1848 s.height = height;
1849 s.what |= DisplayState::eDisplaySizeChanged;
1850}
1851
Mathias Agopiane57f2922012-08-09 16:29:12 -07001852// ---------------------------------------------------------------------------
1853
chaviw60c9d3e2021-06-04 12:52:17 -05001854SurfaceComposerClient::SurfaceComposerClient() : mStatus(NO_INIT) {}
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001855
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +01001856SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
chaviw60c9d3e2021-06-04 12:52:17 -05001857 : mStatus(NO_ERROR), mClient(client) {}
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +01001858
Mathias Agopian698c0872011-06-28 19:09:31 -07001859void SurfaceComposerClient::onFirstRef() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001860 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07001861 if (sf != nullptr && mStatus == NO_INIT) {
Robert Carr1db73f62016-12-21 12:58:51 -08001862 sp<ISurfaceComposerClient> conn;
Robert Carrb89ea9d2018-12-10 13:01:14 -08001863 conn = sf->createConnection();
Yi Kong48a619f2018-06-05 16:34:59 -07001864 if (conn != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001865 mClient = conn;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001866 mStatus = NO_ERROR;
1867 }
1868 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001869}
1870
Mathias Agopian698c0872011-06-28 19:09:31 -07001871SurfaceComposerClient::~SurfaceComposerClient() {
Mathias Agopian631f3582010-05-25 17:51:34 -07001872 dispose();
1873}
Mathias Agopiandd3423c2009-09-23 15:44:05 -07001874
Mathias Agopian698c0872011-06-28 19:09:31 -07001875status_t SurfaceComposerClient::initCheck() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001876 return mStatus;
1877}
1878
Mathias Agopian698c0872011-06-28 19:09:31 -07001879sp<IBinder> SurfaceComposerClient::connection() const {
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001880 return IInterface::asBinder(mClient);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001881}
1882
Mathias Agopiand4784a32010-05-27 19:41:15 -07001883status_t SurfaceComposerClient::linkToComposerDeath(
1884 const sp<IBinder::DeathRecipient>& recipient,
Mathias Agopian698c0872011-06-28 19:09:31 -07001885 void* cookie, uint32_t flags) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07001886 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
1887 return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001888}
1889
Mathias Agopian698c0872011-06-28 19:09:31 -07001890void SurfaceComposerClient::dispose() {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001891 // this can be called more than once.
Mathias Agopian7e27f052010-05-28 14:22:23 -07001892 sp<ISurfaceComposerClient> client;
Mathias Agopiand4784a32010-05-27 19:41:15 -07001893 Mutex::Autolock _lm(mLock);
Yi Kong48a619f2018-06-05 16:34:59 -07001894 if (mClient != nullptr) {
Mathias Agopiand4784a32010-05-27 19:41:15 -07001895 client = mClient; // hold ref while lock is held
1896 mClient.clear();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001897 }
Mathias Agopiand4784a32010-05-27 19:41:15 -07001898 mStatus = NO_INIT;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001899}
1900
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001901sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
1902 PixelFormat format, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001903 const sp<IBinder>& parentHandle,
Valerie Hau1acd6962019-10-28 16:35:48 -07001904 LayerMetadata metadata,
1905 uint32_t* outTransformHint) {
Robert Carr3b382ed2018-03-14 13:49:41 -07001906 sp<SurfaceControl> s;
Vishnu Nair992496b2020-10-22 17:27:21 -07001907 createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
Valerie Hau1acd6962019-10-28 16:35:48 -07001908 outTransformHint);
Robert Carr3b382ed2018-03-14 13:49:41 -07001909 return s;
1910}
1911
Marissa Wall35187b32019-01-08 10:08:52 -08001912sp<SurfaceControl> SurfaceComposerClient::createWithSurfaceParent(const String8& name, uint32_t w,
1913 uint32_t h, PixelFormat format,
1914 uint32_t flags, Surface* parent,
Valerie Hau1acd6962019-10-28 16:35:48 -07001915 LayerMetadata metadata,
1916 uint32_t* outTransformHint) {
Marissa Wall35187b32019-01-08 10:08:52 -08001917 sp<SurfaceControl> sur;
1918 status_t err = mStatus;
1919
1920 if (mStatus == NO_ERROR) {
1921 sp<IBinder> handle;
1922 sp<IGraphicBufferProducer> parentGbp = parent->getIGraphicBufferProducer();
1923 sp<IGraphicBufferProducer> gbp;
1924
Valerie Hau1acd6962019-10-28 16:35:48 -07001925 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001926 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001927 err = mClient->createWithSurfaceParent(name, w, h, format, flags, parentGbp,
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001928 std::move(metadata), &handle, &gbp, &id,
1929 &transformHint);
Valerie Hau1acd6962019-10-28 16:35:48 -07001930 if (outTransformHint) {
1931 *outTransformHint = transformHint;
1932 }
Marissa Wall35187b32019-01-08 10:08:52 -08001933 ALOGE_IF(err, "SurfaceComposerClient::createWithSurfaceParent error %s", strerror(-err));
1934 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001935 return new SurfaceControl(this, handle, gbp, id, transformHint);
Marissa Wall35187b32019-01-08 10:08:52 -08001936 }
1937 }
1938 return nullptr;
1939}
1940
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001941status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
1942 PixelFormat format,
1943 sp<SurfaceControl>* outSurface, uint32_t flags,
Vishnu Nair992496b2020-10-22 17:27:21 -07001944 const sp<IBinder>& parentHandle,
1945 LayerMetadata metadata,
Valerie Hau1acd6962019-10-28 16:35:48 -07001946 uint32_t* outTransformHint) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001947 sp<SurfaceControl> sur;
Robert Carr740eaf02018-03-27 12:59:18 -07001948 status_t err = mStatus;
Robert Carr3b382ed2018-03-14 13:49:41 -07001949
Mathias Agopian698c0872011-06-28 19:09:31 -07001950 if (mStatus == NO_ERROR) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001951 sp<IBinder> handle;
1952 sp<IGraphicBufferProducer> gbp;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001953
Valerie Hau1acd6962019-10-28 16:35:48 -07001954 uint32_t transformHint = 0;
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001955 int32_t id = -1;
Evan Rosky1f6d6d52018-12-06 10:47:26 -08001956 err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001957 &handle, &gbp, &id, &transformHint);
1958
Valerie Hau1acd6962019-10-28 16:35:48 -07001959 if (outTransformHint) {
1960 *outTransformHint = transformHint;
1961 }
Mathias Agopian4d9b8222013-03-12 17:11:48 -07001962 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
1963 if (err == NO_ERROR) {
Arthur Hung5b5b9152021-04-21 16:53:59 +08001964 *outSurface =
1965 new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
Mathias Agopian698c0872011-06-28 19:09:31 -07001966 }
1967 }
Robert Carr3b382ed2018-03-14 13:49:41 -07001968 return err;
Mathias Agopian698c0872011-06-28 19:09:31 -07001969}
1970
chaviwfe94a222019-08-21 13:52:59 -07001971sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface) {
1972 if (mirrorFromSurface == nullptr) {
1973 return nullptr;
1974 }
1975
1976 sp<IBinder> handle;
1977 sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
Pablo Gamito2ec1f7b2020-09-01 14:18:49 +00001978 int32_t layer_id = -1;
1979 status_t err = mClient->mirrorSurface(mirrorFromHandle, &handle, &layer_id);
chaviwfe94a222019-08-21 13:52:59 -07001980 if (err == NO_ERROR) {
Pablo Gamitodbc31672020-09-01 18:28:58 +00001981 return new SurfaceControl(this, handle, nullptr, layer_id, true /* owned */);
chaviwfe94a222019-08-21 13:52:59 -07001982 }
1983 return nullptr;
1984}
1985
Svetoslavd85084b2014-03-20 10:28:31 -07001986status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
1987 if (mStatus != NO_ERROR) {
1988 return mStatus;
1989 }
1990 return mClient->clearLayerFrameStats(token);
1991}
1992
1993status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
1994 FrameStats* outStats) const {
1995 if (mStatus != NO_ERROR) {
1996 return mStatus;
1997 }
1998 return mClient->getLayerFrameStats(token, outStats);
1999}
2000
Mathias Agopian698c0872011-06-28 19:09:31 -07002001// ----------------------------------------------------------------------------
2002
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07002003status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07002004 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2005 return sf->enableVSyncInjections(enable);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07002006}
2007
2008status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07002009 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
2010 return sf->injectVSync(when);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07002011}
2012
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08002013status_t SurfaceComposerClient::getDisplayState(const sp<IBinder>& display,
2014 ui::DisplayState* state) {
2015 return ComposerService::getComposerService()->getDisplayState(display, state);
2016}
2017
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002018status_t SurfaceComposerClient::getStaticDisplayInfo(const sp<IBinder>& display,
2019 ui::StaticDisplayInfo* info) {
2020 return ComposerService::getComposerService()->getStaticDisplayInfo(display, info);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08002021}
2022
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002023status_t SurfaceComposerClient::getDynamicDisplayInfo(const sp<IBinder>& display,
2024 ui::DynamicDisplayInfo* info) {
2025 return ComposerService::getComposerService()->getDynamicDisplayInfo(display, info);
Dan Stoza7f7da322014-05-02 15:26:25 -07002026}
2027
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002028status_t SurfaceComposerClient::getActiveDisplayMode(const sp<IBinder>& display,
2029 ui::DisplayMode* mode) {
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002030 ui::DynamicDisplayInfo info;
2031 status_t result = getDynamicDisplayInfo(display, &info);
Dan Stoza7f7da322014-05-02 15:26:25 -07002032 if (result != NO_ERROR) {
2033 return result;
2034 }
2035
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002036 if (const auto activeMode = info.getActiveDisplayMode()) {
2037 *mode = *activeMode;
2038 return NO_ERROR;
Dan Stoza7f7da322014-05-02 15:26:25 -07002039 }
2040
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002041 ALOGE("Active display mode not found.");
2042 return NAME_NOT_FOUND;
Dan Stoza7f7da322014-05-02 15:26:25 -07002043}
2044
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002045status_t SurfaceComposerClient::setDesiredDisplayModeSpecs(
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002046 const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching,
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02002047 float primaryRefreshRateMin, float primaryRefreshRateMax, float appRequestRefreshRateMin,
2048 float appRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07002049 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002050 ->setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
2051 primaryRefreshRateMin, primaryRefreshRateMax,
2052 appRequestRefreshRateMin, appRequestRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07002053}
2054
Marin Shalamanov228f46b2021-01-28 21:11:45 +01002055status_t SurfaceComposerClient::getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
2056 ui::DisplayModeId* outDefaultMode,
2057 bool* outAllowGroupSwitching,
2058 float* outPrimaryRefreshRateMin,
2059 float* outPrimaryRefreshRateMax,
2060 float* outAppRequestRefreshRateMin,
2061 float* outAppRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -07002062 return ComposerService::getComposerService()
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002063 ->getDesiredDisplayModeSpecs(displayToken, outDefaultMode, outAllowGroupSwitching,
2064 outPrimaryRefreshRateMin, outPrimaryRefreshRateMax,
2065 outAppRequestRefreshRateMin, outAppRequestRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01002066}
2067
Daniel Solomon42d04562019-01-20 21:03:19 -08002068status_t SurfaceComposerClient::getDisplayNativePrimaries(const sp<IBinder>& display,
2069 ui::DisplayPrimaries& outPrimaries) {
2070 return ComposerService::getComposerService()->getDisplayNativePrimaries(display, outPrimaries);
2071}
2072
Michael Wright28f24d02016-07-12 13:30:53 -07002073status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
Peiyong Lina52f0292018-03-14 17:26:31 -07002074 ColorMode colorMode) {
Michael Wright28f24d02016-07-12 13:30:53 -07002075 return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
2076}
2077
Galia Peycheva5492cb52019-10-30 14:13:16 +01002078void SurfaceComposerClient::setAutoLowLatencyMode(const sp<IBinder>& display, bool on) {
2079 ComposerService::getComposerService()->setAutoLowLatencyMode(display, on);
2080}
2081
Galia Peycheva5492cb52019-10-30 14:13:16 +01002082void SurfaceComposerClient::setGameContentType(const sp<IBinder>& display, bool on) {
2083 ComposerService::getComposerService()->setGameContentType(display, on);
2084}
2085
Prashant Malani2c9b11f2014-05-25 01:36:31 -07002086void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
2087 int mode) {
2088 ComposerService::getComposerService()->setPowerMode(token, mode);
Jeff Brown2a09bb32012-10-08 19:13:57 -07002089}
2090
Peiyong Linc6780972018-10-28 15:24:08 -07002091status_t SurfaceComposerClient::getCompositionPreference(
2092 ui::Dataspace* defaultDataspace, ui::PixelFormat* defaultPixelFormat,
2093 ui::Dataspace* wideColorGamutDataspace, ui::PixelFormat* wideColorGamutPixelFormat) {
2094 return ComposerService::getComposerService()
2095 ->getCompositionPreference(defaultDataspace, defaultPixelFormat,
2096 wideColorGamutDataspace, wideColorGamutPixelFormat);
Peiyong Lin0256f722018-08-31 15:45:10 -07002097}
2098
Peiyong Lin08d10512019-01-16 13:27:35 -08002099bool SurfaceComposerClient::getProtectedContentSupport() {
2100 bool supported = false;
2101 ComposerService::getComposerService()->getProtectedContentSupport(&supported);
2102 return supported;
2103}
2104
Svetoslavd85084b2014-03-20 10:28:31 -07002105status_t SurfaceComposerClient::clearAnimationFrameStats() {
2106 return ComposerService::getComposerService()->clearAnimationFrameStats();
2107}
2108
2109status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
2110 return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
2111}
2112
Kriti Dang49ad4132021-01-08 11:49:56 +01002113status_t SurfaceComposerClient::overrideHdrTypes(const sp<IBinder>& display,
2114 const std::vector<ui::Hdr>& hdrTypes) {
2115 return ComposerService::getComposerService()->overrideHdrTypes(display, hdrTypes);
2116}
2117
Tej Singhe2751772021-04-06 22:05:29 -07002118status_t SurfaceComposerClient::onPullAtom(const int32_t atomId, std::string* outData,
2119 bool* success) {
2120 return ComposerService::getComposerService()->onPullAtom(atomId, outData, success);
2121}
2122
Kevin DuBois9c0a1762018-10-16 13:32:31 -07002123status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
2124 ui::PixelFormat* outFormat,
2125 ui::Dataspace* outDataspace,
2126 uint8_t* outComponentMask) {
2127 return ComposerService::getComposerService()
2128 ->getDisplayedContentSamplingAttributes(display, outFormat, outDataspace,
2129 outComponentMask);
2130}
2131
Kevin DuBois74e53772018-11-19 10:52:38 -08002132status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display,
2133 bool enable, uint8_t componentMask,
2134 uint64_t maxFrames) {
2135 return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable,
2136 componentMask,
2137 maxFrames);
2138}
2139
Kevin DuBois1d4249a2018-08-29 10:45:14 -07002140status_t SurfaceComposerClient::getDisplayedContentSample(const sp<IBinder>& display,
2141 uint64_t maxFrames, uint64_t timestamp,
2142 DisplayedFrameStats* outStats) {
2143 return ComposerService::getComposerService()->getDisplayedContentSample(display, maxFrames,
2144 timestamp, outStats);
2145}
Marissa Wall35187b32019-01-08 10:08:52 -08002146
Peiyong Lin4f3fddf2019-01-24 17:21:24 -08002147status_t SurfaceComposerClient::isWideColorDisplay(const sp<IBinder>& display,
2148 bool* outIsWideColorDisplay) {
2149 return ComposerService::getComposerService()->isWideColorDisplay(display,
2150 outIsWideColorDisplay);
2151}
2152
Kevin DuBois00c66832019-02-18 16:21:31 -08002153status_t SurfaceComposerClient::addRegionSamplingListener(
2154 const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
2155 const sp<IRegionSamplingListener>& listener) {
2156 return ComposerService::getComposerService()->addRegionSamplingListener(samplingArea,
2157 stopLayerHandle,
2158 listener);
2159}
2160
2161status_t SurfaceComposerClient::removeRegionSamplingListener(
2162 const sp<IRegionSamplingListener>& listener) {
2163 return ComposerService::getComposerService()->removeRegionSamplingListener(listener);
2164}
2165
Alec Mouria9a68a62021-03-04 19:14:50 -08002166status_t SurfaceComposerClient::addFpsListener(int32_t taskId,
Alec Mouriadebf5c2021-01-05 12:57:36 -08002167 const sp<gui::IFpsListener>& listener) {
Alec Mouria9a68a62021-03-04 19:14:50 -08002168 return ComposerService::getComposerService()->addFpsListener(taskId, listener);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002169}
2170
2171status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& listener) {
2172 return ComposerService::getComposerService()->removeFpsListener(listener);
2173}
2174
Galia Peycheva8f04b302021-04-27 13:25:38 +02002175status_t SurfaceComposerClient::addTunnelModeEnabledListener(
2176 const sp<gui::ITunnelModeEnabledListener>& listener) {
2177 return ComposerService::getComposerService()->addTunnelModeEnabledListener(listener);
2178}
2179
2180status_t SurfaceComposerClient::removeTunnelModeEnabledListener(
2181 const sp<gui::ITunnelModeEnabledListener>& listener) {
2182 return ComposerService::getComposerService()->removeTunnelModeEnabledListener(listener);
2183}
2184
Dan Gittik57e63c52019-01-18 16:37:54 +00002185bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) {
2186 bool support = false;
2187 ComposerService::getComposerService()->getDisplayBrightnessSupport(displayToken, &support);
2188 return support;
2189}
2190
2191status_t SurfaceComposerClient::setDisplayBrightness(const sp<IBinder>& displayToken,
John Reck22be6962021-03-10 12:59:54 -05002192 const gui::DisplayBrightness& brightness) {
Dan Gittik57e63c52019-01-18 16:37:54 +00002193 return ComposerService::getComposerService()->setDisplayBrightness(displayToken, brightness);
2194}
2195
John Reck88270902021-03-18 11:27:35 -04002196status_t SurfaceComposerClient::addHdrLayerInfoListener(
2197 const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
2198 return ComposerService::getComposerService()->addHdrLayerInfoListener(displayToken, listener);
2199}
2200
2201status_t SurfaceComposerClient::removeHdrLayerInfoListener(
2202 const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
2203 return ComposerService::getComposerService()->removeHdrLayerInfoListener(displayToken,
2204 listener);
2205}
2206
Lais Andrade3a6e47d2020-04-02 11:20:16 +01002207status_t SurfaceComposerClient::notifyPowerBoost(int32_t boostId) {
2208 return ComposerService::getComposerService()->notifyPowerBoost(boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07002209}
2210
Vishnu Nairb13bb952019-11-15 10:24:08 -08002211status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColor,
2212 const half4& spotColor, float lightPosY,
2213 float lightPosZ, float lightRadius) {
2214 return ComposerService::getComposerService()->setGlobalShadowSettings(ambientColor, spotColor,
2215 lightPosY, lightPosZ,
2216 lightRadius);
2217}
2218
Ana Krulec31f2b3c2020-12-14 14:30:09 -08002219int SurfaceComposerClient::getGPUContextPriority() {
2220 return ComposerService::getComposerService()->getGPUContextPriority();
2221}
2222
chaviw60c9d3e2021-06-04 12:52:17 -05002223status_t SurfaceComposerClient::addWindowInfosListener(
2224 const sp<WindowInfosListener>& windowInfosListener) {
2225 return WindowInfosListenerReporter::getInstance()
2226 ->addWindowInfosListener(windowInfosListener, ComposerService::getComposerService());
2227}
2228
2229status_t SurfaceComposerClient::removeWindowInfosListener(
2230 const sp<WindowInfosListener>& windowInfosListener) {
2231 return WindowInfosListenerReporter::getInstance()
2232 ->removeWindowInfosListener(windowInfosListener, ComposerService::getComposerService());
2233}
2234
Mathias Agopian698c0872011-06-28 19:09:31 -07002235// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08002236
chaviw690db382020-07-27 16:46:46 -07002237status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002238 const sp<IScreenCaptureListener>& captureListener) {
Mathias Agopian2a9fc492013-03-01 13:42:57 -08002239 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002240 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002241
chaviwe7b9f272020-08-18 16:08:59 -07002242 return s->captureDisplay(captureArgs, captureListener);
Robert Carr673134e2017-01-09 19:48:38 -08002243}
2244
Dominik Laskowskif1833852021-03-23 15:06:50 -07002245status_t ScreenshotClient::captureDisplay(DisplayId displayId,
chaviwe7b9f272020-08-18 16:08:59 -07002246 const sp<IScreenCaptureListener>& captureListener) {
chaviw93df2ea2019-04-30 16:45:12 -07002247 sp<ISurfaceComposer> s(ComposerService::getComposerService());
2248 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002249
Dominik Laskowskif1833852021-03-23 15:06:50 -07002250 return s->captureDisplay(displayId, captureListener);
chaviw93df2ea2019-04-30 16:45:12 -07002251}
2252
chaviw26c52482020-07-28 16:25:52 -07002253status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs,
chaviwe7b9f272020-08-18 16:08:59 -07002254 const sp<IScreenCaptureListener>& captureListener) {
chaviwa76b2712017-09-20 12:02:26 -07002255 sp<ISurfaceComposer> s(ComposerService::getComposerService());
Yi Kong48a619f2018-06-05 16:34:59 -07002256 if (s == nullptr) return NO_INIT;
chaviw8ffc7b82020-08-18 11:25:37 -07002257
chaviwe7b9f272020-08-18 16:08:59 -07002258 return s->captureLayers(captureArgs, captureListener);
chaviwa76b2712017-09-20 12:02:26 -07002259}
Dominik Laskowski718f9602019-11-09 20:01:35 -08002260
chaviw69058fb2021-09-27 09:37:30 -05002261// ---------------------------------------------------------------------------------
2262
2263void ReleaseCallbackThread::addReleaseCallback(const ReleaseCallbackId callbackId,
2264 sp<Fence> releaseFence) {
2265 std::scoped_lock<std::mutex> lock(mMutex);
2266 if (!mStarted) {
2267 mThread = std::thread(&ReleaseCallbackThread::threadMain, this);
2268 mStarted = true;
2269 }
2270
2271 mCallbackInfos.emplace(callbackId, std::move(releaseFence));
2272 mReleaseCallbackPending.notify_one();
2273}
2274
2275void ReleaseCallbackThread::threadMain() {
2276 const auto listener = TransactionCompletedListener::getInstance();
2277 std::queue<std::tuple<const ReleaseCallbackId, const sp<Fence>>> callbackInfos;
2278 while (true) {
2279 {
2280 std::unique_lock<std::mutex> lock(mMutex);
2281 callbackInfos = std::move(mCallbackInfos);
2282 mCallbackInfos = {};
2283 }
2284
2285 while (!callbackInfos.empty()) {
2286 auto [callbackId, releaseFence] = callbackInfos.front();
2287 listener->onReleaseBuffer(callbackId, std::move(releaseFence), UINT_MAX);
2288 callbackInfos.pop();
2289 }
2290
2291 {
2292 std::unique_lock<std::mutex> lock(mMutex);
2293 if (mCallbackInfos.size() == 0) {
2294 mReleaseCallbackPending.wait(lock);
2295 }
2296 }
2297 }
2298}
2299
Dominik Laskowski718f9602019-11-09 20:01:35 -08002300} // namespace android