blob: 1f3ee6129989dff0354aae92e8f542c7e6f0848c [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "SurfaceComposerClient"
18
19#include <stdint.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080020#include <sys/types.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080022#include <utils/Errors.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080023#include <utils/Log.h>
Mathias Agopiana67932f2011-04-20 14:20:59 -070024#include <utils/SortedVector.h>
25#include <utils/String8.h>
26#include <utils/threads.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080027
Mathias Agopiana67932f2011-04-20 14:20:59 -070028#include <binder/IServiceManager.h>
Mathias Agopian9cce3252010-02-09 17:46:37 -080029
Michael Wright28f24d02016-07-12 13:30:53 -070030#include <system/graphics.h>
31
Mathias Agopian076b1cc2009-04-10 14:24:30 -070032#include <ui/DisplayInfo.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080033
Robert Carr673134e2017-01-09 19:48:38 -080034#include <gui/BufferItemConsumer.h>
Mathias Agopianabe815d2013-03-19 22:22:21 -070035#include <gui/CpuConsumer.h>
Mathias Agopiane3c697f2013-02-14 17:11:02 -080036#include <gui/IGraphicBufferProducer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080037#include <gui/ISurfaceComposer.h>
38#include <gui/ISurfaceComposerClient.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070039#include <gui/LayerState.h>
Robert Carr0d480722017-01-10 16:42:54 -080040#include <gui/Surface.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080041#include <gui/SurfaceComposerClient.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080042
Mathias Agopian41f673c2011-11-17 17:48:35 -080043#include <private/gui/ComposerService.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080044
45namespace android {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080046// ---------------------------------------------------------------------------
47
Mathias Agopian7e27f052010-05-28 14:22:23 -070048ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
49
Mathias Agopianb7e930d2010-06-01 15:12:58 -070050ComposerService::ComposerService()
51: Singleton<ComposerService>() {
Andy McFadden6652b3e2012-09-06 18:45:56 -070052 Mutex::Autolock _l(mLock);
53 connectLocked();
54}
55
56void ComposerService::connectLocked() {
Mathias Agopianb7e930d2010-06-01 15:12:58 -070057 const String16 name("SurfaceFlinger");
58 while (getService(name, &mComposerService) != NO_ERROR) {
59 usleep(250000);
60 }
Andy McFadden6652b3e2012-09-06 18:45:56 -070061 assert(mComposerService != NULL);
62
63 // Create the death listener.
64 class DeathObserver : public IBinder::DeathRecipient {
65 ComposerService& mComposerService;
66 virtual void binderDied(const wp<IBinder>& who) {
67 ALOGW("ComposerService remote (surfaceflinger) died [%p]",
68 who.unsafe_get());
69 mComposerService.composerServiceDied();
70 }
71 public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070072 explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
Andy McFadden6652b3e2012-09-06 18:45:56 -070073 };
74
75 mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
Marco Nelissen2ea926b2014-11-14 08:01:01 -080076 IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
Mathias Agopianb7e930d2010-06-01 15:12:58 -070077}
78
Andy McFadden6652b3e2012-09-06 18:45:56 -070079/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
80 ComposerService& instance = ComposerService::getInstance();
81 Mutex::Autolock _l(instance.mLock);
82 if (instance.mComposerService == NULL) {
83 ComposerService::getInstance().connectLocked();
84 assert(instance.mComposerService != NULL);
85 ALOGD("ComposerService reconnected");
86 }
87 return instance.mComposerService;
88}
89
90void ComposerService::composerServiceDied()
91{
92 Mutex::Autolock _l(mLock);
93 mComposerService = NULL;
94 mDeathObserver = NULL;
Mathias Agopianb7e930d2010-06-01 15:12:58 -070095}
96
Mathias Agopian7e27f052010-05-28 14:22:23 -070097// ---------------------------------------------------------------------------
98
Robert Carr4cdc58f2017-08-23 14:22:20 -070099SurfaceComposerClient::Transaction::Transaction(const Transaction& other) :
100 mForceSynchronous(other.mForceSynchronous),
101 mTransactionNestCount(other.mTransactionNestCount),
102 mAnimation(other.mAnimation) {
103 mDisplayStates = other.mDisplayStates;
104 mComposerStates = other.mComposerStates;
Mathias Agopian698c0872011-06-28 19:09:31 -0700105}
106
Robert Carr2c5f6d22017-09-26 12:30:35 -0700107SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
chaviw8e3fe5d2018-02-22 10:55:42 -0800108 for (auto const& kv : other.mComposerStates) {
109 if (mComposerStates.count(kv.first) == 0) {
110 mComposerStates[kv.first] = kv.second;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700111 } else {
chaviw8e3fe5d2018-02-22 10:55:42 -0800112 mComposerStates[kv.first].state.merge(kv.second.state);
Robert Carr2c5f6d22017-09-26 12:30:35 -0700113 }
114 }
115 other.mComposerStates.clear();
116
117 for (auto const& state : other.mDisplayStates) {
118 ssize_t index = mDisplayStates.indexOf(state);
119 if (index < 0) {
120 mDisplayStates.add(state);
121 } else {
122 mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
123 }
124 }
125 other.mDisplayStates.clear();
126
127 return *this;
128}
129
Robert Carr4cdc58f2017-08-23 14:22:20 -0700130status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {
131 if (mStatus != NO_ERROR) {
132 return mStatus;
133 }
134
135 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
136
137 Vector<ComposerState> composerStates;
138 Vector<DisplayState> displayStates;
139 uint32_t flags = 0;
140
141 mForceSynchronous |= synchronous;
142
chaviw8e3fe5d2018-02-22 10:55:42 -0800143 for (auto const& kv : mComposerStates){
144 composerStates.add(kv.second);
145 }
146
Robert Carr4cdc58f2017-08-23 14:22:20 -0700147 mComposerStates.clear();
148
149 displayStates = mDisplayStates;
150 mDisplayStates.clear();
151
152 if (mForceSynchronous) {
153 flags |= ISurfaceComposer::eSynchronous;
154 }
155 if (mAnimation) {
156 flags |= ISurfaceComposer::eAnimation;
157 }
158
159 mForceSynchronous = false;
160 mAnimation = false;
161
162 sf->setTransactionState(composerStates, displayStates, flags);
163 mStatus = NO_ERROR;
164 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700165}
166
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800167// ---------------------------------------------------------------------------
168
Robert Carr4cdc58f2017-08-23 14:22:20 -0700169sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
Jamie Gennisdd3cb842012-10-19 18:19:11 -0700170 return ComposerService::getComposerService()->createDisplay(displayName,
171 secure);
Mathias Agopiane57f2922012-08-09 16:29:12 -0700172}
173
Robert Carr4cdc58f2017-08-23 14:22:20 -0700174void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
Jesse Hall6c913be2013-08-08 12:15:49 -0700175 return ComposerService::getComposerService()->destroyDisplay(display);
176}
177
Robert Carr4cdc58f2017-08-23 14:22:20 -0700178sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700179 return ComposerService::getComposerService()->getBuiltInDisplay(id);
180}
181
Robert Carr4cdc58f2017-08-23 14:22:20 -0700182void SurfaceComposerClient::Transaction::setAnimationTransaction() {
Jamie Gennis2d5e2302012-10-15 18:24:43 -0700183 mAnimation = true;
184}
185
chaviw763ef572018-02-22 16:04:57 -0800186layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
chaviw8e3fe5d2018-02-22 10:55:42 -0800187 if (mComposerStates.count(sc) == 0) {
Mathias Agopian698c0872011-06-28 19:09:31 -0700188 // we don't have it, add an initialized layer_state to our list
chaviw8e3fe5d2018-02-22 10:55:42 -0800189 ComposerState s;
190 s.client = sc->getClient()->mClient;
191 s.state.surface = sc->getHandle();
192 mComposerStates[sc] = s;
Mathias Agopian698c0872011-06-28 19:09:31 -0700193 }
194
chaviw8e3fe5d2018-02-22 10:55:42 -0800195 return &(mComposerStates[sc].state);
Mathias Agopian698c0872011-06-28 19:09:31 -0700196}
197
Robert Carr4cdc58f2017-08-23 14:22:20 -0700198SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
199 const sp<SurfaceControl>& sc, float x, float y) {
chaviw763ef572018-02-22 16:04:57 -0800200 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700201 if (!s) {
202 mStatus = BAD_INDEX;
203 return *this;
204 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700205 s->what |= layer_state_t::ePositionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700206 s->x = x;
207 s->y = y;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700208 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700209}
210
Robert Carr4cdc58f2017-08-23 14:22:20 -0700211SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
212 const sp<SurfaceControl>& sc) {
213 return setFlags(sc, 0, layer_state_t::eLayerHidden);
214}
215
216SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
217 const sp<SurfaceControl>& sc) {
218 return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
219}
220
221SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
222 const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
chaviw763ef572018-02-22 16:04:57 -0800223 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700224 if (!s) {
225 mStatus = BAD_INDEX;
226 return *this;
227 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700228 s->what |= layer_state_t::eSizeChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700229 s->w = w;
230 s->h = h;
Jamie Gennis28378392011-10-12 17:39:00 -0700231
Jorim Jaggi092123c2016-04-13 01:40:35 +0000232 // Resizing a surface makes the transaction synchronous.
233 mForceSynchronous = true;
234
Robert Carr4cdc58f2017-08-23 14:22:20 -0700235 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700236}
237
Robert Carr4cdc58f2017-08-23 14:22:20 -0700238SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
239 const sp<SurfaceControl>& sc, int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800240 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700241 if (!s) {
242 mStatus = BAD_INDEX;
243 return *this;
244 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700245 s->what |= layer_state_t::eLayerChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700246 s->z = z;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700247 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700248}
249
Robert Carr4cdc58f2017-08-23 14:22:20 -0700250SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(const sp<SurfaceControl>& sc, const sp<IBinder>& relativeTo,
Robert Carrdb66e622017-04-10 16:55:57 -0700251 int32_t z) {
chaviw763ef572018-02-22 16:04:57 -0800252 layer_state_t* s = getLayerState(sc);
Robert Carrdb66e622017-04-10 16:55:57 -0700253 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700254 mStatus = BAD_INDEX;
Robert Carrdb66e622017-04-10 16:55:57 -0700255 }
256 s->what |= layer_state_t::eRelativeLayerChanged;
257 s->relativeLayerHandle = relativeTo;
258 s->z = z;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700259 return *this;
Robert Carrdb66e622017-04-10 16:55:57 -0700260}
261
Robert Carr4cdc58f2017-08-23 14:22:20 -0700262SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
263 const sp<SurfaceControl>& sc, uint32_t flags,
Mathias Agopian698c0872011-06-28 19:09:31 -0700264 uint32_t mask) {
chaviw763ef572018-02-22 16:04:57 -0800265 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700266 if (!s) {
267 mStatus = BAD_INDEX;
268 return *this;
269 }
Pablo Ceballos53390e12015-08-04 11:25:59 -0700270 if ((mask & layer_state_t::eLayerOpaque) ||
271 (mask & layer_state_t::eLayerHidden) ||
272 (mask & layer_state_t::eLayerSecure)) {
Dan Stoza23116082015-06-18 14:58:39 -0700273 s->what |= layer_state_t::eFlagsChanged;
Andy McFadden4125a4f2014-01-29 17:17:11 -0800274 }
Mathias Agopian698c0872011-06-28 19:09:31 -0700275 s->flags &= ~mask;
276 s->flags |= (flags & mask);
277 s->mask |= mask;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700278 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700279}
280
Robert Carr4cdc58f2017-08-23 14:22:20 -0700281SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
282 const sp<SurfaceControl>& sc,
Mathias Agopian698c0872011-06-28 19:09:31 -0700283 const Region& transparentRegion) {
chaviw763ef572018-02-22 16:04:57 -0800284 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700285 if (!s) {
286 mStatus = BAD_INDEX;
287 return *this;
288 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700289 s->what |= layer_state_t::eTransparentRegionChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700290 s->transparentRegion = transparentRegion;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700291 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700292}
293
Robert Carr4cdc58f2017-08-23 14:22:20 -0700294SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
295 const sp<SurfaceControl>& sc, float alpha) {
chaviw763ef572018-02-22 16:04:57 -0800296 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700297 if (!s) {
298 mStatus = BAD_INDEX;
299 return *this;
300 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700301 s->what |= layer_state_t::eAlphaChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700302 s->alpha = alpha;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700303 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700304}
305
Robert Carr4cdc58f2017-08-23 14:22:20 -0700306SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
307 const sp<SurfaceControl>& sc, uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -0800308 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700309 if (!s) {
310 mStatus = BAD_INDEX;
311 return *this;
312 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700313 s->what |= layer_state_t::eLayerStackChanged;
Mathias Agopian87855782012-07-24 21:41:09 -0700314 s->layerStack = layerStack;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700315 return *this;
Mathias Agopian87855782012-07-24 21:41:09 -0700316}
317
Robert Carr4cdc58f2017-08-23 14:22:20 -0700318SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
319 const sp<SurfaceControl>& sc, float dsdx, float dtdx,
Robert Carrcb6e1e32017-02-21 19:48:26 -0800320 float dtdy, float dsdy) {
chaviw763ef572018-02-22 16:04:57 -0800321 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700322 if (!s) {
323 mStatus = BAD_INDEX;
324 return *this;
325 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700326 s->what |= layer_state_t::eMatrixChanged;
Mathias Agopian698c0872011-06-28 19:09:31 -0700327 layer_state_t::matrix22_t matrix;
328 matrix.dsdx = dsdx;
329 matrix.dtdx = dtdx;
330 matrix.dsdy = dsdy;
331 matrix.dtdy = dtdy;
332 s->matrix = matrix;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700333 return *this;
Mathias Agopian698c0872011-06-28 19:09:31 -0700334}
335
Robert Carr4cdc58f2017-08-23 14:22:20 -0700336SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
337 const sp<SurfaceControl>& sc, const Rect& crop) {
chaviw763ef572018-02-22 16:04:57 -0800338 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700339 if (!s) {
340 mStatus = BAD_INDEX;
341 return *this;
342 }
Mathias Agopian3165cc22012-08-08 19:42:09 -0700343 s->what |= layer_state_t::eCropChanged;
Jamie Gennisf15a83f2012-05-10 20:43:55 -0700344 s->crop = crop;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700345 return *this;
Jamie Gennisf15a83f2012-05-10 20:43:55 -0700346}
347
Robert Carr4cdc58f2017-08-23 14:22:20 -0700348SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFinalCrop(const sp<SurfaceControl>& sc, const Rect& crop) {
chaviw763ef572018-02-22 16:04:57 -0800349 layer_state_t* s = getLayerState(sc);
Pablo Ceballosacbe6782016-03-04 17:54:21 +0000350 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700351 mStatus = BAD_INDEX;
352 return *this;
Pablo Ceballosacbe6782016-03-04 17:54:21 +0000353 }
354 s->what |= layer_state_t::eFinalCropChanged;
355 s->finalCrop = crop;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700356 return *this;
Pablo Ceballosacbe6782016-03-04 17:54:21 +0000357}
358
Robert Carr4cdc58f2017-08-23 14:22:20 -0700359SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil(
360 const sp<SurfaceControl>& sc,
Dan Stoza7dde5992015-05-22 09:51:44 -0700361 const sp<IBinder>& handle, uint64_t frameNumber) {
chaviw763ef572018-02-22 16:04:57 -0800362 layer_state_t* s = getLayerState(sc);
Dan Stoza7dde5992015-05-22 09:51:44 -0700363 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700364 mStatus = BAD_INDEX;
365 return *this;
Dan Stoza7dde5992015-05-22 09:51:44 -0700366 }
367 s->what |= layer_state_t::eDeferTransaction;
Robert Carr0d480722017-01-10 16:42:54 -0800368 s->barrierHandle = handle;
369 s->frameNumber = frameNumber;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700370 return *this;
Robert Carr0d480722017-01-10 16:42:54 -0800371}
372
Robert Carr4cdc58f2017-08-23 14:22:20 -0700373SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil(
374 const sp<SurfaceControl>& sc,
Robert Carr0d480722017-01-10 16:42:54 -0800375 const sp<Surface>& barrierSurface, uint64_t frameNumber) {
chaviw763ef572018-02-22 16:04:57 -0800376 layer_state_t* s = getLayerState(sc);
Robert Carr0d480722017-01-10 16:42:54 -0800377 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700378 mStatus = BAD_INDEX;
379 return *this;
Robert Carr0d480722017-01-10 16:42:54 -0800380 }
381 s->what |= layer_state_t::eDeferTransaction;
382 s->barrierGbp = barrierSurface->getIGraphicBufferProducer();
Dan Stoza7dde5992015-05-22 09:51:44 -0700383 s->frameNumber = frameNumber;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700384 return *this;
Dan Stoza7dde5992015-05-22 09:51:44 -0700385}
386
Robert Carr4cdc58f2017-08-23 14:22:20 -0700387SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparentChildren(
388 const sp<SurfaceControl>& sc,
Robert Carr1db73f62016-12-21 12:58:51 -0800389 const sp<IBinder>& newParentHandle) {
chaviw763ef572018-02-22 16:04:57 -0800390 layer_state_t* s = getLayerState(sc);
Robert Carr1db73f62016-12-21 12:58:51 -0800391 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700392 mStatus = BAD_INDEX;
393 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -0800394 }
395 s->what |= layer_state_t::eReparentChildren;
396 s->reparentHandle = newParentHandle;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700397 return *this;
Robert Carr1db73f62016-12-21 12:58:51 -0800398}
399
Robert Carr4cdc58f2017-08-23 14:22:20 -0700400SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
401 const sp<SurfaceControl>& sc,
chaviwf1961f72017-09-18 16:41:07 -0700402 const sp<IBinder>& newParentHandle) {
chaviw763ef572018-02-22 16:04:57 -0800403 layer_state_t* s = getLayerState(sc);
chaviw06178942017-07-27 10:25:59 -0700404 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700405 mStatus = BAD_INDEX;
406 return *this;
chaviw06178942017-07-27 10:25:59 -0700407 }
chaviwf1961f72017-09-18 16:41:07 -0700408 s->what |= layer_state_t::eReparent;
chaviw06178942017-07-27 10:25:59 -0700409 s->parentHandleForChild = newParentHandle;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700410 return *this;
chaviw06178942017-07-27 10:25:59 -0700411}
412
Robert Carr4cdc58f2017-08-23 14:22:20 -0700413SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
414 const sp<SurfaceControl>& sc,
415 const half3& color) {
chaviw763ef572018-02-22 16:04:57 -0800416 layer_state_t* s = getLayerState(sc);
Robert Carr9524cb32017-02-13 11:32:32 -0800417 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700418 mStatus = BAD_INDEX;
419 return *this;
420 }
421 s->what |= layer_state_t::eColorChanged;
422 s->color = color;
423 return *this;
424}
425
426SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::detachChildren(
427 const sp<SurfaceControl>& sc) {
chaviw763ef572018-02-22 16:04:57 -0800428 layer_state_t* s = getLayerState(sc);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700429 if (!s) {
430 mStatus = BAD_INDEX;
Robert Carr9524cb32017-02-13 11:32:32 -0800431 }
432 s->what |= layer_state_t::eDetachChildren;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700433 return *this;
Robert Carr9524cb32017-02-13 11:32:32 -0800434}
435
Robert Carr4cdc58f2017-08-23 14:22:20 -0700436SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setOverrideScalingMode(
437 const sp<SurfaceControl>& sc, int32_t overrideScalingMode) {
chaviw763ef572018-02-22 16:04:57 -0800438 layer_state_t* s = getLayerState(sc);
Robert Carrc3574f72016-03-24 12:19:32 -0700439 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700440 mStatus = BAD_INDEX;
441 return *this;
Robert Carrc3574f72016-03-24 12:19:32 -0700442 }
443
444 switch (overrideScalingMode) {
445 case NATIVE_WINDOW_SCALING_MODE_FREEZE:
446 case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
447 case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP:
448 case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP:
449 case -1:
450 break;
451 default:
452 ALOGE("unknown scaling mode: %d",
453 overrideScalingMode);
Robert Carr4cdc58f2017-08-23 14:22:20 -0700454 mStatus = BAD_VALUE;
455 return *this;
Robert Carrc3574f72016-03-24 12:19:32 -0700456 }
457
458 s->what |= layer_state_t::eOverrideScalingModeChanged;
459 s->overrideScalingMode = overrideScalingMode;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700460 return *this;
Robert Carrc3574f72016-03-24 12:19:32 -0700461}
462
Robert Carr4cdc58f2017-08-23 14:22:20 -0700463SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometryAppliesWithResize(
464 const sp<SurfaceControl>& sc) {
chaviw763ef572018-02-22 16:04:57 -0800465 layer_state_t* s = getLayerState(sc);
Robert Carr82364e32016-05-15 11:27:47 -0700466 if (!s) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700467 mStatus = BAD_INDEX;
468 return *this;
Robert Carr82364e32016-05-15 11:27:47 -0700469 }
Robert Carr99e27f02016-06-16 15:18:02 -0700470 s->what |= layer_state_t::eGeometryAppliesWithResize;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700471 return *this;
Robert Carr82364e32016-05-15 11:27:47 -0700472}
473
chaviwca27f252018-02-06 16:46:39 -0800474SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::destroySurface(
475 const sp<SurfaceControl>& sc) {
chaviw763ef572018-02-22 16:04:57 -0800476 layer_state_t* s = getLayerState(sc);
chaviwca27f252018-02-06 16:46:39 -0800477 if (!s) {
478 mStatus = BAD_INDEX;
479 return *this;
480 }
481 s->what |= layer_state_t::eDestroySurface;
482 return *this;
483}
484
Mathias Agopian698c0872011-06-28 19:09:31 -0700485// ---------------------------------------------------------------------------
486
chaviw763ef572018-02-22 16:04:57 -0800487DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
Mathias Agopiane57f2922012-08-09 16:29:12 -0700488 DisplayState s;
489 s.token = token;
490 ssize_t index = mDisplayStates.indexOf(s);
491 if (index < 0) {
492 // we don't have it, add an initialized layer_state to our list
493 s.what = 0;
494 index = mDisplayStates.add(s);
495 }
Dan Stozad723bd72014-11-18 10:24:03 -0800496 return mDisplayStates.editItemAt(static_cast<size_t>(index));
Mathias Agopiane57f2922012-08-09 16:29:12 -0700497}
498
Robert Carr4cdc58f2017-08-23 14:22:20 -0700499status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
500 const sp<IGraphicBufferProducer>& bufferProducer) {
Pablo Ceballoseddbef82016-09-01 11:21:21 -0700501 if (bufferProducer.get() != nullptr) {
502 // Make sure that composition can never be stalled by a virtual display
503 // consumer that isn't processing buffers fast enough.
504 status_t err = bufferProducer->setAsyncMode(true);
505 if (err != NO_ERROR) {
506 ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
507 "BufferQueue. This BufferQueue cannot be used for virtual "
508 "display. (%d)", err);
509 return err;
510 }
Pablo Ceballos1aad24c2016-08-04 10:24:22 -0700511 }
chaviw763ef572018-02-22 16:04:57 -0800512 DisplayState& s(getDisplayState(token));
Andy McFadden2adaf042012-12-18 09:49:45 -0800513 s.surface = bufferProducer;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700514 s.what |= DisplayState::eSurfaceChanged;
Pablo Ceballos1aad24c2016-08-04 10:24:22 -0700515 return NO_ERROR;
Mathias Agopiane57f2922012-08-09 16:29:12 -0700516}
517
Robert Carr4cdc58f2017-08-23 14:22:20 -0700518void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
Mathias Agopiane57f2922012-08-09 16:29:12 -0700519 uint32_t layerStack) {
chaviw763ef572018-02-22 16:04:57 -0800520 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -0700521 s.layerStack = layerStack;
522 s.what |= DisplayState::eLayerStackChanged;
523}
524
Robert Carr4cdc58f2017-08-23 14:22:20 -0700525void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
Mathias Agopian00e8c7a2012-09-04 19:30:46 -0700526 uint32_t orientation,
527 const Rect& layerStackRect,
528 const Rect& displayRect) {
chaviw763ef572018-02-22 16:04:57 -0800529 DisplayState& s(getDisplayState(token));
Mathias Agopiane57f2922012-08-09 16:29:12 -0700530 s.orientation = orientation;
Mathias Agopian00e8c7a2012-09-04 19:30:46 -0700531 s.viewport = layerStackRect;
532 s.frame = displayRect;
533 s.what |= DisplayState::eDisplayProjectionChanged;
Jorim Jaggi092123c2016-04-13 01:40:35 +0000534 mForceSynchronous = true; // TODO: do we actually still need this?
Mathias Agopiane57f2922012-08-09 16:29:12 -0700535}
536
Robert Carr4cdc58f2017-08-23 14:22:20 -0700537void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
chaviw763ef572018-02-22 16:04:57 -0800538 DisplayState& s(getDisplayState(token));
Michael Wright1f6078a2014-06-26 16:01:02 -0700539 s.width = width;
540 s.height = height;
541 s.what |= DisplayState::eDisplaySizeChanged;
542}
543
Mathias Agopiane57f2922012-08-09 16:29:12 -0700544// ---------------------------------------------------------------------------
545
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800546SurfaceComposerClient::SurfaceComposerClient()
Robert Carr4cdc58f2017-08-23 14:22:20 -0700547 : mStatus(NO_INIT)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800548{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800549}
550
Robert Carr1db73f62016-12-21 12:58:51 -0800551SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root)
Robert Carr4cdc58f2017-08-23 14:22:20 -0700552 : mStatus(NO_INIT), mParent(root)
Robert Carr1db73f62016-12-21 12:58:51 -0800553{
554}
555
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +0100556SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
557 : mStatus(NO_ERROR), mClient(client)
558{
559}
560
Mathias Agopian698c0872011-06-28 19:09:31 -0700561void SurfaceComposerClient::onFirstRef() {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700562 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Jorim Jaggif3cf4bc2017-11-30 14:19:23 +0100563 if (sf != 0 && mStatus == NO_INIT) {
Robert Carr1db73f62016-12-21 12:58:51 -0800564 auto rootProducer = mParent.promote();
565 sp<ISurfaceComposerClient> conn;
Robert Carr4cdc58f2017-08-23 14:22:20 -0700566 conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) :
567 sf->createConnection();
Mathias Agopiand4784a32010-05-27 19:41:15 -0700568 if (conn != 0) {
569 mClient = conn;
Mathias Agopiand4784a32010-05-27 19:41:15 -0700570 mStatus = NO_ERROR;
571 }
572 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800573}
574
Mathias Agopian698c0872011-06-28 19:09:31 -0700575SurfaceComposerClient::~SurfaceComposerClient() {
Mathias Agopian631f3582010-05-25 17:51:34 -0700576 dispose();
577}
Mathias Agopiandd3423c2009-09-23 15:44:05 -0700578
Mathias Agopian698c0872011-06-28 19:09:31 -0700579status_t SurfaceComposerClient::initCheck() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800580 return mStatus;
581}
582
Mathias Agopian698c0872011-06-28 19:09:31 -0700583sp<IBinder> SurfaceComposerClient::connection() const {
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800584 return IInterface::asBinder(mClient);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800585}
586
Mathias Agopiand4784a32010-05-27 19:41:15 -0700587status_t SurfaceComposerClient::linkToComposerDeath(
588 const sp<IBinder::DeathRecipient>& recipient,
Mathias Agopian698c0872011-06-28 19:09:31 -0700589 void* cookie, uint32_t flags) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700590 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
591 return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800592}
593
Mathias Agopian698c0872011-06-28 19:09:31 -0700594void SurfaceComposerClient::dispose() {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800595 // this can be called more than once.
Mathias Agopian7e27f052010-05-28 14:22:23 -0700596 sp<ISurfaceComposerClient> client;
Mathias Agopiand4784a32010-05-27 19:41:15 -0700597 Mutex::Autolock _lm(mLock);
598 if (mClient != 0) {
Mathias Agopiand4784a32010-05-27 19:41:15 -0700599 client = mClient; // hold ref while lock is held
600 mClient.clear();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800601 }
Mathias Agopiand4784a32010-05-27 19:41:15 -0700602 mStatus = NO_INIT;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800603}
604
Mathias Agopian698c0872011-06-28 19:09:31 -0700605sp<SurfaceControl> SurfaceComposerClient::createSurface(
Mathias Agopian698c0872011-06-28 19:09:31 -0700606 const String8& name,
Mathias Agopian698c0872011-06-28 19:09:31 -0700607 uint32_t w,
608 uint32_t h,
609 PixelFormat format,
Robert Carr1f0a16a2016-10-24 16:27:39 -0700610 uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -0500611 SurfaceControl* parent,
612 uint32_t windowType,
613 uint32_t ownerUid)
Mathias Agopian698c0872011-06-28 19:09:31 -0700614{
Robert Carr3b382ed2018-03-14 13:49:41 -0700615 sp<SurfaceControl> s;
616 createSurfaceChecked(name, w, h, format, &s, flags, parent, windowType, ownerUid);
617 return s;
618}
619
620status_t SurfaceComposerClient::createSurfaceChecked(
621 const String8& name,
622 uint32_t w,
623 uint32_t h,
624 PixelFormat format,
625 sp<SurfaceControl>* outSurface,
626 uint32_t flags,
627 SurfaceControl* parent,
628 uint32_t windowType,
629 uint32_t ownerUid)
630{
Mathias Agopian4d9b8222013-03-12 17:11:48 -0700631 sp<SurfaceControl> sur;
Robert Carr740eaf02018-03-27 12:59:18 -0700632 status_t err = mStatus;
Robert Carr3b382ed2018-03-14 13:49:41 -0700633
Mathias Agopian698c0872011-06-28 19:09:31 -0700634 if (mStatus == NO_ERROR) {
Mathias Agopian4d9b8222013-03-12 17:11:48 -0700635 sp<IBinder> handle;
Robert Carr1f0a16a2016-10-24 16:27:39 -0700636 sp<IBinder> parentHandle;
Mathias Agopian4d9b8222013-03-12 17:11:48 -0700637 sp<IGraphicBufferProducer> gbp;
Robert Carr1f0a16a2016-10-24 16:27:39 -0700638
639 if (parent != nullptr) {
640 parentHandle = parent->getHandle();
641 }
Robert Carr3b382ed2018-03-14 13:49:41 -0700642 err = mClient->createSurface(name, w, h, format, flags, parentHandle,
Albert Chaulk479c60c2017-01-27 14:21:34 -0500643 windowType, ownerUid, &handle, &gbp);
Mathias Agopian4d9b8222013-03-12 17:11:48 -0700644 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
645 if (err == NO_ERROR) {
Robert Carr3b382ed2018-03-14 13:49:41 -0700646 *outSurface = new SurfaceControl(this, handle, gbp, true /* owned */);
Mathias Agopian698c0872011-06-28 19:09:31 -0700647 }
648 }
Robert Carr3b382ed2018-03-14 13:49:41 -0700649 return err;
Mathias Agopian698c0872011-06-28 19:09:31 -0700650}
651
Mathias Agopianac9fa422013-02-11 16:40:36 -0800652status_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) {
Mathias Agopian698c0872011-06-28 19:09:31 -0700653 if (mStatus != NO_ERROR)
654 return mStatus;
655 status_t err = mClient->destroySurface(sid);
656 return err;
657}
658
Svetoslavd85084b2014-03-20 10:28:31 -0700659status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
660 if (mStatus != NO_ERROR) {
661 return mStatus;
662 }
663 return mClient->clearLayerFrameStats(token);
664}
665
666status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
667 FrameStats* outStats) const {
668 if (mStatus != NO_ERROR) {
669 return mStatus;
670 }
671 return mClient->getLayerFrameStats(token, outStats);
672}
673
Mathias Agopian698c0872011-06-28 19:09:31 -0700674// ----------------------------------------------------------------------------
675
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700676status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700677 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
678 return sf->enableVSyncInjections(enable);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700679}
680
681status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
Robert Carr4cdc58f2017-08-23 14:22:20 -0700682 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
683 return sf->injectVSync(when);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700684}
685
Dan Stoza7f7da322014-05-02 15:26:25 -0700686status_t SurfaceComposerClient::getDisplayConfigs(
687 const sp<IBinder>& display, Vector<DisplayInfo>* configs)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800688{
Dan Stoza7f7da322014-05-02 15:26:25 -0700689 return ComposerService::getComposerService()->getDisplayConfigs(display, configs);
690}
691
692status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display,
693 DisplayInfo* info) {
694 Vector<DisplayInfo> configs;
695 status_t result = getDisplayConfigs(display, &configs);
696 if (result != NO_ERROR) {
697 return result;
698 }
699
700 int activeId = getActiveConfig(display);
701 if (activeId < 0) {
702 ALOGE("No active configuration found");
703 return NAME_NOT_FOUND;
704 }
705
Dan Stozad723bd72014-11-18 10:24:03 -0800706 *info = configs[static_cast<size_t>(activeId)];
Dan Stoza7f7da322014-05-02 15:26:25 -0700707 return NO_ERROR;
708}
709
710int SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) {
711 return ComposerService::getComposerService()->getActiveConfig(display);
712}
713
714status_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) {
715 return ComposerService::getComposerService()->setActiveConfig(display, id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800716}
717
Michael Wright28f24d02016-07-12 13:30:53 -0700718status_t SurfaceComposerClient::getDisplayColorModes(const sp<IBinder>& display,
Peiyong Lina52f0292018-03-14 17:26:31 -0700719 Vector<ColorMode>* outColorModes) {
Michael Wright28f24d02016-07-12 13:30:53 -0700720 return ComposerService::getComposerService()->getDisplayColorModes(display, outColorModes);
721}
722
Peiyong Lina52f0292018-03-14 17:26:31 -0700723ColorMode SurfaceComposerClient::getActiveColorMode(const sp<IBinder>& display) {
Michael Wright28f24d02016-07-12 13:30:53 -0700724 return ComposerService::getComposerService()->getActiveColorMode(display);
725}
726
727status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
Peiyong Lina52f0292018-03-14 17:26:31 -0700728 ColorMode colorMode) {
Michael Wright28f24d02016-07-12 13:30:53 -0700729 return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
730}
731
Prashant Malani2c9b11f2014-05-25 01:36:31 -0700732void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
733 int mode) {
734 ComposerService::getComposerService()->setPowerMode(token, mode);
Jeff Brown2a09bb32012-10-08 19:13:57 -0700735}
736
Svetoslavd85084b2014-03-20 10:28:31 -0700737status_t SurfaceComposerClient::clearAnimationFrameStats() {
738 return ComposerService::getComposerService()->clearAnimationFrameStats();
739}
740
741status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
742 return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
743}
744
Dan Stozac4f471e2016-03-24 09:31:08 -0700745status_t SurfaceComposerClient::getHdrCapabilities(const sp<IBinder>& display,
746 HdrCapabilities* outCapabilities) {
747 return ComposerService::getComposerService()->getHdrCapabilities(display,
748 outCapabilities);
749}
750
Mathias Agopian698c0872011-06-28 19:09:31 -0700751// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800752
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000753status_t ScreenshotClient::capture(const sp<IBinder>& display, Rect sourceCrop, uint32_t reqWidth,
754 uint32_t reqHeight, int32_t minLayerZ, int32_t maxLayerZ,
755 bool useIdentityTransform, uint32_t rotation,
756 sp<GraphicBuffer>* outBuffer) {
Mathias Agopian2a9fc492013-03-01 13:42:57 -0800757 sp<ISurfaceComposer> s(ComposerService::getComposerService());
758 if (s == NULL) return NO_INIT;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000759 status_t ret = s->captureScreen(display, outBuffer, sourceCrop, reqWidth, reqHeight, minLayerZ,
760 maxLayerZ, useIdentityTransform,
761 static_cast<ISurfaceComposer::Rotation>(rotation));
Robert Carr673134e2017-01-09 19:48:38 -0800762 if (ret != NO_ERROR) {
763 return ret;
764 }
Robert Carr673134e2017-01-09 19:48:38 -0800765 return ret;
766}
767
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000768status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, Rect sourceCrop,
769 float frameScale, sp<GraphicBuffer>* outBuffer) {
chaviwa76b2712017-09-20 12:02:26 -0700770 sp<ISurfaceComposer> s(ComposerService::getComposerService());
771 if (s == NULL) return NO_INIT;
Robert Carr578038f2018-03-09 12:25:24 -0800772 status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale,
773 false /* childrenOnly */);
774 return ret;
775}
776
777status_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle, Rect sourceCrop,
778 float frameScale, sp<GraphicBuffer>* outBuffer) {
779 sp<ISurfaceComposer> s(ComposerService::getComposerService());
780 if (s == NULL) return NO_INIT;
781 status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale,
782 true /* childrenOnly */);
chaviw7206d492017-11-10 16:16:12 -0800783 return ret;
chaviwa76b2712017-09-20 12:02:26 -0700784}
Mathias Agopian74c40c02010-09-29 13:02:36 -0700785// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800786}; // namespace android