• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 "Surface"
18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
19 //#define LOG_NDEBUG 0
20 
21 #include <gui/Surface.h>
22 
23 #include <condition_variable>
24 #include <deque>
25 #include <mutex>
26 #include <thread>
27 
28 #include <inttypes.h>
29 
30 #include <android/gui/DisplayStatInfo.h>
31 #include <android/native_window.h>
32 
33 #include <gui/FenceMonitor.h>
34 #include <gui/TraceUtils.h>
35 #include <utils/Log.h>
36 #include <utils/NativeHandle.h>
37 #include <utils/Trace.h>
38 
39 #include <ui/DynamicDisplayInfo.h>
40 #include <ui/Fence.h>
41 #include <ui/GraphicBuffer.h>
42 #include <ui/Region.h>
43 
44 #include <gui/AidlStatusUtil.h>
45 #include <gui/BufferItem.h>
46 #include <gui/IProducerListener.h>
47 
48 #include <gui/ISurfaceComposer.h>
49 #include <gui/LayerState.h>
50 #include <private/gui/ComposerService.h>
51 #include <private/gui/ComposerServiceAIDL.h>
52 
53 namespace android {
54 
55 using gui::aidl_utils::statusTFromBinderStatus;
56 using ui::Dataspace;
57 
58 namespace {
59 
60 enum {
61     // moved from nativewindow/include/system/window.h, to be removed
62     NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT = 28,
63     NATIVE_WINDOW_GET_HDR_SUPPORT = 29,
64 };
65 
isInterceptorRegistrationOp(int op)66 bool isInterceptorRegistrationOp(int op) {
67     return op == NATIVE_WINDOW_SET_CANCEL_INTERCEPTOR ||
68             op == NATIVE_WINDOW_SET_DEQUEUE_INTERCEPTOR ||
69             op == NATIVE_WINDOW_SET_PERFORM_INTERCEPTOR ||
70             op == NATIVE_WINDOW_SET_QUEUE_INTERCEPTOR ||
71             op == NATIVE_WINDOW_SET_QUERY_INTERCEPTOR;
72 }
73 
74 } // namespace
75 
Surface(const sp<IGraphicBufferProducer> & bufferProducer,bool controlledByApp,const sp<IBinder> & surfaceControlHandle)76 Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp,
77                  const sp<IBinder>& surfaceControlHandle)
78       : mGraphicBufferProducer(bufferProducer),
79         mCrop(Rect::EMPTY_RECT),
80         mBufferAge(0),
81         mGenerationNumber(0),
82         mSharedBufferMode(false),
83         mAutoRefresh(false),
84         mAutoPrerotation(false),
85         mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT),
86         mSharedBufferHasBeenQueued(false),
87         mQueriedSupportedTimestamps(false),
88         mFrameTimestampsSupportsPresent(false),
89         mEnableFrameTimestamps(false),
90         mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) {
91     // Initialize the ANativeWindow function pointers.
92     ANativeWindow::setSwapInterval  = hook_setSwapInterval;
93     ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;
94     ANativeWindow::cancelBuffer     = hook_cancelBuffer;
95     ANativeWindow::queueBuffer      = hook_queueBuffer;
96     ANativeWindow::query            = hook_query;
97     ANativeWindow::perform          = hook_perform;
98 
99     ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED;
100     ANativeWindow::cancelBuffer_DEPRECATED  = hook_cancelBuffer_DEPRECATED;
101     ANativeWindow::lockBuffer_DEPRECATED    = hook_lockBuffer_DEPRECATED;
102     ANativeWindow::queueBuffer_DEPRECATED   = hook_queueBuffer_DEPRECATED;
103 
104     const_cast<int&>(ANativeWindow::minSwapInterval) = 0;
105     const_cast<int&>(ANativeWindow::maxSwapInterval) = 1;
106 
107     mReqWidth = 0;
108     mReqHeight = 0;
109     mReqFormat = 0;
110     mReqUsage = 0;
111     mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO;
112     mDataSpace = Dataspace::UNKNOWN;
113     mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
114     mTransform = 0;
115     mStickyTransform = 0;
116     mDefaultWidth = 0;
117     mDefaultHeight = 0;
118     mUserWidth = 0;
119     mUserHeight = 0;
120     mTransformHint = 0;
121     mConsumerRunningBehind = false;
122     mConnectedToCpu = false;
123     mProducerControlledByApp = controlledByApp;
124     mSwapIntervalZero = false;
125     mMaxBufferCount = NUM_BUFFER_SLOTS;
126     mSurfaceControlHandle = surfaceControlHandle;
127 }
128 
~Surface()129 Surface::~Surface() {
130     if (mConnectedToCpu) {
131         Surface::disconnect(NATIVE_WINDOW_API_CPU);
132     }
133 }
134 
composerService() const135 sp<ISurfaceComposer> Surface::composerService() const {
136     return ComposerService::getComposerService();
137 }
138 
composerServiceAIDL() const139 sp<gui::ISurfaceComposer> Surface::composerServiceAIDL() const {
140     return ComposerServiceAIDL::getComposerService();
141 }
142 
now() const143 nsecs_t Surface::now() const {
144     return systemTime();
145 }
146 
getIGraphicBufferProducer() const147 sp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const {
148     return mGraphicBufferProducer;
149 }
150 
setSidebandStream(const sp<NativeHandle> & stream)151 void Surface::setSidebandStream(const sp<NativeHandle>& stream) {
152     mGraphicBufferProducer->setSidebandStream(stream);
153 }
154 
allocateBuffers()155 void Surface::allocateBuffers() {
156     uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth;
157     uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight;
158     mGraphicBufferProducer->allocateBuffers(reqWidth, reqHeight,
159             mReqFormat, mReqUsage);
160 }
161 
setGenerationNumber(uint32_t generation)162 status_t Surface::setGenerationNumber(uint32_t generation) {
163     status_t result = mGraphicBufferProducer->setGenerationNumber(generation);
164     if (result == NO_ERROR) {
165         mGenerationNumber = generation;
166     }
167     return result;
168 }
169 
getNextFrameNumber() const170 uint64_t Surface::getNextFrameNumber() const {
171     Mutex::Autolock lock(mMutex);
172     return mNextFrameNumber;
173 }
174 
getConsumerName() const175 String8 Surface::getConsumerName() const {
176     return mGraphicBufferProducer->getConsumerName();
177 }
178 
setDequeueTimeout(nsecs_t timeout)179 status_t Surface::setDequeueTimeout(nsecs_t timeout) {
180     return mGraphicBufferProducer->setDequeueTimeout(timeout);
181 }
182 
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])183 status_t Surface::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
184         sp<Fence>* outFence, float outTransformMatrix[16]) {
185     return mGraphicBufferProducer->getLastQueuedBuffer(outBuffer, outFence,
186             outTransformMatrix);
187 }
188 
getDisplayRefreshCycleDuration(nsecs_t * outRefreshDuration)189 status_t Surface::getDisplayRefreshCycleDuration(nsecs_t* outRefreshDuration) {
190     ATRACE_CALL();
191 
192     gui::DisplayStatInfo stats;
193     binder::Status status = composerServiceAIDL()->getDisplayStats(nullptr, &stats);
194     if (!status.isOk()) {
195         return statusTFromBinderStatus(status);
196     }
197 
198     *outRefreshDuration = stats.vsyncPeriod;
199 
200     return NO_ERROR;
201 }
202 
enableFrameTimestamps(bool enable)203 void Surface::enableFrameTimestamps(bool enable) {
204     Mutex::Autolock lock(mMutex);
205     // If going from disabled to enabled, get the initial values for
206     // compositor and display timing.
207     if (!mEnableFrameTimestamps && enable) {
208         FrameEventHistoryDelta delta;
209         mGraphicBufferProducer->getFrameTimestamps(&delta);
210         mFrameEventHistory->applyDelta(delta);
211     }
212     mEnableFrameTimestamps = enable;
213 }
214 
getCompositorTiming(nsecs_t * compositeDeadline,nsecs_t * compositeInterval,nsecs_t * compositeToPresentLatency)215 status_t Surface::getCompositorTiming(
216         nsecs_t* compositeDeadline, nsecs_t* compositeInterval,
217         nsecs_t* compositeToPresentLatency) {
218     Mutex::Autolock lock(mMutex);
219     if (!mEnableFrameTimestamps) {
220         return INVALID_OPERATION;
221     }
222 
223     if (compositeDeadline != nullptr) {
224         *compositeDeadline =
225                 mFrameEventHistory->getNextCompositeDeadline(now());
226     }
227     if (compositeInterval != nullptr) {
228         *compositeInterval = mFrameEventHistory->getCompositeInterval();
229     }
230     if (compositeToPresentLatency != nullptr) {
231         *compositeToPresentLatency =
232                 mFrameEventHistory->getCompositeToPresentLatency();
233     }
234     return NO_ERROR;
235 }
236 
checkConsumerForUpdates(const FrameEvents * e,const uint64_t lastFrameNumber,const nsecs_t * outLatchTime,const nsecs_t * outFirstRefreshStartTime,const nsecs_t * outLastRefreshStartTime,const nsecs_t * outGpuCompositionDoneTime,const nsecs_t * outDisplayPresentTime,const nsecs_t * outDequeueReadyTime,const nsecs_t * outReleaseTime)237 static bool checkConsumerForUpdates(
238         const FrameEvents* e, const uint64_t lastFrameNumber,
239         const nsecs_t* outLatchTime,
240         const nsecs_t* outFirstRefreshStartTime,
241         const nsecs_t* outLastRefreshStartTime,
242         const nsecs_t* outGpuCompositionDoneTime,
243         const nsecs_t* outDisplayPresentTime,
244         const nsecs_t* outDequeueReadyTime,
245         const nsecs_t* outReleaseTime) {
246     bool checkForLatch = (outLatchTime != nullptr) && !e->hasLatchInfo();
247     bool checkForFirstRefreshStart = (outFirstRefreshStartTime != nullptr) &&
248             !e->hasFirstRefreshStartInfo();
249     bool checkForGpuCompositionDone = (outGpuCompositionDoneTime != nullptr) &&
250             !e->hasGpuCompositionDoneInfo();
251     bool checkForDisplayPresent = (outDisplayPresentTime != nullptr) &&
252             !e->hasDisplayPresentInfo();
253 
254     // LastRefreshStart, DequeueReady, and Release are never available for the
255     // last frame.
256     bool checkForLastRefreshStart = (outLastRefreshStartTime != nullptr) &&
257             !e->hasLastRefreshStartInfo() &&
258             (e->frameNumber != lastFrameNumber);
259     bool checkForDequeueReady = (outDequeueReadyTime != nullptr) &&
260             !e->hasDequeueReadyInfo() && (e->frameNumber != lastFrameNumber);
261     bool checkForRelease = (outReleaseTime != nullptr) &&
262             !e->hasReleaseInfo() && (e->frameNumber != lastFrameNumber);
263 
264     // RequestedPresent and Acquire info are always available producer-side.
265     return checkForLatch || checkForFirstRefreshStart ||
266             checkForLastRefreshStart || checkForGpuCompositionDone ||
267             checkForDisplayPresent || checkForDequeueReady || checkForRelease;
268 }
269 
getFrameTimestamp(nsecs_t * dst,const nsecs_t & src)270 static void getFrameTimestamp(nsecs_t *dst, const nsecs_t& src) {
271     if (dst != nullptr) {
272         // We always get valid timestamps for these eventually.
273         *dst = (src == FrameEvents::TIMESTAMP_PENDING) ?
274                 NATIVE_WINDOW_TIMESTAMP_PENDING : src;
275     }
276 }
277 
getFrameTimestampFence(nsecs_t * dst,const std::shared_ptr<FenceTime> & src,bool fenceShouldBeKnown)278 static void getFrameTimestampFence(nsecs_t *dst,
279         const std::shared_ptr<FenceTime>& src, bool fenceShouldBeKnown) {
280     if (dst != nullptr) {
281         if (!fenceShouldBeKnown) {
282             *dst = NATIVE_WINDOW_TIMESTAMP_PENDING;
283             return;
284         }
285 
286         nsecs_t signalTime = src->getSignalTime();
287         *dst = (signalTime == Fence::SIGNAL_TIME_PENDING) ?
288                     NATIVE_WINDOW_TIMESTAMP_PENDING :
289                 (signalTime == Fence::SIGNAL_TIME_INVALID) ?
290                     NATIVE_WINDOW_TIMESTAMP_INVALID :
291                 signalTime;
292     }
293 }
294 
getFrameTimestamps(uint64_t frameNumber,nsecs_t * outRequestedPresentTime,nsecs_t * outAcquireTime,nsecs_t * outLatchTime,nsecs_t * outFirstRefreshStartTime,nsecs_t * outLastRefreshStartTime,nsecs_t * outGpuCompositionDoneTime,nsecs_t * outDisplayPresentTime,nsecs_t * outDequeueReadyTime,nsecs_t * outReleaseTime)295 status_t Surface::getFrameTimestamps(uint64_t frameNumber,
296         nsecs_t* outRequestedPresentTime, nsecs_t* outAcquireTime,
297         nsecs_t* outLatchTime, nsecs_t* outFirstRefreshStartTime,
298         nsecs_t* outLastRefreshStartTime, nsecs_t* outGpuCompositionDoneTime,
299         nsecs_t* outDisplayPresentTime, nsecs_t* outDequeueReadyTime,
300         nsecs_t* outReleaseTime) {
301     ATRACE_CALL();
302 
303     Mutex::Autolock lock(mMutex);
304 
305     if (!mEnableFrameTimestamps) {
306         return INVALID_OPERATION;
307     }
308 
309     // Verify the requested timestamps are supported.
310     querySupportedTimestampsLocked();
311     if (outDisplayPresentTime != nullptr && !mFrameTimestampsSupportsPresent) {
312         return BAD_VALUE;
313     }
314 
315     FrameEvents* events = mFrameEventHistory->getFrame(frameNumber);
316     if (events == nullptr) {
317         // If the entry isn't available in the producer, it's definitely not
318         // available in the consumer.
319         return NAME_NOT_FOUND;
320     }
321 
322     // Update our cache of events if the requested events are not available.
323     if (checkConsumerForUpdates(events, mLastFrameNumber,
324             outLatchTime, outFirstRefreshStartTime, outLastRefreshStartTime,
325             outGpuCompositionDoneTime, outDisplayPresentTime,
326             outDequeueReadyTime, outReleaseTime)) {
327         FrameEventHistoryDelta delta;
328         mGraphicBufferProducer->getFrameTimestamps(&delta);
329         mFrameEventHistory->applyDelta(delta);
330         events = mFrameEventHistory->getFrame(frameNumber);
331     }
332 
333     if (events == nullptr) {
334         // The entry was available before the update, but was overwritten
335         // after the update. Make sure not to send the wrong frame's data.
336         return NAME_NOT_FOUND;
337     }
338 
339     getFrameTimestamp(outRequestedPresentTime, events->requestedPresentTime);
340     getFrameTimestamp(outLatchTime, events->latchTime);
341     getFrameTimestamp(outFirstRefreshStartTime, events->firstRefreshStartTime);
342     getFrameTimestamp(outLastRefreshStartTime, events->lastRefreshStartTime);
343     getFrameTimestamp(outDequeueReadyTime, events->dequeueReadyTime);
344 
345     getFrameTimestampFence(outAcquireTime, events->acquireFence,
346             events->hasAcquireInfo());
347     getFrameTimestampFence(outGpuCompositionDoneTime,
348             events->gpuCompositionDoneFence,
349             events->hasGpuCompositionDoneInfo());
350     getFrameTimestampFence(outDisplayPresentTime, events->displayPresentFence,
351             events->hasDisplayPresentInfo());
352     getFrameTimestampFence(outReleaseTime, events->releaseFence,
353             events->hasReleaseInfo());
354 
355     return NO_ERROR;
356 }
357 
358 // Deprecated(b/242763577): to be removed, this method should not be used
359 // The reason this method still exists here is to support compiled vndk
360 // Surface support should not be tied to the display
361 // Return true since most displays should have this support
getWideColorSupport(bool * supported)362 status_t Surface::getWideColorSupport(bool* supported) {
363     ATRACE_CALL();
364 
365     *supported = true;
366     return NO_ERROR;
367 }
368 
369 // Deprecated(b/242763577): to be removed, this method should not be used
370 // The reason this method still exists here is to support compiled vndk
371 // Surface support should not be tied to the display
372 // Return true since most displays should have this support
getHdrSupport(bool * supported)373 status_t Surface::getHdrSupport(bool* supported) {
374     ATRACE_CALL();
375 
376     *supported = true;
377     return NO_ERROR;
378 }
379 
hook_setSwapInterval(ANativeWindow * window,int interval)380 int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) {
381     Surface* c = getSelf(window);
382     return c->setSwapInterval(interval);
383 }
384 
hook_dequeueBuffer(ANativeWindow * window,ANativeWindowBuffer ** buffer,int * fenceFd)385 int Surface::hook_dequeueBuffer(ANativeWindow* window,
386         ANativeWindowBuffer** buffer, int* fenceFd) {
387     Surface* c = getSelf(window);
388     {
389         std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex);
390         if (c->mDequeueInterceptor != nullptr) {
391             auto interceptor = c->mDequeueInterceptor;
392             auto data = c->mDequeueInterceptorData;
393             return interceptor(window, Surface::dequeueBufferInternal, data, buffer, fenceFd);
394         }
395     }
396     return c->dequeueBuffer(buffer, fenceFd);
397 }
398 
dequeueBufferInternal(ANativeWindow * window,ANativeWindowBuffer ** buffer,int * fenceFd)399 int Surface::dequeueBufferInternal(ANativeWindow* window, ANativeWindowBuffer** buffer,
400                                    int* fenceFd) {
401     Surface* c = getSelf(window);
402     return c->dequeueBuffer(buffer, fenceFd);
403 }
404 
hook_cancelBuffer(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)405 int Surface::hook_cancelBuffer(ANativeWindow* window,
406         ANativeWindowBuffer* buffer, int fenceFd) {
407     Surface* c = getSelf(window);
408     {
409         std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex);
410         if (c->mCancelInterceptor != nullptr) {
411             auto interceptor = c->mCancelInterceptor;
412             auto data = c->mCancelInterceptorData;
413             return interceptor(window, Surface::cancelBufferInternal, data, buffer, fenceFd);
414         }
415     }
416     return c->cancelBuffer(buffer, fenceFd);
417 }
418 
cancelBufferInternal(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)419 int Surface::cancelBufferInternal(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd) {
420     Surface* c = getSelf(window);
421     return c->cancelBuffer(buffer, fenceFd);
422 }
423 
hook_queueBuffer(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)424 int Surface::hook_queueBuffer(ANativeWindow* window,
425         ANativeWindowBuffer* buffer, int fenceFd) {
426     Surface* c = getSelf(window);
427     {
428         std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex);
429         if (c->mQueueInterceptor != nullptr) {
430             auto interceptor = c->mQueueInterceptor;
431             auto data = c->mQueueInterceptorData;
432             return interceptor(window, Surface::queueBufferInternal, data, buffer, fenceFd);
433         }
434     }
435     return c->queueBuffer(buffer, fenceFd);
436 }
437 
queueBufferInternal(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)438 int Surface::queueBufferInternal(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd) {
439     Surface* c = getSelf(window);
440     return c->queueBuffer(buffer, fenceFd);
441 }
442 
hook_dequeueBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer ** buffer)443 int Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window,
444         ANativeWindowBuffer** buffer) {
445     Surface* c = getSelf(window);
446     ANativeWindowBuffer* buf;
447     int fenceFd = -1;
448     int result = c->dequeueBuffer(&buf, &fenceFd);
449     if (result != OK) {
450         return result;
451     }
452     sp<Fence> fence(new Fence(fenceFd));
453     int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED");
454     if (waitResult != OK) {
455         ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d",
456                 waitResult);
457         c->cancelBuffer(buf, -1);
458         return waitResult;
459     }
460     *buffer = buf;
461     return result;
462 }
463 
hook_cancelBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)464 int Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window,
465         ANativeWindowBuffer* buffer) {
466     Surface* c = getSelf(window);
467     return c->cancelBuffer(buffer, -1);
468 }
469 
hook_lockBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)470 int Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window,
471         ANativeWindowBuffer* buffer) {
472     Surface* c = getSelf(window);
473     return c->lockBuffer_DEPRECATED(buffer);
474 }
475 
hook_queueBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)476 int Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window,
477         ANativeWindowBuffer* buffer) {
478     Surface* c = getSelf(window);
479     return c->queueBuffer(buffer, -1);
480 }
481 
hook_perform(ANativeWindow * window,int operation,...)482 int Surface::hook_perform(ANativeWindow* window, int operation, ...) {
483     va_list args;
484     va_start(args, operation);
485     Surface* c = getSelf(window);
486     int result;
487     // Don't acquire shared ownership of the interceptor mutex if we're going to
488     // do interceptor registration, as otherwise we'll deadlock on acquiring
489     // exclusive ownership.
490     if (!isInterceptorRegistrationOp(operation)) {
491         std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex);
492         if (c->mPerformInterceptor != nullptr) {
493             result = c->mPerformInterceptor(window, Surface::performInternal,
494                                             c->mPerformInterceptorData, operation, args);
495             va_end(args);
496             return result;
497         }
498     }
499     result = c->perform(operation, args);
500     va_end(args);
501     return result;
502 }
503 
performInternal(ANativeWindow * window,int operation,va_list args)504 int Surface::performInternal(ANativeWindow* window, int operation, va_list args) {
505     Surface* c = getSelf(window);
506     return c->perform(operation, args);
507 }
508 
hook_query(const ANativeWindow * window,int what,int * value)509 int Surface::hook_query(const ANativeWindow* window, int what, int* value) {
510     const Surface* c = getSelf(window);
511     {
512         std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex);
513         if (c->mQueryInterceptor != nullptr) {
514             auto interceptor = c->mQueryInterceptor;
515             auto data = c->mQueryInterceptorData;
516             return interceptor(window, Surface::queryInternal, data, what, value);
517         }
518     }
519     return c->query(what, value);
520 }
521 
queryInternal(const ANativeWindow * window,int what,int * value)522 int Surface::queryInternal(const ANativeWindow* window, int what, int* value) {
523     const Surface* c = getSelf(window);
524     return c->query(what, value);
525 }
526 
setSwapInterval(int interval)527 int Surface::setSwapInterval(int interval) {
528     ATRACE_CALL();
529     // EGL specification states:
530     //  interval is silently clamped to minimum and maximum implementation
531     //  dependent values before being stored.
532 
533     if (interval < minSwapInterval)
534         interval = minSwapInterval;
535 
536     if (interval > maxSwapInterval)
537         interval = maxSwapInterval;
538 
539     const bool wasSwapIntervalZero = mSwapIntervalZero;
540     mSwapIntervalZero = (interval == 0);
541 
542     if (mSwapIntervalZero != wasSwapIntervalZero) {
543         mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero);
544     }
545 
546     return NO_ERROR;
547 }
548 
getDequeueBufferInputLocked(IGraphicBufferProducer::DequeueBufferInput * dequeueInput)549 void Surface::getDequeueBufferInputLocked(
550         IGraphicBufferProducer::DequeueBufferInput* dequeueInput) {
551     LOG_ALWAYS_FATAL_IF(dequeueInput == nullptr, "input is null");
552 
553     dequeueInput->width = mReqWidth ? mReqWidth : mUserWidth;
554     dequeueInput->height = mReqHeight ? mReqHeight : mUserHeight;
555 
556     dequeueInput->format = mReqFormat;
557     dequeueInput->usage = mReqUsage;
558 
559     dequeueInput->getTimestamps = mEnableFrameTimestamps;
560 }
561 
dequeueBuffer(android_native_buffer_t ** buffer,int * fenceFd)562 int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
563     ATRACE_FORMAT("dequeueBuffer - %s", getDebugName());
564     ALOGV("Surface::dequeueBuffer");
565 
566     IGraphicBufferProducer::DequeueBufferInput dqInput;
567     {
568         Mutex::Autolock lock(mMutex);
569         if (mReportRemovedBuffers) {
570             mRemovedBuffers.clear();
571         }
572 
573         getDequeueBufferInputLocked(&dqInput);
574 
575         if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot !=
576                 BufferItem::INVALID_BUFFER_SLOT) {
577             sp<GraphicBuffer>& gbuf(mSlots[mSharedBufferSlot].buffer);
578             if (gbuf != nullptr) {
579                 *buffer = gbuf.get();
580                 *fenceFd = -1;
581                 return OK;
582             }
583         }
584     } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffer
585 
586     int buf = -1;
587     sp<Fence> fence;
588     nsecs_t startTime = systemTime();
589 
590     FrameEventHistoryDelta frameTimestamps;
591     status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, dqInput.width,
592                                                             dqInput.height, dqInput.format,
593                                                             dqInput.usage, &mBufferAge,
594                                                             dqInput.getTimestamps ?
595                                                                     &frameTimestamps : nullptr);
596     mLastDequeueDuration = systemTime() - startTime;
597 
598     if (result < 0) {
599         ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer"
600                 "(%d, %d, %d, %#" PRIx64 ") failed: %d",
601                 dqInput.width, dqInput.height, dqInput.format, dqInput.usage, result);
602         return result;
603     }
604 
605     if (buf < 0 || buf >= NUM_BUFFER_SLOTS) {
606         ALOGE("dequeueBuffer: IGraphicBufferProducer returned invalid slot number %d", buf);
607         android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging
608         return FAILED_TRANSACTION;
609     }
610 
611     Mutex::Autolock lock(mMutex);
612 
613     // Write this while holding the mutex
614     mLastDequeueStartTime = startTime;
615 
616     sp<GraphicBuffer>& gbuf(mSlots[buf].buffer);
617 
618     // this should never happen
619     ALOGE_IF(fence == nullptr, "Surface::dequeueBuffer: received null Fence! buf=%d", buf);
620 
621     if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) {
622         static gui::FenceMonitor hwcReleaseThread("HWC release");
623         hwcReleaseThread.queueFence(fence);
624     }
625 
626     if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) {
627         freeAllBuffers();
628     }
629 
630     if (dqInput.getTimestamps) {
631          mFrameEventHistory->applyDelta(frameTimestamps);
632     }
633 
634     if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) {
635         if (mReportRemovedBuffers && (gbuf != nullptr)) {
636             mRemovedBuffers.push_back(gbuf);
637         }
638         result = mGraphicBufferProducer->requestBuffer(buf, &gbuf);
639         if (result != NO_ERROR) {
640             ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result);
641             mGraphicBufferProducer->cancelBuffer(buf, fence);
642             return result;
643         }
644     }
645 
646     if (fence->isValid()) {
647         *fenceFd = fence->dup();
648         if (*fenceFd == -1) {
649             ALOGE("dequeueBuffer: error duping fence: %d", errno);
650             // dup() should never fail; something is badly wrong. Soldier on
651             // and hope for the best; the worst that should happen is some
652             // visible corruption that lasts until the next frame.
653         }
654     } else {
655         *fenceFd = -1;
656     }
657 
658     *buffer = gbuf.get();
659 
660     if (mSharedBufferMode && mAutoRefresh) {
661         mSharedBufferSlot = buf;
662         mSharedBufferHasBeenQueued = false;
663     } else if (mSharedBufferSlot == buf) {
664         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
665         mSharedBufferHasBeenQueued = false;
666     }
667 
668     mDequeuedSlots.insert(buf);
669 
670     return OK;
671 }
672 
dequeueBuffers(std::vector<BatchBuffer> * buffers)673 int Surface::dequeueBuffers(std::vector<BatchBuffer>* buffers) {
674     using DequeueBufferInput = IGraphicBufferProducer::DequeueBufferInput;
675     using DequeueBufferOutput = IGraphicBufferProducer::DequeueBufferOutput;
676     using CancelBufferInput = IGraphicBufferProducer::CancelBufferInput;
677     using RequestBufferOutput = IGraphicBufferProducer::RequestBufferOutput;
678 
679     ATRACE_CALL();
680     ALOGV("Surface::dequeueBuffers");
681 
682     if (buffers->size() == 0) {
683         ALOGE("%s: must dequeue at least 1 buffer!", __FUNCTION__);
684         return BAD_VALUE;
685     }
686 
687     if (mSharedBufferMode) {
688         ALOGE("%s: batch operation is not supported in shared buffer mode!",
689                 __FUNCTION__);
690         return INVALID_OPERATION;
691     }
692 
693     size_t numBufferRequested = buffers->size();
694     DequeueBufferInput input;
695 
696     {
697         Mutex::Autolock lock(mMutex);
698         if (mReportRemovedBuffers) {
699             mRemovedBuffers.clear();
700         }
701 
702         getDequeueBufferInputLocked(&input);
703     } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffers
704 
705     std::vector<DequeueBufferInput> dequeueInput(numBufferRequested, input);
706     std::vector<DequeueBufferOutput> dequeueOutput;
707 
708     nsecs_t startTime = systemTime();
709 
710     status_t result = mGraphicBufferProducer->dequeueBuffers(dequeueInput, &dequeueOutput);
711 
712     mLastDequeueDuration = systemTime() - startTime;
713 
714     if (result < 0) {
715         ALOGV("%s: IGraphicBufferProducer::dequeueBuffers"
716                 "(%d, %d, %d, %#" PRIx64 ") failed: %d",
717                 __FUNCTION__, input.width, input.height, input.format, input.usage, result);
718         return result;
719     }
720 
721     std::vector<CancelBufferInput> cancelBufferInputs;
722     cancelBufferInputs.reserve(numBufferRequested);
723     std::vector<status_t> cancelBufferOutputs;
724     for (size_t i = 0; i < numBufferRequested; i++) {
725         if (dequeueOutput[i].result >= 0) {
726             CancelBufferInput& input = cancelBufferInputs.emplace_back();
727             input.slot = dequeueOutput[i].slot;
728             input.fence = dequeueOutput[i].fence;
729         }
730     }
731 
732     for (const auto& output : dequeueOutput) {
733         if (output.result < 0) {
734             mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
735             ALOGV("%s: IGraphicBufferProducer::dequeueBuffers"
736                     "(%d, %d, %d, %#" PRIx64 ") failed: %d",
737                     __FUNCTION__, input.width, input.height, input.format, input.usage,
738                     output.result);
739             return output.result;
740         }
741 
742         if (output.slot < 0 || output.slot >= NUM_BUFFER_SLOTS) {
743             mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
744             ALOGE("%s: IGraphicBufferProducer returned invalid slot number %d",
745                     __FUNCTION__, output.slot);
746             android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging
747             return FAILED_TRANSACTION;
748         }
749 
750         if (input.getTimestamps && !output.timestamps.has_value()) {
751             mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
752             ALOGE("%s: no frame timestamp returns!", __FUNCTION__);
753             return FAILED_TRANSACTION;
754         }
755 
756         // this should never happen
757         ALOGE_IF(output.fence == nullptr,
758                 "%s: received null Fence! slot=%d", __FUNCTION__, output.slot);
759     }
760 
761     Mutex::Autolock lock(mMutex);
762 
763     // Write this while holding the mutex
764     mLastDequeueStartTime = startTime;
765 
766     std::vector<int32_t> requestBufferSlots;
767     requestBufferSlots.reserve(numBufferRequested);
768     // handle release all buffers and request buffers
769     for (const auto& output : dequeueOutput) {
770         if (output.result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) {
771             ALOGV("%s: RELEASE_ALL_BUFFERS during batch operation", __FUNCTION__);
772             freeAllBuffers();
773             break;
774         }
775     }
776 
777     for (const auto& output : dequeueOutput) {
778         // Collect slots that needs requesting buffer
779         sp<GraphicBuffer>& gbuf(mSlots[output.slot].buffer);
780         if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) {
781             if (mReportRemovedBuffers && (gbuf != nullptr)) {
782                 mRemovedBuffers.push_back(gbuf);
783             }
784             requestBufferSlots.push_back(output.slot);
785         }
786     }
787 
788     // Batch request Buffer
789     std::vector<RequestBufferOutput> reqBufferOutput;
790     if (requestBufferSlots.size() > 0) {
791         result = mGraphicBufferProducer->requestBuffers(requestBufferSlots, &reqBufferOutput);
792         if (result != NO_ERROR) {
793             ALOGE("%s: IGraphicBufferProducer::requestBuffers failed: %d",
794                     __FUNCTION__, result);
795             mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
796             return result;
797         }
798 
799         // Check if we have any single failure
800         for (size_t i = 0; i < requestBufferSlots.size(); i++) {
801             if (reqBufferOutput[i].result != OK) {
802                 ALOGE("%s: IGraphicBufferProducer::requestBuffers failed at %zu-th buffer, slot %d",
803                         __FUNCTION__, i, requestBufferSlots[i]);
804                 mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
805                 return reqBufferOutput[i].result;
806             }
807         }
808 
809         // Fill request buffer results to mSlots
810         for (size_t i = 0; i < requestBufferSlots.size(); i++) {
811             mSlots[requestBufferSlots[i]].buffer = reqBufferOutput[i].buffer;
812         }
813     }
814 
815     for (size_t batchIdx = 0; batchIdx < numBufferRequested; batchIdx++) {
816         const auto& output = dequeueOutput[batchIdx];
817         int slot = output.slot;
818         sp<GraphicBuffer>& gbuf(mSlots[slot].buffer);
819 
820         if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) {
821             static gui::FenceMonitor hwcReleaseThread("HWC release");
822             hwcReleaseThread.queueFence(output.fence);
823         }
824 
825         if (input.getTimestamps) {
826              mFrameEventHistory->applyDelta(output.timestamps.value());
827         }
828 
829         if (output.fence->isValid()) {
830             buffers->at(batchIdx).fenceFd = output.fence->dup();
831             if (buffers->at(batchIdx).fenceFd == -1) {
832                 ALOGE("%s: error duping fence: %d", __FUNCTION__, errno);
833                 // dup() should never fail; something is badly wrong. Soldier on
834                 // and hope for the best; the worst that should happen is some
835                 // visible corruption that lasts until the next frame.
836             }
837         } else {
838             buffers->at(batchIdx).fenceFd = -1;
839         }
840 
841         buffers->at(batchIdx).buffer = gbuf.get();
842         mDequeuedSlots.insert(slot);
843     }
844     return OK;
845 }
846 
cancelBuffer(android_native_buffer_t * buffer,int fenceFd)847 int Surface::cancelBuffer(android_native_buffer_t* buffer,
848         int fenceFd) {
849     ATRACE_CALL();
850     ALOGV("Surface::cancelBuffer");
851     Mutex::Autolock lock(mMutex);
852     int i = getSlotFromBufferLocked(buffer);
853     if (i < 0) {
854         if (fenceFd >= 0) {
855             close(fenceFd);
856         }
857         return i;
858     }
859     if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
860         if (fenceFd >= 0) {
861             close(fenceFd);
862         }
863         return OK;
864     }
865     sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
866     mGraphicBufferProducer->cancelBuffer(i, fence);
867 
868     if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) {
869         mSharedBufferHasBeenQueued = true;
870     }
871 
872     mDequeuedSlots.erase(i);
873 
874     return OK;
875 }
876 
cancelBuffers(const std::vector<BatchBuffer> & buffers)877 int Surface::cancelBuffers(const std::vector<BatchBuffer>& buffers) {
878     using CancelBufferInput = IGraphicBufferProducer::CancelBufferInput;
879     ATRACE_CALL();
880     ALOGV("Surface::cancelBuffers");
881 
882     if (mSharedBufferMode) {
883         ALOGE("%s: batch operation is not supported in shared buffer mode!",
884                 __FUNCTION__);
885         return INVALID_OPERATION;
886     }
887 
888     size_t numBuffers = buffers.size();
889     std::vector<CancelBufferInput> cancelBufferInputs(numBuffers);
890     std::vector<status_t> cancelBufferOutputs;
891     size_t numBuffersCancelled = 0;
892     int badSlotResult = 0;
893     for (size_t i = 0; i < numBuffers; i++) {
894         int slot = getSlotFromBufferLocked(buffers[i].buffer);
895         int fenceFd = buffers[i].fenceFd;
896         if (slot < 0) {
897             if (fenceFd >= 0) {
898                 close(fenceFd);
899             }
900             ALOGE("%s: cannot find slot number for cancelled buffer", __FUNCTION__);
901             badSlotResult = slot;
902         } else {
903             sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
904             cancelBufferInputs[numBuffersCancelled].slot = slot;
905             cancelBufferInputs[numBuffersCancelled++].fence = fence;
906         }
907     }
908     cancelBufferInputs.resize(numBuffersCancelled);
909     mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
910 
911 
912     for (size_t i = 0; i < numBuffersCancelled; i++) {
913         mDequeuedSlots.erase(cancelBufferInputs[i].slot);
914     }
915 
916     if (badSlotResult != 0) {
917         return badSlotResult;
918     }
919     return OK;
920 }
921 
getSlotFromBufferLocked(android_native_buffer_t * buffer) const922 int Surface::getSlotFromBufferLocked(
923         android_native_buffer_t* buffer) const {
924     if (buffer == nullptr) {
925         ALOGE("%s: input buffer is null!", __FUNCTION__);
926         return BAD_VALUE;
927     }
928 
929     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
930         if (mSlots[i].buffer != nullptr &&
931                 mSlots[i].buffer->handle == buffer->handle) {
932             return i;
933         }
934     }
935     ALOGE("%s: unknown buffer: %p", __FUNCTION__, buffer->handle);
936     return BAD_VALUE;
937 }
938 
lockBuffer_DEPRECATED(android_native_buffer_t * buffer)939 int Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__((unused))) {
940     ALOGV("Surface::lockBuffer");
941     Mutex::Autolock lock(mMutex);
942     return OK;
943 }
944 
getQueueBufferInputLocked(android_native_buffer_t * buffer,int fenceFd,nsecs_t timestamp,IGraphicBufferProducer::QueueBufferInput * out)945 void Surface::getQueueBufferInputLocked(android_native_buffer_t* buffer, int fenceFd,
946         nsecs_t timestamp, IGraphicBufferProducer::QueueBufferInput* out) {
947     bool isAutoTimestamp = false;
948 
949     if (timestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
950         timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
951         isAutoTimestamp = true;
952         ALOGV("Surface::queueBuffer making up timestamp: %.2f ms",
953             timestamp / 1000000.0);
954     }
955 
956     // Make sure the crop rectangle is entirely inside the buffer.
957     Rect crop(Rect::EMPTY_RECT);
958     mCrop.intersect(Rect(buffer->width, buffer->height), &crop);
959 
960     sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
961     IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp,
962             static_cast<android_dataspace>(mDataSpace), crop, mScalingMode,
963             mTransform ^ mStickyTransform, fence, mStickyTransform,
964             mEnableFrameTimestamps);
965 
966     // we should send HDR metadata as needed if this becomes a bottleneck
967     input.setHdrMetadata(mHdrMetadata);
968 
969     if (mConnectedToCpu || mDirtyRegion.bounds() == Rect::INVALID_RECT) {
970         input.setSurfaceDamage(Region::INVALID_REGION);
971     } else {
972         // Here we do two things:
973         // 1) The surface damage was specified using the OpenGL ES convention of
974         //    the origin being in the bottom-left corner. Here we flip to the
975         //    convention that the rest of the system uses (top-left corner) by
976         //    subtracting all top/bottom coordinates from the buffer height.
977         // 2) If the buffer is coming in rotated (for example, because the EGL
978         //    implementation is reacting to the transform hint coming back from
979         //    SurfaceFlinger), the surface damage needs to be rotated the
980         //    opposite direction, since it was generated assuming an unrotated
981         //    buffer (the app doesn't know that the EGL implementation is
982         //    reacting to the transform hint behind its back). The
983         //    transformations in the switch statement below apply those
984         //    complementary rotations (e.g., if 90 degrees, rotate 270 degrees).
985 
986         int width = buffer->width;
987         int height = buffer->height;
988         bool rotated90 = (mTransform ^ mStickyTransform) &
989                 NATIVE_WINDOW_TRANSFORM_ROT_90;
990         if (rotated90) {
991             std::swap(width, height);
992         }
993 
994         Region flippedRegion;
995         for (auto rect : mDirtyRegion) {
996             int left = rect.left;
997             int right = rect.right;
998             int top = height - rect.bottom; // Flip from OpenGL convention
999             int bottom = height - rect.top; // Flip from OpenGL convention
1000             switch (mTransform ^ mStickyTransform) {
1001                 case NATIVE_WINDOW_TRANSFORM_ROT_90: {
1002                     // Rotate 270 degrees
1003                     Rect flippedRect{top, width - right, bottom, width - left};
1004                     flippedRegion.orSelf(flippedRect);
1005                     break;
1006                 }
1007                 case NATIVE_WINDOW_TRANSFORM_ROT_180: {
1008                     // Rotate 180 degrees
1009                     Rect flippedRect{width - right, height - bottom,
1010                             width - left, height - top};
1011                     flippedRegion.orSelf(flippedRect);
1012                     break;
1013                 }
1014                 case NATIVE_WINDOW_TRANSFORM_ROT_270: {
1015                     // Rotate 90 degrees
1016                     Rect flippedRect{height - bottom, left,
1017                             height - top, right};
1018                     flippedRegion.orSelf(flippedRect);
1019                     break;
1020                 }
1021                 default: {
1022                     Rect flippedRect{left, top, right, bottom};
1023                     flippedRegion.orSelf(flippedRect);
1024                     break;
1025                 }
1026             }
1027         }
1028 
1029         input.setSurfaceDamage(flippedRegion);
1030     }
1031     *out = input;
1032 }
1033 
applyGrallocMetadataLocked(android_native_buffer_t * buffer,const IGraphicBufferProducer::QueueBufferInput & queueBufferInput)1034 void Surface::applyGrallocMetadataLocked(
1035         android_native_buffer_t* buffer,
1036         const IGraphicBufferProducer::QueueBufferInput& queueBufferInput) {
1037     ATRACE_CALL();
1038     auto& mapper = GraphicBufferMapper::get();
1039     mapper.setDataspace(buffer->handle, static_cast<ui::Dataspace>(queueBufferInput.dataSpace));
1040     if (mHdrMetadataIsSet & HdrMetadata::SMPTE2086)
1041         mapper.setSmpte2086(buffer->handle, queueBufferInput.getHdrMetadata().getSmpte2086());
1042     if (mHdrMetadataIsSet & HdrMetadata::CTA861_3)
1043         mapper.setCta861_3(buffer->handle, queueBufferInput.getHdrMetadata().getCta8613());
1044     if (mHdrMetadataIsSet & HdrMetadata::HDR10PLUS)
1045         mapper.setSmpte2094_40(buffer->handle, queueBufferInput.getHdrMetadata().getHdr10Plus());
1046 }
1047 
onBufferQueuedLocked(int slot,sp<Fence> fence,const IGraphicBufferProducer::QueueBufferOutput & output)1048 void Surface::onBufferQueuedLocked(int slot, sp<Fence> fence,
1049         const IGraphicBufferProducer::QueueBufferOutput& output) {
1050     mDequeuedSlots.erase(slot);
1051 
1052     if (mEnableFrameTimestamps) {
1053         mFrameEventHistory->applyDelta(output.frameTimestamps);
1054         // Update timestamps with the local acquire fence.
1055         // The consumer doesn't send it back to prevent us from having two
1056         // file descriptors of the same fence.
1057         mFrameEventHistory->updateAcquireFence(mNextFrameNumber,
1058                 std::make_shared<FenceTime>(fence));
1059 
1060         // Cache timestamps of signaled fences so we can close their file
1061         // descriptors.
1062         mFrameEventHistory->updateSignalTimes();
1063     }
1064 
1065     mLastFrameNumber = mNextFrameNumber;
1066 
1067     mDefaultWidth = output.width;
1068     mDefaultHeight = output.height;
1069     mNextFrameNumber = output.nextFrameNumber;
1070 
1071     // Ignore transform hint if sticky transform is set or transform to display inverse flag is
1072     // set.
1073     if (mStickyTransform == 0 && !transformToDisplayInverse()) {
1074         mTransformHint = output.transformHint;
1075     }
1076 
1077     mConsumerRunningBehind = (output.numPendingBuffers >= 2);
1078 
1079     if (!mConnectedToCpu) {
1080         // Clear surface damage back to full-buffer
1081         mDirtyRegion = Region::INVALID_REGION;
1082     }
1083 
1084     if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == slot) {
1085         mSharedBufferHasBeenQueued = true;
1086     }
1087 
1088     mQueueBufferCondition.broadcast();
1089 
1090     if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) {
1091         static gui::FenceMonitor gpuCompletionThread("GPU completion");
1092         gpuCompletionThread.queueFence(fence);
1093     }
1094 }
1095 
queueBuffer(android_native_buffer_t * buffer,int fenceFd)1096 int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
1097     ATRACE_CALL();
1098     ALOGV("Surface::queueBuffer");
1099     Mutex::Autolock lock(mMutex);
1100 
1101     int i = getSlotFromBufferLocked(buffer);
1102     if (i < 0) {
1103         if (fenceFd >= 0) {
1104             close(fenceFd);
1105         }
1106         return i;
1107     }
1108     if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
1109         if (fenceFd >= 0) {
1110             close(fenceFd);
1111         }
1112         return OK;
1113     }
1114 
1115     IGraphicBufferProducer::QueueBufferOutput output;
1116     IGraphicBufferProducer::QueueBufferInput input;
1117     getQueueBufferInputLocked(buffer, fenceFd, mTimestamp, &input);
1118     applyGrallocMetadataLocked(buffer, input);
1119     sp<Fence> fence = input.fence;
1120 
1121     nsecs_t now = systemTime();
1122 
1123     status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output);
1124     mLastQueueDuration = systemTime() - now;
1125     if (err != OK)  {
1126         ALOGE("queueBuffer: error queuing buffer, %d", err);
1127     }
1128 
1129     onBufferQueuedLocked(i, fence, output);
1130     return err;
1131 }
1132 
queueBuffers(const std::vector<BatchQueuedBuffer> & buffers)1133 int Surface::queueBuffers(const std::vector<BatchQueuedBuffer>& buffers) {
1134     ATRACE_CALL();
1135     ALOGV("Surface::queueBuffers");
1136     Mutex::Autolock lock(mMutex);
1137 
1138     if (mSharedBufferMode) {
1139         ALOGE("%s: batched operation is not supported in shared buffer mode", __FUNCTION__);
1140         return INVALID_OPERATION;
1141     }
1142 
1143     size_t numBuffers = buffers.size();
1144     std::vector<IGraphicBufferProducer::QueueBufferInput> queueBufferInputs(numBuffers);
1145     std::vector<IGraphicBufferProducer::QueueBufferOutput> queueBufferOutputs;
1146     std::vector<int> bufferSlots(numBuffers, -1);
1147     std::vector<sp<Fence>> bufferFences(numBuffers);
1148 
1149     for (size_t batchIdx = 0; batchIdx < numBuffers; batchIdx++) {
1150         int i = getSlotFromBufferLocked(buffers[batchIdx].buffer);
1151         if (i < 0) {
1152             if (buffers[batchIdx].fenceFd >= 0) {
1153                 close(buffers[batchIdx].fenceFd);
1154             }
1155             return i;
1156         }
1157         bufferSlots[batchIdx] = i;
1158 
1159         IGraphicBufferProducer::QueueBufferInput input;
1160         getQueueBufferInputLocked(
1161                 buffers[batchIdx].buffer, buffers[batchIdx].fenceFd, buffers[batchIdx].timestamp,
1162                 &input);
1163         bufferFences[batchIdx] = input.fence;
1164         queueBufferInputs[batchIdx] = input;
1165     }
1166 
1167     nsecs_t now = systemTime();
1168     status_t err = mGraphicBufferProducer->queueBuffers(queueBufferInputs, &queueBufferOutputs);
1169     mLastQueueDuration = systemTime() - now;
1170     if (err != OK)  {
1171         ALOGE("%s: error queuing buffer, %d", __FUNCTION__, err);
1172     }
1173 
1174 
1175     for (size_t batchIdx = 0; batchIdx < numBuffers; batchIdx++) {
1176         onBufferQueuedLocked(bufferSlots[batchIdx], bufferFences[batchIdx],
1177                 queueBufferOutputs[batchIdx]);
1178     }
1179 
1180     return err;
1181 }
1182 
querySupportedTimestampsLocked() const1183 void Surface::querySupportedTimestampsLocked() const {
1184     // mMutex must be locked when calling this method.
1185 
1186     if (mQueriedSupportedTimestamps) {
1187         return;
1188     }
1189     mQueriedSupportedTimestamps = true;
1190 
1191     std::vector<FrameEvent> supportedFrameTimestamps;
1192     binder::Status status =
1193             composerServiceAIDL()->getSupportedFrameTimestamps(&supportedFrameTimestamps);
1194 
1195     if (!status.isOk()) {
1196         return;
1197     }
1198 
1199     for (auto sft : supportedFrameTimestamps) {
1200         if (sft == FrameEvent::DISPLAY_PRESENT) {
1201             mFrameTimestampsSupportsPresent = true;
1202         }
1203     }
1204 }
1205 
query(int what,int * value) const1206 int Surface::query(int what, int* value) const {
1207     ATRACE_CALL();
1208     ALOGV("Surface::query");
1209     { // scope for the lock
1210         Mutex::Autolock lock(mMutex);
1211         switch (what) {
1212             case NATIVE_WINDOW_FORMAT:
1213                 if (mReqFormat) {
1214                     *value = static_cast<int>(mReqFormat);
1215                     return NO_ERROR;
1216                 }
1217                 break;
1218             case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: {
1219                 status_t err = mGraphicBufferProducer->query(what, value);
1220                 if (err == NO_ERROR) {
1221                     return NO_ERROR;
1222                 }
1223                 sp<gui::ISurfaceComposer> surfaceComposer = composerServiceAIDL();
1224                 if (surfaceComposer == nullptr) {
1225                     return -EPERM; // likely permissions error
1226                 }
1227                 // ISurfaceComposer no longer supports authenticateSurfaceTexture
1228                 *value = 0;
1229                 return NO_ERROR;
1230             }
1231             case NATIVE_WINDOW_CONCRETE_TYPE:
1232                 *value = NATIVE_WINDOW_SURFACE;
1233                 return NO_ERROR;
1234             case NATIVE_WINDOW_DEFAULT_WIDTH:
1235                 *value = static_cast<int>(
1236                         mUserWidth ? mUserWidth : mDefaultWidth);
1237                 return NO_ERROR;
1238             case NATIVE_WINDOW_DEFAULT_HEIGHT:
1239                 *value = static_cast<int>(
1240                         mUserHeight ? mUserHeight : mDefaultHeight);
1241                 return NO_ERROR;
1242             case NATIVE_WINDOW_TRANSFORM_HINT:
1243                 *value = static_cast<int>(getTransformHint());
1244                 return NO_ERROR;
1245             case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: {
1246                 status_t err = NO_ERROR;
1247                 if (!mConsumerRunningBehind) {
1248                     *value = 0;
1249                 } else {
1250                     err = mGraphicBufferProducer->query(what, value);
1251                     if (err == NO_ERROR) {
1252                         mConsumerRunningBehind = *value;
1253                     }
1254                 }
1255                 return err;
1256             }
1257             case NATIVE_WINDOW_BUFFER_AGE: {
1258                 if (mBufferAge > INT32_MAX) {
1259                     *value = 0;
1260                 } else {
1261                     *value = static_cast<int32_t>(mBufferAge);
1262                 }
1263                 return NO_ERROR;
1264             }
1265             case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: {
1266                 int64_t durationUs = mLastDequeueDuration / 1000;
1267                 *value = durationUs > std::numeric_limits<int>::max() ?
1268                         std::numeric_limits<int>::max() :
1269                         static_cast<int>(durationUs);
1270                 return NO_ERROR;
1271             }
1272             case NATIVE_WINDOW_LAST_QUEUE_DURATION: {
1273                 int64_t durationUs = mLastQueueDuration / 1000;
1274                 *value = durationUs > std::numeric_limits<int>::max() ?
1275                         std::numeric_limits<int>::max() :
1276                         static_cast<int>(durationUs);
1277                 return NO_ERROR;
1278             }
1279             case NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT: {
1280                 querySupportedTimestampsLocked();
1281                 *value = mFrameTimestampsSupportsPresent ? 1 : 0;
1282                 return NO_ERROR;
1283             }
1284             case NATIVE_WINDOW_IS_VALID: {
1285                 *value = mGraphicBufferProducer != nullptr ? 1 : 0;
1286                 return NO_ERROR;
1287             }
1288             case NATIVE_WINDOW_DATASPACE: {
1289                 *value = static_cast<int>(mDataSpace);
1290                 return NO_ERROR;
1291             }
1292             case NATIVE_WINDOW_MAX_BUFFER_COUNT: {
1293                 *value = mMaxBufferCount;
1294                 return NO_ERROR;
1295             }
1296         }
1297     }
1298     return mGraphicBufferProducer->query(what, value);
1299 }
1300 
perform(int operation,va_list args)1301 int Surface::perform(int operation, va_list args)
1302 {
1303     int res = NO_ERROR;
1304     switch (operation) {
1305     case NATIVE_WINDOW_CONNECT:
1306         // deprecated. must return NO_ERROR.
1307         break;
1308     case NATIVE_WINDOW_DISCONNECT:
1309         // deprecated. must return NO_ERROR.
1310         break;
1311     case NATIVE_WINDOW_SET_USAGE:
1312         res = dispatchSetUsage(args);
1313         break;
1314     case NATIVE_WINDOW_SET_CROP:
1315         res = dispatchSetCrop(args);
1316         break;
1317     case NATIVE_WINDOW_SET_BUFFER_COUNT:
1318         res = dispatchSetBufferCount(args);
1319         break;
1320     case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
1321         res = dispatchSetBuffersGeometry(args);
1322         break;
1323     case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
1324         res = dispatchSetBuffersTransform(args);
1325         break;
1326     case NATIVE_WINDOW_SET_BUFFERS_STICKY_TRANSFORM:
1327         res = dispatchSetBuffersStickyTransform(args);
1328         break;
1329     case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
1330         res = dispatchSetBuffersTimestamp(args);
1331         break;
1332     case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS:
1333         res = dispatchSetBuffersDimensions(args);
1334         break;
1335     case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS:
1336         res = dispatchSetBuffersUserDimensions(args);
1337         break;
1338     case NATIVE_WINDOW_SET_BUFFERS_FORMAT:
1339         res = dispatchSetBuffersFormat(args);
1340         break;
1341     case NATIVE_WINDOW_LOCK:
1342         res = dispatchLock(args);
1343         break;
1344     case NATIVE_WINDOW_UNLOCK_AND_POST:
1345         res = dispatchUnlockAndPost(args);
1346         break;
1347     case NATIVE_WINDOW_SET_SCALING_MODE:
1348         res = dispatchSetScalingMode(args);
1349         break;
1350     case NATIVE_WINDOW_API_CONNECT:
1351         res = dispatchConnect(args);
1352         break;
1353     case NATIVE_WINDOW_API_DISCONNECT:
1354         res = dispatchDisconnect(args);
1355         break;
1356     case NATIVE_WINDOW_SET_SIDEBAND_STREAM:
1357         res = dispatchSetSidebandStream(args);
1358         break;
1359     case NATIVE_WINDOW_SET_BUFFERS_DATASPACE:
1360         res = dispatchSetBuffersDataSpace(args);
1361         break;
1362     case NATIVE_WINDOW_SET_BUFFERS_SMPTE2086_METADATA:
1363         res = dispatchSetBuffersSmpte2086Metadata(args);
1364         break;
1365     case NATIVE_WINDOW_SET_BUFFERS_CTA861_3_METADATA:
1366         res = dispatchSetBuffersCta8613Metadata(args);
1367         break;
1368     case NATIVE_WINDOW_SET_BUFFERS_HDR10_PLUS_METADATA:
1369         res = dispatchSetBuffersHdr10PlusMetadata(args);
1370         break;
1371     case NATIVE_WINDOW_SET_SURFACE_DAMAGE:
1372         res = dispatchSetSurfaceDamage(args);
1373         break;
1374     case NATIVE_WINDOW_SET_SHARED_BUFFER_MODE:
1375         res = dispatchSetSharedBufferMode(args);
1376         break;
1377     case NATIVE_WINDOW_SET_AUTO_REFRESH:
1378         res = dispatchSetAutoRefresh(args);
1379         break;
1380     case NATIVE_WINDOW_GET_REFRESH_CYCLE_DURATION:
1381         res = dispatchGetDisplayRefreshCycleDuration(args);
1382         break;
1383     case NATIVE_WINDOW_GET_NEXT_FRAME_ID:
1384         res = dispatchGetNextFrameId(args);
1385         break;
1386     case NATIVE_WINDOW_ENABLE_FRAME_TIMESTAMPS:
1387         res = dispatchEnableFrameTimestamps(args);
1388         break;
1389     case NATIVE_WINDOW_GET_COMPOSITOR_TIMING:
1390         res = dispatchGetCompositorTiming(args);
1391         break;
1392     case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS:
1393         res = dispatchGetFrameTimestamps(args);
1394         break;
1395     case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT:
1396         res = dispatchGetWideColorSupport(args);
1397         break;
1398     case NATIVE_WINDOW_GET_HDR_SUPPORT:
1399         res = dispatchGetHdrSupport(args);
1400         break;
1401     case NATIVE_WINDOW_SET_USAGE64:
1402         res = dispatchSetUsage64(args);
1403         break;
1404     case NATIVE_WINDOW_GET_CONSUMER_USAGE64:
1405         res = dispatchGetConsumerUsage64(args);
1406         break;
1407     case NATIVE_WINDOW_SET_AUTO_PREROTATION:
1408         res = dispatchSetAutoPrerotation(args);
1409         break;
1410     case NATIVE_WINDOW_GET_LAST_DEQUEUE_START:
1411         res = dispatchGetLastDequeueStartTime(args);
1412         break;
1413     case NATIVE_WINDOW_SET_DEQUEUE_TIMEOUT:
1414         res = dispatchSetDequeueTimeout(args);
1415         break;
1416     case NATIVE_WINDOW_GET_LAST_DEQUEUE_DURATION:
1417         res = dispatchGetLastDequeueDuration(args);
1418         break;
1419     case NATIVE_WINDOW_GET_LAST_QUEUE_DURATION:
1420         res = dispatchGetLastQueueDuration(args);
1421         break;
1422     case NATIVE_WINDOW_SET_FRAME_RATE:
1423         res = dispatchSetFrameRate(args);
1424         break;
1425     case NATIVE_WINDOW_SET_CANCEL_INTERCEPTOR:
1426         res = dispatchAddCancelInterceptor(args);
1427         break;
1428     case NATIVE_WINDOW_SET_DEQUEUE_INTERCEPTOR:
1429         res = dispatchAddDequeueInterceptor(args);
1430         break;
1431     case NATIVE_WINDOW_SET_PERFORM_INTERCEPTOR:
1432         res = dispatchAddPerformInterceptor(args);
1433         break;
1434     case NATIVE_WINDOW_SET_QUEUE_INTERCEPTOR:
1435         res = dispatchAddQueueInterceptor(args);
1436         break;
1437     case NATIVE_WINDOW_SET_QUERY_INTERCEPTOR:
1438         res = dispatchAddQueryInterceptor(args);
1439         break;
1440     case NATIVE_WINDOW_ALLOCATE_BUFFERS:
1441         allocateBuffers();
1442         res = NO_ERROR;
1443         break;
1444     case NATIVE_WINDOW_GET_LAST_QUEUED_BUFFER:
1445         res = dispatchGetLastQueuedBuffer(args);
1446         break;
1447     case NATIVE_WINDOW_GET_LAST_QUEUED_BUFFER2:
1448         res = dispatchGetLastQueuedBuffer2(args);
1449         break;
1450     case NATIVE_WINDOW_SET_FRAME_TIMELINE_INFO:
1451         res = dispatchSetFrameTimelineInfo(args);
1452         break;
1453     default:
1454         res = NAME_NOT_FOUND;
1455         break;
1456     }
1457     return res;
1458 }
1459 
dispatchConnect(va_list args)1460 int Surface::dispatchConnect(va_list args) {
1461     int api = va_arg(args, int);
1462     return connect(api);
1463 }
1464 
dispatchDisconnect(va_list args)1465 int Surface::dispatchDisconnect(va_list args) {
1466     int api = va_arg(args, int);
1467     return disconnect(api);
1468 }
1469 
dispatchSetUsage(va_list args)1470 int Surface::dispatchSetUsage(va_list args) {
1471     uint64_t usage = va_arg(args, uint32_t);
1472     return setUsage(usage);
1473 }
1474 
dispatchSetUsage64(va_list args)1475 int Surface::dispatchSetUsage64(va_list args) {
1476     uint64_t usage = va_arg(args, uint64_t);
1477     return setUsage(usage);
1478 }
1479 
dispatchSetCrop(va_list args)1480 int Surface::dispatchSetCrop(va_list args) {
1481     android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
1482     return setCrop(reinterpret_cast<Rect const*>(rect));
1483 }
1484 
dispatchSetBufferCount(va_list args)1485 int Surface::dispatchSetBufferCount(va_list args) {
1486     size_t bufferCount = va_arg(args, size_t);
1487     return setBufferCount(static_cast<int32_t>(bufferCount));
1488 }
1489 
dispatchSetBuffersGeometry(va_list args)1490 int Surface::dispatchSetBuffersGeometry(va_list args) {
1491     uint32_t width = va_arg(args, uint32_t);
1492     uint32_t height = va_arg(args, uint32_t);
1493     PixelFormat format = va_arg(args, PixelFormat);
1494     int err = setBuffersDimensions(width, height);
1495     if (err != 0) {
1496         return err;
1497     }
1498     return setBuffersFormat(format);
1499 }
1500 
dispatchSetBuffersDimensions(va_list args)1501 int Surface::dispatchSetBuffersDimensions(va_list args) {
1502     uint32_t width = va_arg(args, uint32_t);
1503     uint32_t height = va_arg(args, uint32_t);
1504     return setBuffersDimensions(width, height);
1505 }
1506 
dispatchSetBuffersUserDimensions(va_list args)1507 int Surface::dispatchSetBuffersUserDimensions(va_list args) {
1508     uint32_t width = va_arg(args, uint32_t);
1509     uint32_t height = va_arg(args, uint32_t);
1510     return setBuffersUserDimensions(width, height);
1511 }
1512 
dispatchSetBuffersFormat(va_list args)1513 int Surface::dispatchSetBuffersFormat(va_list args) {
1514     PixelFormat format = va_arg(args, PixelFormat);
1515     return setBuffersFormat(format);
1516 }
1517 
dispatchSetScalingMode(va_list args)1518 int Surface::dispatchSetScalingMode(va_list args) {
1519     int mode = va_arg(args, int);
1520     return setScalingMode(mode);
1521 }
1522 
dispatchSetBuffersTransform(va_list args)1523 int Surface::dispatchSetBuffersTransform(va_list args) {
1524     uint32_t transform = va_arg(args, uint32_t);
1525     return setBuffersTransform(transform);
1526 }
1527 
dispatchSetBuffersStickyTransform(va_list args)1528 int Surface::dispatchSetBuffersStickyTransform(va_list args) {
1529     uint32_t transform = va_arg(args, uint32_t);
1530     return setBuffersStickyTransform(transform);
1531 }
1532 
dispatchSetBuffersTimestamp(va_list args)1533 int Surface::dispatchSetBuffersTimestamp(va_list args) {
1534     int64_t timestamp = va_arg(args, int64_t);
1535     return setBuffersTimestamp(timestamp);
1536 }
1537 
dispatchLock(va_list args)1538 int Surface::dispatchLock(va_list args) {
1539     ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*);
1540     ARect* inOutDirtyBounds = va_arg(args, ARect*);
1541     return lock(outBuffer, inOutDirtyBounds);
1542 }
1543 
dispatchUnlockAndPost(va_list args)1544 int Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) {
1545     return unlockAndPost();
1546 }
1547 
dispatchSetSidebandStream(va_list args)1548 int Surface::dispatchSetSidebandStream(va_list args) {
1549     native_handle_t* sH = va_arg(args, native_handle_t*);
1550     sp<NativeHandle> sidebandHandle = NativeHandle::create(sH, false);
1551     setSidebandStream(sidebandHandle);
1552     return OK;
1553 }
1554 
dispatchSetBuffersDataSpace(va_list args)1555 int Surface::dispatchSetBuffersDataSpace(va_list args) {
1556     Dataspace dataspace = static_cast<Dataspace>(va_arg(args, int));
1557     return setBuffersDataSpace(dataspace);
1558 }
1559 
dispatchSetBuffersSmpte2086Metadata(va_list args)1560 int Surface::dispatchSetBuffersSmpte2086Metadata(va_list args) {
1561     const android_smpte2086_metadata* metadata =
1562         va_arg(args, const android_smpte2086_metadata*);
1563     return setBuffersSmpte2086Metadata(metadata);
1564 }
1565 
dispatchSetBuffersCta8613Metadata(va_list args)1566 int Surface::dispatchSetBuffersCta8613Metadata(va_list args) {
1567     const android_cta861_3_metadata* metadata =
1568         va_arg(args, const android_cta861_3_metadata*);
1569     return setBuffersCta8613Metadata(metadata);
1570 }
1571 
dispatchSetBuffersHdr10PlusMetadata(va_list args)1572 int Surface::dispatchSetBuffersHdr10PlusMetadata(va_list args) {
1573     const size_t size = va_arg(args, size_t);
1574     const uint8_t* metadata = va_arg(args, const uint8_t*);
1575     return setBuffersHdr10PlusMetadata(size, metadata);
1576 }
1577 
dispatchSetSurfaceDamage(va_list args)1578 int Surface::dispatchSetSurfaceDamage(va_list args) {
1579     android_native_rect_t* rects = va_arg(args, android_native_rect_t*);
1580     size_t numRects = va_arg(args, size_t);
1581     setSurfaceDamage(rects, numRects);
1582     return NO_ERROR;
1583 }
1584 
dispatchSetSharedBufferMode(va_list args)1585 int Surface::dispatchSetSharedBufferMode(va_list args) {
1586     bool sharedBufferMode = va_arg(args, int);
1587     return setSharedBufferMode(sharedBufferMode);
1588 }
1589 
dispatchSetAutoRefresh(va_list args)1590 int Surface::dispatchSetAutoRefresh(va_list args) {
1591     bool autoRefresh = va_arg(args, int);
1592     return setAutoRefresh(autoRefresh);
1593 }
1594 
dispatchGetDisplayRefreshCycleDuration(va_list args)1595 int Surface::dispatchGetDisplayRefreshCycleDuration(va_list args) {
1596     nsecs_t* outRefreshDuration = va_arg(args, int64_t*);
1597     return getDisplayRefreshCycleDuration(outRefreshDuration);
1598 }
1599 
dispatchGetNextFrameId(va_list args)1600 int Surface::dispatchGetNextFrameId(va_list args) {
1601     uint64_t* nextFrameId = va_arg(args, uint64_t*);
1602     *nextFrameId = getNextFrameNumber();
1603     return NO_ERROR;
1604 }
1605 
dispatchEnableFrameTimestamps(va_list args)1606 int Surface::dispatchEnableFrameTimestamps(va_list args) {
1607     bool enable = va_arg(args, int);
1608     enableFrameTimestamps(enable);
1609     return NO_ERROR;
1610 }
1611 
dispatchGetCompositorTiming(va_list args)1612 int Surface::dispatchGetCompositorTiming(va_list args) {
1613     nsecs_t* compositeDeadline = va_arg(args, int64_t*);
1614     nsecs_t* compositeInterval = va_arg(args, int64_t*);
1615     nsecs_t* compositeToPresentLatency = va_arg(args, int64_t*);
1616     return getCompositorTiming(compositeDeadline, compositeInterval,
1617             compositeToPresentLatency);
1618 }
1619 
dispatchGetFrameTimestamps(va_list args)1620 int Surface::dispatchGetFrameTimestamps(va_list args) {
1621     uint64_t frameId = va_arg(args, uint64_t);
1622     nsecs_t* outRequestedPresentTime = va_arg(args, int64_t*);
1623     nsecs_t* outAcquireTime = va_arg(args, int64_t*);
1624     nsecs_t* outLatchTime = va_arg(args, int64_t*);
1625     nsecs_t* outFirstRefreshStartTime = va_arg(args, int64_t*);
1626     nsecs_t* outLastRefreshStartTime = va_arg(args, int64_t*);
1627     nsecs_t* outGpuCompositionDoneTime = va_arg(args, int64_t*);
1628     nsecs_t* outDisplayPresentTime = va_arg(args, int64_t*);
1629     nsecs_t* outDequeueReadyTime = va_arg(args, int64_t*);
1630     nsecs_t* outReleaseTime = va_arg(args, int64_t*);
1631     return getFrameTimestamps(frameId,
1632             outRequestedPresentTime, outAcquireTime, outLatchTime,
1633             outFirstRefreshStartTime, outLastRefreshStartTime,
1634             outGpuCompositionDoneTime, outDisplayPresentTime,
1635             outDequeueReadyTime, outReleaseTime);
1636 }
1637 
dispatchGetWideColorSupport(va_list args)1638 int Surface::dispatchGetWideColorSupport(va_list args) {
1639     bool* outSupport = va_arg(args, bool*);
1640     return getWideColorSupport(outSupport);
1641 }
1642 
dispatchGetHdrSupport(va_list args)1643 int Surface::dispatchGetHdrSupport(va_list args) {
1644     bool* outSupport = va_arg(args, bool*);
1645     return getHdrSupport(outSupport);
1646 }
1647 
dispatchGetConsumerUsage64(va_list args)1648 int Surface::dispatchGetConsumerUsage64(va_list args) {
1649     uint64_t* usage = va_arg(args, uint64_t*);
1650     return getConsumerUsage(usage);
1651 }
1652 
dispatchSetAutoPrerotation(va_list args)1653 int Surface::dispatchSetAutoPrerotation(va_list args) {
1654     bool autoPrerotation = va_arg(args, int);
1655     return setAutoPrerotation(autoPrerotation);
1656 }
1657 
dispatchGetLastDequeueStartTime(va_list args)1658 int Surface::dispatchGetLastDequeueStartTime(va_list args) {
1659     int64_t* lastDequeueStartTime = va_arg(args, int64_t*);
1660     *lastDequeueStartTime = mLastDequeueStartTime;
1661     return NO_ERROR;
1662 }
1663 
dispatchSetDequeueTimeout(va_list args)1664 int Surface::dispatchSetDequeueTimeout(va_list args) {
1665     nsecs_t timeout = va_arg(args, int64_t);
1666     return setDequeueTimeout(timeout);
1667 }
1668 
dispatchGetLastDequeueDuration(va_list args)1669 int Surface::dispatchGetLastDequeueDuration(va_list args) {
1670     int64_t* lastDequeueDuration = va_arg(args, int64_t*);
1671     *lastDequeueDuration = mLastDequeueDuration;
1672     return NO_ERROR;
1673 }
1674 
dispatchGetLastQueueDuration(va_list args)1675 int Surface::dispatchGetLastQueueDuration(va_list args) {
1676     int64_t* lastQueueDuration = va_arg(args, int64_t*);
1677     *lastQueueDuration = mLastQueueDuration;
1678     return NO_ERROR;
1679 }
1680 
dispatchSetFrameRate(va_list args)1681 int Surface::dispatchSetFrameRate(va_list args) {
1682     float frameRate = static_cast<float>(va_arg(args, double));
1683     int8_t compatibility = static_cast<int8_t>(va_arg(args, int));
1684     int8_t changeFrameRateStrategy = static_cast<int8_t>(va_arg(args, int));
1685     return setFrameRate(frameRate, compatibility, changeFrameRateStrategy);
1686 }
1687 
dispatchAddCancelInterceptor(va_list args)1688 int Surface::dispatchAddCancelInterceptor(va_list args) {
1689     ANativeWindow_cancelBufferInterceptor interceptor =
1690             va_arg(args, ANativeWindow_cancelBufferInterceptor);
1691     void* data = va_arg(args, void*);
1692     std::lock_guard<std::shared_mutex> lock(mInterceptorMutex);
1693     mCancelInterceptor = interceptor;
1694     mCancelInterceptorData = data;
1695     return NO_ERROR;
1696 }
1697 
dispatchAddDequeueInterceptor(va_list args)1698 int Surface::dispatchAddDequeueInterceptor(va_list args) {
1699     ANativeWindow_dequeueBufferInterceptor interceptor =
1700             va_arg(args, ANativeWindow_dequeueBufferInterceptor);
1701     void* data = va_arg(args, void*);
1702     std::lock_guard<std::shared_mutex> lock(mInterceptorMutex);
1703     mDequeueInterceptor = interceptor;
1704     mDequeueInterceptorData = data;
1705     return NO_ERROR;
1706 }
1707 
dispatchAddPerformInterceptor(va_list args)1708 int Surface::dispatchAddPerformInterceptor(va_list args) {
1709     ANativeWindow_performInterceptor interceptor = va_arg(args, ANativeWindow_performInterceptor);
1710     void* data = va_arg(args, void*);
1711     std::lock_guard<std::shared_mutex> lock(mInterceptorMutex);
1712     mPerformInterceptor = interceptor;
1713     mPerformInterceptorData = data;
1714     return NO_ERROR;
1715 }
1716 
dispatchAddQueueInterceptor(va_list args)1717 int Surface::dispatchAddQueueInterceptor(va_list args) {
1718     ANativeWindow_queueBufferInterceptor interceptor =
1719             va_arg(args, ANativeWindow_queueBufferInterceptor);
1720     void* data = va_arg(args, void*);
1721     std::lock_guard<std::shared_mutex> lock(mInterceptorMutex);
1722     mQueueInterceptor = interceptor;
1723     mQueueInterceptorData = data;
1724     return NO_ERROR;
1725 }
1726 
dispatchAddQueryInterceptor(va_list args)1727 int Surface::dispatchAddQueryInterceptor(va_list args) {
1728     ANativeWindow_queryInterceptor interceptor = va_arg(args, ANativeWindow_queryInterceptor);
1729     void* data = va_arg(args, void*);
1730     std::lock_guard<std::shared_mutex> lock(mInterceptorMutex);
1731     mQueryInterceptor = interceptor;
1732     mQueryInterceptorData = data;
1733     return NO_ERROR;
1734 }
1735 
dispatchGetLastQueuedBuffer(va_list args)1736 int Surface::dispatchGetLastQueuedBuffer(va_list args) {
1737     AHardwareBuffer** buffer = va_arg(args, AHardwareBuffer**);
1738     int* fence = va_arg(args, int*);
1739     float* matrix = va_arg(args, float*);
1740     sp<GraphicBuffer> graphicBuffer;
1741     sp<Fence> spFence;
1742 
1743     int result = mGraphicBufferProducer->getLastQueuedBuffer(&graphicBuffer, &spFence, matrix);
1744 
1745     if (graphicBuffer != nullptr) {
1746         *buffer = graphicBuffer->toAHardwareBuffer();
1747         AHardwareBuffer_acquire(*buffer);
1748     } else {
1749         *buffer = nullptr;
1750     }
1751 
1752     if (spFence != nullptr) {
1753         *fence = spFence->dup();
1754     } else {
1755         *fence = -1;
1756     }
1757     return result;
1758 }
1759 
dispatchGetLastQueuedBuffer2(va_list args)1760 int Surface::dispatchGetLastQueuedBuffer2(va_list args) {
1761     AHardwareBuffer** buffer = va_arg(args, AHardwareBuffer**);
1762     int* fence = va_arg(args, int*);
1763     ARect* crop = va_arg(args, ARect*);
1764     uint32_t* transform = va_arg(args, uint32_t*);
1765     sp<GraphicBuffer> graphicBuffer;
1766     sp<Fence> spFence;
1767 
1768     Rect r;
1769     int result =
1770             mGraphicBufferProducer->getLastQueuedBuffer(&graphicBuffer, &spFence, &r, transform);
1771 
1772     if (graphicBuffer != nullptr) {
1773         *buffer = graphicBuffer->toAHardwareBuffer();
1774         AHardwareBuffer_acquire(*buffer);
1775 
1776         // Avoid setting crop* unless buffer is valid (matches IGBP behavior)
1777         crop->left = r.left;
1778         crop->top = r.top;
1779         crop->right = r.right;
1780         crop->bottom = r.bottom;
1781     } else {
1782         *buffer = nullptr;
1783     }
1784 
1785     if (spFence != nullptr) {
1786         *fence = spFence->dup();
1787     } else {
1788         *fence = -1;
1789     }
1790     return result;
1791 }
1792 
dispatchSetFrameTimelineInfo(va_list args)1793 int Surface::dispatchSetFrameTimelineInfo(va_list args) {
1794     ATRACE_CALL();
1795     ALOGV("Surface::%s", __func__);
1796 
1797     const auto nativeWindowFtlInfo = static_cast<ANativeWindowFrameTimelineInfo>(
1798             va_arg(args, ANativeWindowFrameTimelineInfo));
1799 
1800     FrameTimelineInfo ftlInfo;
1801     ftlInfo.vsyncId = nativeWindowFtlInfo.frameTimelineVsyncId;
1802     ftlInfo.inputEventId = nativeWindowFtlInfo.inputEventId;
1803     ftlInfo.startTimeNanos = nativeWindowFtlInfo.startTimeNanos;
1804     ftlInfo.useForRefreshRateSelection = nativeWindowFtlInfo.useForRefreshRateSelection;
1805     ftlInfo.skippedFrameVsyncId = nativeWindowFtlInfo.skippedFrameVsyncId;
1806     ftlInfo.skippedFrameStartTimeNanos = nativeWindowFtlInfo.skippedFrameStartTimeNanos;
1807 
1808     return setFrameTimelineInfo(nativeWindowFtlInfo.frameNumber, ftlInfo);
1809 }
1810 
transformToDisplayInverse() const1811 bool Surface::transformToDisplayInverse() const {
1812     return (mTransform & NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY) ==
1813             NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
1814 }
1815 
connect(int api)1816 int Surface::connect(int api) {
1817     static sp<IProducerListener> listener = new StubProducerListener();
1818     return connect(api, listener);
1819 }
1820 
connect(int api,const sp<IProducerListener> & listener)1821 int Surface::connect(int api, const sp<IProducerListener>& listener) {
1822     return connect(api, listener, false);
1823 }
1824 
connect(int api,bool reportBufferRemoval,const sp<SurfaceListener> & sListener)1825 int Surface::connect(
1826         int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) {
1827     if (sListener != nullptr) {
1828         mListenerProxy = new ProducerListenerProxy(this, sListener);
1829     }
1830     return connect(api, mListenerProxy, reportBufferRemoval);
1831 }
1832 
connect(int api,const sp<IProducerListener> & listener,bool reportBufferRemoval)1833 int Surface::connect(
1834         int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) {
1835     ATRACE_CALL();
1836     ALOGV("Surface::connect");
1837     Mutex::Autolock lock(mMutex);
1838     IGraphicBufferProducer::QueueBufferOutput output;
1839     mReportRemovedBuffers = reportBufferRemoval;
1840     int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output);
1841     if (err == NO_ERROR) {
1842         mDefaultWidth = output.width;
1843         mDefaultHeight = output.height;
1844         mNextFrameNumber = output.nextFrameNumber;
1845         mMaxBufferCount = output.maxBufferCount;
1846 
1847         // Ignore transform hint if sticky transform is set or transform to display inverse flag is
1848         // set. Transform hint should be ignored if the client is expected to always submit buffers
1849         // in the same orientation.
1850         if (mStickyTransform == 0 && !transformToDisplayInverse()) {
1851             mTransformHint = output.transformHint;
1852         }
1853 
1854         mConsumerRunningBehind = (output.numPendingBuffers >= 2);
1855     }
1856     if (!err && api == NATIVE_WINDOW_API_CPU) {
1857         mConnectedToCpu = true;
1858         // Clear the dirty region in case we're switching from a non-CPU API
1859         mDirtyRegion.clear();
1860     } else if (!err) {
1861         // Initialize the dirty region for tracking surface damage
1862         mDirtyRegion = Region::INVALID_REGION;
1863     }
1864 
1865     return err;
1866 }
1867 
1868 
disconnect(int api,IGraphicBufferProducer::DisconnectMode mode)1869 int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) {
1870     ATRACE_CALL();
1871     ALOGV("Surface::disconnect");
1872     Mutex::Autolock lock(mMutex);
1873     mRemovedBuffers.clear();
1874     mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
1875     mSharedBufferHasBeenQueued = false;
1876     freeAllBuffers();
1877     int err = mGraphicBufferProducer->disconnect(api, mode);
1878     if (!err) {
1879         mReqFormat = 0;
1880         mReqWidth = 0;
1881         mReqHeight = 0;
1882         mReqUsage = 0;
1883         mCrop.clear();
1884         mDataSpace = Dataspace::UNKNOWN;
1885         mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
1886         mTransform = 0;
1887         mStickyTransform = 0;
1888         mAutoPrerotation = false;
1889         mEnableFrameTimestamps = false;
1890         mMaxBufferCount = NUM_BUFFER_SLOTS;
1891 
1892         if (api == NATIVE_WINDOW_API_CPU) {
1893             mConnectedToCpu = false;
1894         }
1895     }
1896     return err;
1897 }
1898 
detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)1899 int Surface::detachNextBuffer(sp<GraphicBuffer>* outBuffer,
1900         sp<Fence>* outFence) {
1901     ATRACE_CALL();
1902     ALOGV("Surface::detachNextBuffer");
1903 
1904     if (outBuffer == nullptr || outFence == nullptr) {
1905         return BAD_VALUE;
1906     }
1907 
1908     Mutex::Autolock lock(mMutex);
1909     if (mReportRemovedBuffers) {
1910         mRemovedBuffers.clear();
1911     }
1912 
1913     sp<GraphicBuffer> buffer(nullptr);
1914     sp<Fence> fence(nullptr);
1915     status_t result = mGraphicBufferProducer->detachNextBuffer(
1916             &buffer, &fence);
1917     if (result != NO_ERROR) {
1918         return result;
1919     }
1920 
1921     *outBuffer = buffer;
1922     if (fence != nullptr && fence->isValid()) {
1923         *outFence = fence;
1924     } else {
1925         *outFence = Fence::NO_FENCE;
1926     }
1927 
1928     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
1929         if (mSlots[i].buffer != nullptr &&
1930                 mSlots[i].buffer->getId() == buffer->getId()) {
1931             if (mReportRemovedBuffers) {
1932                 mRemovedBuffers.push_back(mSlots[i].buffer);
1933             }
1934             mSlots[i].buffer = nullptr;
1935         }
1936     }
1937 
1938     return NO_ERROR;
1939 }
1940 
attachBuffer(ANativeWindowBuffer * buffer)1941 int Surface::attachBuffer(ANativeWindowBuffer* buffer)
1942 {
1943     ATRACE_CALL();
1944     ALOGV("Surface::attachBuffer");
1945 
1946     Mutex::Autolock lock(mMutex);
1947     if (mReportRemovedBuffers) {
1948         mRemovedBuffers.clear();
1949     }
1950 
1951     sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer));
1952     uint32_t priorGeneration = graphicBuffer->mGenerationNumber;
1953     graphicBuffer->mGenerationNumber = mGenerationNumber;
1954     int32_t attachedSlot = -1;
1955     status_t result = mGraphicBufferProducer->attachBuffer(&attachedSlot, graphicBuffer);
1956     if (result != NO_ERROR) {
1957         ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result);
1958         graphicBuffer->mGenerationNumber = priorGeneration;
1959         return result;
1960     }
1961     if (mReportRemovedBuffers && (mSlots[attachedSlot].buffer != nullptr)) {
1962         mRemovedBuffers.push_back(mSlots[attachedSlot].buffer);
1963     }
1964     mSlots[attachedSlot].buffer = graphicBuffer;
1965     mDequeuedSlots.insert(attachedSlot);
1966 
1967     return NO_ERROR;
1968 }
1969 
setUsage(uint64_t reqUsage)1970 int Surface::setUsage(uint64_t reqUsage)
1971 {
1972     ALOGV("Surface::setUsage");
1973     Mutex::Autolock lock(mMutex);
1974     if (reqUsage != mReqUsage) {
1975         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
1976     }
1977     mReqUsage = reqUsage;
1978     return OK;
1979 }
1980 
setCrop(Rect const * rect)1981 int Surface::setCrop(Rect const* rect)
1982 {
1983     ATRACE_CALL();
1984 
1985     Rect realRect(Rect::EMPTY_RECT);
1986     if (rect == nullptr || rect->isEmpty()) {
1987         realRect.clear();
1988     } else {
1989         realRect = *rect;
1990     }
1991 
1992     ALOGV("Surface::setCrop rect=[%d %d %d %d]",
1993             realRect.left, realRect.top, realRect.right, realRect.bottom);
1994 
1995     Mutex::Autolock lock(mMutex);
1996     mCrop = realRect;
1997     return NO_ERROR;
1998 }
1999 
setBufferCount(int bufferCount)2000 int Surface::setBufferCount(int bufferCount)
2001 {
2002     ATRACE_CALL();
2003     ALOGV("Surface::setBufferCount");
2004     Mutex::Autolock lock(mMutex);
2005 
2006     status_t err = NO_ERROR;
2007     if (bufferCount == 0) {
2008         err = mGraphicBufferProducer->setMaxDequeuedBufferCount(1);
2009     } else {
2010         int minUndequeuedBuffers = 0;
2011         err = mGraphicBufferProducer->query(
2012                 NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers);
2013         if (err == NO_ERROR) {
2014             err = mGraphicBufferProducer->setMaxDequeuedBufferCount(
2015                     bufferCount - minUndequeuedBuffers);
2016         }
2017     }
2018 
2019     ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s",
2020              bufferCount, strerror(-err));
2021 
2022     return err;
2023 }
2024 
setMaxDequeuedBufferCount(int maxDequeuedBuffers)2025 int Surface::setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
2026     ATRACE_CALL();
2027     ALOGV("Surface::setMaxDequeuedBufferCount");
2028     Mutex::Autolock lock(mMutex);
2029 
2030     status_t err = mGraphicBufferProducer->setMaxDequeuedBufferCount(
2031             maxDequeuedBuffers);
2032     ALOGE_IF(err, "IGraphicBufferProducer::setMaxDequeuedBufferCount(%d) "
2033             "returned %s", maxDequeuedBuffers, strerror(-err));
2034 
2035     return err;
2036 }
2037 
setAsyncMode(bool async)2038 int Surface::setAsyncMode(bool async) {
2039     ATRACE_CALL();
2040     ALOGV("Surface::setAsyncMode");
2041     Mutex::Autolock lock(mMutex);
2042 
2043     status_t err = mGraphicBufferProducer->setAsyncMode(async);
2044     ALOGE_IF(err, "IGraphicBufferProducer::setAsyncMode(%d) returned %s",
2045             async, strerror(-err));
2046 
2047     return err;
2048 }
2049 
setSharedBufferMode(bool sharedBufferMode)2050 int Surface::setSharedBufferMode(bool sharedBufferMode) {
2051     ATRACE_CALL();
2052     ALOGV("Surface::setSharedBufferMode (%d)", sharedBufferMode);
2053     Mutex::Autolock lock(mMutex);
2054 
2055     status_t err = mGraphicBufferProducer->setSharedBufferMode(
2056             sharedBufferMode);
2057     if (err == NO_ERROR) {
2058         mSharedBufferMode = sharedBufferMode;
2059     }
2060     ALOGE_IF(err, "IGraphicBufferProducer::setSharedBufferMode(%d) returned"
2061             "%s", sharedBufferMode, strerror(-err));
2062 
2063     return err;
2064 }
2065 
setAutoRefresh(bool autoRefresh)2066 int Surface::setAutoRefresh(bool autoRefresh) {
2067     ATRACE_CALL();
2068     ALOGV("Surface::setAutoRefresh (%d)", autoRefresh);
2069     Mutex::Autolock lock(mMutex);
2070 
2071     status_t err = mGraphicBufferProducer->setAutoRefresh(autoRefresh);
2072     if (err == NO_ERROR) {
2073         mAutoRefresh = autoRefresh;
2074     }
2075     ALOGE_IF(err, "IGraphicBufferProducer::setAutoRefresh(%d) returned %s",
2076             autoRefresh, strerror(-err));
2077     return err;
2078 }
2079 
setBuffersDimensions(uint32_t width,uint32_t height)2080 int Surface::setBuffersDimensions(uint32_t width, uint32_t height)
2081 {
2082     ATRACE_CALL();
2083     ALOGV("Surface::setBuffersDimensions");
2084 
2085     if ((width && !height) || (!width && height))
2086         return BAD_VALUE;
2087 
2088     Mutex::Autolock lock(mMutex);
2089     if (width != mReqWidth || height != mReqHeight) {
2090         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
2091     }
2092     mReqWidth = width;
2093     mReqHeight = height;
2094     return NO_ERROR;
2095 }
2096 
setBuffersUserDimensions(uint32_t width,uint32_t height)2097 int Surface::setBuffersUserDimensions(uint32_t width, uint32_t height)
2098 {
2099     ATRACE_CALL();
2100     ALOGV("Surface::setBuffersUserDimensions");
2101 
2102     if ((width && !height) || (!width && height))
2103         return BAD_VALUE;
2104 
2105     Mutex::Autolock lock(mMutex);
2106     if (width != mUserWidth || height != mUserHeight) {
2107         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
2108     }
2109     mUserWidth = width;
2110     mUserHeight = height;
2111     return NO_ERROR;
2112 }
2113 
setBuffersFormat(PixelFormat format)2114 int Surface::setBuffersFormat(PixelFormat format)
2115 {
2116     ALOGV("Surface::setBuffersFormat");
2117 
2118     Mutex::Autolock lock(mMutex);
2119     if (format != mReqFormat) {
2120         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
2121     }
2122     mReqFormat = format;
2123     return NO_ERROR;
2124 }
2125 
setScalingMode(int mode)2126 int Surface::setScalingMode(int mode)
2127 {
2128     ATRACE_CALL();
2129     ALOGV("Surface::setScalingMode(%d)", mode);
2130 
2131     switch (mode) {
2132         case NATIVE_WINDOW_SCALING_MODE_FREEZE:
2133         case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
2134         case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP:
2135         case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP:
2136             break;
2137         default:
2138             ALOGE("unknown scaling mode: %d", mode);
2139             return BAD_VALUE;
2140     }
2141 
2142     Mutex::Autolock lock(mMutex);
2143     mScalingMode = mode;
2144     return NO_ERROR;
2145 }
2146 
setBuffersTransform(uint32_t transform)2147 int Surface::setBuffersTransform(uint32_t transform)
2148 {
2149     ATRACE_CALL();
2150     ALOGV("Surface::setBuffersTransform");
2151     Mutex::Autolock lock(mMutex);
2152     // Ensure NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY is sticky. If the client sets the flag, do not
2153     // override it until the surface is disconnected. This is a temporary workaround for camera
2154     // until they switch to using Buffer State Layers. Currently if client sets the buffer transform
2155     // it may be overriden by the buffer producer when the producer sets the buffer transform.
2156     if (transformToDisplayInverse()) {
2157         transform |= NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
2158     }
2159     mTransform = transform;
2160     return NO_ERROR;
2161 }
2162 
setBuffersStickyTransform(uint32_t transform)2163 int Surface::setBuffersStickyTransform(uint32_t transform)
2164 {
2165     ATRACE_CALL();
2166     ALOGV("Surface::setBuffersStickyTransform");
2167     Mutex::Autolock lock(mMutex);
2168     mStickyTransform = transform;
2169     return NO_ERROR;
2170 }
2171 
setBuffersTimestamp(int64_t timestamp)2172 int Surface::setBuffersTimestamp(int64_t timestamp)
2173 {
2174     ALOGV("Surface::setBuffersTimestamp");
2175     Mutex::Autolock lock(mMutex);
2176     mTimestamp = timestamp;
2177     return NO_ERROR;
2178 }
2179 
setBuffersDataSpace(Dataspace dataSpace)2180 int Surface::setBuffersDataSpace(Dataspace dataSpace)
2181 {
2182     ALOGV("Surface::setBuffersDataSpace");
2183     Mutex::Autolock lock(mMutex);
2184     mDataSpace = dataSpace;
2185     return NO_ERROR;
2186 }
2187 
setBuffersSmpte2086Metadata(const android_smpte2086_metadata * metadata)2188 int Surface::setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata) {
2189     ALOGV("Surface::setBuffersSmpte2086Metadata");
2190     Mutex::Autolock lock(mMutex);
2191     mHdrMetadataIsSet |= HdrMetadata::SMPTE2086;
2192     if (metadata) {
2193         mHdrMetadata.smpte2086 = *metadata;
2194         mHdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
2195     } else {
2196         mHdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
2197     }
2198     return NO_ERROR;
2199 }
2200 
setBuffersCta8613Metadata(const android_cta861_3_metadata * metadata)2201 int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata) {
2202     ALOGV("Surface::setBuffersCta8613Metadata");
2203     Mutex::Autolock lock(mMutex);
2204     mHdrMetadataIsSet |= HdrMetadata::CTA861_3;
2205     if (metadata) {
2206         mHdrMetadata.cta8613 = *metadata;
2207         mHdrMetadata.validTypes |= HdrMetadata::CTA861_3;
2208     } else {
2209         mHdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
2210     }
2211     return NO_ERROR;
2212 }
2213 
setBuffersHdr10PlusMetadata(const size_t size,const uint8_t * metadata)2214 int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) {
2215     ALOGV("Surface::setBuffersBlobMetadata");
2216     Mutex::Autolock lock(mMutex);
2217     mHdrMetadataIsSet |= HdrMetadata::HDR10PLUS;
2218     if (size > 0) {
2219         mHdrMetadata.hdr10plus.assign(metadata, metadata + size);
2220         mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS;
2221     } else {
2222         mHdrMetadata.validTypes &= ~HdrMetadata::HDR10PLUS;
2223         mHdrMetadata.hdr10plus.clear();
2224     }
2225     return NO_ERROR;
2226 }
2227 
getBuffersDataSpace()2228 Dataspace Surface::getBuffersDataSpace() {
2229     ALOGV("Surface::getBuffersDataSpace");
2230     Mutex::Autolock lock(mMutex);
2231     return mDataSpace;
2232 }
2233 
freeAllBuffers()2234 void Surface::freeAllBuffers() {
2235     if (!mDequeuedSlots.empty()) {
2236         ALOGE("%s: %zu buffers were freed while being dequeued!",
2237                 __FUNCTION__, mDequeuedSlots.size());
2238     }
2239     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
2240         mSlots[i].buffer = nullptr;
2241     }
2242 }
2243 
getAndFlushBuffersFromSlots(const std::vector<int32_t> & slots,std::vector<sp<GraphicBuffer>> * outBuffers)2244 status_t Surface::getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots,
2245         std::vector<sp<GraphicBuffer>>* outBuffers) {
2246     ALOGV("Surface::getAndFlushBuffersFromSlots");
2247     for (int32_t i : slots) {
2248         if (i < 0 || i >= NUM_BUFFER_SLOTS) {
2249             ALOGE("%s: Invalid slotIndex: %d", __FUNCTION__, i);
2250             return BAD_VALUE;
2251         }
2252     }
2253 
2254     Mutex::Autolock lock(mMutex);
2255     for (int32_t i : slots) {
2256         if (mSlots[i].buffer == nullptr) {
2257             ALOGW("%s: Discarded slot %d doesn't contain buffer!", __FUNCTION__, i);
2258             continue;
2259         }
2260         // Don't flush currently dequeued buffers
2261         if (mDequeuedSlots.count(i) > 0) {
2262             continue;
2263         }
2264         outBuffers->push_back(mSlots[i].buffer);
2265         mSlots[i].buffer = nullptr;
2266     }
2267     return OK;
2268 }
2269 
setSurfaceDamage(android_native_rect_t * rects,size_t numRects)2270 void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) {
2271     ATRACE_CALL();
2272     ALOGV("Surface::setSurfaceDamage");
2273     Mutex::Autolock lock(mMutex);
2274 
2275     if (mConnectedToCpu || numRects == 0) {
2276         mDirtyRegion = Region::INVALID_REGION;
2277         return;
2278     }
2279 
2280     mDirtyRegion.clear();
2281     for (size_t r = 0; r < numRects; ++r) {
2282         // We intentionally flip top and bottom here, since because they're
2283         // specified with a bottom-left origin, top > bottom, which fails
2284         // validation in the Region class. We will fix this up when we flip to a
2285         // top-left origin in queueBuffer.
2286         Rect rect(rects[r].left, rects[r].bottom, rects[r].right, rects[r].top);
2287         mDirtyRegion.orSelf(rect);
2288     }
2289 }
2290 
2291 // ----------------------------------------------------------------------
2292 // the lock/unlock APIs must be used from the same thread
2293 
copyBlt(const sp<GraphicBuffer> & dst,const sp<GraphicBuffer> & src,const Region & reg,int * dstFenceFd)2294 static status_t copyBlt(
2295         const sp<GraphicBuffer>& dst,
2296         const sp<GraphicBuffer>& src,
2297         const Region& reg,
2298         int *dstFenceFd)
2299 {
2300     if (dst->getId() == src->getId())
2301         return OK;
2302 
2303     // src and dst with, height and format must be identical. no verification
2304     // is done here.
2305     status_t err;
2306     uint8_t* src_bits = nullptr;
2307     err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(),
2308             reinterpret_cast<void**>(&src_bits));
2309     ALOGE_IF(err, "error locking src buffer %s", strerror(-err));
2310 
2311     uint8_t* dst_bits = nullptr;
2312     err = dst->lockAsync(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(),
2313             reinterpret_cast<void**>(&dst_bits), *dstFenceFd);
2314     ALOGE_IF(err, "error locking dst buffer %s", strerror(-err));
2315     *dstFenceFd = -1;
2316 
2317     Region::const_iterator head(reg.begin());
2318     Region::const_iterator tail(reg.end());
2319     if (head != tail && src_bits && dst_bits) {
2320         const size_t bpp = bytesPerPixel(src->format);
2321         const size_t dbpr = static_cast<uint32_t>(dst->stride) * bpp;
2322         const size_t sbpr = static_cast<uint32_t>(src->stride) * bpp;
2323 
2324         while (head != tail) {
2325             const Rect& r(*head++);
2326             int32_t h = r.height();
2327             if (h <= 0) continue;
2328             size_t size = static_cast<uint32_t>(r.width()) * bpp;
2329             uint8_t const * s = src_bits +
2330                     static_cast<uint32_t>(r.left + src->stride * r.top) * bpp;
2331             uint8_t       * d = dst_bits +
2332                     static_cast<uint32_t>(r.left + dst->stride * r.top) * bpp;
2333             if (dbpr==sbpr && size==sbpr) {
2334                 size *= static_cast<size_t>(h);
2335                 h = 1;
2336             }
2337             do {
2338                 memcpy(d, s, size);
2339                 d += dbpr;
2340                 s += sbpr;
2341             } while (--h > 0);
2342         }
2343     }
2344 
2345     if (src_bits)
2346         src->unlock();
2347 
2348     if (dst_bits)
2349         dst->unlockAsync(dstFenceFd);
2350 
2351     return err;
2352 }
2353 
2354 // ----------------------------------------------------------------------------
2355 
lock(ANativeWindow_Buffer * outBuffer,ARect * inOutDirtyBounds)2356 status_t Surface::lock(
2357         ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds)
2358 {
2359     if (mLockedBuffer != nullptr) {
2360         ALOGE("Surface::lock failed, already locked");
2361         return INVALID_OPERATION;
2362     }
2363 
2364     if (!mConnectedToCpu) {
2365         int err = Surface::connect(NATIVE_WINDOW_API_CPU);
2366         if (err) {
2367             return err;
2368         }
2369         // we're intending to do software rendering from this point
2370         setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
2371     }
2372 
2373     ANativeWindowBuffer* out;
2374     int fenceFd = -1;
2375     status_t err = dequeueBuffer(&out, &fenceFd);
2376     ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err));
2377     if (err == NO_ERROR) {
2378         sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out));
2379         const Rect bounds(backBuffer->width, backBuffer->height);
2380 
2381         Region newDirtyRegion;
2382         if (inOutDirtyBounds) {
2383             newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds));
2384             newDirtyRegion.andSelf(bounds);
2385         } else {
2386             newDirtyRegion.set(bounds);
2387         }
2388 
2389         // figure out if we can copy the frontbuffer back
2390         const sp<GraphicBuffer>& frontBuffer(mPostedBuffer);
2391         const bool canCopyBack = (frontBuffer != nullptr &&
2392                 backBuffer->width  == frontBuffer->width &&
2393                 backBuffer->height == frontBuffer->height &&
2394                 backBuffer->format == frontBuffer->format);
2395 
2396         if (canCopyBack) {
2397             // copy the area that is invalid and not repainted this round
2398             const Region copyback(mDirtyRegion.subtract(newDirtyRegion));
2399             if (!copyback.isEmpty()) {
2400                 copyBlt(backBuffer, frontBuffer, copyback, &fenceFd);
2401             }
2402         } else {
2403             // if we can't copy-back anything, modify the user's dirty
2404             // region to make sure they redraw the whole buffer
2405             newDirtyRegion.set(bounds);
2406             mDirtyRegion.clear();
2407             Mutex::Autolock lock(mMutex);
2408             for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) {
2409                 mSlots[i].dirtyRegion.clear();
2410             }
2411         }
2412 
2413 
2414         { // scope for the lock
2415             Mutex::Autolock lock(mMutex);
2416             int backBufferSlot(getSlotFromBufferLocked(backBuffer.get()));
2417             if (backBufferSlot >= 0) {
2418                 Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion);
2419                 mDirtyRegion.subtract(dirtyRegion);
2420                 dirtyRegion = newDirtyRegion;
2421             }
2422         }
2423 
2424         mDirtyRegion.orSelf(newDirtyRegion);
2425         if (inOutDirtyBounds) {
2426             *inOutDirtyBounds = newDirtyRegion.getBounds();
2427         }
2428 
2429         void* vaddr;
2430         status_t res = backBuffer->lockAsync(
2431                 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2432                 newDirtyRegion.bounds(), &vaddr, fenceFd);
2433 
2434         ALOGW_IF(res, "failed locking buffer (handle = %p)",
2435                 backBuffer->handle);
2436 
2437         if (res != 0) {
2438             err = INVALID_OPERATION;
2439         } else {
2440             mLockedBuffer = backBuffer;
2441             outBuffer->width  = backBuffer->width;
2442             outBuffer->height = backBuffer->height;
2443             outBuffer->stride = backBuffer->stride;
2444             outBuffer->format = backBuffer->format;
2445             outBuffer->bits   = vaddr;
2446         }
2447     }
2448     return err;
2449 }
2450 
unlockAndPost()2451 status_t Surface::unlockAndPost()
2452 {
2453     if (mLockedBuffer == nullptr) {
2454         ALOGE("Surface::unlockAndPost failed, no locked buffer");
2455         return INVALID_OPERATION;
2456     }
2457 
2458     int fd = -1;
2459     status_t err = mLockedBuffer->unlockAsync(&fd);
2460     ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle);
2461 
2462     err = queueBuffer(mLockedBuffer.get(), fd);
2463     ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)",
2464             mLockedBuffer->handle, strerror(-err));
2465 
2466     mPostedBuffer = mLockedBuffer;
2467     mLockedBuffer = nullptr;
2468     return err;
2469 }
2470 
waitForNextFrame(uint64_t lastFrame,nsecs_t timeout)2471 bool Surface::waitForNextFrame(uint64_t lastFrame, nsecs_t timeout) {
2472     Mutex::Autolock lock(mMutex);
2473     if (mNextFrameNumber > lastFrame) {
2474       return true;
2475     }
2476     return mQueueBufferCondition.waitRelative(mMutex, timeout) == OK;
2477 }
2478 
getUniqueId(uint64_t * outId) const2479 status_t Surface::getUniqueId(uint64_t* outId) const {
2480     Mutex::Autolock lock(mMutex);
2481     return mGraphicBufferProducer->getUniqueId(outId);
2482 }
2483 
getConsumerUsage(uint64_t * outUsage) const2484 int Surface::getConsumerUsage(uint64_t* outUsage) const {
2485     Mutex::Autolock lock(mMutex);
2486     return mGraphicBufferProducer->getConsumerUsage(outUsage);
2487 }
2488 
getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>> * out)2489 status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) {
2490     if (out == nullptr) {
2491         ALOGE("%s: out must not be null!", __FUNCTION__);
2492         return BAD_VALUE;
2493     }
2494 
2495     Mutex::Autolock lock(mMutex);
2496     *out = mRemovedBuffers;
2497     mRemovedBuffers.clear();
2498     return OK;
2499 }
2500 
attachAndQueueBufferWithDataspace(Surface * surface,sp<GraphicBuffer> buffer,Dataspace dataspace)2501 status_t Surface::attachAndQueueBufferWithDataspace(Surface* surface, sp<GraphicBuffer> buffer,
2502                                                     Dataspace dataspace) {
2503     if (buffer == nullptr) {
2504         return BAD_VALUE;
2505     }
2506     int err = static_cast<ANativeWindow*>(surface)->perform(surface, NATIVE_WINDOW_API_CONNECT,
2507                                                             NATIVE_WINDOW_API_CPU);
2508     if (err != OK) {
2509         return err;
2510     }
2511     ui::Dataspace tmpDataspace = surface->getBuffersDataSpace();
2512     err = surface->setBuffersDataSpace(dataspace);
2513     if (err != OK) {
2514         return err;
2515     }
2516     err = surface->attachBuffer(buffer->getNativeBuffer());
2517     if (err != OK) {
2518         return err;
2519     }
2520     err = static_cast<ANativeWindow*>(surface)->queueBuffer(surface, buffer->getNativeBuffer(), -1);
2521     if (err != OK) {
2522         return err;
2523     }
2524     err = surface->setBuffersDataSpace(tmpDataspace);
2525     if (err != OK) {
2526         return err;
2527     }
2528     err = surface->disconnect(NATIVE_WINDOW_API_CPU);
2529     return err;
2530 }
2531 
setAutoPrerotation(bool autoPrerotation)2532 int Surface::setAutoPrerotation(bool autoPrerotation) {
2533     ATRACE_CALL();
2534     ALOGV("Surface::setAutoPrerotation (%d)", autoPrerotation);
2535     Mutex::Autolock lock(mMutex);
2536 
2537     if (mAutoPrerotation == autoPrerotation) {
2538         return OK;
2539     }
2540 
2541     status_t err = mGraphicBufferProducer->setAutoPrerotation(autoPrerotation);
2542     if (err == NO_ERROR) {
2543         mAutoPrerotation = autoPrerotation;
2544     }
2545     ALOGE_IF(err, "IGraphicBufferProducer::setAutoPrerotation(%d) returned %s", autoPrerotation,
2546              strerror(-err));
2547     return err;
2548 }
2549 
onBuffersDiscarded(const std::vector<int32_t> & slots)2550 void Surface::ProducerListenerProxy::onBuffersDiscarded(const std::vector<int32_t>& slots) {
2551     ATRACE_CALL();
2552     sp<Surface> parent = mParent.promote();
2553     if (parent == nullptr) {
2554         return;
2555     }
2556 
2557     std::vector<sp<GraphicBuffer>> discardedBufs;
2558     status_t res = parent->getAndFlushBuffersFromSlots(slots, &discardedBufs);
2559     if (res != OK) {
2560         ALOGE("%s: Failed to get buffers from slots: %s(%d)", __FUNCTION__,
2561                 strerror(-res), res);
2562         return;
2563     }
2564 
2565     mSurfaceListener->onBuffersDiscarded(discardedBufs);
2566 }
2567 
setFrameRate(float,int8_t,int8_t)2568 [[deprecated]] status_t Surface::setFrameRate(float /*frameRate*/, int8_t /*compatibility*/,
2569                                               int8_t /*changeFrameRateStrategy*/) {
2570     ALOGI("Surface::setFrameRate is deprecated, setFrameRate hint is dropped as destination is not "
2571           "SurfaceFlinger");
2572     // ISurfaceComposer no longer supports setFrameRate, we will return NO_ERROR when the api is
2573     // called to avoid apps crashing, as BAD_VALUE can generate fatal exception in apps.
2574     return NO_ERROR;
2575 }
2576 
setFrameTimelineInfo(uint64_t,const FrameTimelineInfo &)2577 status_t Surface::setFrameTimelineInfo(uint64_t /*frameNumber*/,
2578                                        const FrameTimelineInfo& /*frameTimelineInfo*/) {
2579     // ISurfaceComposer no longer supports setFrameTimelineInfo
2580     return BAD_VALUE;
2581 }
2582 
getSurfaceControlHandle() const2583 sp<IBinder> Surface::getSurfaceControlHandle() const {
2584     Mutex::Autolock lock(mMutex);
2585     return mSurfaceControlHandle;
2586 }
2587 
destroy()2588 void Surface::destroy() {
2589     Mutex::Autolock lock(mMutex);
2590     mSurfaceControlHandle = nullptr;
2591 }
2592 
getDebugName()2593 const char* Surface::getDebugName() {
2594     std::unique_lock lock{mNameMutex};
2595     if (mName.empty()) {
2596         mName = getConsumerName();
2597     }
2598     return mName.c_str();
2599 }
2600 
2601 }; // namespace android
2602