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