Home | History | Annotate | Download | only in gui
      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 <inttypes.h>
     24 
     25 #include <android/native_window.h>
     26 
     27 #include <utils/Log.h>
     28 #include <utils/Trace.h>
     29 #include <utils/NativeHandle.h>
     30 
     31 #include <ui/DisplayStatInfo.h>
     32 #include <ui/Fence.h>
     33 #include <ui/HdrCapabilities.h>
     34 #include <ui/Region.h>
     35 
     36 #include <gui/BufferItem.h>
     37 #include <gui/IProducerListener.h>
     38 
     39 #include <gui/ISurfaceComposer.h>
     40 #include <private/gui/ComposerService.h>
     41 
     42 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
     43 #include <configstore/Utils.h>
     44 
     45 namespace android {
     46 
     47 Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp)
     48       : mGraphicBufferProducer(bufferProducer),
     49         mCrop(Rect::EMPTY_RECT),
     50         mBufferAge(0),
     51         mGenerationNumber(0),
     52         mSharedBufferMode(false),
     53         mAutoRefresh(false),
     54         mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT),
     55         mSharedBufferHasBeenQueued(false),
     56         mQueriedSupportedTimestamps(false),
     57         mFrameTimestampsSupportsPresent(false),
     58         mEnableFrameTimestamps(false),
     59         mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) {
     60     // Initialize the ANativeWindow function pointers.
     61     ANativeWindow::setSwapInterval  = hook_setSwapInterval;
     62     ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;
     63     ANativeWindow::cancelBuffer     = hook_cancelBuffer;
     64     ANativeWindow::queueBuffer      = hook_queueBuffer;
     65     ANativeWindow::query            = hook_query;
     66     ANativeWindow::perform          = hook_perform;
     67 
     68     ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED;
     69     ANativeWindow::cancelBuffer_DEPRECATED  = hook_cancelBuffer_DEPRECATED;
     70     ANativeWindow::lockBuffer_DEPRECATED    = hook_lockBuffer_DEPRECATED;
     71     ANativeWindow::queueBuffer_DEPRECATED   = hook_queueBuffer_DEPRECATED;
     72 
     73     const_cast<int&>(ANativeWindow::minSwapInterval) = 0;
     74     const_cast<int&>(ANativeWindow::maxSwapInterval) = 1;
     75 
     76     mReqWidth = 0;
     77     mReqHeight = 0;
     78     mReqFormat = 0;
     79     mReqUsage = 0;
     80     mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO;
     81     mDataSpace = HAL_DATASPACE_UNKNOWN;
     82     mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
     83     mTransform = 0;
     84     mStickyTransform = 0;
     85     mDefaultWidth = 0;
     86     mDefaultHeight = 0;
     87     mUserWidth = 0;
     88     mUserHeight = 0;
     89     mTransformHint = 0;
     90     mConsumerRunningBehind = false;
     91     mConnectedToCpu = false;
     92     mProducerControlledByApp = controlledByApp;
     93     mSwapIntervalZero = false;
     94 }
     95 
     96 Surface::~Surface() {
     97     if (mConnectedToCpu) {
     98         Surface::disconnect(NATIVE_WINDOW_API_CPU);
     99     }
    100 }
    101 
    102 sp<ISurfaceComposer> Surface::composerService() const {
    103     return ComposerService::getComposerService();
    104 }
    105 
    106 nsecs_t Surface::now() const {
    107     return systemTime();
    108 }
    109 
    110 sp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const {
    111     return mGraphicBufferProducer;
    112 }
    113 
    114 void Surface::setSidebandStream(const sp<NativeHandle>& stream) {
    115     mGraphicBufferProducer->setSidebandStream(stream);
    116 }
    117 
    118 void Surface::allocateBuffers() {
    119     uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth;
    120     uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight;
    121     mGraphicBufferProducer->allocateBuffers(reqWidth, reqHeight,
    122             mReqFormat, mReqUsage);
    123 }
    124 
    125 status_t Surface::setGenerationNumber(uint32_t generation) {
    126     status_t result = mGraphicBufferProducer->setGenerationNumber(generation);
    127     if (result == NO_ERROR) {
    128         mGenerationNumber = generation;
    129     }
    130     return result;
    131 }
    132 
    133 uint64_t Surface::getNextFrameNumber() const {
    134     Mutex::Autolock lock(mMutex);
    135     return mNextFrameNumber;
    136 }
    137 
    138 String8 Surface::getConsumerName() const {
    139     return mGraphicBufferProducer->getConsumerName();
    140 }
    141 
    142 status_t Surface::setDequeueTimeout(nsecs_t timeout) {
    143     return mGraphicBufferProducer->setDequeueTimeout(timeout);
    144 }
    145 
    146 status_t Surface::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
    147         sp<Fence>* outFence, float outTransformMatrix[16]) {
    148     return mGraphicBufferProducer->getLastQueuedBuffer(outBuffer, outFence,
    149             outTransformMatrix);
    150 }
    151 
    152 status_t Surface::getDisplayRefreshCycleDuration(nsecs_t* outRefreshDuration) {
    153     ATRACE_CALL();
    154 
    155     DisplayStatInfo stats;
    156     status_t err = composerService()->getDisplayStats(NULL, &stats);
    157 
    158     *outRefreshDuration = stats.vsyncPeriod;
    159 
    160     return NO_ERROR;
    161 }
    162 
    163 void Surface::enableFrameTimestamps(bool enable) {
    164     Mutex::Autolock lock(mMutex);
    165     // If going from disabled to enabled, get the initial values for
    166     // compositor and display timing.
    167     if (!mEnableFrameTimestamps && enable) {
    168         FrameEventHistoryDelta delta;
    169         mGraphicBufferProducer->getFrameTimestamps(&delta);
    170         mFrameEventHistory->applyDelta(delta);
    171     }
    172     mEnableFrameTimestamps = enable;
    173 }
    174 
    175 status_t Surface::getCompositorTiming(
    176         nsecs_t* compositeDeadline, nsecs_t* compositeInterval,
    177         nsecs_t* compositeToPresentLatency) {
    178     Mutex::Autolock lock(mMutex);
    179     if (!mEnableFrameTimestamps) {
    180         return INVALID_OPERATION;
    181     }
    182 
    183     if (compositeDeadline != nullptr) {
    184         *compositeDeadline =
    185                 mFrameEventHistory->getNextCompositeDeadline(now());
    186     }
    187     if (compositeInterval != nullptr) {
    188         *compositeInterval = mFrameEventHistory->getCompositeInterval();
    189     }
    190     if (compositeToPresentLatency != nullptr) {
    191         *compositeToPresentLatency =
    192                 mFrameEventHistory->getCompositeToPresentLatency();
    193     }
    194     return NO_ERROR;
    195 }
    196 
    197 static bool checkConsumerForUpdates(
    198         const FrameEvents* e, const uint64_t lastFrameNumber,
    199         const nsecs_t* outLatchTime,
    200         const nsecs_t* outFirstRefreshStartTime,
    201         const nsecs_t* outLastRefreshStartTime,
    202         const nsecs_t* outGpuCompositionDoneTime,
    203         const nsecs_t* outDisplayPresentTime,
    204         const nsecs_t* outDequeueReadyTime,
    205         const nsecs_t* outReleaseTime) {
    206     bool checkForLatch = (outLatchTime != nullptr) && !e->hasLatchInfo();
    207     bool checkForFirstRefreshStart = (outFirstRefreshStartTime != nullptr) &&
    208             !e->hasFirstRefreshStartInfo();
    209     bool checkForGpuCompositionDone = (outGpuCompositionDoneTime != nullptr) &&
    210             !e->hasGpuCompositionDoneInfo();
    211     bool checkForDisplayPresent = (outDisplayPresentTime != nullptr) &&
    212             !e->hasDisplayPresentInfo();
    213 
    214     // LastRefreshStart, DequeueReady, and Release are never available for the
    215     // last frame.
    216     bool checkForLastRefreshStart = (outLastRefreshStartTime != nullptr) &&
    217             !e->hasLastRefreshStartInfo() &&
    218             (e->frameNumber != lastFrameNumber);
    219     bool checkForDequeueReady = (outDequeueReadyTime != nullptr) &&
    220             !e->hasDequeueReadyInfo() && (e->frameNumber != lastFrameNumber);
    221     bool checkForRelease = (outReleaseTime != nullptr) &&
    222             !e->hasReleaseInfo() && (e->frameNumber != lastFrameNumber);
    223 
    224     // RequestedPresent and Acquire info are always available producer-side.
    225     return checkForLatch || checkForFirstRefreshStart ||
    226             checkForLastRefreshStart || checkForGpuCompositionDone ||
    227             checkForDisplayPresent || checkForDequeueReady || checkForRelease;
    228 }
    229 
    230 static void getFrameTimestamp(nsecs_t *dst, const nsecs_t& src) {
    231     if (dst != nullptr) {
    232         // We always get valid timestamps for these eventually.
    233         *dst = (src == FrameEvents::TIMESTAMP_PENDING) ?
    234                 NATIVE_WINDOW_TIMESTAMP_PENDING : src;
    235     }
    236 }
    237 
    238 static void getFrameTimestampFence(nsecs_t *dst,
    239         const std::shared_ptr<FenceTime>& src, bool fenceShouldBeKnown) {
    240     if (dst != nullptr) {
    241         if (!fenceShouldBeKnown) {
    242             *dst = NATIVE_WINDOW_TIMESTAMP_PENDING;
    243             return;
    244         }
    245 
    246         nsecs_t signalTime = src->getSignalTime();
    247         *dst = (signalTime == Fence::SIGNAL_TIME_PENDING) ?
    248                     NATIVE_WINDOW_TIMESTAMP_PENDING :
    249                 (signalTime == Fence::SIGNAL_TIME_INVALID) ?
    250                     NATIVE_WINDOW_TIMESTAMP_INVALID :
    251                 signalTime;
    252     }
    253 }
    254 
    255 status_t Surface::getFrameTimestamps(uint64_t frameNumber,
    256         nsecs_t* outRequestedPresentTime, nsecs_t* outAcquireTime,
    257         nsecs_t* outLatchTime, nsecs_t* outFirstRefreshStartTime,
    258         nsecs_t* outLastRefreshStartTime, nsecs_t* outGpuCompositionDoneTime,
    259         nsecs_t* outDisplayPresentTime, nsecs_t* outDequeueReadyTime,
    260         nsecs_t* outReleaseTime) {
    261     ATRACE_CALL();
    262 
    263     Mutex::Autolock lock(mMutex);
    264 
    265     if (!mEnableFrameTimestamps) {
    266         return INVALID_OPERATION;
    267     }
    268 
    269     // Verify the requested timestamps are supported.
    270     querySupportedTimestampsLocked();
    271     if (outDisplayPresentTime != nullptr && !mFrameTimestampsSupportsPresent) {
    272         return BAD_VALUE;
    273     }
    274 
    275     FrameEvents* events = mFrameEventHistory->getFrame(frameNumber);
    276     if (events == nullptr) {
    277         // If the entry isn't available in the producer, it's definitely not
    278         // available in the consumer.
    279         return NAME_NOT_FOUND;
    280     }
    281 
    282     // Update our cache of events if the requested events are not available.
    283     if (checkConsumerForUpdates(events, mLastFrameNumber,
    284             outLatchTime, outFirstRefreshStartTime, outLastRefreshStartTime,
    285             outGpuCompositionDoneTime, outDisplayPresentTime,
    286             outDequeueReadyTime, outReleaseTime)) {
    287         FrameEventHistoryDelta delta;
    288         mGraphicBufferProducer->getFrameTimestamps(&delta);
    289         mFrameEventHistory->applyDelta(delta);
    290         events = mFrameEventHistory->getFrame(frameNumber);
    291     }
    292 
    293     if (events == nullptr) {
    294         // The entry was available before the update, but was overwritten
    295         // after the update. Make sure not to send the wrong frame's data.
    296         return NAME_NOT_FOUND;
    297     }
    298 
    299     getFrameTimestamp(outRequestedPresentTime, events->requestedPresentTime);
    300     getFrameTimestamp(outLatchTime, events->latchTime);
    301     getFrameTimestamp(outFirstRefreshStartTime, events->firstRefreshStartTime);
    302     getFrameTimestamp(outLastRefreshStartTime, events->lastRefreshStartTime);
    303     getFrameTimestamp(outDequeueReadyTime, events->dequeueReadyTime);
    304 
    305     getFrameTimestampFence(outAcquireTime, events->acquireFence,
    306             events->hasAcquireInfo());
    307     getFrameTimestampFence(outGpuCompositionDoneTime,
    308             events->gpuCompositionDoneFence,
    309             events->hasGpuCompositionDoneInfo());
    310     getFrameTimestampFence(outDisplayPresentTime, events->displayPresentFence,
    311             events->hasDisplayPresentInfo());
    312     getFrameTimestampFence(outReleaseTime, events->releaseFence,
    313             events->hasReleaseInfo());
    314 
    315     return NO_ERROR;
    316 }
    317 
    318 using namespace android::hardware::configstore;
    319 using namespace android::hardware::configstore::V1_0;
    320 
    321 status_t Surface::getWideColorSupport(bool* supported) {
    322     ATRACE_CALL();
    323 
    324     sp<IBinder> display(
    325         composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
    326     Vector<android_color_mode_t> colorModes;
    327     status_t err =
    328         composerService()->getDisplayColorModes(display, &colorModes);
    329 
    330     if (err)
    331         return err;
    332 
    333     bool wideColorBoardConfig =
    334         getBool<ISurfaceFlingerConfigs,
    335                 &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
    336 
    337     *supported = false;
    338     for (android_color_mode_t colorMode : colorModes) {
    339         switch (colorMode) {
    340             case HAL_COLOR_MODE_DISPLAY_P3:
    341             case HAL_COLOR_MODE_ADOBE_RGB:
    342             case HAL_COLOR_MODE_DCI_P3:
    343                 if (wideColorBoardConfig) {
    344                     *supported = true;
    345                 }
    346                 break;
    347             default:
    348                 break;
    349         }
    350     }
    351 
    352     return NO_ERROR;
    353 }
    354 
    355 status_t Surface::getHdrSupport(bool* supported) {
    356     ATRACE_CALL();
    357 
    358     sp<IBinder> display(
    359         composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
    360     HdrCapabilities hdrCapabilities;
    361     status_t err =
    362         composerService()->getHdrCapabilities(display, &hdrCapabilities);
    363 
    364     if (err)
    365         return err;
    366 
    367     *supported = !hdrCapabilities.getSupportedHdrTypes().empty();
    368 
    369     return NO_ERROR;
    370 }
    371 
    372 int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) {
    373     Surface* c = getSelf(window);
    374     return c->setSwapInterval(interval);
    375 }
    376 
    377 int Surface::hook_dequeueBuffer(ANativeWindow* window,
    378         ANativeWindowBuffer** buffer, int* fenceFd) {
    379     Surface* c = getSelf(window);
    380     return c->dequeueBuffer(buffer, fenceFd);
    381 }
    382 
    383 int Surface::hook_cancelBuffer(ANativeWindow* window,
    384         ANativeWindowBuffer* buffer, int fenceFd) {
    385     Surface* c = getSelf(window);
    386     return c->cancelBuffer(buffer, fenceFd);
    387 }
    388 
    389 int Surface::hook_queueBuffer(ANativeWindow* window,
    390         ANativeWindowBuffer* buffer, int fenceFd) {
    391     Surface* c = getSelf(window);
    392     return c->queueBuffer(buffer, fenceFd);
    393 }
    394 
    395 int Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window,
    396         ANativeWindowBuffer** buffer) {
    397     Surface* c = getSelf(window);
    398     ANativeWindowBuffer* buf;
    399     int fenceFd = -1;
    400     int result = c->dequeueBuffer(&buf, &fenceFd);
    401     if (result != OK) {
    402         return result;
    403     }
    404     sp<Fence> fence(new Fence(fenceFd));
    405     int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED");
    406     if (waitResult != OK) {
    407         ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d",
    408                 waitResult);
    409         c->cancelBuffer(buf, -1);
    410         return waitResult;
    411     }
    412     *buffer = buf;
    413     return result;
    414 }
    415 
    416 int Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window,
    417         ANativeWindowBuffer* buffer) {
    418     Surface* c = getSelf(window);
    419     return c->cancelBuffer(buffer, -1);
    420 }
    421 
    422 int Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window,
    423         ANativeWindowBuffer* buffer) {
    424     Surface* c = getSelf(window);
    425     return c->lockBuffer_DEPRECATED(buffer);
    426 }
    427 
    428 int Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window,
    429         ANativeWindowBuffer* buffer) {
    430     Surface* c = getSelf(window);
    431     return c->queueBuffer(buffer, -1);
    432 }
    433 
    434 int Surface::hook_query(const ANativeWindow* window,
    435                                 int what, int* value) {
    436     const Surface* c = getSelf(window);
    437     return c->query(what, value);
    438 }
    439 
    440 int Surface::hook_perform(ANativeWindow* window, int operation, ...) {
    441     va_list args;
    442     va_start(args, operation);
    443     Surface* c = getSelf(window);
    444     int result = c->perform(operation, args);
    445     va_end(args);
    446     return result;
    447 }
    448 
    449 int Surface::setSwapInterval(int interval) {
    450     ATRACE_CALL();
    451     // EGL specification states:
    452     //  interval is silently clamped to minimum and maximum implementation
    453     //  dependent values before being stored.
    454 
    455     if (interval < minSwapInterval)
    456         interval = minSwapInterval;
    457 
    458     if (interval > maxSwapInterval)
    459         interval = maxSwapInterval;
    460 
    461     mSwapIntervalZero = (interval == 0);
    462     mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero);
    463 
    464     return NO_ERROR;
    465 }
    466 
    467 int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
    468     ATRACE_CALL();
    469     ALOGV("Surface::dequeueBuffer");
    470 
    471     uint32_t reqWidth;
    472     uint32_t reqHeight;
    473     PixelFormat reqFormat;
    474     uint64_t reqUsage;
    475     bool enableFrameTimestamps;
    476 
    477     {
    478         Mutex::Autolock lock(mMutex);
    479         if (mReportRemovedBuffers) {
    480             mRemovedBuffers.clear();
    481         }
    482 
    483         reqWidth = mReqWidth ? mReqWidth : mUserWidth;
    484         reqHeight = mReqHeight ? mReqHeight : mUserHeight;
    485 
    486         reqFormat = mReqFormat;
    487         reqUsage = mReqUsage;
    488 
    489         enableFrameTimestamps = mEnableFrameTimestamps;
    490 
    491         if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot !=
    492                 BufferItem::INVALID_BUFFER_SLOT) {
    493             sp<GraphicBuffer>& gbuf(mSlots[mSharedBufferSlot].buffer);
    494             if (gbuf != NULL) {
    495                 *buffer = gbuf.get();
    496                 *fenceFd = -1;
    497                 return OK;
    498             }
    499         }
    500     } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffer
    501 
    502     int buf = -1;
    503     sp<Fence> fence;
    504     nsecs_t startTime = systemTime();
    505 
    506     FrameEventHistoryDelta frameTimestamps;
    507     status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight,
    508                                                             reqFormat, reqUsage, &mBufferAge,
    509                                                             enableFrameTimestamps ? &frameTimestamps
    510                                                                                   : nullptr);
    511     mLastDequeueDuration = systemTime() - startTime;
    512 
    513     if (result < 0) {
    514         ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer"
    515                 "(%d, %d, %d, %#" PRIx64 ") failed: %d",
    516                 reqWidth, reqHeight, reqFormat, reqUsage, result);
    517         return result;
    518     }
    519 
    520     if (buf < 0 || buf >= NUM_BUFFER_SLOTS) {
    521         ALOGE("dequeueBuffer: IGraphicBufferProducer returned invalid slot number %d", buf);
    522         android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging
    523         return FAILED_TRANSACTION;
    524     }
    525 
    526     Mutex::Autolock lock(mMutex);
    527 
    528     // Write this while holding the mutex
    529     mLastDequeueStartTime = startTime;
    530 
    531     sp<GraphicBuffer>& gbuf(mSlots[buf].buffer);
    532 
    533     // this should never happen
    534     ALOGE_IF(fence == NULL, "Surface::dequeueBuffer: received null Fence! buf=%d", buf);
    535 
    536     if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) {
    537         freeAllBuffers();
    538     }
    539 
    540     if (enableFrameTimestamps) {
    541          mFrameEventHistory->applyDelta(frameTimestamps);
    542     }
    543 
    544     if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) {
    545         if (mReportRemovedBuffers && (gbuf != nullptr)) {
    546             mRemovedBuffers.push_back(gbuf);
    547         }
    548         result = mGraphicBufferProducer->requestBuffer(buf, &gbuf);
    549         if (result != NO_ERROR) {
    550             ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result);
    551             mGraphicBufferProducer->cancelBuffer(buf, fence);
    552             return result;
    553         }
    554     }
    555 
    556     if (fence->isValid()) {
    557         *fenceFd = fence->dup();
    558         if (*fenceFd == -1) {
    559             ALOGE("dequeueBuffer: error duping fence: %d", errno);
    560             // dup() should never fail; something is badly wrong. Soldier on
    561             // and hope for the best; the worst that should happen is some
    562             // visible corruption that lasts until the next frame.
    563         }
    564     } else {
    565         *fenceFd = -1;
    566     }
    567 
    568     *buffer = gbuf.get();
    569 
    570     if (mSharedBufferMode && mAutoRefresh) {
    571         mSharedBufferSlot = buf;
    572         mSharedBufferHasBeenQueued = false;
    573     } else if (mSharedBufferSlot == buf) {
    574         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
    575         mSharedBufferHasBeenQueued = false;
    576     }
    577 
    578     return OK;
    579 }
    580 
    581 int Surface::cancelBuffer(android_native_buffer_t* buffer,
    582         int fenceFd) {
    583     ATRACE_CALL();
    584     ALOGV("Surface::cancelBuffer");
    585     Mutex::Autolock lock(mMutex);
    586     int i = getSlotFromBufferLocked(buffer);
    587     if (i < 0) {
    588         if (fenceFd >= 0) {
    589             close(fenceFd);
    590         }
    591         return i;
    592     }
    593     if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
    594         if (fenceFd >= 0) {
    595             close(fenceFd);
    596         }
    597         return OK;
    598     }
    599     sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
    600     mGraphicBufferProducer->cancelBuffer(i, fence);
    601 
    602     if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) {
    603         mSharedBufferHasBeenQueued = true;
    604     }
    605 
    606     return OK;
    607 }
    608 
    609 int Surface::getSlotFromBufferLocked(
    610         android_native_buffer_t* buffer) const {
    611     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
    612         if (mSlots[i].buffer != NULL &&
    613                 mSlots[i].buffer->handle == buffer->handle) {
    614             return i;
    615         }
    616     }
    617     ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
    618     return BAD_VALUE;
    619 }
    620 
    621 int Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__((unused))) {
    622     ALOGV("Surface::lockBuffer");
    623     Mutex::Autolock lock(mMutex);
    624     return OK;
    625 }
    626 
    627 int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
    628     ATRACE_CALL();
    629     ALOGV("Surface::queueBuffer");
    630     Mutex::Autolock lock(mMutex);
    631     int64_t timestamp;
    632     bool isAutoTimestamp = false;
    633 
    634     if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
    635         timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
    636         isAutoTimestamp = true;
    637         ALOGV("Surface::queueBuffer making up timestamp: %.2f ms",
    638             timestamp / 1000000.0);
    639     } else {
    640         timestamp = mTimestamp;
    641     }
    642     int i = getSlotFromBufferLocked(buffer);
    643     if (i < 0) {
    644         if (fenceFd >= 0) {
    645             close(fenceFd);
    646         }
    647         return i;
    648     }
    649     if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
    650         if (fenceFd >= 0) {
    651             close(fenceFd);
    652         }
    653         return OK;
    654     }
    655 
    656 
    657     // Make sure the crop rectangle is entirely inside the buffer.
    658     Rect crop(Rect::EMPTY_RECT);
    659     mCrop.intersect(Rect(buffer->width, buffer->height), &crop);
    660 
    661     sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
    662     IGraphicBufferProducer::QueueBufferOutput output;
    663     IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp,
    664             mDataSpace, crop, mScalingMode, mTransform ^ mStickyTransform,
    665             fence, mStickyTransform, mEnableFrameTimestamps);
    666 
    667     if (mConnectedToCpu || mDirtyRegion.bounds() == Rect::INVALID_RECT) {
    668         input.setSurfaceDamage(Region::INVALID_REGION);
    669     } else {
    670         // Here we do two things:
    671         // 1) The surface damage was specified using the OpenGL ES convention of
    672         //    the origin being in the bottom-left corner. Here we flip to the
    673         //    convention that the rest of the system uses (top-left corner) by
    674         //    subtracting all top/bottom coordinates from the buffer height.
    675         // 2) If the buffer is coming in rotated (for example, because the EGL
    676         //    implementation is reacting to the transform hint coming back from
    677         //    SurfaceFlinger), the surface damage needs to be rotated the
    678         //    opposite direction, since it was generated assuming an unrotated
    679         //    buffer (the app doesn't know that the EGL implementation is
    680         //    reacting to the transform hint behind its back). The
    681         //    transformations in the switch statement below apply those
    682         //    complementary rotations (e.g., if 90 degrees, rotate 270 degrees).
    683 
    684         int width = buffer->width;
    685         int height = buffer->height;
    686         bool rotated90 = (mTransform ^ mStickyTransform) &
    687                 NATIVE_WINDOW_TRANSFORM_ROT_90;
    688         if (rotated90) {
    689             std::swap(width, height);
    690         }
    691 
    692         Region flippedRegion;
    693         for (auto rect : mDirtyRegion) {
    694             int left = rect.left;
    695             int right = rect.right;
    696             int top = height - rect.bottom; // Flip from OpenGL convention
    697             int bottom = height - rect.top; // Flip from OpenGL convention
    698             switch (mTransform ^ mStickyTransform) {
    699                 case NATIVE_WINDOW_TRANSFORM_ROT_90: {
    700                     // Rotate 270 degrees
    701                     Rect flippedRect{top, width - right, bottom, width - left};
    702                     flippedRegion.orSelf(flippedRect);
    703                     break;
    704                 }
    705                 case NATIVE_WINDOW_TRANSFORM_ROT_180: {
    706                     // Rotate 180 degrees
    707                     Rect flippedRect{width - right, height - bottom,
    708                             width - left, height - top};
    709                     flippedRegion.orSelf(flippedRect);
    710                     break;
    711                 }
    712                 case NATIVE_WINDOW_TRANSFORM_ROT_270: {
    713                     // Rotate 90 degrees
    714                     Rect flippedRect{height - bottom, left,
    715                             height - top, right};
    716                     flippedRegion.orSelf(flippedRect);
    717                     break;
    718                 }
    719                 default: {
    720                     Rect flippedRect{left, top, right, bottom};
    721                     flippedRegion.orSelf(flippedRect);
    722                     break;
    723                 }
    724             }
    725         }
    726 
    727         input.setSurfaceDamage(flippedRegion);
    728     }
    729 
    730     nsecs_t now = systemTime();
    731     status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output);
    732     mLastQueueDuration = systemTime() - now;
    733     if (err != OK)  {
    734         ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
    735     }
    736 
    737     if (mEnableFrameTimestamps) {
    738         mFrameEventHistory->applyDelta(output.frameTimestamps);
    739         // Update timestamps with the local acquire fence.
    740         // The consumer doesn't send it back to prevent us from having two
    741         // file descriptors of the same fence.
    742         mFrameEventHistory->updateAcquireFence(mNextFrameNumber,
    743                 std::make_shared<FenceTime>(std::move(fence)));
    744 
    745         // Cache timestamps of signaled fences so we can close their file
    746         // descriptors.
    747         mFrameEventHistory->updateSignalTimes();
    748     }
    749 
    750     mLastFrameNumber = mNextFrameNumber;
    751 
    752     mDefaultWidth = output.width;
    753     mDefaultHeight = output.height;
    754     mNextFrameNumber = output.nextFrameNumber;
    755 
    756     // Disable transform hint if sticky transform is set.
    757     if (mStickyTransform == 0) {
    758         mTransformHint = output.transformHint;
    759     }
    760 
    761     mConsumerRunningBehind = (output.numPendingBuffers >= 2);
    762 
    763     if (!mConnectedToCpu) {
    764         // Clear surface damage back to full-buffer
    765         mDirtyRegion = Region::INVALID_REGION;
    766     }
    767 
    768     if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) {
    769         mSharedBufferHasBeenQueued = true;
    770     }
    771 
    772     mQueueBufferCondition.broadcast();
    773 
    774     return err;
    775 }
    776 
    777 void Surface::querySupportedTimestampsLocked() const {
    778     // mMutex must be locked when calling this method.
    779 
    780     if (mQueriedSupportedTimestamps) {
    781         return;
    782     }
    783     mQueriedSupportedTimestamps = true;
    784 
    785     std::vector<FrameEvent> supportedFrameTimestamps;
    786     status_t err = composerService()->getSupportedFrameTimestamps(
    787             &supportedFrameTimestamps);
    788 
    789     if (err != NO_ERROR) {
    790         return;
    791     }
    792 
    793     for (auto sft : supportedFrameTimestamps) {
    794         if (sft == FrameEvent::DISPLAY_PRESENT) {
    795             mFrameTimestampsSupportsPresent = true;
    796         }
    797     }
    798 }
    799 
    800 int Surface::query(int what, int* value) const {
    801     ATRACE_CALL();
    802     ALOGV("Surface::query");
    803     { // scope for the lock
    804         Mutex::Autolock lock(mMutex);
    805         switch (what) {
    806             case NATIVE_WINDOW_FORMAT:
    807                 if (mReqFormat) {
    808                     *value = static_cast<int>(mReqFormat);
    809                     return NO_ERROR;
    810                 }
    811                 break;
    812             case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: {
    813                 if (composerService()->authenticateSurfaceTexture(
    814                         mGraphicBufferProducer)) {
    815                     *value = 1;
    816                 } else {
    817                     *value = 0;
    818                 }
    819                 return NO_ERROR;
    820             }
    821             case NATIVE_WINDOW_CONCRETE_TYPE:
    822                 *value = NATIVE_WINDOW_SURFACE;
    823                 return NO_ERROR;
    824             case NATIVE_WINDOW_DEFAULT_WIDTH:
    825                 *value = static_cast<int>(
    826                         mUserWidth ? mUserWidth : mDefaultWidth);
    827                 return NO_ERROR;
    828             case NATIVE_WINDOW_DEFAULT_HEIGHT:
    829                 *value = static_cast<int>(
    830                         mUserHeight ? mUserHeight : mDefaultHeight);
    831                 return NO_ERROR;
    832             case NATIVE_WINDOW_TRANSFORM_HINT:
    833                 *value = static_cast<int>(mTransformHint);
    834                 return NO_ERROR;
    835             case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: {
    836                 status_t err = NO_ERROR;
    837                 if (!mConsumerRunningBehind) {
    838                     *value = 0;
    839                 } else {
    840                     err = mGraphicBufferProducer->query(what, value);
    841                     if (err == NO_ERROR) {
    842                         mConsumerRunningBehind = *value;
    843                     }
    844                 }
    845                 return err;
    846             }
    847             case NATIVE_WINDOW_BUFFER_AGE: {
    848                 if (mBufferAge > INT32_MAX) {
    849                     *value = 0;
    850                 } else {
    851                     *value = static_cast<int32_t>(mBufferAge);
    852                 }
    853                 return NO_ERROR;
    854             }
    855             case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: {
    856                 int64_t durationUs = mLastDequeueDuration / 1000;
    857                 *value = durationUs > std::numeric_limits<int>::max() ?
    858                         std::numeric_limits<int>::max() :
    859                         static_cast<int>(durationUs);
    860                 return NO_ERROR;
    861             }
    862             case NATIVE_WINDOW_LAST_QUEUE_DURATION: {
    863                 int64_t durationUs = mLastQueueDuration / 1000;
    864                 *value = durationUs > std::numeric_limits<int>::max() ?
    865                         std::numeric_limits<int>::max() :
    866                         static_cast<int>(durationUs);
    867                 return NO_ERROR;
    868             }
    869             case NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT: {
    870                 querySupportedTimestampsLocked();
    871                 *value = mFrameTimestampsSupportsPresent ? 1 : 0;
    872                 return NO_ERROR;
    873             }
    874             case NATIVE_WINDOW_IS_VALID: {
    875                 *value = mGraphicBufferProducer != nullptr ? 1 : 0;
    876                 return NO_ERROR;
    877             }
    878         }
    879     }
    880     return mGraphicBufferProducer->query(what, value);
    881 }
    882 
    883 int Surface::perform(int operation, va_list args)
    884 {
    885     int res = NO_ERROR;
    886     switch (operation) {
    887     case NATIVE_WINDOW_CONNECT:
    888         // deprecated. must return NO_ERROR.
    889         break;
    890     case NATIVE_WINDOW_DISCONNECT:
    891         // deprecated. must return NO_ERROR.
    892         break;
    893     case NATIVE_WINDOW_SET_USAGE:
    894         res = dispatchSetUsage(args);
    895         break;
    896     case NATIVE_WINDOW_SET_CROP:
    897         res = dispatchSetCrop(args);
    898         break;
    899     case NATIVE_WINDOW_SET_BUFFER_COUNT:
    900         res = dispatchSetBufferCount(args);
    901         break;
    902     case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
    903         res = dispatchSetBuffersGeometry(args);
    904         break;
    905     case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
    906         res = dispatchSetBuffersTransform(args);
    907         break;
    908     case NATIVE_WINDOW_SET_BUFFERS_STICKY_TRANSFORM:
    909         res = dispatchSetBuffersStickyTransform(args);
    910         break;
    911     case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
    912         res = dispatchSetBuffersTimestamp(args);
    913         break;
    914     case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS:
    915         res = dispatchSetBuffersDimensions(args);
    916         break;
    917     case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS:
    918         res = dispatchSetBuffersUserDimensions(args);
    919         break;
    920     case NATIVE_WINDOW_SET_BUFFERS_FORMAT:
    921         res = dispatchSetBuffersFormat(args);
    922         break;
    923     case NATIVE_WINDOW_LOCK:
    924         res = dispatchLock(args);
    925         break;
    926     case NATIVE_WINDOW_UNLOCK_AND_POST:
    927         res = dispatchUnlockAndPost(args);
    928         break;
    929     case NATIVE_WINDOW_SET_SCALING_MODE:
    930         res = dispatchSetScalingMode(args);
    931         break;
    932     case NATIVE_WINDOW_API_CONNECT:
    933         res = dispatchConnect(args);
    934         break;
    935     case NATIVE_WINDOW_API_DISCONNECT:
    936         res = dispatchDisconnect(args);
    937         break;
    938     case NATIVE_WINDOW_SET_SIDEBAND_STREAM:
    939         res = dispatchSetSidebandStream(args);
    940         break;
    941     case NATIVE_WINDOW_SET_BUFFERS_DATASPACE:
    942         res = dispatchSetBuffersDataSpace(args);
    943         break;
    944     case NATIVE_WINDOW_SET_SURFACE_DAMAGE:
    945         res = dispatchSetSurfaceDamage(args);
    946         break;
    947     case NATIVE_WINDOW_SET_SHARED_BUFFER_MODE:
    948         res = dispatchSetSharedBufferMode(args);
    949         break;
    950     case NATIVE_WINDOW_SET_AUTO_REFRESH:
    951         res = dispatchSetAutoRefresh(args);
    952         break;
    953     case NATIVE_WINDOW_GET_REFRESH_CYCLE_DURATION:
    954         res = dispatchGetDisplayRefreshCycleDuration(args);
    955         break;
    956     case NATIVE_WINDOW_GET_NEXT_FRAME_ID:
    957         res = dispatchGetNextFrameId(args);
    958         break;
    959     case NATIVE_WINDOW_ENABLE_FRAME_TIMESTAMPS:
    960         res = dispatchEnableFrameTimestamps(args);
    961         break;
    962     case NATIVE_WINDOW_GET_COMPOSITOR_TIMING:
    963         res = dispatchGetCompositorTiming(args);
    964         break;
    965     case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS:
    966         res = dispatchGetFrameTimestamps(args);
    967         break;
    968     case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT:
    969         res = dispatchGetWideColorSupport(args);
    970         break;
    971     case NATIVE_WINDOW_GET_HDR_SUPPORT:
    972         res = dispatchGetHdrSupport(args);
    973         break;
    974     case NATIVE_WINDOW_SET_USAGE64:
    975         res = dispatchSetUsage64(args);
    976         break;
    977     case NATIVE_WINDOW_GET_CONSUMER_USAGE64:
    978         res = dispatchGetConsumerUsage64(args);
    979         break;
    980     default:
    981         res = NAME_NOT_FOUND;
    982         break;
    983     }
    984     return res;
    985 }
    986 
    987 int Surface::dispatchConnect(va_list args) {
    988     int api = va_arg(args, int);
    989     return connect(api);
    990 }
    991 
    992 int Surface::dispatchDisconnect(va_list args) {
    993     int api = va_arg(args, int);
    994     return disconnect(api);
    995 }
    996 
    997 int Surface::dispatchSetUsage(va_list args) {
    998     uint64_t usage = va_arg(args, uint32_t);
    999     return setUsage(usage);
   1000 }
   1001 
   1002 int Surface::dispatchSetUsage64(va_list args) {
   1003     uint64_t usage = va_arg(args, uint64_t);
   1004     return setUsage(usage);
   1005 }
   1006 
   1007 int Surface::dispatchSetCrop(va_list args) {
   1008     android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
   1009     return setCrop(reinterpret_cast<Rect const*>(rect));
   1010 }
   1011 
   1012 int Surface::dispatchSetBufferCount(va_list args) {
   1013     size_t bufferCount = va_arg(args, size_t);
   1014     return setBufferCount(static_cast<int32_t>(bufferCount));
   1015 }
   1016 
   1017 int Surface::dispatchSetBuffersGeometry(va_list args) {
   1018     uint32_t width = va_arg(args, uint32_t);
   1019     uint32_t height = va_arg(args, uint32_t);
   1020     PixelFormat format = va_arg(args, PixelFormat);
   1021     int err = setBuffersDimensions(width, height);
   1022     if (err != 0) {
   1023         return err;
   1024     }
   1025     return setBuffersFormat(format);
   1026 }
   1027 
   1028 int Surface::dispatchSetBuffersDimensions(va_list args) {
   1029     uint32_t width = va_arg(args, uint32_t);
   1030     uint32_t height = va_arg(args, uint32_t);
   1031     return setBuffersDimensions(width, height);
   1032 }
   1033 
   1034 int Surface::dispatchSetBuffersUserDimensions(va_list args) {
   1035     uint32_t width = va_arg(args, uint32_t);
   1036     uint32_t height = va_arg(args, uint32_t);
   1037     return setBuffersUserDimensions(width, height);
   1038 }
   1039 
   1040 int Surface::dispatchSetBuffersFormat(va_list args) {
   1041     PixelFormat format = va_arg(args, PixelFormat);
   1042     return setBuffersFormat(format);
   1043 }
   1044 
   1045 int Surface::dispatchSetScalingMode(va_list args) {
   1046     int mode = va_arg(args, int);
   1047     return setScalingMode(mode);
   1048 }
   1049 
   1050 int Surface::dispatchSetBuffersTransform(va_list args) {
   1051     uint32_t transform = va_arg(args, uint32_t);
   1052     return setBuffersTransform(transform);
   1053 }
   1054 
   1055 int Surface::dispatchSetBuffersStickyTransform(va_list args) {
   1056     uint32_t transform = va_arg(args, uint32_t);
   1057     return setBuffersStickyTransform(transform);
   1058 }
   1059 
   1060 int Surface::dispatchSetBuffersTimestamp(va_list args) {
   1061     int64_t timestamp = va_arg(args, int64_t);
   1062     return setBuffersTimestamp(timestamp);
   1063 }
   1064 
   1065 int Surface::dispatchLock(va_list args) {
   1066     ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*);
   1067     ARect* inOutDirtyBounds = va_arg(args, ARect*);
   1068     return lock(outBuffer, inOutDirtyBounds);
   1069 }
   1070 
   1071 int Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) {
   1072     return unlockAndPost();
   1073 }
   1074 
   1075 int Surface::dispatchSetSidebandStream(va_list args) {
   1076     native_handle_t* sH = va_arg(args, native_handle_t*);
   1077     sp<NativeHandle> sidebandHandle = NativeHandle::create(sH, false);
   1078     setSidebandStream(sidebandHandle);
   1079     return OK;
   1080 }
   1081 
   1082 int Surface::dispatchSetBuffersDataSpace(va_list args) {
   1083     android_dataspace dataspace =
   1084             static_cast<android_dataspace>(va_arg(args, int));
   1085     return setBuffersDataSpace(dataspace);
   1086 }
   1087 
   1088 int Surface::dispatchSetSurfaceDamage(va_list args) {
   1089     android_native_rect_t* rects = va_arg(args, android_native_rect_t*);
   1090     size_t numRects = va_arg(args, size_t);
   1091     setSurfaceDamage(rects, numRects);
   1092     return NO_ERROR;
   1093 }
   1094 
   1095 int Surface::dispatchSetSharedBufferMode(va_list args) {
   1096     bool sharedBufferMode = va_arg(args, int);
   1097     return setSharedBufferMode(sharedBufferMode);
   1098 }
   1099 
   1100 int Surface::dispatchSetAutoRefresh(va_list args) {
   1101     bool autoRefresh = va_arg(args, int);
   1102     return setAutoRefresh(autoRefresh);
   1103 }
   1104 
   1105 int Surface::dispatchGetDisplayRefreshCycleDuration(va_list args) {
   1106     nsecs_t* outRefreshDuration = va_arg(args, int64_t*);
   1107     return getDisplayRefreshCycleDuration(outRefreshDuration);
   1108 }
   1109 
   1110 int Surface::dispatchGetNextFrameId(va_list args) {
   1111     uint64_t* nextFrameId = va_arg(args, uint64_t*);
   1112     *nextFrameId = getNextFrameNumber();
   1113     return NO_ERROR;
   1114 }
   1115 
   1116 int Surface::dispatchEnableFrameTimestamps(va_list args) {
   1117     bool enable = va_arg(args, int);
   1118     enableFrameTimestamps(enable);
   1119     return NO_ERROR;
   1120 }
   1121 
   1122 int Surface::dispatchGetCompositorTiming(va_list args) {
   1123     nsecs_t* compositeDeadline = va_arg(args, int64_t*);
   1124     nsecs_t* compositeInterval = va_arg(args, int64_t*);
   1125     nsecs_t* compositeToPresentLatency = va_arg(args, int64_t*);
   1126     return getCompositorTiming(compositeDeadline, compositeInterval,
   1127             compositeToPresentLatency);
   1128 }
   1129 
   1130 int Surface::dispatchGetFrameTimestamps(va_list args) {
   1131     uint64_t frameId = va_arg(args, uint64_t);
   1132     nsecs_t* outRequestedPresentTime = va_arg(args, int64_t*);
   1133     nsecs_t* outAcquireTime = va_arg(args, int64_t*);
   1134     nsecs_t* outLatchTime = va_arg(args, int64_t*);
   1135     nsecs_t* outFirstRefreshStartTime = va_arg(args, int64_t*);
   1136     nsecs_t* outLastRefreshStartTime = va_arg(args, int64_t*);
   1137     nsecs_t* outGpuCompositionDoneTime = va_arg(args, int64_t*);
   1138     nsecs_t* outDisplayPresentTime = va_arg(args, int64_t*);
   1139     nsecs_t* outDequeueReadyTime = va_arg(args, int64_t*);
   1140     nsecs_t* outReleaseTime = va_arg(args, int64_t*);
   1141     return getFrameTimestamps(frameId,
   1142             outRequestedPresentTime, outAcquireTime, outLatchTime,
   1143             outFirstRefreshStartTime, outLastRefreshStartTime,
   1144             outGpuCompositionDoneTime, outDisplayPresentTime,
   1145             outDequeueReadyTime, outReleaseTime);
   1146 }
   1147 
   1148 int Surface::dispatchGetWideColorSupport(va_list args) {
   1149     bool* outSupport = va_arg(args, bool*);
   1150     return getWideColorSupport(outSupport);
   1151 }
   1152 
   1153 int Surface::dispatchGetHdrSupport(va_list args) {
   1154     bool* outSupport = va_arg(args, bool*);
   1155     return getHdrSupport(outSupport);
   1156 }
   1157 
   1158 int Surface::dispatchGetConsumerUsage64(va_list args) {
   1159     uint64_t* usage = va_arg(args, uint64_t*);
   1160     return getConsumerUsage(usage);
   1161 }
   1162 
   1163 int Surface::connect(int api) {
   1164     static sp<IProducerListener> listener = new DummyProducerListener();
   1165     return connect(api, listener);
   1166 }
   1167 
   1168 int Surface::connect(int api, const sp<IProducerListener>& listener) {
   1169     return connect(api, listener, false);
   1170 }
   1171 
   1172 int Surface::connect(
   1173         int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) {
   1174     ATRACE_CALL();
   1175     ALOGV("Surface::connect");
   1176     Mutex::Autolock lock(mMutex);
   1177     IGraphicBufferProducer::QueueBufferOutput output;
   1178     mReportRemovedBuffers = reportBufferRemoval;
   1179     int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output);
   1180     if (err == NO_ERROR) {
   1181         mDefaultWidth = output.width;
   1182         mDefaultHeight = output.height;
   1183         mNextFrameNumber = output.nextFrameNumber;
   1184 
   1185         // Disable transform hint if sticky transform is set.
   1186         if (mStickyTransform == 0) {
   1187             mTransformHint = output.transformHint;
   1188         }
   1189 
   1190         mConsumerRunningBehind = (output.numPendingBuffers >= 2);
   1191     }
   1192     if (!err && api == NATIVE_WINDOW_API_CPU) {
   1193         mConnectedToCpu = true;
   1194         // Clear the dirty region in case we're switching from a non-CPU API
   1195         mDirtyRegion.clear();
   1196     } else if (!err) {
   1197         // Initialize the dirty region for tracking surface damage
   1198         mDirtyRegion = Region::INVALID_REGION;
   1199     }
   1200 
   1201     return err;
   1202 }
   1203 
   1204 
   1205 int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) {
   1206     ATRACE_CALL();
   1207     ALOGV("Surface::disconnect");
   1208     Mutex::Autolock lock(mMutex);
   1209     mRemovedBuffers.clear();
   1210     mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
   1211     mSharedBufferHasBeenQueued = false;
   1212     freeAllBuffers();
   1213     int err = mGraphicBufferProducer->disconnect(api, mode);
   1214     if (!err) {
   1215         mReqFormat = 0;
   1216         mReqWidth = 0;
   1217         mReqHeight = 0;
   1218         mReqUsage = 0;
   1219         mCrop.clear();
   1220         mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
   1221         mTransform = 0;
   1222         mStickyTransform = 0;
   1223 
   1224         if (api == NATIVE_WINDOW_API_CPU) {
   1225             mConnectedToCpu = false;
   1226         }
   1227     }
   1228     return err;
   1229 }
   1230 
   1231 int Surface::detachNextBuffer(sp<GraphicBuffer>* outBuffer,
   1232         sp<Fence>* outFence) {
   1233     ATRACE_CALL();
   1234     ALOGV("Surface::detachNextBuffer");
   1235 
   1236     if (outBuffer == NULL || outFence == NULL) {
   1237         return BAD_VALUE;
   1238     }
   1239 
   1240     Mutex::Autolock lock(mMutex);
   1241     if (mReportRemovedBuffers) {
   1242         mRemovedBuffers.clear();
   1243     }
   1244 
   1245     sp<GraphicBuffer> buffer(NULL);
   1246     sp<Fence> fence(NULL);
   1247     status_t result = mGraphicBufferProducer->detachNextBuffer(
   1248             &buffer, &fence);
   1249     if (result != NO_ERROR) {
   1250         return result;
   1251     }
   1252 
   1253     *outBuffer = buffer;
   1254     if (fence != NULL && fence->isValid()) {
   1255         *outFence = fence;
   1256     } else {
   1257         *outFence = Fence::NO_FENCE;
   1258     }
   1259 
   1260     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
   1261         if (mSlots[i].buffer != NULL &&
   1262                 mSlots[i].buffer->getId() == buffer->getId()) {
   1263             if (mReportRemovedBuffers) {
   1264                 mRemovedBuffers.push_back(mSlots[i].buffer);
   1265             }
   1266             mSlots[i].buffer = NULL;
   1267         }
   1268     }
   1269 
   1270     return NO_ERROR;
   1271 }
   1272 
   1273 int Surface::attachBuffer(ANativeWindowBuffer* buffer)
   1274 {
   1275     ATRACE_CALL();
   1276     ALOGV("Surface::attachBuffer");
   1277 
   1278     Mutex::Autolock lock(mMutex);
   1279     if (mReportRemovedBuffers) {
   1280         mRemovedBuffers.clear();
   1281     }
   1282 
   1283     sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer));
   1284     uint32_t priorGeneration = graphicBuffer->mGenerationNumber;
   1285     graphicBuffer->mGenerationNumber = mGenerationNumber;
   1286     int32_t attachedSlot = -1;
   1287     status_t result = mGraphicBufferProducer->attachBuffer(&attachedSlot, graphicBuffer);
   1288     if (result != NO_ERROR) {
   1289         ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result);
   1290         graphicBuffer->mGenerationNumber = priorGeneration;
   1291         return result;
   1292     }
   1293     if (mReportRemovedBuffers && (mSlots[attachedSlot].buffer != nullptr)) {
   1294         mRemovedBuffers.push_back(mSlots[attachedSlot].buffer);
   1295     }
   1296     mSlots[attachedSlot].buffer = graphicBuffer;
   1297 
   1298     return NO_ERROR;
   1299 }
   1300 
   1301 int Surface::setUsage(uint64_t reqUsage)
   1302 {
   1303     ALOGV("Surface::setUsage");
   1304     Mutex::Autolock lock(mMutex);
   1305     if (reqUsage != mReqUsage) {
   1306         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
   1307     }
   1308     mReqUsage = reqUsage;
   1309     return OK;
   1310 }
   1311 
   1312 int Surface::setCrop(Rect const* rect)
   1313 {
   1314     ATRACE_CALL();
   1315 
   1316     Rect realRect(Rect::EMPTY_RECT);
   1317     if (rect == NULL || rect->isEmpty()) {
   1318         realRect.clear();
   1319     } else {
   1320         realRect = *rect;
   1321     }
   1322 
   1323     ALOGV("Surface::setCrop rect=[%d %d %d %d]",
   1324             realRect.left, realRect.top, realRect.right, realRect.bottom);
   1325 
   1326     Mutex::Autolock lock(mMutex);
   1327     mCrop = realRect;
   1328     return NO_ERROR;
   1329 }
   1330 
   1331 int Surface::setBufferCount(int bufferCount)
   1332 {
   1333     ATRACE_CALL();
   1334     ALOGV("Surface::setBufferCount");
   1335     Mutex::Autolock lock(mMutex);
   1336 
   1337     status_t err = NO_ERROR;
   1338     if (bufferCount == 0) {
   1339         err = mGraphicBufferProducer->setMaxDequeuedBufferCount(1);
   1340     } else {
   1341         int minUndequeuedBuffers = 0;
   1342         err = mGraphicBufferProducer->query(
   1343                 NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers);
   1344         if (err == NO_ERROR) {
   1345             err = mGraphicBufferProducer->setMaxDequeuedBufferCount(
   1346                     bufferCount - minUndequeuedBuffers);
   1347         }
   1348     }
   1349 
   1350     ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s",
   1351              bufferCount, strerror(-err));
   1352 
   1353     return err;
   1354 }
   1355 
   1356 int Surface::setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
   1357     ATRACE_CALL();
   1358     ALOGV("Surface::setMaxDequeuedBufferCount");
   1359     Mutex::Autolock lock(mMutex);
   1360 
   1361     status_t err = mGraphicBufferProducer->setMaxDequeuedBufferCount(
   1362             maxDequeuedBuffers);
   1363     ALOGE_IF(err, "IGraphicBufferProducer::setMaxDequeuedBufferCount(%d) "
   1364             "returned %s", maxDequeuedBuffers, strerror(-err));
   1365 
   1366     return err;
   1367 }
   1368 
   1369 int Surface::setAsyncMode(bool async) {
   1370     ATRACE_CALL();
   1371     ALOGV("Surface::setAsyncMode");
   1372     Mutex::Autolock lock(mMutex);
   1373 
   1374     status_t err = mGraphicBufferProducer->setAsyncMode(async);
   1375     ALOGE_IF(err, "IGraphicBufferProducer::setAsyncMode(%d) returned %s",
   1376             async, strerror(-err));
   1377 
   1378     return err;
   1379 }
   1380 
   1381 int Surface::setSharedBufferMode(bool sharedBufferMode) {
   1382     ATRACE_CALL();
   1383     ALOGV("Surface::setSharedBufferMode (%d)", sharedBufferMode);
   1384     Mutex::Autolock lock(mMutex);
   1385 
   1386     status_t err = mGraphicBufferProducer->setSharedBufferMode(
   1387             sharedBufferMode);
   1388     if (err == NO_ERROR) {
   1389         mSharedBufferMode = sharedBufferMode;
   1390     }
   1391     ALOGE_IF(err, "IGraphicBufferProducer::setSharedBufferMode(%d) returned"
   1392             "%s", sharedBufferMode, strerror(-err));
   1393 
   1394     return err;
   1395 }
   1396 
   1397 int Surface::setAutoRefresh(bool autoRefresh) {
   1398     ATRACE_CALL();
   1399     ALOGV("Surface::setAutoRefresh (%d)", autoRefresh);
   1400     Mutex::Autolock lock(mMutex);
   1401 
   1402     status_t err = mGraphicBufferProducer->setAutoRefresh(autoRefresh);
   1403     if (err == NO_ERROR) {
   1404         mAutoRefresh = autoRefresh;
   1405     }
   1406     ALOGE_IF(err, "IGraphicBufferProducer::setAutoRefresh(%d) returned %s",
   1407             autoRefresh, strerror(-err));
   1408     return err;
   1409 }
   1410 
   1411 int Surface::setBuffersDimensions(uint32_t width, uint32_t height)
   1412 {
   1413     ATRACE_CALL();
   1414     ALOGV("Surface::setBuffersDimensions");
   1415 
   1416     if ((width && !height) || (!width && height))
   1417         return BAD_VALUE;
   1418 
   1419     Mutex::Autolock lock(mMutex);
   1420     if (width != mReqWidth || height != mReqHeight) {
   1421         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
   1422     }
   1423     mReqWidth = width;
   1424     mReqHeight = height;
   1425     return NO_ERROR;
   1426 }
   1427 
   1428 int Surface::setBuffersUserDimensions(uint32_t width, uint32_t height)
   1429 {
   1430     ATRACE_CALL();
   1431     ALOGV("Surface::setBuffersUserDimensions");
   1432 
   1433     if ((width && !height) || (!width && height))
   1434         return BAD_VALUE;
   1435 
   1436     Mutex::Autolock lock(mMutex);
   1437     if (width != mUserWidth || height != mUserHeight) {
   1438         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
   1439     }
   1440     mUserWidth = width;
   1441     mUserHeight = height;
   1442     return NO_ERROR;
   1443 }
   1444 
   1445 int Surface::setBuffersFormat(PixelFormat format)
   1446 {
   1447     ALOGV("Surface::setBuffersFormat");
   1448 
   1449     Mutex::Autolock lock(mMutex);
   1450     if (format != mReqFormat) {
   1451         mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT;
   1452     }
   1453     mReqFormat = format;
   1454     return NO_ERROR;
   1455 }
   1456 
   1457 int Surface::setScalingMode(int mode)
   1458 {
   1459     ATRACE_CALL();
   1460     ALOGV("Surface::setScalingMode(%d)", mode);
   1461 
   1462     switch (mode) {
   1463         case NATIVE_WINDOW_SCALING_MODE_FREEZE:
   1464         case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
   1465         case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP:
   1466         case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP:
   1467             break;
   1468         default:
   1469             ALOGE("unknown scaling mode: %d", mode);
   1470             return BAD_VALUE;
   1471     }
   1472 
   1473     Mutex::Autolock lock(mMutex);
   1474     mScalingMode = mode;
   1475     return NO_ERROR;
   1476 }
   1477 
   1478 int Surface::setBuffersTransform(uint32_t transform)
   1479 {
   1480     ATRACE_CALL();
   1481     ALOGV("Surface::setBuffersTransform");
   1482     Mutex::Autolock lock(mMutex);
   1483     mTransform = transform;
   1484     return NO_ERROR;
   1485 }
   1486 
   1487 int Surface::setBuffersStickyTransform(uint32_t transform)
   1488 {
   1489     ATRACE_CALL();
   1490     ALOGV("Surface::setBuffersStickyTransform");
   1491     Mutex::Autolock lock(mMutex);
   1492     mStickyTransform = transform;
   1493     return NO_ERROR;
   1494 }
   1495 
   1496 int Surface::setBuffersTimestamp(int64_t timestamp)
   1497 {
   1498     ALOGV("Surface::setBuffersTimestamp");
   1499     Mutex::Autolock lock(mMutex);
   1500     mTimestamp = timestamp;
   1501     return NO_ERROR;
   1502 }
   1503 
   1504 int Surface::setBuffersDataSpace(android_dataspace dataSpace)
   1505 {
   1506     ALOGV("Surface::setBuffersDataSpace");
   1507     Mutex::Autolock lock(mMutex);
   1508     mDataSpace = dataSpace;
   1509     return NO_ERROR;
   1510 }
   1511 
   1512 void Surface::freeAllBuffers() {
   1513     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
   1514         mSlots[i].buffer = 0;
   1515     }
   1516 }
   1517 
   1518 void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) {
   1519     ATRACE_CALL();
   1520     ALOGV("Surface::setSurfaceDamage");
   1521     Mutex::Autolock lock(mMutex);
   1522 
   1523     if (mConnectedToCpu || numRects == 0) {
   1524         mDirtyRegion = Region::INVALID_REGION;
   1525         return;
   1526     }
   1527 
   1528     mDirtyRegion.clear();
   1529     for (size_t r = 0; r < numRects; ++r) {
   1530         // We intentionally flip top and bottom here, since because they're
   1531         // specified with a bottom-left origin, top > bottom, which fails
   1532         // validation in the Region class. We will fix this up when we flip to a
   1533         // top-left origin in queueBuffer.
   1534         Rect rect(rects[r].left, rects[r].bottom, rects[r].right, rects[r].top);
   1535         mDirtyRegion.orSelf(rect);
   1536     }
   1537 }
   1538 
   1539 // ----------------------------------------------------------------------
   1540 // the lock/unlock APIs must be used from the same thread
   1541 
   1542 static status_t copyBlt(
   1543         const sp<GraphicBuffer>& dst,
   1544         const sp<GraphicBuffer>& src,
   1545         const Region& reg,
   1546         int *dstFenceFd)
   1547 {
   1548     if (dst->getId() == src->getId())
   1549         return OK;
   1550 
   1551     // src and dst with, height and format must be identical. no verification
   1552     // is done here.
   1553     status_t err;
   1554     uint8_t* src_bits = NULL;
   1555     err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(),
   1556             reinterpret_cast<void**>(&src_bits));
   1557     ALOGE_IF(err, "error locking src buffer %s", strerror(-err));
   1558 
   1559     uint8_t* dst_bits = NULL;
   1560     err = dst->lockAsync(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(),
   1561             reinterpret_cast<void**>(&dst_bits), *dstFenceFd);
   1562     ALOGE_IF(err, "error locking dst buffer %s", strerror(-err));
   1563     *dstFenceFd = -1;
   1564 
   1565     Region::const_iterator head(reg.begin());
   1566     Region::const_iterator tail(reg.end());
   1567     if (head != tail && src_bits && dst_bits) {
   1568         const size_t bpp = bytesPerPixel(src->format);
   1569         const size_t dbpr = static_cast<uint32_t>(dst->stride) * bpp;
   1570         const size_t sbpr = static_cast<uint32_t>(src->stride) * bpp;
   1571 
   1572         while (head != tail) {
   1573             const Rect& r(*head++);
   1574             int32_t h = r.height();
   1575             if (h <= 0) continue;
   1576             size_t size = static_cast<uint32_t>(r.width()) * bpp;
   1577             uint8_t const * s = src_bits +
   1578                     static_cast<uint32_t>(r.left + src->stride * r.top) * bpp;
   1579             uint8_t       * d = dst_bits +
   1580                     static_cast<uint32_t>(r.left + dst->stride * r.top) * bpp;
   1581             if (dbpr==sbpr && size==sbpr) {
   1582                 size *= static_cast<size_t>(h);
   1583                 h = 1;
   1584             }
   1585             do {
   1586                 memcpy(d, s, size);
   1587                 d += dbpr;
   1588                 s += sbpr;
   1589             } while (--h > 0);
   1590         }
   1591     }
   1592 
   1593     if (src_bits)
   1594         src->unlock();
   1595 
   1596     if (dst_bits)
   1597         dst->unlockAsync(dstFenceFd);
   1598 
   1599     return err;
   1600 }
   1601 
   1602 // ----------------------------------------------------------------------------
   1603 
   1604 status_t Surface::lock(
   1605         ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds)
   1606 {
   1607     if (mLockedBuffer != 0) {
   1608         ALOGE("Surface::lock failed, already locked");
   1609         return INVALID_OPERATION;
   1610     }
   1611 
   1612     if (!mConnectedToCpu) {
   1613         int err = Surface::connect(NATIVE_WINDOW_API_CPU);
   1614         if (err) {
   1615             return err;
   1616         }
   1617         // we're intending to do software rendering from this point
   1618         setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
   1619     }
   1620 
   1621     ANativeWindowBuffer* out;
   1622     int fenceFd = -1;
   1623     status_t err = dequeueBuffer(&out, &fenceFd);
   1624     ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err));
   1625     if (err == NO_ERROR) {
   1626         sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out));
   1627         const Rect bounds(backBuffer->width, backBuffer->height);
   1628 
   1629         Region newDirtyRegion;
   1630         if (inOutDirtyBounds) {
   1631             newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds));
   1632             newDirtyRegion.andSelf(bounds);
   1633         } else {
   1634             newDirtyRegion.set(bounds);
   1635         }
   1636 
   1637         // figure out if we can copy the frontbuffer back
   1638         const sp<GraphicBuffer>& frontBuffer(mPostedBuffer);
   1639         const bool canCopyBack = (frontBuffer != 0 &&
   1640                 backBuffer->width  == frontBuffer->width &&
   1641                 backBuffer->height == frontBuffer->height &&
   1642                 backBuffer->format == frontBuffer->format);
   1643 
   1644         if (canCopyBack) {
   1645             // copy the area that is invalid and not repainted this round
   1646             const Region copyback(mDirtyRegion.subtract(newDirtyRegion));
   1647             if (!copyback.isEmpty()) {
   1648                 copyBlt(backBuffer, frontBuffer, copyback, &fenceFd);
   1649             }
   1650         } else {
   1651             // if we can't copy-back anything, modify the user's dirty
   1652             // region to make sure they redraw the whole buffer
   1653             newDirtyRegion.set(bounds);
   1654             mDirtyRegion.clear();
   1655             Mutex::Autolock lock(mMutex);
   1656             for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) {
   1657                 mSlots[i].dirtyRegion.clear();
   1658             }
   1659         }
   1660 
   1661 
   1662         { // scope for the lock
   1663             Mutex::Autolock lock(mMutex);
   1664             int backBufferSlot(getSlotFromBufferLocked(backBuffer.get()));
   1665             if (backBufferSlot >= 0) {
   1666                 Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion);
   1667                 mDirtyRegion.subtract(dirtyRegion);
   1668                 dirtyRegion = newDirtyRegion;
   1669             }
   1670         }
   1671 
   1672         mDirtyRegion.orSelf(newDirtyRegion);
   1673         if (inOutDirtyBounds) {
   1674             *inOutDirtyBounds = newDirtyRegion.getBounds();
   1675         }
   1676 
   1677         void* vaddr;
   1678         status_t res = backBuffer->lockAsync(
   1679                 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
   1680                 newDirtyRegion.bounds(), &vaddr, fenceFd);
   1681 
   1682         ALOGW_IF(res, "failed locking buffer (handle = %p)",
   1683                 backBuffer->handle);
   1684 
   1685         if (res != 0) {
   1686             err = INVALID_OPERATION;
   1687         } else {
   1688             mLockedBuffer = backBuffer;
   1689             outBuffer->width  = backBuffer->width;
   1690             outBuffer->height = backBuffer->height;
   1691             outBuffer->stride = backBuffer->stride;
   1692             outBuffer->format = backBuffer->format;
   1693             outBuffer->bits   = vaddr;
   1694         }
   1695     }
   1696     return err;
   1697 }
   1698 
   1699 status_t Surface::unlockAndPost()
   1700 {
   1701     if (mLockedBuffer == 0) {
   1702         ALOGE("Surface::unlockAndPost failed, no locked buffer");
   1703         return INVALID_OPERATION;
   1704     }
   1705 
   1706     int fd = -1;
   1707     status_t err = mLockedBuffer->unlockAsync(&fd);
   1708     ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle);
   1709 
   1710     err = queueBuffer(mLockedBuffer.get(), fd);
   1711     ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)",
   1712             mLockedBuffer->handle, strerror(-err));
   1713 
   1714     mPostedBuffer = mLockedBuffer;
   1715     mLockedBuffer = 0;
   1716     return err;
   1717 }
   1718 
   1719 bool Surface::waitForNextFrame(uint64_t lastFrame, nsecs_t timeout) {
   1720     Mutex::Autolock lock(mMutex);
   1721     if (mNextFrameNumber > lastFrame) {
   1722       return true;
   1723     }
   1724     return mQueueBufferCondition.waitRelative(mMutex, timeout) == OK;
   1725 }
   1726 
   1727 status_t Surface::getUniqueId(uint64_t* outId) const {
   1728     Mutex::Autolock lock(mMutex);
   1729     return mGraphicBufferProducer->getUniqueId(outId);
   1730 }
   1731 
   1732 int Surface::getConsumerUsage(uint64_t* outUsage) const {
   1733     Mutex::Autolock lock(mMutex);
   1734     return mGraphicBufferProducer->getConsumerUsage(outUsage);
   1735 }
   1736 
   1737 nsecs_t Surface::getLastDequeueStartTime() const {
   1738     Mutex::Autolock lock(mMutex);
   1739     return mLastDequeueStartTime;
   1740 }
   1741 
   1742 status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) {
   1743     if (out == nullptr) {
   1744         ALOGE("%s: out must not be null!", __FUNCTION__);
   1745         return BAD_VALUE;
   1746     }
   1747 
   1748     Mutex::Autolock lock(mMutex);
   1749     *out = mRemovedBuffers;
   1750     mRemovedBuffers.clear();
   1751     return OK;
   1752 }
   1753 
   1754 }; // namespace android
   1755