xref: /aosp_15_r20/frameworks/native/libs/gui/SurfaceControl.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2007 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "SurfaceControl"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <errno.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <sys/types.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <sys/stat.h>
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker #include <android/native_window.h>
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <utils/Log.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <utils/Looper.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <utils/threads.h>
31*38e8c45fSAndroid Build Coastguard Worker 
32*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker #include <ui/GraphicBuffer.h>
35*38e8c45fSAndroid Build Coastguard Worker #include <ui/Rect.h>
36*38e8c45fSAndroid Build Coastguard Worker #include <ui/StaticDisplayInfo.h>
37*38e8c45fSAndroid Build Coastguard Worker 
38*38e8c45fSAndroid Build Coastguard Worker #include <gui/BLASTBufferQueue.h>
39*38e8c45fSAndroid Build Coastguard Worker #include <gui/BufferQueueCore.h>
40*38e8c45fSAndroid Build Coastguard Worker #include <gui/Choreographer.h>
41*38e8c45fSAndroid Build Coastguard Worker #include <gui/ISurfaceComposer.h>
42*38e8c45fSAndroid Build Coastguard Worker #include <gui/Surface.h>
43*38e8c45fSAndroid Build Coastguard Worker #include <gui/SurfaceComposerClient.h>
44*38e8c45fSAndroid Build Coastguard Worker #include <gui/SurfaceControl.h>
45*38e8c45fSAndroid Build Coastguard Worker #include <private/gui/ParcelUtils.h>
46*38e8c45fSAndroid Build Coastguard Worker 
47*38e8c45fSAndroid Build Coastguard Worker namespace android {
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker // ============================================================================
50*38e8c45fSAndroid Build Coastguard Worker //  SurfaceControl
51*38e8c45fSAndroid Build Coastguard Worker // ============================================================================
52*38e8c45fSAndroid Build Coastguard Worker 
SurfaceControl(const sp<SurfaceComposerClient> & client,const sp<IBinder> & handle,int32_t layerId,const std::string & name,uint32_t w,uint32_t h,PixelFormat format,uint32_t transform,uint32_t flags)53*38e8c45fSAndroid Build Coastguard Worker SurfaceControl::SurfaceControl(const sp<SurfaceComposerClient>& client, const sp<IBinder>& handle,
54*38e8c45fSAndroid Build Coastguard Worker                                int32_t layerId, const std::string& name, uint32_t w, uint32_t h,
55*38e8c45fSAndroid Build Coastguard Worker                                PixelFormat format, uint32_t transform, uint32_t flags)
56*38e8c45fSAndroid Build Coastguard Worker       : mClient(client),
57*38e8c45fSAndroid Build Coastguard Worker         mHandle(handle),
58*38e8c45fSAndroid Build Coastguard Worker         mLayerId(layerId),
59*38e8c45fSAndroid Build Coastguard Worker         mName(name),
60*38e8c45fSAndroid Build Coastguard Worker         mTransformHint(transform),
61*38e8c45fSAndroid Build Coastguard Worker         mWidth(w),
62*38e8c45fSAndroid Build Coastguard Worker         mHeight(h),
63*38e8c45fSAndroid Build Coastguard Worker         mFormat(format),
64*38e8c45fSAndroid Build Coastguard Worker         mCreateFlags(flags) {}
65*38e8c45fSAndroid Build Coastguard Worker 
SurfaceControl(const sp<SurfaceControl> & other)66*38e8c45fSAndroid Build Coastguard Worker SurfaceControl::SurfaceControl(const sp<SurfaceControl>& other) {
67*38e8c45fSAndroid Build Coastguard Worker     mClient = other->mClient;
68*38e8c45fSAndroid Build Coastguard Worker     mHandle = other->mHandle;
69*38e8c45fSAndroid Build Coastguard Worker     mTransformHint = other->mTransformHint;
70*38e8c45fSAndroid Build Coastguard Worker     mLayerId = other->mLayerId;
71*38e8c45fSAndroid Build Coastguard Worker     mName = other->mName;
72*38e8c45fSAndroid Build Coastguard Worker     mWidth = other->mWidth;
73*38e8c45fSAndroid Build Coastguard Worker     mHeight = other->mHeight;
74*38e8c45fSAndroid Build Coastguard Worker     mFormat = other->mFormat;
75*38e8c45fSAndroid Build Coastguard Worker     mCreateFlags = other->mCreateFlags;
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker 
~SurfaceControl()78*38e8c45fSAndroid Build Coastguard Worker SurfaceControl::~SurfaceControl()
79*38e8c45fSAndroid Build Coastguard Worker {
80*38e8c45fSAndroid Build Coastguard Worker     // Trigger an IPC now, to make sure things
81*38e8c45fSAndroid Build Coastguard Worker     // happen without delay, since these resources are quite heavy.
82*38e8c45fSAndroid Build Coastguard Worker     mClient.clear();
83*38e8c45fSAndroid Build Coastguard Worker     mHandle.clear();
84*38e8c45fSAndroid Build Coastguard Worker     mBbq.clear();
85*38e8c45fSAndroid Build Coastguard Worker     IPCThreadState::self()->flushCommands();
86*38e8c45fSAndroid Build Coastguard Worker }
87*38e8c45fSAndroid Build Coastguard Worker 
disconnect()88*38e8c45fSAndroid Build Coastguard Worker void SurfaceControl::disconnect() {
89*38e8c45fSAndroid Build Coastguard Worker     if (getIGraphicBufferProducer() != nullptr) {
90*38e8c45fSAndroid Build Coastguard Worker         getIGraphicBufferProducer()->disconnect(
91*38e8c45fSAndroid Build Coastguard Worker                 BufferQueueCore::CURRENTLY_CONNECTED_API);
92*38e8c45fSAndroid Build Coastguard Worker     }
93*38e8c45fSAndroid Build Coastguard Worker }
94*38e8c45fSAndroid Build Coastguard Worker 
isSameSurface(const sp<SurfaceControl> & lhs,const sp<SurfaceControl> & rhs)95*38e8c45fSAndroid Build Coastguard Worker bool SurfaceControl::isSameSurface(
96*38e8c45fSAndroid Build Coastguard Worker         const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs)
97*38e8c45fSAndroid Build Coastguard Worker {
98*38e8c45fSAndroid Build Coastguard Worker     if (lhs == nullptr || rhs == nullptr)
99*38e8c45fSAndroid Build Coastguard Worker         return false;
100*38e8c45fSAndroid Build Coastguard Worker     return lhs->mHandle == rhs->mHandle;
101*38e8c45fSAndroid Build Coastguard Worker }
102*38e8c45fSAndroid Build Coastguard Worker 
clearLayerFrameStats() const103*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::clearLayerFrameStats() const {
104*38e8c45fSAndroid Build Coastguard Worker     status_t err = validate();
105*38e8c45fSAndroid Build Coastguard Worker     if (err != NO_ERROR) return err;
106*38e8c45fSAndroid Build Coastguard Worker     const sp<SurfaceComposerClient>& client(mClient);
107*38e8c45fSAndroid Build Coastguard Worker     return client->clearLayerFrameStats(mHandle);
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker 
getLayerFrameStats(FrameStats * outStats) const110*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::getLayerFrameStats(FrameStats* outStats) const {
111*38e8c45fSAndroid Build Coastguard Worker     status_t err = validate();
112*38e8c45fSAndroid Build Coastguard Worker     if (err != NO_ERROR) return err;
113*38e8c45fSAndroid Build Coastguard Worker     const sp<SurfaceComposerClient>& client(mClient);
114*38e8c45fSAndroid Build Coastguard Worker     return client->getLayerFrameStats(mHandle, outStats);
115*38e8c45fSAndroid Build Coastguard Worker }
116*38e8c45fSAndroid Build Coastguard Worker 
validate() const117*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::validate() const
118*38e8c45fSAndroid Build Coastguard Worker {
119*38e8c45fSAndroid Build Coastguard Worker     if (mHandle==nullptr || mClient==nullptr) {
120*38e8c45fSAndroid Build Coastguard Worker         ALOGE("invalid handle (%p) or client (%p)",
121*38e8c45fSAndroid Build Coastguard Worker                 mHandle.get(), mClient.get());
122*38e8c45fSAndroid Build Coastguard Worker         return NO_INIT;
123*38e8c45fSAndroid Build Coastguard Worker     }
124*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker 
writeSurfaceToParcel(const sp<SurfaceControl> & control,Parcel * parcel)127*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::writeSurfaceToParcel(
128*38e8c45fSAndroid Build Coastguard Worker         const sp<SurfaceControl>& control, Parcel* parcel)
129*38e8c45fSAndroid Build Coastguard Worker {
130*38e8c45fSAndroid Build Coastguard Worker     sp<IGraphicBufferProducer> bp;
131*38e8c45fSAndroid Build Coastguard Worker     if (control != nullptr) {
132*38e8c45fSAndroid Build Coastguard Worker         bp = control->getIGraphicBufferProducer();
133*38e8c45fSAndroid Build Coastguard Worker     }
134*38e8c45fSAndroid Build Coastguard Worker     return parcel->writeStrongBinder(IInterface::asBinder(bp));
135*38e8c45fSAndroid Build Coastguard Worker }
136*38e8c45fSAndroid Build Coastguard Worker 
generateSurfaceLocked()137*38e8c45fSAndroid Build Coastguard Worker sp<Surface> SurfaceControl::generateSurfaceLocked()
138*38e8c45fSAndroid Build Coastguard Worker {
139*38e8c45fSAndroid Build Coastguard Worker     uint32_t ignore;
140*38e8c45fSAndroid Build Coastguard Worker     auto flags = mCreateFlags & (ISurfaceComposerClient::eCursorWindow |
141*38e8c45fSAndroid Build Coastguard Worker                                  ISurfaceComposerClient::eOpaque);
142*38e8c45fSAndroid Build Coastguard Worker     mBbqChild = mClient->createSurface(String8::format("[BBQ] %s", mName.c_str()), 0, 0, mFormat,
143*38e8c45fSAndroid Build Coastguard Worker                                        flags, mHandle, {}, &ignore);
144*38e8c45fSAndroid Build Coastguard Worker     mBbq = sp<BLASTBufferQueue>::make("[BBQ]" + mName, mBbqChild, mWidth, mHeight, mFormat);
145*38e8c45fSAndroid Build Coastguard Worker 
146*38e8c45fSAndroid Build Coastguard Worker     // This surface is always consumed by SurfaceFlinger, so the
147*38e8c45fSAndroid Build Coastguard Worker     // producerControlledByApp value doesn't matter; using false.
148*38e8c45fSAndroid Build Coastguard Worker     mSurfaceData = mBbq->getSurface(true);
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     return mSurfaceData;
151*38e8c45fSAndroid Build Coastguard Worker }
152*38e8c45fSAndroid Build Coastguard Worker 
getSurface()153*38e8c45fSAndroid Build Coastguard Worker sp<Surface> SurfaceControl::getSurface()
154*38e8c45fSAndroid Build Coastguard Worker {
155*38e8c45fSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
156*38e8c45fSAndroid Build Coastguard Worker     if (mSurfaceData == nullptr) {
157*38e8c45fSAndroid Build Coastguard Worker         return generateSurfaceLocked();
158*38e8c45fSAndroid Build Coastguard Worker     }
159*38e8c45fSAndroid Build Coastguard Worker     return mSurfaceData;
160*38e8c45fSAndroid Build Coastguard Worker }
161*38e8c45fSAndroid Build Coastguard Worker 
createSurface()162*38e8c45fSAndroid Build Coastguard Worker sp<Surface> SurfaceControl::createSurface()
163*38e8c45fSAndroid Build Coastguard Worker {
164*38e8c45fSAndroid Build Coastguard Worker     return getSurface();
165*38e8c45fSAndroid Build Coastguard Worker }
166*38e8c45fSAndroid Build Coastguard Worker 
updateDefaultBufferSize(uint32_t width,uint32_t height)167*38e8c45fSAndroid Build Coastguard Worker void SurfaceControl::updateDefaultBufferSize(uint32_t width, uint32_t height) {
168*38e8c45fSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
169*38e8c45fSAndroid Build Coastguard Worker     mWidth = width;
170*38e8c45fSAndroid Build Coastguard Worker     mHeight = height;
171*38e8c45fSAndroid Build Coastguard Worker     if (mBbq) {
172*38e8c45fSAndroid Build Coastguard Worker         mBbq->update(mBbqChild, width, height, mFormat);
173*38e8c45fSAndroid Build Coastguard Worker     }
174*38e8c45fSAndroid Build Coastguard Worker }
175*38e8c45fSAndroid Build Coastguard Worker 
getLayerStateHandle() const176*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> SurfaceControl::getLayerStateHandle() const
177*38e8c45fSAndroid Build Coastguard Worker {
178*38e8c45fSAndroid Build Coastguard Worker     return mHandle;
179*38e8c45fSAndroid Build Coastguard Worker }
180*38e8c45fSAndroid Build Coastguard Worker 
getHandle() const181*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> SurfaceControl::getHandle() const {
182*38e8c45fSAndroid Build Coastguard Worker     if (mBbqChild != nullptr) {
183*38e8c45fSAndroid Build Coastguard Worker         return mBbqChild->getHandle();
184*38e8c45fSAndroid Build Coastguard Worker     }
185*38e8c45fSAndroid Build Coastguard Worker     return getLayerStateHandle();
186*38e8c45fSAndroid Build Coastguard Worker }
187*38e8c45fSAndroid Build Coastguard Worker 
getLayerId() const188*38e8c45fSAndroid Build Coastguard Worker int32_t SurfaceControl::getLayerId() const {
189*38e8c45fSAndroid Build Coastguard Worker     return mLayerId;
190*38e8c45fSAndroid Build Coastguard Worker }
191*38e8c45fSAndroid Build Coastguard Worker 
getName() const192*38e8c45fSAndroid Build Coastguard Worker const std::string& SurfaceControl::getName() const {
193*38e8c45fSAndroid Build Coastguard Worker     return mName;
194*38e8c45fSAndroid Build Coastguard Worker }
195*38e8c45fSAndroid Build Coastguard Worker 
getChoreographer()196*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<Choreographer> SurfaceControl::getChoreographer() {
197*38e8c45fSAndroid Build Coastguard Worker     if (mChoreographer) {
198*38e8c45fSAndroid Build Coastguard Worker         return mChoreographer;
199*38e8c45fSAndroid Build Coastguard Worker     }
200*38e8c45fSAndroid Build Coastguard Worker     sp<Looper> looper = Looper::getForThread();
201*38e8c45fSAndroid Build Coastguard Worker     if (!looper.get()) {
202*38e8c45fSAndroid Build Coastguard Worker         ALOGE("%s: No looper prepared for thread", __func__);
203*38e8c45fSAndroid Build Coastguard Worker         return nullptr;
204*38e8c45fSAndroid Build Coastguard Worker     }
205*38e8c45fSAndroid Build Coastguard Worker     mChoreographer = std::make_shared<Choreographer>(looper, getHandle());
206*38e8c45fSAndroid Build Coastguard Worker     status_t result = mChoreographer->initialize();
207*38e8c45fSAndroid Build Coastguard Worker     if (result != OK) {
208*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Failed to initialize choreographer");
209*38e8c45fSAndroid Build Coastguard Worker         mChoreographer = nullptr;
210*38e8c45fSAndroid Build Coastguard Worker     }
211*38e8c45fSAndroid Build Coastguard Worker     return mChoreographer;
212*38e8c45fSAndroid Build Coastguard Worker }
213*38e8c45fSAndroid Build Coastguard Worker 
getIGraphicBufferProducer()214*38e8c45fSAndroid Build Coastguard Worker sp<IGraphicBufferProducer> SurfaceControl::getIGraphicBufferProducer()
215*38e8c45fSAndroid Build Coastguard Worker {
216*38e8c45fSAndroid Build Coastguard Worker     getSurface();
217*38e8c45fSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
218*38e8c45fSAndroid Build Coastguard Worker 
219*38e8c45fSAndroid Build Coastguard Worker     return mBbq->getIGraphicBufferProducer();
220*38e8c45fSAndroid Build Coastguard Worker }
221*38e8c45fSAndroid Build Coastguard Worker 
getClient() const222*38e8c45fSAndroid Build Coastguard Worker sp<SurfaceComposerClient> SurfaceControl::getClient() const
223*38e8c45fSAndroid Build Coastguard Worker {
224*38e8c45fSAndroid Build Coastguard Worker     return mClient;
225*38e8c45fSAndroid Build Coastguard Worker }
226*38e8c45fSAndroid Build Coastguard Worker 
getTransformHint() const227*38e8c45fSAndroid Build Coastguard Worker uint32_t SurfaceControl::getTransformHint() const {
228*38e8c45fSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
229*38e8c45fSAndroid Build Coastguard Worker     return mTransformHint;
230*38e8c45fSAndroid Build Coastguard Worker }
231*38e8c45fSAndroid Build Coastguard Worker 
setTransformHint(uint32_t hint)232*38e8c45fSAndroid Build Coastguard Worker void SurfaceControl::setTransformHint(uint32_t hint) {
233*38e8c45fSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
234*38e8c45fSAndroid Build Coastguard Worker     mTransformHint = hint;
235*38e8c45fSAndroid Build Coastguard Worker }
236*38e8c45fSAndroid Build Coastguard Worker 
writeToParcel(Parcel & parcel)237*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::writeToParcel(Parcel& parcel) {
238*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeStrongBinder, ISurfaceComposerClient::asBinder(mClient->getClient()));
239*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeStrongBinder, mHandle);
240*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeInt32, mLayerId);
241*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeUtf8AsUtf16, mName);
242*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeUint32, mTransformHint);
243*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeUint32, mWidth);
244*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeUint32, mHeight);
245*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeUint32, mFormat);
246*38e8c45fSAndroid Build Coastguard Worker 
247*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
248*38e8c45fSAndroid Build Coastguard Worker }
249*38e8c45fSAndroid Build Coastguard Worker 
readFromParcel(const Parcel & parcel,sp<SurfaceControl> * outSurfaceControl)250*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::readFromParcel(const Parcel& parcel,
251*38e8c45fSAndroid Build Coastguard Worker                                         sp<SurfaceControl>* outSurfaceControl) {
252*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> client;
253*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> handle;
254*38e8c45fSAndroid Build Coastguard Worker     int32_t layerId;
255*38e8c45fSAndroid Build Coastguard Worker     std::string layerName;
256*38e8c45fSAndroid Build Coastguard Worker     uint32_t transformHint;
257*38e8c45fSAndroid Build Coastguard Worker     uint32_t width;
258*38e8c45fSAndroid Build Coastguard Worker     uint32_t height;
259*38e8c45fSAndroid Build Coastguard Worker     uint32_t format;
260*38e8c45fSAndroid Build Coastguard Worker 
261*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readStrongBinder, &client);
262*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readStrongBinder, &handle);
263*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readInt32, &layerId);
264*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readUtf8FromUtf16, &layerName);
265*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readUint32, &transformHint);
266*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readUint32, &width);
267*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readUint32, &height);
268*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readUint32, &format);
269*38e8c45fSAndroid Build Coastguard Worker 
270*38e8c45fSAndroid Build Coastguard Worker     // We aren't the original owner of the surface.
271*38e8c45fSAndroid Build Coastguard Worker     *outSurfaceControl = new SurfaceControl(new SurfaceComposerClient(
272*38e8c45fSAndroid Build Coastguard Worker                                                     interface_cast<ISurfaceComposerClient>(client)),
273*38e8c45fSAndroid Build Coastguard Worker                                             handle.get(), layerId, layerName, width, height, format,
274*38e8c45fSAndroid Build Coastguard Worker                                             transformHint);
275*38e8c45fSAndroid Build Coastguard Worker 
276*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
277*38e8c45fSAndroid Build Coastguard Worker }
278*38e8c45fSAndroid Build Coastguard Worker 
readNullableFromParcel(const Parcel & parcel,sp<SurfaceControl> * outSurfaceControl)279*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::readNullableFromParcel(const Parcel& parcel,
280*38e8c45fSAndroid Build Coastguard Worker                                                 sp<SurfaceControl>* outSurfaceControl) {
281*38e8c45fSAndroid Build Coastguard Worker     bool isNotNull;
282*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.readBool, &isNotNull);
283*38e8c45fSAndroid Build Coastguard Worker     if (isNotNull) {
284*38e8c45fSAndroid Build Coastguard Worker         SAFE_PARCEL(SurfaceControl::readFromParcel, parcel, outSurfaceControl);
285*38e8c45fSAndroid Build Coastguard Worker     }
286*38e8c45fSAndroid Build Coastguard Worker 
287*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
288*38e8c45fSAndroid Build Coastguard Worker }
289*38e8c45fSAndroid Build Coastguard Worker 
writeNullableToParcel(Parcel & parcel,const sp<SurfaceControl> & surfaceControl)290*38e8c45fSAndroid Build Coastguard Worker status_t SurfaceControl::writeNullableToParcel(Parcel& parcel,
291*38e8c45fSAndroid Build Coastguard Worker                                                const sp<SurfaceControl>& surfaceControl) {
292*38e8c45fSAndroid Build Coastguard Worker     auto isNotNull = surfaceControl != nullptr;
293*38e8c45fSAndroid Build Coastguard Worker     SAFE_PARCEL(parcel.writeBool, isNotNull);
294*38e8c45fSAndroid Build Coastguard Worker     if (isNotNull) {
295*38e8c45fSAndroid Build Coastguard Worker         SAFE_PARCEL(surfaceControl->writeToParcel, parcel);
296*38e8c45fSAndroid Build Coastguard Worker     }
297*38e8c45fSAndroid Build Coastguard Worker 
298*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
299*38e8c45fSAndroid Build Coastguard Worker }
300*38e8c45fSAndroid Build Coastguard Worker 
getParentingLayer()301*38e8c45fSAndroid Build Coastguard Worker sp<SurfaceControl> SurfaceControl::getParentingLayer() {
302*38e8c45fSAndroid Build Coastguard Worker     if (mBbqChild != nullptr) {
303*38e8c45fSAndroid Build Coastguard Worker         return mBbqChild;
304*38e8c45fSAndroid Build Coastguard Worker     }
305*38e8c45fSAndroid Build Coastguard Worker     return this;
306*38e8c45fSAndroid Build Coastguard Worker }
307*38e8c45fSAndroid Build Coastguard Worker 
resolveFrameNumber(const std::optional<uint64_t> & frameNumber)308*38e8c45fSAndroid Build Coastguard Worker uint64_t SurfaceControl::resolveFrameNumber(const std::optional<uint64_t>& frameNumber) {
309*38e8c45fSAndroid Build Coastguard Worker     if (frameNumber.has_value()) {
310*38e8c45fSAndroid Build Coastguard Worker         auto ret = frameNumber.value();
311*38e8c45fSAndroid Build Coastguard Worker         // Set the fallback to something far enough ahead that in the unlikely event of mixed
312*38e8c45fSAndroid Build Coastguard Worker         // "real" frame numbers and fallback frame numbers, we still won't collide in any
313*38e8c45fSAndroid Build Coastguard Worker         // meaningful capacity
314*38e8c45fSAndroid Build Coastguard Worker         mFallbackFrameNumber = ret + 100;
315*38e8c45fSAndroid Build Coastguard Worker         return ret;
316*38e8c45fSAndroid Build Coastguard Worker     } else {
317*38e8c45fSAndroid Build Coastguard Worker         return mFallbackFrameNumber++;
318*38e8c45fSAndroid Build Coastguard Worker     }
319*38e8c45fSAndroid Build Coastguard Worker }
320*38e8c45fSAndroid Build Coastguard Worker 
321*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
322*38e8c45fSAndroid Build Coastguard Worker }; // namespace android
323