Home | History | Annotate | Download | only in surfaceflinger
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
     18 
     19 #include <dlfcn.h>
     20 #include <errno.h>
     21 #include <inttypes.h>
     22 #include <math.h>
     23 #include <stdatomic.h>
     24 #include <stdint.h>
     25 #include <sys/types.h>
     26 
     27 #include <mutex>
     28 
     29 #include <EGL/egl.h>
     30 
     31 #include <cutils/properties.h>
     32 #include <log/log.h>
     33 
     34 #include <binder/IPCThreadState.h>
     35 #include <binder/IServiceManager.h>
     36 #include <binder/PermissionCache.h>
     37 
     38 #include <ui/DisplayInfo.h>
     39 #include <ui/DisplayStatInfo.h>
     40 
     41 #include <gui/BufferQueue.h>
     42 #include <gui/GuiConfig.h>
     43 #include <gui/IDisplayEventConnection.h>
     44 #include <gui/Surface.h>
     45 
     46 #include <ui/GraphicBufferAllocator.h>
     47 #include <ui/HdrCapabilities.h>
     48 #include <ui/PixelFormat.h>
     49 #include <ui/UiConfig.h>
     50 
     51 #include <utils/misc.h>
     52 #include <utils/String8.h>
     53 #include <utils/String16.h>
     54 #include <utils/StopWatch.h>
     55 #include <utils/Timers.h>
     56 #include <utils/Trace.h>
     57 
     58 #include <private/android_filesystem_config.h>
     59 #include <private/gui/SyncFeatures.h>
     60 
     61 #include <set>
     62 
     63 #include "Client.h"
     64 #include "clz.h"
     65 #include "Colorizer.h"
     66 #include "DdmConnection.h"
     67 #include "DisplayDevice.h"
     68 #include "DispSync.h"
     69 #include "EventControlThread.h"
     70 #include "EventThread.h"
     71 #include "Layer.h"
     72 #include "LayerVector.h"
     73 #include "LayerDim.h"
     74 #include "MonitoredProducer.h"
     75 #include "SurfaceFlinger.h"
     76 
     77 #include "DisplayHardware/FramebufferSurface.h"
     78 #include "DisplayHardware/HWComposer.h"
     79 #include "DisplayHardware/VirtualDisplaySurface.h"
     80 
     81 #include "Effects/Daltonizer.h"
     82 
     83 #include "RenderEngine/RenderEngine.h"
     84 #include <cutils/compiler.h>
     85 
     86 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
     87 #include <configstore/Utils.h>
     88 
     89 #define DISPLAY_COUNT       1
     90 
     91 /*
     92  * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
     93  * black pixels.
     94  */
     95 #define DEBUG_SCREENSHOTS   false
     96 
     97 extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
     98 
     99 namespace android {
    100 // ---------------------------------------------------------------------------
    101 
    102 using namespace android::hardware::configstore;
    103 using namespace android::hardware::configstore::V1_0;
    104 
    105 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
    106 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
    107 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
    108 const String16 sDump("android.permission.DUMP");
    109 
    110 // ---------------------------------------------------------------------------
    111 int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
    112 int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
    113 bool SurfaceFlinger::useContextPriority;
    114 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
    115 bool SurfaceFlinger::useHwcForRgbToYuv;
    116 uint64_t SurfaceFlinger::maxVirtualDisplaySize;
    117 bool SurfaceFlinger::hasSyncFramework;
    118 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
    119 
    120 SurfaceFlinger::SurfaceFlinger()
    121     :   BnSurfaceComposer(),
    122         mTransactionFlags(0),
    123         mTransactionPending(false),
    124         mAnimTransactionPending(false),
    125         mLayersRemoved(false),
    126         mLayersAdded(false),
    127         mRepaintEverything(0),
    128         mRenderEngine(NULL),
    129         mBootTime(systemTime()),
    130         mVisibleRegionsDirty(false),
    131         mHwWorkListDirty(false),
    132         mAnimCompositionPending(false),
    133         mDebugRegion(0),
    134         mDebugDDMS(0),
    135         mDebugDisableHWC(0),
    136         mDebugDisableTransformHint(0),
    137         mDebugInSwapBuffers(0),
    138         mLastSwapBufferTime(0),
    139         mDebugInTransaction(0),
    140         mLastTransactionTime(0),
    141         mBootFinished(false),
    142         mForceFullDamage(false),
    143         mInterceptor(this),
    144         mPrimaryDispSync("PrimaryDispSync"),
    145         mPrimaryHWVsyncEnabled(false),
    146         mHWVsyncAvailable(false),
    147         mDaltonize(false),
    148         mHasColorMatrix(false),
    149         mHasPoweredOff(false),
    150         mFrameBuckets(),
    151         mTotalTime(0),
    152         mLastSwapTime(0),
    153         mNumLayers(0)
    154 {
    155     ALOGI("SurfaceFlinger is starting");
    156 
    157     vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
    158             &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
    159 
    160     sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
    161             &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
    162 
    163     maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
    164             &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
    165 
    166     hasSyncFramework = getBool< ISurfaceFlingerConfigs,
    167             &ISurfaceFlingerConfigs::hasSyncFramework>(true);
    168 
    169     useContextPriority = getBool< ISurfaceFlingerConfigs,
    170             &ISurfaceFlingerConfigs::useContextPriority>(false);
    171 
    172     dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
    173             &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
    174 
    175     useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
    176             &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
    177 
    178     maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
    179             &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
    180 
    181     char value[PROPERTY_VALUE_MAX];
    182 
    183     property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
    184     mGpuToCpuSupported = !atoi(value);
    185 
    186     property_get("debug.sf.showupdates", value, "0");
    187     mDebugRegion = atoi(value);
    188 
    189     property_get("debug.sf.ddms", value, "0");
    190     mDebugDDMS = atoi(value);
    191     if (mDebugDDMS) {
    192         if (!startDdmConnection()) {
    193             // start failed, and DDMS debugging not enabled
    194             mDebugDDMS = 0;
    195         }
    196     }
    197     ALOGI_IF(mDebugRegion, "showupdates enabled");
    198     ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
    199 
    200     property_get("debug.sf.enable_hwc_vds", value, "0");
    201     mUseHwcVirtualDisplays = atoi(value);
    202     ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
    203 
    204     property_get("ro.sf.disable_triple_buffer", value, "1");
    205     mLayerTripleBufferingDisabled = atoi(value);
    206     ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
    207 }
    208 
    209 void SurfaceFlinger::onFirstRef()
    210 {
    211     mEventQueue.init(this);
    212 }
    213 
    214 SurfaceFlinger::~SurfaceFlinger()
    215 {
    216     EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    217     eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    218     eglTerminate(display);
    219 }
    220 
    221 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
    222 {
    223     // the window manager died on us. prepare its eulogy.
    224 
    225     // restore initial conditions (default device unblank, etc)
    226     initializeDisplays();
    227 
    228     // restart the boot-animation
    229     startBootAnim();
    230 }
    231 
    232 static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
    233     status_t err = client->initCheck();
    234     if (err == NO_ERROR) {
    235         return client;
    236     }
    237     return nullptr;
    238 }
    239 
    240 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
    241     return initClient(new Client(this));
    242 }
    243 
    244 sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
    245         const sp<IGraphicBufferProducer>& gbp) {
    246     if (authenticateSurfaceTexture(gbp) == false) {
    247         return nullptr;
    248     }
    249     const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
    250     if (layer == nullptr) {
    251         return nullptr;
    252     }
    253 
    254    return initClient(new Client(this, layer));
    255 }
    256 
    257 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
    258         bool secure)
    259 {
    260     class DisplayToken : public BBinder {
    261         sp<SurfaceFlinger> flinger;
    262         virtual ~DisplayToken() {
    263              // no more references, this display must be terminated
    264              Mutex::Autolock _l(flinger->mStateLock);
    265              flinger->mCurrentState.displays.removeItem(this);
    266              flinger->setTransactionFlags(eDisplayTransactionNeeded);
    267          }
    268      public:
    269         explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
    270             : flinger(flinger) {
    271         }
    272     };
    273 
    274     sp<BBinder> token = new DisplayToken(this);
    275 
    276     Mutex::Autolock _l(mStateLock);
    277     DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
    278     info.displayName = displayName;
    279     mCurrentState.displays.add(token, info);
    280     mInterceptor.saveDisplayCreation(info);
    281     return token;
    282 }
    283 
    284 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
    285     Mutex::Autolock _l(mStateLock);
    286 
    287     ssize_t idx = mCurrentState.displays.indexOfKey(display);
    288     if (idx < 0) {
    289         ALOGW("destroyDisplay: invalid display token");
    290         return;
    291     }
    292 
    293     const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
    294     if (!info.isVirtualDisplay()) {
    295         ALOGE("destroyDisplay called for non-virtual display");
    296         return;
    297     }
    298     mInterceptor.saveDisplayDeletion(info.displayId);
    299     mCurrentState.displays.removeItemsAt(idx);
    300     setTransactionFlags(eDisplayTransactionNeeded);
    301 }
    302 
    303 void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
    304     ALOGW_IF(mBuiltinDisplays[type],
    305             "Overwriting display token for display type %d", type);
    306     mBuiltinDisplays[type] = new BBinder();
    307     // All non-virtual displays are currently considered secure.
    308     DisplayDeviceState info(type, true);
    309     mCurrentState.displays.add(mBuiltinDisplays[type], info);
    310     mInterceptor.saveDisplayCreation(info);
    311 }
    312 
    313 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
    314     if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
    315         ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
    316         return NULL;
    317     }
    318     return mBuiltinDisplays[id];
    319 }
    320 
    321 void SurfaceFlinger::bootFinished()
    322 {
    323     if (mStartPropertySetThread->join() != NO_ERROR) {
    324         ALOGE("Join StartPropertySetThread failed!");
    325     }
    326     const nsecs_t now = systemTime();
    327     const nsecs_t duration = now - mBootTime;
    328     ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
    329     mBootFinished = true;
    330 
    331     // wait patiently for the window manager death
    332     const String16 name("window");
    333     sp<IBinder> window(defaultServiceManager()->getService(name));
    334     if (window != 0) {
    335         window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
    336     }
    337 
    338     // stop boot animation
    339     // formerly we would just kill the process, but we now ask it to exit so it
    340     // can choose where to stop the animation.
    341     property_set("service.bootanim.exit", "1");
    342 
    343     const int LOGTAG_SF_STOP_BOOTANIM = 60110;
    344     LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
    345                    ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
    346 }
    347 
    348 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
    349     class MessageDestroyGLTexture : public MessageBase {
    350         RenderEngine& engine;
    351         uint32_t texture;
    352     public:
    353         MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
    354             : engine(engine), texture(texture) {
    355         }
    356         virtual bool handler() {
    357             engine.deleteTextures(1, &texture);
    358             return true;
    359         }
    360     };
    361     postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
    362 }
    363 
    364 class DispSyncSource : public VSyncSource, private DispSync::Callback {
    365 public:
    366     DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
    367         const char* name) :
    368             mName(name),
    369             mValue(0),
    370             mTraceVsync(traceVsync),
    371             mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
    372             mVsyncEventLabel(String8::format("VSYNC-%s", name)),
    373             mDispSync(dispSync),
    374             mCallbackMutex(),
    375             mCallback(),
    376             mVsyncMutex(),
    377             mPhaseOffset(phaseOffset),
    378             mEnabled(false) {}
    379 
    380     virtual ~DispSyncSource() {}
    381 
    382     virtual void setVSyncEnabled(bool enable) {
    383         Mutex::Autolock lock(mVsyncMutex);
    384         if (enable) {
    385             status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
    386                     static_cast<DispSync::Callback*>(this));
    387             if (err != NO_ERROR) {
    388                 ALOGE("error registering vsync callback: %s (%d)",
    389                         strerror(-err), err);
    390             }
    391             //ATRACE_INT(mVsyncOnLabel.string(), 1);
    392         } else {
    393             status_t err = mDispSync->removeEventListener(
    394                     static_cast<DispSync::Callback*>(this));
    395             if (err != NO_ERROR) {
    396                 ALOGE("error unregistering vsync callback: %s (%d)",
    397                         strerror(-err), err);
    398             }
    399             //ATRACE_INT(mVsyncOnLabel.string(), 0);
    400         }
    401         mEnabled = enable;
    402     }
    403 
    404     virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
    405         Mutex::Autolock lock(mCallbackMutex);
    406         mCallback = callback;
    407     }
    408 
    409     virtual void setPhaseOffset(nsecs_t phaseOffset) {
    410         Mutex::Autolock lock(mVsyncMutex);
    411 
    412         // Normalize phaseOffset to [0, period)
    413         auto period = mDispSync->getPeriod();
    414         phaseOffset %= period;
    415         if (phaseOffset < 0) {
    416             // If we're here, then phaseOffset is in (-period, 0). After this
    417             // operation, it will be in (0, period)
    418             phaseOffset += period;
    419         }
    420         mPhaseOffset = phaseOffset;
    421 
    422         // If we're not enabled, we don't need to mess with the listeners
    423         if (!mEnabled) {
    424             return;
    425         }
    426 
    427         // Remove the listener with the old offset
    428         status_t err = mDispSync->removeEventListener(
    429                 static_cast<DispSync::Callback*>(this));
    430         if (err != NO_ERROR) {
    431             ALOGE("error unregistering vsync callback: %s (%d)",
    432                     strerror(-err), err);
    433         }
    434 
    435         // Add a listener with the new offset
    436         err = mDispSync->addEventListener(mName, mPhaseOffset,
    437                 static_cast<DispSync::Callback*>(this));
    438         if (err != NO_ERROR) {
    439             ALOGE("error registering vsync callback: %s (%d)",
    440                     strerror(-err), err);
    441         }
    442     }
    443 
    444 private:
    445     virtual void onDispSyncEvent(nsecs_t when) {
    446         sp<VSyncSource::Callback> callback;
    447         {
    448             Mutex::Autolock lock(mCallbackMutex);
    449             callback = mCallback;
    450 
    451             if (mTraceVsync) {
    452                 mValue = (mValue + 1) % 2;
    453                 ATRACE_INT(mVsyncEventLabel.string(), mValue);
    454             }
    455         }
    456 
    457         if (callback != NULL) {
    458             callback->onVSyncEvent(when);
    459         }
    460     }
    461 
    462     const char* const mName;
    463 
    464     int mValue;
    465 
    466     const bool mTraceVsync;
    467     const String8 mVsyncOnLabel;
    468     const String8 mVsyncEventLabel;
    469 
    470     DispSync* mDispSync;
    471 
    472     Mutex mCallbackMutex; // Protects the following
    473     sp<VSyncSource::Callback> mCallback;
    474 
    475     Mutex mVsyncMutex; // Protects the following
    476     nsecs_t mPhaseOffset;
    477     bool mEnabled;
    478 };
    479 
    480 class InjectVSyncSource : public VSyncSource {
    481 public:
    482     InjectVSyncSource() {}
    483 
    484     virtual ~InjectVSyncSource() {}
    485 
    486     virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
    487         std::lock_guard<std::mutex> lock(mCallbackMutex);
    488         mCallback = callback;
    489     }
    490 
    491     virtual void onInjectSyncEvent(nsecs_t when) {
    492         std::lock_guard<std::mutex> lock(mCallbackMutex);
    493         mCallback->onVSyncEvent(when);
    494     }
    495 
    496     virtual void setVSyncEnabled(bool) {}
    497     virtual void setPhaseOffset(nsecs_t) {}
    498 
    499 private:
    500     std::mutex mCallbackMutex; // Protects the following
    501     sp<VSyncSource::Callback> mCallback;
    502 };
    503 
    504 // Do not call property_set on main thread which will be blocked by init
    505 // Use StartPropertySetThread instead.
    506 void SurfaceFlinger::init() {
    507     ALOGI(  "SurfaceFlinger's main thread ready to run. "
    508             "Initializing graphics H/W...");
    509 
    510     Mutex::Autolock _l(mStateLock);
    511 
    512     // initialize EGL for the default display
    513     mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    514     eglInitialize(mEGLDisplay, NULL, NULL);
    515 
    516     // start the EventThread
    517     sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
    518             vsyncPhaseOffsetNs, true, "app");
    519     mEventThread = new EventThread(vsyncSrc, *this, false);
    520     sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
    521             sfVsyncPhaseOffsetNs, true, "sf");
    522     mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
    523     mEventQueue.setEventThread(mSFEventThread);
    524 
    525     // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
    526     struct sched_param param = {0};
    527     param.sched_priority = 2;
    528     if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
    529         ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
    530     }
    531     if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
    532         ALOGE("Couldn't set SCHED_FIFO for EventThread");
    533     }
    534 
    535     // Initialize the H/W composer object.  There may or may not be an
    536     // actual hardware composer underneath.
    537     mHwc.reset(new HWComposer(this,
    538             *static_cast<HWComposer::EventHandler *>(this)));
    539 
    540     // get a RenderEngine for the given display / config (can't fail)
    541     mRenderEngine = RenderEngine::create(mEGLDisplay,
    542             mHwc->getVisualID(), 0);
    543 
    544     // retrieve the EGL context that was selected/created
    545     mEGLContext = mRenderEngine->getEGLContext();
    546 
    547     LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
    548             "couldn't create EGLContext");
    549 
    550     // initialize our non-virtual displays
    551     for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
    552         DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
    553         // set-up the displays that are already connected
    554         if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
    555             // All non-virtual displays are currently considered secure.
    556             bool isSecure = true;
    557             createBuiltinDisplayLocked(type);
    558             wp<IBinder> token = mBuiltinDisplays[i];
    559 
    560             sp<IGraphicBufferProducer> producer;
    561             sp<IGraphicBufferConsumer> consumer;
    562             BufferQueue::createBufferQueue(&producer, &consumer);
    563 
    564             sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
    565                     consumer);
    566             int32_t hwcId = allocateHwcDisplayId(type);
    567             sp<DisplayDevice> hw = new DisplayDevice(this,
    568                     type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
    569                     fbs, producer,
    570                     mRenderEngine->getEGLConfig(), false);
    571             if (i > DisplayDevice::DISPLAY_PRIMARY) {
    572                 // FIXME: currently we don't get blank/unblank requests
    573                 // for displays other than the main display, so we always
    574                 // assume a connected display is unblanked.
    575                 ALOGD("marking display %zu as acquired/unblanked", i);
    576                 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
    577             }
    578             mDisplays.add(token, hw);
    579         }
    580     }
    581 
    582     // make the GLContext current so that we can create textures when creating Layers
    583     // (which may happens before we render something)
    584     getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
    585 
    586     mEventControlThread = new EventControlThread(this);
    587     mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
    588 
    589     // set a fake vsync period if there is no HWComposer
    590     if (mHwc->initCheck() != NO_ERROR) {
    591         mPrimaryDispSync.setPeriod(16666667);
    592     }
    593 
    594     // initialize our drawing state
    595     mDrawingState = mCurrentState;
    596 
    597     // set initial conditions (e.g. unblank default device)
    598     initializeDisplays();
    599 
    600     mRenderEngine->primeCache();
    601 
    602     // Inform native graphics APIs that the present timestamp is NOT supported:
    603     mStartPropertySetThread = new StartPropertySetThread(false);
    604     if (mStartPropertySetThread->Start() != NO_ERROR) {
    605         ALOGE("Run StartPropertySetThread failed!");
    606     }
    607 
    608     ALOGV("Done initializing");
    609 }
    610 
    611 int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
    612     return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
    613             type : mHwc->allocateDisplayId();
    614 }
    615 
    616 void SurfaceFlinger::startBootAnim() {
    617     // Start boot animation service by setting a property mailbox
    618     // if property setting thread is already running, Start() will be just a NOP
    619     mStartPropertySetThread->Start();
    620     // Wait until property was set
    621     if (mStartPropertySetThread->join() != NO_ERROR) {
    622         ALOGE("Join StartPropertySetThread failed!");
    623     }
    624 }
    625 
    626 size_t SurfaceFlinger::getMaxTextureSize() const {
    627     return mRenderEngine->getMaxTextureSize();
    628 }
    629 
    630 size_t SurfaceFlinger::getMaxViewportDims() const {
    631     return mRenderEngine->getMaxViewportDims();
    632 }
    633 
    634 // ----------------------------------------------------------------------------
    635 
    636 bool SurfaceFlinger::authenticateSurfaceTexture(
    637         const sp<IGraphicBufferProducer>& bufferProducer) const {
    638     Mutex::Autolock _l(mStateLock);
    639     return authenticateSurfaceTextureLocked(bufferProducer);
    640 }
    641 
    642 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
    643         const sp<IGraphicBufferProducer>& bufferProducer) const {
    644     sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
    645     return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
    646 }
    647 
    648 status_t SurfaceFlinger::getSupportedFrameTimestamps(
    649         std::vector<FrameEvent>* outSupported) const {
    650     *outSupported = {
    651         FrameEvent::REQUESTED_PRESENT,
    652         FrameEvent::ACQUIRE,
    653         FrameEvent::LATCH,
    654         FrameEvent::FIRST_REFRESH_START,
    655         FrameEvent::LAST_REFRESH_START,
    656         FrameEvent::GPU_COMPOSITION_DONE,
    657         FrameEvent::DEQUEUE_READY,
    658         FrameEvent::RELEASE,
    659     };
    660     return NO_ERROR;
    661 }
    662 
    663 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
    664         Vector<DisplayInfo>* configs) {
    665     if ((configs == NULL) || (display.get() == NULL)) {
    666         return BAD_VALUE;
    667     }
    668 
    669     int32_t type = getDisplayType(display);
    670     if (type < 0) return type;
    671 
    672     // TODO: Not sure if display density should handled by SF any longer
    673     class Density {
    674         static int getDensityFromProperty(char const* propName) {
    675             char property[PROPERTY_VALUE_MAX];
    676             int density = 0;
    677             if (property_get(propName, property, NULL) > 0) {
    678                 density = atoi(property);
    679             }
    680             return density;
    681         }
    682     public:
    683         static int getEmuDensity() {
    684             return getDensityFromProperty("qemu.sf.lcd_density"); }
    685         static int getBuildDensity()  {
    686             return getDensityFromProperty("ro.sf.lcd_density"); }
    687     };
    688 
    689     configs->clear();
    690 
    691     const Vector<HWComposer::DisplayConfig>& hwConfigs =
    692             getHwComposer().getConfigs(type);
    693     for (size_t c = 0; c < hwConfigs.size(); ++c) {
    694         const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
    695         DisplayInfo info = DisplayInfo();
    696 
    697         float xdpi = hwConfig.xdpi;
    698         float ydpi = hwConfig.ydpi;
    699 
    700         if (type == DisplayDevice::DISPLAY_PRIMARY) {
    701             // The density of the device is provided by a build property
    702             float density = Density::getBuildDensity() / 160.0f;
    703             if (density == 0) {
    704                 // the build doesn't provide a density -- this is wrong!
    705                 // use xdpi instead
    706                 ALOGE("ro.sf.lcd_density must be defined as a build property");
    707                 density = xdpi / 160.0f;
    708             }
    709             if (Density::getEmuDensity()) {
    710                 // if "qemu.sf.lcd_density" is specified, it overrides everything
    711                 xdpi = ydpi = density = Density::getEmuDensity();
    712                 density /= 160.0f;
    713             }
    714             info.density = density;
    715 
    716             // TODO: this needs to go away (currently needed only by webkit)
    717             sp<const DisplayDevice> hw(getDefaultDisplayDevice());
    718             info.orientation = hw->getOrientation();
    719         } else {
    720             // TODO: where should this value come from?
    721             static const int TV_DENSITY = 213;
    722             info.density = TV_DENSITY / 160.0f;
    723             info.orientation = 0;
    724         }
    725 
    726         info.w = hwConfig.width;
    727         info.h = hwConfig.height;
    728         info.xdpi = xdpi;
    729         info.ydpi = ydpi;
    730         info.fps = float(1e9 / hwConfig.refresh);
    731         info.appVsyncOffset = vsyncPhaseOffsetNs;
    732 
    733         // This is how far in advance a buffer must be queued for
    734         // presentation at a given time.  If you want a buffer to appear
    735         // on the screen at time N, you must submit the buffer before
    736         // (N - presentationDeadline).
    737         //
    738         // Normally it's one full refresh period (to give SF a chance to
    739         // latch the buffer), but this can be reduced by configuring a
    740         // DispSync offset.  Any additional delays introduced by the hardware
    741         // composer or panel must be accounted for here.
    742         //
    743         // We add an additional 1ms to allow for processing time and
    744         // differences between the ideal and actual refresh rate.
    745         info.presentationDeadline =
    746                 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
    747 
    748         // All non-virtual displays are currently considered secure.
    749         info.secure = true;
    750 
    751         configs->push_back(info);
    752     }
    753 
    754     return NO_ERROR;
    755 }
    756 
    757 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
    758         DisplayStatInfo* stats) {
    759     if (stats == NULL) {
    760         return BAD_VALUE;
    761     }
    762 
    763     // FIXME for now we always return stats for the primary display
    764     memset(stats, 0, sizeof(*stats));
    765     stats->vsyncTime   = mPrimaryDispSync.computeNextRefresh(0);
    766     stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
    767     return NO_ERROR;
    768 }
    769 
    770 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
    771     sp<const DisplayDevice> device(getDisplayDevice(display));
    772     if (device != NULL) {
    773         return device->getActiveConfig();
    774     }
    775     return BAD_VALUE;
    776 }
    777 
    778 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
    779     ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
    780           this);
    781     int32_t type = hw->getDisplayType();
    782     int currentMode = hw->getActiveConfig();
    783 
    784     if (mode == currentMode) {
    785         ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
    786         return;
    787     }
    788 
    789     if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
    790         ALOGW("Trying to set config for virtual display");
    791         return;
    792     }
    793 
    794     hw->setActiveConfig(mode);
    795     getHwComposer().setActiveConfig(type, mode);
    796 }
    797 
    798 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
    799     class MessageSetActiveConfig: public MessageBase {
    800         SurfaceFlinger& mFlinger;
    801         sp<IBinder> mDisplay;
    802         int mMode;
    803     public:
    804         MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
    805                                int mode) :
    806             mFlinger(flinger), mDisplay(disp) { mMode = mode; }
    807         virtual bool handler() {
    808             Vector<DisplayInfo> configs;
    809             mFlinger.getDisplayConfigs(mDisplay, &configs);
    810             if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
    811                 ALOGE("Attempt to set active config = %d for display with %zu configs",
    812                         mMode, configs.size());
    813             }
    814             sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
    815             if (hw == NULL) {
    816                 ALOGE("Attempt to set active config = %d for null display %p",
    817                         mMode, mDisplay.get());
    818             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
    819                 ALOGW("Attempt to set active config = %d for virtual display",
    820                         mMode);
    821             } else {
    822                 mFlinger.setActiveConfigInternal(hw, mMode);
    823             }
    824             return true;
    825         }
    826     };
    827     sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
    828     postMessageSync(msg);
    829     return NO_ERROR;
    830 }
    831 
    832 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
    833         Vector<android_color_mode_t>* outColorModes) {
    834     if (outColorModes == nullptr || display.get() == nullptr) {
    835         return BAD_VALUE;
    836     }
    837 
    838     int32_t type = getDisplayType(display);
    839     if (type < 0) return type;
    840 
    841     std::set<android_color_mode_t> colorModes;
    842     for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
    843         colorModes.insert(hwConfig.colorMode);
    844     }
    845 
    846     outColorModes->clear();
    847     std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
    848 
    849     return NO_ERROR;
    850 }
    851 
    852 android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
    853     if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
    854 
    855     int32_t type = getDisplayType(display);
    856     if (type < 0) return static_cast<android_color_mode_t>(type);
    857 
    858     return getHwComposer().getColorMode(type);
    859 }
    860 
    861 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
    862         android_color_mode_t colorMode) {
    863     if (display.get() == nullptr || colorMode < 0) {
    864         return BAD_VALUE;
    865     }
    866 
    867     int32_t type = getDisplayType(display);
    868     if (type < 0) return type;
    869     const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
    870     HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
    871     desiredConfig.colorMode = colorMode;
    872     for (size_t c = 0; c < hwConfigs.size(); ++c) {
    873         const HWComposer::DisplayConfig config = hwConfigs[c];
    874         if (config == desiredConfig) {
    875             return setActiveConfig(display, c);
    876         }
    877     }
    878     return BAD_VALUE;
    879 }
    880 
    881 status_t SurfaceFlinger::clearAnimationFrameStats() {
    882     Mutex::Autolock _l(mStateLock);
    883     mAnimFrameTracker.clearStats();
    884     return NO_ERROR;
    885 }
    886 
    887 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
    888     Mutex::Autolock _l(mStateLock);
    889     mAnimFrameTracker.getStats(outStats);
    890     return NO_ERROR;
    891 }
    892 
    893 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
    894         HdrCapabilities* outCapabilities) const {
    895     // HWC1 does not provide HDR capabilities
    896     *outCapabilities = HdrCapabilities();
    897     return NO_ERROR;
    898 }
    899 
    900 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
    901     if (enable == mInjectVSyncs) {
    902         return NO_ERROR;
    903     }
    904 
    905     if (enable) {
    906         mInjectVSyncs = enable;
    907         ALOGV("VSync Injections enabled");
    908         if (mVSyncInjector.get() == nullptr) {
    909             mVSyncInjector = new InjectVSyncSource();
    910             mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
    911         }
    912         mEventQueue.setEventThread(mInjectorEventThread);
    913     } else {
    914         mInjectVSyncs = enable;
    915         ALOGV("VSync Injections disabled");
    916         mEventQueue.setEventThread(mSFEventThread);
    917         mVSyncInjector.clear();
    918     }
    919     return NO_ERROR;
    920 }
    921 
    922 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
    923     if (!mInjectVSyncs) {
    924         ALOGE("VSync Injections not enabled");
    925         return BAD_VALUE;
    926     }
    927     if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
    928         ALOGV("Injecting VSync inside SurfaceFlinger");
    929         mVSyncInjector->onInjectSyncEvent(when);
    930     }
    931     return NO_ERROR;
    932 }
    933 
    934 // ----------------------------------------------------------------------------
    935 
    936 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
    937         ISurfaceComposer::VsyncSource vsyncSource) {
    938     if (vsyncSource == eVsyncSourceSurfaceFlinger) {
    939         return mSFEventThread->createEventConnection();
    940     } else {
    941         return mEventThread->createEventConnection();
    942     }
    943 }
    944 
    945 // ----------------------------------------------------------------------------
    946 
    947 void SurfaceFlinger::waitForEvent() {
    948     mEventQueue.waitMessage();
    949 }
    950 
    951 void SurfaceFlinger::signalTransaction() {
    952     mEventQueue.invalidate();
    953 }
    954 
    955 void SurfaceFlinger::signalLayerUpdate() {
    956     mEventQueue.invalidate();
    957 }
    958 
    959 void SurfaceFlinger::signalRefresh() {
    960     mEventQueue.refresh();
    961 }
    962 
    963 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
    964         nsecs_t reltime, uint32_t /* flags */) {
    965     return mEventQueue.postMessage(msg, reltime);
    966 }
    967 
    968 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
    969         nsecs_t reltime, uint32_t /* flags */) {
    970     status_t res = mEventQueue.postMessage(msg, reltime);
    971     if (res == NO_ERROR) {
    972         msg->wait();
    973     }
    974     return res;
    975 }
    976 
    977 void SurfaceFlinger::run() {
    978     do {
    979         waitForEvent();
    980     } while (true);
    981 }
    982 
    983 void SurfaceFlinger::enableHardwareVsync() {
    984     Mutex::Autolock _l(mHWVsyncLock);
    985     if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
    986         mPrimaryDispSync.beginResync();
    987         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
    988         mEventControlThread->setVsyncEnabled(true);
    989         mPrimaryHWVsyncEnabled = true;
    990     }
    991 }
    992 
    993 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
    994     Mutex::Autolock _l(mHWVsyncLock);
    995 
    996     if (makeAvailable) {
    997         mHWVsyncAvailable = true;
    998     } else if (!mHWVsyncAvailable) {
    999         // Hardware vsync is not currently available, so abort the resync
   1000         // attempt for now
   1001         return;
   1002     }
   1003 
   1004     const nsecs_t period =
   1005             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
   1006 
   1007     mPrimaryDispSync.reset();
   1008     mPrimaryDispSync.setPeriod(period);
   1009 
   1010     if (!mPrimaryHWVsyncEnabled) {
   1011         mPrimaryDispSync.beginResync();
   1012         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
   1013         mEventControlThread->setVsyncEnabled(true);
   1014         mPrimaryHWVsyncEnabled = true;
   1015     }
   1016 }
   1017 
   1018 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
   1019     Mutex::Autolock _l(mHWVsyncLock);
   1020     if (mPrimaryHWVsyncEnabled) {
   1021         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
   1022         mEventControlThread->setVsyncEnabled(false);
   1023         mPrimaryDispSync.endResync();
   1024         mPrimaryHWVsyncEnabled = false;
   1025     }
   1026     if (makeUnavailable) {
   1027         mHWVsyncAvailable = false;
   1028     }
   1029 }
   1030 
   1031 void SurfaceFlinger::resyncWithRateLimit() {
   1032     static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
   1033     if (systemTime() - mLastSwapTime > kIgnoreDelay) {
   1034         resyncToHardwareVsync(false);
   1035     }
   1036 }
   1037 
   1038 void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
   1039                                      nsecs_t timestamp) {
   1040     bool needsHwVsync = false;
   1041 
   1042     { // Scope for the lock
   1043         Mutex::Autolock _l(mHWVsyncLock);
   1044         if (type == 0 && mPrimaryHWVsyncEnabled) {
   1045             needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
   1046         }
   1047     }
   1048 
   1049     if (needsHwVsync) {
   1050         enableHardwareVsync();
   1051     } else {
   1052         disableHardwareVsync(false);
   1053     }
   1054 }
   1055 
   1056 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
   1057     std::lock_guard<std::mutex> lock(mCompositorTimingLock);
   1058     *compositorTiming = mCompositorTiming;
   1059 }
   1060 
   1061 void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
   1062     if (mEventThread == NULL) {
   1063         // This is a temporary workaround for b/7145521.  A non-null pointer
   1064         // does not mean EventThread has finished initializing, so this
   1065         // is not a correct fix.
   1066         ALOGW("WARNING: EventThread not started, ignoring hotplug");
   1067         return;
   1068     }
   1069 
   1070     if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
   1071         Mutex::Autolock _l(mStateLock);
   1072         if (connected) {
   1073             createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
   1074         } else {
   1075             mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
   1076             mBuiltinDisplays[type].clear();
   1077         }
   1078         setTransactionFlags(eDisplayTransactionNeeded);
   1079 
   1080         // Defer EventThread notification until SF has updated mDisplays.
   1081     }
   1082 }
   1083 
   1084 void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
   1085     repaintEverything();
   1086 }
   1087 
   1088 void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
   1089     ATRACE_CALL();
   1090     getHwComposer().eventControl(disp, event, enabled);
   1091 }
   1092 
   1093 void SurfaceFlinger::onMessageReceived(int32_t what) {
   1094     ATRACE_CALL();
   1095     switch (what) {
   1096         case MessageQueue::INVALIDATE: {
   1097             bool refreshNeeded = handleMessageTransaction();
   1098             refreshNeeded |= handleMessageInvalidate();
   1099             refreshNeeded |= mRepaintEverything;
   1100             if (refreshNeeded) {
   1101                 // Signal a refresh if a transaction modified the window state,
   1102                 // a new buffer was latched, or if HWC has requested a full
   1103                 // repaint
   1104                 signalRefresh();
   1105             }
   1106             break;
   1107         }
   1108         case MessageQueue::REFRESH: {
   1109             handleMessageRefresh();
   1110             break;
   1111         }
   1112     }
   1113 }
   1114 
   1115 bool SurfaceFlinger::handleMessageTransaction() {
   1116     uint32_t transactionFlags = peekTransactionFlags();
   1117     if (transactionFlags) {
   1118         handleTransaction(transactionFlags);
   1119         return true;
   1120     }
   1121     return false;
   1122 }
   1123 
   1124 bool SurfaceFlinger::handleMessageInvalidate() {
   1125     ATRACE_CALL();
   1126     return handlePageFlip();
   1127 }
   1128 
   1129 void SurfaceFlinger::handleMessageRefresh() {
   1130     ATRACE_CALL();
   1131 
   1132     nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
   1133 
   1134     preComposition(refreshStartTime);
   1135     rebuildLayerStacks();
   1136     setUpHWComposer();
   1137     doDebugFlashRegions();
   1138     doComposition();
   1139     postComposition(refreshStartTime);
   1140 }
   1141 
   1142 void SurfaceFlinger::doDebugFlashRegions()
   1143 {
   1144     // is debugging enabled
   1145     if (CC_LIKELY(!mDebugRegion))
   1146         return;
   1147 
   1148     const bool repaintEverything = mRepaintEverything;
   1149     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1150         const sp<DisplayDevice>& hw(mDisplays[dpy]);
   1151         if (hw->isDisplayOn()) {
   1152             // transform the dirty region into this screen's coordinate space
   1153             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
   1154             if (!dirtyRegion.isEmpty()) {
   1155                 // redraw the whole screen
   1156                 doComposeSurfaces(hw, Region(hw->bounds()));
   1157 
   1158                 // and draw the dirty region
   1159                 const int32_t height = hw->getHeight();
   1160                 RenderEngine& engine(getRenderEngine());
   1161                 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
   1162 
   1163                 hw->compositionComplete();
   1164                 hw->swapBuffers(getHwComposer());
   1165             }
   1166         }
   1167     }
   1168 
   1169     postFramebuffer();
   1170 
   1171     if (mDebugRegion > 1) {
   1172         usleep(mDebugRegion * 1000);
   1173     }
   1174 
   1175     HWComposer& hwc(getHwComposer());
   1176     if (hwc.initCheck() == NO_ERROR) {
   1177         status_t err = hwc.prepare();
   1178         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
   1179     }
   1180 }
   1181 
   1182 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
   1183 {
   1184     bool needExtraInvalidate = false;
   1185     mDrawingState.traverseInZOrder([&](Layer* layer) {
   1186         if (layer->onPreComposition(refreshStartTime)) {
   1187             needExtraInvalidate = true;
   1188         }
   1189     });
   1190 
   1191     if (needExtraInvalidate) {
   1192         signalLayerUpdate();
   1193     }
   1194 }
   1195 
   1196 void SurfaceFlinger::updateCompositorTiming(
   1197         nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
   1198         std::shared_ptr<FenceTime>& presentFenceTime) {
   1199     // Update queue of past composite+present times and determine the
   1200     // most recently known composite to present latency.
   1201     mCompositePresentTimes.push({compositeTime, presentFenceTime});
   1202     nsecs_t compositeToPresentLatency = -1;
   1203     while (!mCompositePresentTimes.empty()) {
   1204         CompositePresentTime& cpt = mCompositePresentTimes.front();
   1205         // Cached values should have been updated before calling this method,
   1206         // which helps avoid duplicate syscalls.
   1207         nsecs_t displayTime = cpt.display->getCachedSignalTime();
   1208         if (displayTime == Fence::SIGNAL_TIME_PENDING) {
   1209             break;
   1210         }
   1211         compositeToPresentLatency = displayTime - cpt.composite;
   1212         mCompositePresentTimes.pop();
   1213     }
   1214 
   1215     // Don't let mCompositePresentTimes grow unbounded, just in case.
   1216     while (mCompositePresentTimes.size() > 16) {
   1217         mCompositePresentTimes.pop();
   1218     }
   1219 
   1220     setCompositorTimingSnapped(
   1221             vsyncPhase, vsyncInterval, compositeToPresentLatency);
   1222 }
   1223 
   1224 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
   1225         nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
   1226     // Integer division and modulo round toward 0 not -inf, so we need to
   1227     // treat negative and positive offsets differently.
   1228     nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
   1229             (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
   1230             ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
   1231 
   1232     // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
   1233     if (idealLatency <= 0) {
   1234         idealLatency = vsyncInterval;
   1235     }
   1236 
   1237     // Snap the latency to a value that removes scheduling jitter from the
   1238     // composition and present times, which often have >1ms of jitter.
   1239     // Reducing jitter is important if an app attempts to extrapolate
   1240     // something (such as user input) to an accurate diasplay time.
   1241     // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
   1242     // with (presentLatency % interval).
   1243     nsecs_t bias = vsyncInterval / 2;
   1244     int64_t extraVsyncs =
   1245             (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
   1246     nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
   1247             idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
   1248 
   1249     std::lock_guard<std::mutex> lock(mCompositorTimingLock);
   1250     mCompositorTiming.deadline = vsyncPhase - idealLatency;
   1251     mCompositorTiming.interval = vsyncInterval;
   1252     mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
   1253 }
   1254 
   1255 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
   1256 {
   1257     const HWComposer& hwc = getHwComposer();
   1258     const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
   1259 
   1260     mGlCompositionDoneTimeline.updateSignalTimes();
   1261     std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
   1262     if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
   1263         glCompositionDoneFenceTime =
   1264                 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
   1265         mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
   1266     } else {
   1267         glCompositionDoneFenceTime = FenceTime::NO_FENCE;
   1268     }
   1269 
   1270     mDisplayTimeline.updateSignalTimes();
   1271     sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
   1272     auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
   1273     mDisplayTimeline.push(retireFenceTime);
   1274 
   1275     nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
   1276     nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
   1277 
   1278     // We use the refreshStartTime which might be sampled a little later than
   1279     // when we started doing work for this frame, but that should be okay
   1280     // since updateCompositorTiming has snapping logic.
   1281     updateCompositorTiming(
   1282         vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
   1283     CompositorTiming compositorTiming;
   1284     {
   1285         std::lock_guard<std::mutex> lock(mCompositorTimingLock);
   1286         compositorTiming = mCompositorTiming;
   1287     }
   1288 
   1289     mDrawingState.traverseInZOrder([&](Layer* layer) {
   1290         // TODO(brianderson): The retire fence is incorrectly passed in as the
   1291         // present fence. Fix this if this file lives on.
   1292         bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
   1293                 retireFenceTime, compositorTiming);
   1294         if (frameLatched) {
   1295             recordBufferingStats(layer->getName().string(),
   1296                     layer->getOccupancyHistory(false));
   1297         }
   1298     });
   1299 
   1300     if (retireFence->isValid()) {
   1301         if (mPrimaryDispSync.addPresentFence(retireFenceTime)) {
   1302             enableHardwareVsync();
   1303         } else {
   1304             disableHardwareVsync(false);
   1305         }
   1306     }
   1307 
   1308     if (!hasSyncFramework) {
   1309         if (hw->isDisplayOn()) {
   1310             enableHardwareVsync();
   1311         }
   1312     }
   1313 
   1314     if (mAnimCompositionPending) {
   1315         mAnimCompositionPending = false;
   1316 
   1317         if (retireFenceTime->isValid()) {
   1318             mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
   1319         } else {
   1320             // The HWC doesn't support present fences, so use the refresh
   1321             // timestamp instead.
   1322             nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
   1323             mAnimFrameTracker.setActualPresentTime(presentTime);
   1324         }
   1325         mAnimFrameTracker.advanceFrame();
   1326     }
   1327 
   1328     if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
   1329         return;
   1330     }
   1331 
   1332     nsecs_t currentTime = systemTime();
   1333     if (mHasPoweredOff) {
   1334         mHasPoweredOff = false;
   1335     } else {
   1336         nsecs_t period = mPrimaryDispSync.getPeriod();
   1337         nsecs_t elapsedTime = currentTime - mLastSwapTime;
   1338         size_t numPeriods = static_cast<size_t>(elapsedTime / period);
   1339         if (numPeriods < NUM_BUCKETS - 1) {
   1340             mFrameBuckets[numPeriods] += elapsedTime;
   1341         } else {
   1342             mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
   1343         }
   1344         mTotalTime += elapsedTime;
   1345     }
   1346     mLastSwapTime = currentTime;
   1347 }
   1348 
   1349 void SurfaceFlinger::rebuildLayerStacks() {
   1350     // rebuild the visible layer list per screen
   1351     if (CC_UNLIKELY(mVisibleRegionsDirty)) {
   1352         ATRACE_CALL();
   1353         mVisibleRegionsDirty = false;
   1354         invalidateHwcGeometry();
   1355 
   1356         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1357             Region opaqueRegion;
   1358             Region dirtyRegion;
   1359             Vector< sp<Layer> > layersSortedByZ;
   1360             const sp<DisplayDevice>& hw(mDisplays[dpy]);
   1361             const Transform& tr(hw->getTransform());
   1362             const Rect bounds(hw->getBounds());
   1363             if (hw->isDisplayOn()) {
   1364                 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
   1365 
   1366                 mDrawingState.traverseInZOrder([&](Layer* layer) {
   1367                     if (layer->getLayerStack() == hw->getLayerStack()) {
   1368                         Region drawRegion(tr.transform(
   1369                                 layer->visibleNonTransparentRegion));
   1370                         drawRegion.andSelf(bounds);
   1371                         if (!drawRegion.isEmpty()) {
   1372                             layersSortedByZ.add(layer);
   1373                         }
   1374                     }
   1375                 });
   1376             }
   1377             hw->setVisibleLayersSortedByZ(layersSortedByZ);
   1378             hw->undefinedRegion.set(bounds);
   1379             hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
   1380             hw->dirtyRegion.orSelf(dirtyRegion);
   1381         }
   1382     }
   1383 }
   1384 
   1385 void SurfaceFlinger::setUpHWComposer() {
   1386     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1387         bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
   1388         bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
   1389         bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
   1390 
   1391         // If nothing has changed (!dirty), don't recompose.
   1392         // If something changed, but we don't currently have any visible layers,
   1393         //   and didn't when we last did a composition, then skip it this time.
   1394         // The second rule does two things:
   1395         // - When all layers are removed from a display, we'll emit one black
   1396         //   frame, then nothing more until we get new layers.
   1397         // - When a display is created with a private layer stack, we won't
   1398         //   emit any black frames until a layer is added to the layer stack.
   1399         bool mustRecompose = dirty && !(empty && wasEmpty);
   1400 
   1401         ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
   1402                 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
   1403                 mustRecompose ? "doing" : "skipping",
   1404                 dirty ? "+" : "-",
   1405                 empty ? "+" : "-",
   1406                 wasEmpty ? "+" : "-");
   1407 
   1408         mDisplays[dpy]->beginFrame(mustRecompose);
   1409 
   1410         if (mustRecompose) {
   1411             mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
   1412         }
   1413     }
   1414 
   1415     HWComposer& hwc(getHwComposer());
   1416     if (hwc.initCheck() == NO_ERROR) {
   1417         // build the h/w work list
   1418         if (CC_UNLIKELY(mHwWorkListDirty)) {
   1419             mHwWorkListDirty = false;
   1420             for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1421                 sp<const DisplayDevice> hw(mDisplays[dpy]);
   1422                 const int32_t id = hw->getHwcDisplayId();
   1423                 if (id >= 0) {
   1424                     const Vector< sp<Layer> >& currentLayers(
   1425                         hw->getVisibleLayersSortedByZ());
   1426                     const size_t count = currentLayers.size();
   1427                     if (hwc.createWorkList(id, count) == NO_ERROR) {
   1428                         HWComposer::LayerListIterator cur = hwc.begin(id);
   1429                         const HWComposer::LayerListIterator end = hwc.end(id);
   1430                         for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
   1431                             const sp<Layer>& layer(currentLayers[i]);
   1432                             layer->setGeometry(hw, *cur);
   1433                             if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
   1434                                 cur->setSkip(true);
   1435                             }
   1436                         }
   1437                     }
   1438                 }
   1439             }
   1440         }
   1441 
   1442         // set the per-frame data
   1443         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1444             sp<const DisplayDevice> hw(mDisplays[dpy]);
   1445             const int32_t id = hw->getHwcDisplayId();
   1446             if (id >= 0) {
   1447                 const Vector< sp<Layer> >& currentLayers(
   1448                     hw->getVisibleLayersSortedByZ());
   1449                 const size_t count = currentLayers.size();
   1450                 HWComposer::LayerListIterator cur = hwc.begin(id);
   1451                 const HWComposer::LayerListIterator end = hwc.end(id);
   1452                 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
   1453                     /*
   1454                      * update the per-frame h/w composer data for each layer
   1455                      * and build the transparent region of the FB
   1456                      */
   1457                     const sp<Layer>& layer(currentLayers[i]);
   1458                     layer->setPerFrameData(hw, *cur);
   1459                 }
   1460             }
   1461         }
   1462 
   1463         // If possible, attempt to use the cursor overlay on each display.
   1464         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1465             sp<const DisplayDevice> hw(mDisplays[dpy]);
   1466             const int32_t id = hw->getHwcDisplayId();
   1467             if (id >= 0) {
   1468                 const Vector< sp<Layer> >& currentLayers(
   1469                     hw->getVisibleLayersSortedByZ());
   1470                 const size_t count = currentLayers.size();
   1471                 HWComposer::LayerListIterator cur = hwc.begin(id);
   1472                 const HWComposer::LayerListIterator end = hwc.end(id);
   1473                 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
   1474                     const sp<Layer>& layer(currentLayers[i]);
   1475                     if (layer->isPotentialCursor()) {
   1476                         cur->setIsCursorLayerHint();
   1477                         break;
   1478                     }
   1479                 }
   1480             }
   1481         }
   1482 
   1483         status_t err = hwc.prepare();
   1484         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
   1485 
   1486         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1487             sp<const DisplayDevice> hw(mDisplays[dpy]);
   1488             hw->prepareFrame(hwc);
   1489         }
   1490     }
   1491 }
   1492 
   1493 void SurfaceFlinger::doComposition() {
   1494     ATRACE_CALL();
   1495     const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
   1496     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1497         const sp<DisplayDevice>& hw(mDisplays[dpy]);
   1498         if (hw->isDisplayOn()) {
   1499             // transform the dirty region into this screen's coordinate space
   1500             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
   1501 
   1502             // repaint the framebuffer (if needed)
   1503             doDisplayComposition(hw, dirtyRegion);
   1504 
   1505             hw->dirtyRegion.clear();
   1506             hw->flip(hw->swapRegion);
   1507             hw->swapRegion.clear();
   1508         }
   1509         // inform the h/w that we're done compositing
   1510         hw->compositionComplete();
   1511     }
   1512     postFramebuffer();
   1513 }
   1514 
   1515 void SurfaceFlinger::postFramebuffer()
   1516 {
   1517     ATRACE_CALL();
   1518 
   1519     const nsecs_t now = systemTime();
   1520     mDebugInSwapBuffers = now;
   1521 
   1522     HWComposer& hwc(getHwComposer());
   1523     if (hwc.initCheck() == NO_ERROR) {
   1524         if (!hwc.supportsFramebufferTarget()) {
   1525             // EGL spec says:
   1526             //   "surface must be bound to the calling thread's current context,
   1527             //    for the current rendering API."
   1528             getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
   1529         }
   1530         hwc.commit();
   1531     }
   1532 
   1533     // make the default display current because the VirtualDisplayDevice code cannot
   1534     // deal with dequeueBuffer() being called outside of the composition loop; however
   1535     // the code below can call glFlush() which is allowed (and does in some case) call
   1536     // dequeueBuffer().
   1537     getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
   1538 
   1539     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1540         sp<const DisplayDevice> hw(mDisplays[dpy]);
   1541         const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
   1542         hw->onSwapBuffersCompleted(hwc);
   1543         const size_t count = currentLayers.size();
   1544         int32_t id = hw->getHwcDisplayId();
   1545         if (id >=0 && hwc.initCheck() == NO_ERROR) {
   1546             HWComposer::LayerListIterator cur = hwc.begin(id);
   1547             const HWComposer::LayerListIterator end = hwc.end(id);
   1548             for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
   1549                 currentLayers[i]->onLayerDisplayed(hw, &*cur);
   1550             }
   1551         } else {
   1552             for (size_t i = 0; i < count; i++) {
   1553                 currentLayers[i]->onLayerDisplayed(hw, NULL);
   1554             }
   1555         }
   1556     }
   1557 
   1558     mLastSwapBufferTime = systemTime() - now;
   1559     mDebugInSwapBuffers = 0;
   1560 
   1561     uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
   1562     if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
   1563         logFrameStats();
   1564     }
   1565 }
   1566 
   1567 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
   1568 {
   1569     ATRACE_CALL();
   1570 
   1571     // here we keep a copy of the drawing state (that is the state that's
   1572     // going to be overwritten by handleTransactionLocked()) outside of
   1573     // mStateLock so that the side-effects of the State assignment
   1574     // don't happen with mStateLock held (which can cause deadlocks).
   1575     State drawingState(mDrawingState);
   1576 
   1577     Mutex::Autolock _l(mStateLock);
   1578     const nsecs_t now = systemTime();
   1579     mDebugInTransaction = now;
   1580 
   1581     // Here we're guaranteed that some transaction flags are set
   1582     // so we can call handleTransactionLocked() unconditionally.
   1583     // We call getTransactionFlags(), which will also clear the flags,
   1584     // with mStateLock held to guarantee that mCurrentState won't change
   1585     // until the transaction is committed.
   1586 
   1587     transactionFlags = getTransactionFlags(eTransactionMask);
   1588     handleTransactionLocked(transactionFlags);
   1589 
   1590     mLastTransactionTime = systemTime() - now;
   1591     mDebugInTransaction = 0;
   1592     invalidateHwcGeometry();
   1593     // here the transaction has been committed
   1594 }
   1595 
   1596 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
   1597 {
   1598     // Notify all layers of available frames
   1599     mCurrentState.traverseInZOrder([](Layer* layer) {
   1600         layer->notifyAvailableFrames();
   1601     });
   1602 
   1603     /*
   1604      * Traversal of the children
   1605      * (perform the transaction for each of them if needed)
   1606      */
   1607 
   1608     if (transactionFlags & eTraversalNeeded) {
   1609         mCurrentState.traverseInZOrder([&](Layer* layer) {
   1610             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
   1611             if (!trFlags) return;
   1612 
   1613             const uint32_t flags = layer->doTransaction(0);
   1614             if (flags & Layer::eVisibleRegion)
   1615                 mVisibleRegionsDirty = true;
   1616         });
   1617     }
   1618 
   1619     /*
   1620      * Perform display own transactions if needed
   1621      */
   1622 
   1623     if (transactionFlags & eDisplayTransactionNeeded) {
   1624         // here we take advantage of Vector's copy-on-write semantics to
   1625         // improve performance by skipping the transaction entirely when
   1626         // know that the lists are identical
   1627         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
   1628         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
   1629         if (!curr.isIdenticalTo(draw)) {
   1630             mVisibleRegionsDirty = true;
   1631             const size_t cc = curr.size();
   1632                   size_t dc = draw.size();
   1633 
   1634             // find the displays that were removed
   1635             // (ie: in drawing state but not in current state)
   1636             // also handle displays that changed
   1637             // (ie: displays that are in both lists)
   1638             for (size_t i=0 ; i<dc ; i++) {
   1639                 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
   1640                 if (j < 0) {
   1641                     // in drawing state but not in current state
   1642                     if (!draw[i].isMainDisplay()) {
   1643                         // Call makeCurrent() on the primary display so we can
   1644                         // be sure that nothing associated with this display
   1645                         // is current.
   1646                         const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
   1647                         defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
   1648                         sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
   1649                         if (hw != NULL)
   1650                             hw->disconnect(getHwComposer());
   1651                         if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
   1652                             mEventThread->onHotplugReceived(draw[i].type, false);
   1653                         mDisplays.removeItem(draw.keyAt(i));
   1654                     } else {
   1655                         ALOGW("trying to remove the main display");
   1656                     }
   1657                 } else {
   1658                     // this display is in both lists. see if something changed.
   1659                     const DisplayDeviceState& state(curr[j]);
   1660                     const wp<IBinder>& display(curr.keyAt(j));
   1661                     const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
   1662                     const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
   1663                     if (state_binder != draw_binder) {
   1664                         // changing the surface is like destroying and
   1665                         // recreating the DisplayDevice, so we just remove it
   1666                         // from the drawing state, so that it get re-added
   1667                         // below.
   1668                         sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
   1669                         if (hw != NULL)
   1670                             hw->disconnect(getHwComposer());
   1671                         mDisplays.removeItem(display);
   1672                         mDrawingState.displays.removeItemsAt(i);
   1673                         dc--; i--;
   1674                         // at this point we must loop to the next item
   1675                         continue;
   1676                     }
   1677 
   1678                     const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
   1679                     if (disp != NULL) {
   1680                         if (state.layerStack != draw[i].layerStack) {
   1681                             disp->setLayerStack(state.layerStack);
   1682                         }
   1683                         if ((state.orientation != draw[i].orientation)
   1684                                 || (state.viewport != draw[i].viewport)
   1685                                 || (state.frame != draw[i].frame))
   1686                         {
   1687                             disp->setProjection(state.orientation,
   1688                                     state.viewport, state.frame);
   1689                         }
   1690                         if (state.width != draw[i].width || state.height != draw[i].height) {
   1691                             disp->setDisplaySize(state.width, state.height);
   1692                         }
   1693                     }
   1694                 }
   1695             }
   1696 
   1697             // find displays that were added
   1698             // (ie: in current state but not in drawing state)
   1699             for (size_t i=0 ; i<cc ; i++) {
   1700                 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
   1701                     const DisplayDeviceState& state(curr[i]);
   1702 
   1703                     sp<DisplaySurface> dispSurface;
   1704                     sp<IGraphicBufferProducer> producer;
   1705                     sp<IGraphicBufferProducer> bqProducer;
   1706                     sp<IGraphicBufferConsumer> bqConsumer;
   1707                     BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
   1708 
   1709                     int32_t hwcDisplayId = -1;
   1710                     if (state.isVirtualDisplay()) {
   1711                         // Virtual displays without a surface are dormant:
   1712                         // they have external state (layer stack, projection,
   1713                         // etc.) but no internal state (i.e. a DisplayDevice).
   1714                         if (state.surface != NULL) {
   1715 
   1716                             int width = 0;
   1717                             int status = state.surface->query(
   1718                                     NATIVE_WINDOW_WIDTH, &width);
   1719                             ALOGE_IF(status != NO_ERROR,
   1720                                     "Unable to query width (%d)", status);
   1721                             int height = 0;
   1722                             status = state.surface->query(
   1723                                     NATIVE_WINDOW_HEIGHT, &height);
   1724                             ALOGE_IF(status != NO_ERROR,
   1725                                     "Unable to query height (%d)", status);
   1726                             if (mUseHwcVirtualDisplays &&
   1727                                     (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
   1728                                     (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
   1729                                      height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
   1730                                 hwcDisplayId = allocateHwcDisplayId(state.type);
   1731                             }
   1732 
   1733                             sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
   1734                                     *mHwc, hwcDisplayId, state.surface,
   1735                                     bqProducer, bqConsumer, state.displayName);
   1736 
   1737                             dispSurface = vds;
   1738                             producer = vds;
   1739                         }
   1740                     } else {
   1741                         ALOGE_IF(state.surface!=NULL,
   1742                                 "adding a supported display, but rendering "
   1743                                 "surface is provided (%p), ignoring it",
   1744                                 state.surface.get());
   1745                         hwcDisplayId = allocateHwcDisplayId(state.type);
   1746                         // for supported (by hwc) displays we provide our
   1747                         // own rendering surface
   1748                         dispSurface = new FramebufferSurface(*mHwc, state.type,
   1749                                 bqConsumer);
   1750                         producer = bqProducer;
   1751                     }
   1752 
   1753                     const wp<IBinder>& display(curr.keyAt(i));
   1754                     if (dispSurface != NULL) {
   1755                         sp<DisplayDevice> hw = new DisplayDevice(this,
   1756                                 state.type, hwcDisplayId,
   1757                                 mHwc->getFormat(hwcDisplayId), state.isSecure,
   1758                                 display, dispSurface, producer,
   1759                                 mRenderEngine->getEGLConfig(), false);
   1760                         hw->setLayerStack(state.layerStack);
   1761                         hw->setProjection(state.orientation,
   1762                                 state.viewport, state.frame);
   1763                         hw->setDisplayName(state.displayName);
   1764                         mDisplays.add(display, hw);
   1765                         if (state.isVirtualDisplay()) {
   1766                             if (hwcDisplayId >= 0) {
   1767                                 mHwc->setVirtualDisplayProperties(hwcDisplayId,
   1768                                         hw->getWidth(), hw->getHeight(),
   1769                                         hw->getFormat());
   1770                             }
   1771                         } else {
   1772                             mEventThread->onHotplugReceived(state.type, true);
   1773                         }
   1774                     }
   1775                 }
   1776             }
   1777         }
   1778     }
   1779 
   1780     if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
   1781         // The transform hint might have changed for some layers
   1782         // (either because a display has changed, or because a layer
   1783         // as changed).
   1784         //
   1785         // Walk through all the layers in currentLayers,
   1786         // and update their transform hint.
   1787         //
   1788         // If a layer is visible only on a single display, then that
   1789         // display is used to calculate the hint, otherwise we use the
   1790         // default display.
   1791         //
   1792         // NOTE: we do this here, rather than in rebuildLayerStacks() so that
   1793         // the hint is set before we acquire a buffer from the surface texture.
   1794         //
   1795         // NOTE: layer transactions have taken place already, so we use their
   1796         // drawing state. However, SurfaceFlinger's own transaction has not
   1797         // happened yet, so we must use the current state layer list
   1798         // (soon to become the drawing state list).
   1799         //
   1800         sp<const DisplayDevice> disp;
   1801         uint32_t currentlayerStack = 0;
   1802         bool first = true;
   1803         mCurrentState.traverseInZOrder([&](Layer* layer) {
   1804             // NOTE: we rely on the fact that layers are sorted by
   1805             // layerStack first (so we don't have to traverse the list
   1806             // of displays for every layer).
   1807             uint32_t layerStack = layer->getLayerStack();
   1808             if (first || currentlayerStack != layerStack) {
   1809                 currentlayerStack = layerStack;
   1810                 // figure out if this layerstack is mirrored
   1811                 // (more than one display) if so, pick the default display,
   1812                 // if not, pick the only display it's on.
   1813                 disp.clear();
   1814                 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1815                     sp<const DisplayDevice> hw(mDisplays[dpy]);
   1816                     if (hw->getLayerStack() == currentlayerStack) {
   1817                         if (disp == NULL) {
   1818                             disp = hw;
   1819                         } else {
   1820                             disp = NULL;
   1821                             break;
   1822                         }
   1823                     }
   1824                 }
   1825             }
   1826             if (disp == NULL) {
   1827                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
   1828                 // redraw after transform hint changes. See bug 8508397.
   1829 
   1830                 // could be null when this layer is using a layerStack
   1831                 // that is not visible on any display. Also can occur at
   1832                 // screen off/on times.
   1833                 disp = getDefaultDisplayDeviceLocked();
   1834             }
   1835             layer->updateTransformHint(disp);
   1836 
   1837             first = false;
   1838         });
   1839     }
   1840 
   1841 
   1842     /*
   1843      * Perform our own transaction if needed
   1844      */
   1845 
   1846     if (mLayersAdded) {
   1847         mLayersAdded = false;
   1848         // Layers have been added.
   1849         mVisibleRegionsDirty = true;
   1850     }
   1851 
   1852     // some layers might have been removed, so
   1853     // we need to update the regions they're exposing.
   1854     if (mLayersRemoved) {
   1855         mLayersRemoved = false;
   1856         mVisibleRegionsDirty = true;
   1857         mDrawingState.traverseInZOrder([&](Layer* layer) {
   1858             if (mLayersPendingRemoval.indexOf(layer) >= 0) {
   1859                 // this layer is not visible anymore
   1860                 // TODO: we could traverse the tree from front to back and
   1861                 //       compute the actual visible region
   1862                 // TODO: we could cache the transformed region
   1863                 Region visibleReg;
   1864                 visibleReg.set(layer->computeScreenBounds());
   1865                 invalidateLayerStack(layer, visibleReg);
   1866             }
   1867         });
   1868     }
   1869 
   1870     commitTransaction();
   1871 
   1872     updateCursorAsync();
   1873 }
   1874 
   1875 void SurfaceFlinger::updateCursorAsync()
   1876 {
   1877     HWComposer& hwc(getHwComposer());
   1878     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   1879         sp<const DisplayDevice> hw(mDisplays[dpy]);
   1880         const int32_t id = hw->getHwcDisplayId();
   1881         if (id < 0) {
   1882             continue;
   1883         }
   1884         const Vector< sp<Layer> >& currentLayers(
   1885             hw->getVisibleLayersSortedByZ());
   1886         const size_t count = currentLayers.size();
   1887         HWComposer::LayerListIterator cur = hwc.begin(id);
   1888         const HWComposer::LayerListIterator end = hwc.end(id);
   1889         for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
   1890             if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
   1891                 continue;
   1892             }
   1893             const sp<Layer>& layer(currentLayers[i]);
   1894             Rect cursorPos = layer->getPosition(hw);
   1895             hwc.setCursorPositionAsync(id, cursorPos);
   1896             break;
   1897         }
   1898     }
   1899 }
   1900 
   1901 void SurfaceFlinger::commitTransaction()
   1902 {
   1903     if (!mLayersPendingRemoval.isEmpty()) {
   1904         // Notify removed layers now that they can't be drawn from
   1905         for (const auto& l : mLayersPendingRemoval) {
   1906             recordBufferingStats(l->getName().string(),
   1907                     l->getOccupancyHistory(true));
   1908             l->onRemoved();
   1909         }
   1910         mLayersPendingRemoval.clear();
   1911     }
   1912 
   1913     // If this transaction is part of a window animation then the next frame
   1914     // we composite should be considered an animation as well.
   1915     mAnimCompositionPending = mAnimTransactionPending;
   1916 
   1917     mDrawingState = mCurrentState;
   1918     mDrawingState.traverseInZOrder([](Layer* layer) {
   1919         layer->commitChildList();
   1920     });
   1921     mTransactionPending = false;
   1922     mAnimTransactionPending = false;
   1923     mTransactionCV.broadcast();
   1924 }
   1925 
   1926 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
   1927         Region& outDirtyRegion, Region& outOpaqueRegion)
   1928 {
   1929     ATRACE_CALL();
   1930 
   1931     Region aboveOpaqueLayers;
   1932     Region aboveCoveredLayers;
   1933     Region dirty;
   1934 
   1935     outDirtyRegion.clear();
   1936 
   1937     mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
   1938         // start with the whole surface at its current location
   1939         const Layer::State& s(layer->getDrawingState());
   1940 
   1941         // only consider the layers on the given layer stack
   1942         if (layer->getLayerStack() != displayDevice->getLayerStack())
   1943             return;
   1944 
   1945         /*
   1946          * opaqueRegion: area of a surface that is fully opaque.
   1947          */
   1948         Region opaqueRegion;
   1949 
   1950         /*
   1951          * visibleRegion: area of a surface that is visible on screen
   1952          * and not fully transparent. This is essentially the layer's
   1953          * footprint minus the opaque regions above it.
   1954          * Areas covered by a translucent surface are considered visible.
   1955          */
   1956         Region visibleRegion;
   1957 
   1958         /*
   1959          * coveredRegion: area of a surface that is covered by all
   1960          * visible regions above it (which includes the translucent areas).
   1961          */
   1962         Region coveredRegion;
   1963 
   1964         /*
   1965          * transparentRegion: area of a surface that is hinted to be completely
   1966          * transparent. This is only used to tell when the layer has no visible
   1967          * non-transparent regions and can be removed from the layer list. It
   1968          * does not affect the visibleRegion of this layer or any layers
   1969          * beneath it. The hint may not be correct if apps don't respect the
   1970          * SurfaceView restrictions (which, sadly, some don't).
   1971          */
   1972         Region transparentRegion;
   1973 
   1974 
   1975         // handle hidden surfaces by setting the visible region to empty
   1976         if (CC_LIKELY(layer->isVisible())) {
   1977             const bool translucent = !layer->isOpaque(s);
   1978             Rect bounds(layer->computeScreenBounds());
   1979             visibleRegion.set(bounds);
   1980             Transform tr = layer->getTransform();
   1981             if (!visibleRegion.isEmpty()) {
   1982                 // Remove the transparent area from the visible region
   1983                 if (translucent) {
   1984                     if (tr.preserveRects()) {
   1985                         // transform the transparent region
   1986                         transparentRegion = tr.transform(s.activeTransparentRegion);
   1987                     } else {
   1988                         // transformation too complex, can't do the
   1989                         // transparent region optimization.
   1990                         transparentRegion.clear();
   1991                     }
   1992                 }
   1993 
   1994                 // compute the opaque region
   1995                 const int32_t layerOrientation = tr.getOrientation();
   1996                 if (s.alpha==255 && !translucent &&
   1997                         ((layerOrientation & Transform::ROT_INVALID) == false)) {
   1998                     // the opaque region is the layer's footprint
   1999                     opaqueRegion = visibleRegion;
   2000                 }
   2001             }
   2002         }
   2003 
   2004         // Clip the covered region to the visible region
   2005         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
   2006 
   2007         // Update aboveCoveredLayers for next (lower) layer
   2008         aboveCoveredLayers.orSelf(visibleRegion);
   2009 
   2010         // subtract the opaque region covered by the layers above us
   2011         visibleRegion.subtractSelf(aboveOpaqueLayers);
   2012 
   2013         // compute this layer's dirty region
   2014         if (layer->contentDirty) {
   2015             // we need to invalidate the whole region
   2016             dirty = visibleRegion;
   2017             // as well, as the old visible region
   2018             dirty.orSelf(layer->visibleRegion);
   2019             layer->contentDirty = false;
   2020         } else {
   2021             /* compute the exposed region:
   2022              *   the exposed region consists of two components:
   2023              *   1) what's VISIBLE now and was COVERED before
   2024              *   2) what's EXPOSED now less what was EXPOSED before
   2025              *
   2026              * note that (1) is conservative, we start with the whole
   2027              * visible region but only keep what used to be covered by
   2028              * something -- which mean it may have been exposed.
   2029              *
   2030              * (2) handles areas that were not covered by anything but got
   2031              * exposed because of a resize.
   2032              */
   2033             const Region newExposed = visibleRegion - coveredRegion;
   2034             const Region oldVisibleRegion = layer->visibleRegion;
   2035             const Region oldCoveredRegion = layer->coveredRegion;
   2036             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
   2037             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
   2038         }
   2039         dirty.subtractSelf(aboveOpaqueLayers);
   2040 
   2041         // accumulate to the screen dirty region
   2042         outDirtyRegion.orSelf(dirty);
   2043 
   2044         // Update aboveOpaqueLayers for next (lower) layer
   2045         aboveOpaqueLayers.orSelf(opaqueRegion);
   2046 
   2047         // Store the visible region in screen space
   2048         layer->setVisibleRegion(visibleRegion);
   2049         layer->setCoveredRegion(coveredRegion);
   2050         layer->setVisibleNonTransparentRegion(
   2051                 visibleRegion.subtract(transparentRegion));
   2052     });
   2053 
   2054     outOpaqueRegion = aboveOpaqueLayers;
   2055 }
   2056 
   2057 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
   2058     uint32_t layerStack = layer->getLayerStack();
   2059     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   2060         const sp<DisplayDevice>& hw(mDisplays[dpy]);
   2061         if (hw->getLayerStack() == layerStack) {
   2062             hw->dirtyRegion.orSelf(dirty);
   2063         }
   2064     }
   2065 }
   2066 
   2067 bool SurfaceFlinger::handlePageFlip()
   2068 {
   2069     nsecs_t latchTime = systemTime();
   2070     Region dirtyRegion;
   2071 
   2072     bool visibleRegions = false;
   2073     bool frameQueued = false;
   2074 
   2075     // Store the set of layers that need updates. This set must not change as
   2076     // buffers are being latched, as this could result in a deadlock.
   2077     // Example: Two producers share the same command stream and:
   2078     // 1.) Layer 0 is latched
   2079     // 2.) Layer 0 gets a new frame
   2080     // 2.) Layer 1 gets a new frame
   2081     // 3.) Layer 1 is latched.
   2082     // Display is now waiting on Layer 1's frame, which is behind layer 0's
   2083     // second frame. But layer 0's second frame could be waiting on display.
   2084     Vector<Layer*> layersWithQueuedFrames;
   2085     mDrawingState.traverseInZOrder([&](Layer* layer) {
   2086         if (layer->hasQueuedFrame()) {
   2087             frameQueued = true;
   2088             if (layer->shouldPresentNow(mPrimaryDispSync)) {
   2089                 layersWithQueuedFrames.push_back(layer);
   2090             } else {
   2091                 layer->useEmptyDamage();
   2092             }
   2093         } else {
   2094             layer->useEmptyDamage();
   2095         }
   2096     });
   2097     for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
   2098         Layer* layer = layersWithQueuedFrames[i];
   2099         const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
   2100         layer->useSurfaceDamage();
   2101         invalidateLayerStack(layer, dirty);
   2102     }
   2103 
   2104     mVisibleRegionsDirty |= visibleRegions;
   2105 
   2106     // If we will need to wake up at some time in the future to deal with a
   2107     // queued frame that shouldn't be displayed during this vsync period, wake
   2108     // up during the next vsync period to check again.
   2109     if (frameQueued && layersWithQueuedFrames.empty()) {
   2110         signalLayerUpdate();
   2111     }
   2112 
   2113     // Only continue with the refresh if there is actually new work to do
   2114     return !layersWithQueuedFrames.empty();
   2115 }
   2116 
   2117 void SurfaceFlinger::invalidateHwcGeometry()
   2118 {
   2119     mHwWorkListDirty = true;
   2120 }
   2121 
   2122 
   2123 void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
   2124         const Region& inDirtyRegion)
   2125 {
   2126     // We only need to actually compose the display if:
   2127     // 1) It is being handled by hardware composer, which may need this to
   2128     //    keep its virtual display state machine in sync, or
   2129     // 2) There is work to be done (the dirty region isn't empty)
   2130     bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
   2131     if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
   2132         return;
   2133     }
   2134 
   2135     Region dirtyRegion(inDirtyRegion);
   2136 
   2137     // compute the invalid region
   2138     hw->swapRegion.orSelf(dirtyRegion);
   2139 
   2140     uint32_t flags = hw->getFlags();
   2141     if (flags & DisplayDevice::SWAP_RECTANGLE) {
   2142         // we can redraw only what's dirty, but since SWAP_RECTANGLE only
   2143         // takes a rectangle, we must make sure to update that whole
   2144         // rectangle in that case
   2145         dirtyRegion.set(hw->swapRegion.bounds());
   2146     } else {
   2147         if (flags & DisplayDevice::PARTIAL_UPDATES) {
   2148             // We need to redraw the rectangle that will be updated
   2149             // (pushed to the framebuffer).
   2150             // This is needed because PARTIAL_UPDATES only takes one
   2151             // rectangle instead of a region (see DisplayDevice::flip())
   2152             dirtyRegion.set(hw->swapRegion.bounds());
   2153         } else {
   2154             // we need to redraw everything (the whole screen)
   2155             dirtyRegion.set(hw->bounds());
   2156             hw->swapRegion = dirtyRegion;
   2157         }
   2158     }
   2159 
   2160     if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
   2161         if (!doComposeSurfaces(hw, dirtyRegion)) return;
   2162     } else {
   2163         RenderEngine& engine(getRenderEngine());
   2164         mat4 colorMatrix = mColorMatrix;
   2165         if (mDaltonize) {
   2166             colorMatrix = colorMatrix * mDaltonizer();
   2167         }
   2168         mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
   2169         doComposeSurfaces(hw, dirtyRegion);
   2170         engine.setupColorTransform(oldMatrix);
   2171     }
   2172 
   2173     // update the swap region and clear the dirty region
   2174     hw->swapRegion.orSelf(dirtyRegion);
   2175 
   2176     // swap buffers (presentation)
   2177     hw->swapBuffers(getHwComposer());
   2178 }
   2179 
   2180 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
   2181 {
   2182     RenderEngine& engine(getRenderEngine());
   2183     const int32_t id = hw->getHwcDisplayId();
   2184     HWComposer& hwc(getHwComposer());
   2185     HWComposer::LayerListIterator cur = hwc.begin(id);
   2186     const HWComposer::LayerListIterator end = hwc.end(id);
   2187 
   2188     bool hasGlesComposition = hwc.hasGlesComposition(id);
   2189     if (hasGlesComposition) {
   2190         if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
   2191             ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
   2192                   hw->getDisplayName().string());
   2193             eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
   2194             if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
   2195               ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
   2196             }
   2197             return false;
   2198         }
   2199 
   2200         // Never touch the framebuffer if we don't have any framebuffer layers
   2201         const bool hasHwcComposition = hwc.hasHwcComposition(id);
   2202         if (hasHwcComposition) {
   2203             // when using overlays, we assume a fully transparent framebuffer
   2204             // NOTE: we could reduce how much we need to clear, for instance
   2205             // remove where there are opaque FB layers. however, on some
   2206             // GPUs doing a "clean slate" clear might be more efficient.
   2207             // We'll revisit later if needed.
   2208             engine.clearWithColor(0, 0, 0, 0);
   2209         } else {
   2210             // we start with the whole screen area
   2211             const Region bounds(hw->getBounds());
   2212 
   2213             // we remove the scissor part
   2214             // we're left with the letterbox region
   2215             // (common case is that letterbox ends-up being empty)
   2216             const Region letterbox(bounds.subtract(hw->getScissor()));
   2217 
   2218             // compute the area to clear
   2219             Region region(hw->undefinedRegion.merge(letterbox));
   2220 
   2221             // but limit it to the dirty region
   2222             region.andSelf(dirty);
   2223 
   2224             // screen is already cleared here
   2225             if (!region.isEmpty()) {
   2226                 // can happen with SurfaceView
   2227                 drawWormhole(hw, region);
   2228             }
   2229         }
   2230 
   2231         if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
   2232             // just to be on the safe side, we don't set the
   2233             // scissor on the main display. It should never be needed
   2234             // anyways (though in theory it could since the API allows it).
   2235             const Rect& bounds(hw->getBounds());
   2236             const Rect& scissor(hw->getScissor());
   2237             if (scissor != bounds) {
   2238                 // scissor doesn't match the screen's dimensions, so we
   2239                 // need to clear everything outside of it and enable
   2240                 // the GL scissor so we don't draw anything where we shouldn't
   2241 
   2242                 // enable scissor for this frame
   2243                 const uint32_t height = hw->getHeight();
   2244                 engine.setScissor(scissor.left, height - scissor.bottom,
   2245                         scissor.getWidth(), scissor.getHeight());
   2246             }
   2247         }
   2248     }
   2249 
   2250     /*
   2251      * and then, render the layers targeted at the framebuffer
   2252      */
   2253 
   2254     const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
   2255     const size_t count = layers.size();
   2256     const Transform& tr = hw->getTransform();
   2257     if (cur != end) {
   2258         // we're using h/w composer
   2259         for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
   2260             const sp<Layer>& layer(layers[i]);
   2261             const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
   2262             if (!clip.isEmpty()) {
   2263                 switch (cur->getCompositionType()) {
   2264                     case HWC_CURSOR_OVERLAY:
   2265                     case HWC_OVERLAY: {
   2266                         const Layer::State& state(layer->getDrawingState());
   2267                         if ((cur->getHints() & HWC_HINT_CLEAR_FB)
   2268                                 && i
   2269                                 && layer->isOpaque(state) && (state.alpha == 0xFF)
   2270                                 && hasGlesComposition) {
   2271                             // never clear the very first layer since we're
   2272                             // guaranteed the FB is already cleared
   2273                             layer->clearWithOpenGL(hw);
   2274                         }
   2275                         break;
   2276                     }
   2277                     case HWC_FRAMEBUFFER: {
   2278                         layer->draw(hw, clip);
   2279                         break;
   2280                     }
   2281                     case HWC_FRAMEBUFFER_TARGET: {
   2282                         // this should not happen as the iterator shouldn't
   2283                         // let us get there.
   2284                         ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
   2285                         break;
   2286                     }
   2287                 }
   2288             }
   2289             layer->setAcquireFence(hw, *cur);
   2290         }
   2291     } else {
   2292         // we're not using h/w composer
   2293         for (size_t i=0 ; i<count ; ++i) {
   2294             const sp<Layer>& layer(layers[i]);
   2295             const Region clip(dirty.intersect(
   2296                     tr.transform(layer->visibleRegion)));
   2297             if (!clip.isEmpty()) {
   2298                 layer->draw(hw, clip);
   2299             }
   2300         }
   2301     }
   2302 
   2303     // disable scissor at the end of the frame
   2304     engine.disableScissor();
   2305     return true;
   2306 }
   2307 
   2308 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
   2309     const int32_t height = hw->getHeight();
   2310     RenderEngine& engine(getRenderEngine());
   2311     engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
   2312 }
   2313 
   2314 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
   2315         const sp<IBinder>& handle,
   2316         const sp<IGraphicBufferProducer>& gbc,
   2317         const sp<Layer>& lbc,
   2318         const sp<Layer>& parent)
   2319 {
   2320     // add this layer to the current state list
   2321     {
   2322         Mutex::Autolock _l(mStateLock);
   2323         if (mNumLayers >= MAX_LAYERS) {
   2324             return NO_MEMORY;
   2325         }
   2326         if (parent == nullptr) {
   2327             mCurrentState.layersSortedByZ.add(lbc);
   2328         } else {
   2329             if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
   2330                 ALOGE("addClientLayer called with a removed parent");
   2331                 return NAME_NOT_FOUND;
   2332             }
   2333             parent->addChild(lbc);
   2334         }
   2335 
   2336         mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
   2337         mLayersAdded = true;
   2338         mNumLayers++;
   2339     }
   2340 
   2341     // attach this layer to the client
   2342     client->attachLayer(handle, lbc);
   2343 
   2344     return NO_ERROR;
   2345 }
   2346 
   2347 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
   2348     Mutex::Autolock _l(mStateLock);
   2349 
   2350     const auto& p = layer->getParent();
   2351     ssize_t index;
   2352     if (p != nullptr) {
   2353         if (topLevelOnly) {
   2354             return NO_ERROR;
   2355         }
   2356 
   2357         sp<Layer> ancestor = p;
   2358         while (ancestor->getParent() != nullptr) {
   2359             ancestor = ancestor->getParent();
   2360         }
   2361         if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
   2362             ALOGE("removeLayer called with a layer whose parent has been removed");
   2363             return NAME_NOT_FOUND;
   2364         }
   2365 
   2366         index = p->removeChild(layer);
   2367     } else {
   2368         index = mCurrentState.layersSortedByZ.remove(layer);
   2369     }
   2370 
   2371     // As a matter of normal operation, the LayerCleaner will produce a second
   2372     // attempt to remove the surface. The Layer will be kept alive in mDrawingState
   2373     // so we will succeed in promoting it, but it's already been removed
   2374     // from mCurrentState. As long as we can find it in mDrawingState we have no problem
   2375     // otherwise something has gone wrong and we are leaking the layer.
   2376     if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
   2377         ALOGE("Failed to find layer (%s) in layer parent (%s).",
   2378                 layer->getName().string(),
   2379                 (p != nullptr) ? p->getName().string() : "no-parent");
   2380         return BAD_VALUE;
   2381     } else if (index < 0) {
   2382         return NO_ERROR;
   2383     }
   2384 
   2385     layer->onRemovedFromCurrentState();
   2386     mLayersPendingRemoval.add(layer);
   2387     mLayersRemoved = true;
   2388     mNumLayers -= 1 + layer->getChildrenCount();
   2389     setTransactionFlags(eTransactionNeeded);
   2390     return NO_ERROR;
   2391 }
   2392 
   2393 uint32_t SurfaceFlinger::peekTransactionFlags() {
   2394     return android_atomic_release_load(&mTransactionFlags);
   2395 }
   2396 
   2397 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
   2398     return android_atomic_and(~flags, &mTransactionFlags) & flags;
   2399 }
   2400 
   2401 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
   2402     uint32_t old = android_atomic_or(flags, &mTransactionFlags);
   2403     if ((old & flags)==0) { // wake the server up
   2404         signalTransaction();
   2405     }
   2406     return old;
   2407 }
   2408 
   2409 void SurfaceFlinger::setTransactionState(
   2410         const Vector<ComposerState>& state,
   2411         const Vector<DisplayState>& displays,
   2412         uint32_t flags)
   2413 {
   2414     ATRACE_CALL();
   2415     Mutex::Autolock _l(mStateLock);
   2416     uint32_t transactionFlags = 0;
   2417 
   2418     if (flags & eAnimation) {
   2419         // For window updates that are part of an animation we must wait for
   2420         // previous animation "frames" to be handled.
   2421         while (mAnimTransactionPending) {
   2422             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
   2423             if (CC_UNLIKELY(err != NO_ERROR)) {
   2424                 // just in case something goes wrong in SF, return to the
   2425                 // caller after a few seconds.
   2426                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
   2427                         "waiting for previous animation frame");
   2428                 mAnimTransactionPending = false;
   2429                 break;
   2430             }
   2431         }
   2432     }
   2433 
   2434     size_t count = displays.size();
   2435     for (size_t i=0 ; i<count ; i++) {
   2436         const DisplayState& s(displays[i]);
   2437         transactionFlags |= setDisplayStateLocked(s);
   2438     }
   2439 
   2440     count = state.size();
   2441     for (size_t i=0 ; i<count ; i++) {
   2442         const ComposerState& s(state[i]);
   2443         // Here we need to check that the interface we're given is indeed
   2444         // one of our own. A malicious client could give us a NULL
   2445         // IInterface, or one of its own or even one of our own but a
   2446         // different type. All these situations would cause us to crash.
   2447         //
   2448         // NOTE: it would be better to use RTTI as we could directly check
   2449         // that we have a Client*. however, RTTI is disabled in Android.
   2450         if (s.client != NULL) {
   2451             sp<IBinder> binder = IInterface::asBinder(s.client);
   2452             if (binder != NULL) {
   2453                 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
   2454                     sp<Client> client( static_cast<Client *>(s.client.get()) );
   2455                     transactionFlags |= setClientStateLocked(client, s.state);
   2456                 }
   2457             }
   2458         }
   2459     }
   2460 
   2461     // If a synchronous transaction is explicitly requested without any changes,
   2462     // force a transaction anyway. This can be used as a flush mechanism for
   2463     // previous async transactions.
   2464     if (transactionFlags == 0 && (flags & eSynchronous)) {
   2465         transactionFlags = eTransactionNeeded;
   2466     }
   2467 
   2468     if (transactionFlags) {
   2469         if (mInterceptor.isEnabled()) {
   2470             mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
   2471         }
   2472 
   2473         // this triggers the transaction
   2474         setTransactionFlags(transactionFlags);
   2475 
   2476         // if this is a synchronous transaction, wait for it to take effect
   2477         // before returning.
   2478         if (flags & eSynchronous) {
   2479             mTransactionPending = true;
   2480         }
   2481         if (flags & eAnimation) {
   2482             mAnimTransactionPending = true;
   2483         }
   2484         while (mTransactionPending) {
   2485             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
   2486             if (CC_UNLIKELY(err != NO_ERROR)) {
   2487                 // just in case something goes wrong in SF, return to the
   2488                 // called after a few seconds.
   2489                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
   2490                 mTransactionPending = false;
   2491                 break;
   2492             }
   2493         }
   2494     }
   2495 }
   2496 
   2497 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
   2498 {
   2499     ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
   2500     if (dpyIdx < 0)
   2501         return 0;
   2502 
   2503     uint32_t flags = 0;
   2504     DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
   2505     if (disp.isValid()) {
   2506         const uint32_t what = s.what;
   2507         if (what & DisplayState::eSurfaceChanged) {
   2508             if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
   2509                 disp.surface = s.surface;
   2510                 flags |= eDisplayTransactionNeeded;
   2511             }
   2512         }
   2513         if (what & DisplayState::eLayerStackChanged) {
   2514             if (disp.layerStack != s.layerStack) {
   2515                 disp.layerStack = s.layerStack;
   2516                 flags |= eDisplayTransactionNeeded;
   2517             }
   2518         }
   2519         if (what & DisplayState::eDisplayProjectionChanged) {
   2520             if (disp.orientation != s.orientation) {
   2521                 disp.orientation = s.orientation;
   2522                 flags |= eDisplayTransactionNeeded;
   2523             }
   2524             if (disp.frame != s.frame) {
   2525                 disp.frame = s.frame;
   2526                 flags |= eDisplayTransactionNeeded;
   2527             }
   2528             if (disp.viewport != s.viewport) {
   2529                 disp.viewport = s.viewport;
   2530                 flags |= eDisplayTransactionNeeded;
   2531             }
   2532         }
   2533         if (what & DisplayState::eDisplaySizeChanged) {
   2534             if (disp.width != s.width) {
   2535                 disp.width = s.width;
   2536                 flags |= eDisplayTransactionNeeded;
   2537             }
   2538             if (disp.height != s.height) {
   2539                 disp.height = s.height;
   2540                 flags |= eDisplayTransactionNeeded;
   2541             }
   2542         }
   2543     }
   2544     return flags;
   2545 }
   2546 
   2547 uint32_t SurfaceFlinger::setClientStateLocked(
   2548         const sp<Client>& client,
   2549         const layer_state_t& s)
   2550 {
   2551     uint32_t flags = 0;
   2552     sp<Layer> layer(client->getLayerUser(s.surface));
   2553     if (layer != 0) {
   2554         const uint32_t what = s.what;
   2555         bool geometryAppliesWithResize =
   2556                 what & layer_state_t::eGeometryAppliesWithResize;
   2557         if (what & layer_state_t::ePositionChanged) {
   2558             if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
   2559                 flags |= eTraversalNeeded;
   2560             }
   2561         }
   2562         if (what & layer_state_t::eLayerChanged) {
   2563             // NOTE: index needs to be calculated before we update the state
   2564             const auto& p = layer->getParent();
   2565             if (p == nullptr) {
   2566                 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
   2567                 if (layer->setLayer(s.z) && idx >= 0) {
   2568                     mCurrentState.layersSortedByZ.removeAt(idx);
   2569                     mCurrentState.layersSortedByZ.add(layer);
   2570                     // we need traversal (state changed)
   2571                     // AND transaction (list changed)
   2572                     flags |= eTransactionNeeded|eTraversalNeeded;
   2573                 }
   2574             } else {
   2575                 if (p->setChildLayer(layer, s.z)) {
   2576                     flags |= eTransactionNeeded|eTraversalNeeded;
   2577                 }
   2578             }
   2579         }
   2580         if (what & layer_state_t::eSizeChanged) {
   2581             if (layer->setSize(s.w, s.h)) {
   2582                 flags |= eTraversalNeeded;
   2583             }
   2584         }
   2585         if (what & layer_state_t::eAlphaChanged) {
   2586             if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
   2587                 flags |= eTraversalNeeded;
   2588         }
   2589         if (what & layer_state_t::eMatrixChanged) {
   2590             if (layer->setMatrix(s.matrix))
   2591                 flags |= eTraversalNeeded;
   2592         }
   2593         if (what & layer_state_t::eTransparentRegionChanged) {
   2594             if (layer->setTransparentRegionHint(s.transparentRegion))
   2595                 flags |= eTraversalNeeded;
   2596         }
   2597         if (what & layer_state_t::eFlagsChanged) {
   2598             if (layer->setFlags(s.flags, s.mask))
   2599                 flags |= eTraversalNeeded;
   2600         }
   2601         if (what & layer_state_t::eCropChanged) {
   2602             if (layer->setCrop(s.crop, !geometryAppliesWithResize))
   2603                 flags |= eTraversalNeeded;
   2604         }
   2605         if (what & layer_state_t::eFinalCropChanged) {
   2606             if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
   2607                 flags |= eTraversalNeeded;
   2608         }
   2609         if (what & layer_state_t::eLayerStackChanged) {
   2610             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
   2611             // We only allow setting layer stacks for top level layers,
   2612             // everything else inherits layer stack from its parent.
   2613             if (layer->hasParent()) {
   2614                 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
   2615                         layer->getName().string());
   2616             } else if (idx < 0) {
   2617                 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
   2618                         "that also does not appear in the top level layer list. Something"
   2619                         " has gone wrong.", layer->getName().string());
   2620             } else if (layer->setLayerStack(s.layerStack)) {
   2621                 mCurrentState.layersSortedByZ.removeAt(idx);
   2622                 mCurrentState.layersSortedByZ.add(layer);
   2623                 // we need traversal (state changed)
   2624                 // AND transaction (list changed)
   2625                 flags |= eTransactionNeeded|eTraversalNeeded;
   2626             }
   2627         }
   2628         if (what & layer_state_t::eDeferTransaction) {
   2629             if (s.barrierHandle != nullptr) {
   2630                 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
   2631             } else if (s.barrierGbp != nullptr) {
   2632                 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
   2633                 if (authenticateSurfaceTextureLocked(gbp)) {
   2634                     const auto& otherLayer =
   2635                         (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
   2636                     layer->deferTransactionUntil(otherLayer, s.frameNumber);
   2637                 } else {
   2638                     ALOGE("Attempt to defer transaction to to an"
   2639                             " unrecognized GraphicBufferProducer");
   2640                 }
   2641             }
   2642             // We don't trigger a traversal here because if no other state is
   2643             // changed, we don't want this to cause any more work
   2644         }
   2645         if (what & layer_state_t::eReparentChildren) {
   2646             if (layer->reparentChildren(s.reparentHandle)) {
   2647                 flags |= eTransactionNeeded|eTraversalNeeded;
   2648             }
   2649         }
   2650         if (what & layer_state_t::eDetachChildren) {
   2651             layer->detachChildren();
   2652         }
   2653         if (what & layer_state_t::eOverrideScalingModeChanged) {
   2654             layer->setOverrideScalingMode(s.overrideScalingMode);
   2655             // We don't trigger a traversal here because if no other state is
   2656             // changed, we don't want this to cause any more work
   2657         }
   2658     }
   2659     return flags;
   2660 }
   2661 
   2662 status_t SurfaceFlinger::createLayer(
   2663         const String8& name,
   2664         const sp<Client>& client,
   2665         uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
   2666         uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
   2667         sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
   2668 {
   2669     if (int32_t(w|h) < 0) {
   2670         ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
   2671                 int(w), int(h));
   2672         return BAD_VALUE;
   2673     }
   2674 
   2675     status_t result = NO_ERROR;
   2676 
   2677     sp<Layer> layer;
   2678 
   2679     String8 uniqueName = getUniqueLayerName(name);
   2680 
   2681     switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
   2682         case ISurfaceComposerClient::eFXSurfaceNormal:
   2683             result = createNormalLayer(client,
   2684                     uniqueName, w, h, flags, format,
   2685                     handle, gbp, &layer);
   2686             break;
   2687         case ISurfaceComposerClient::eFXSurfaceDim:
   2688             result = createDimLayer(client,
   2689                     uniqueName, w, h, flags,
   2690                     handle, gbp, &layer);
   2691             break;
   2692         default:
   2693             result = BAD_VALUE;
   2694             break;
   2695     }
   2696 
   2697     if (result != NO_ERROR) {
   2698         return result;
   2699     }
   2700 
   2701     layer->setInfo(windowType, ownerUid);
   2702 
   2703     result = addClientLayer(client, *handle, *gbp, layer, *parent);
   2704     if (result != NO_ERROR) {
   2705         return result;
   2706     }
   2707     mInterceptor.saveSurfaceCreation(layer);
   2708 
   2709     setTransactionFlags(eTransactionNeeded);
   2710     return result;
   2711 }
   2712 
   2713 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
   2714 {
   2715     bool matchFound = true;
   2716     uint32_t dupeCounter = 0;
   2717 
   2718     // Tack on our counter whether there is a hit or not, so everyone gets a tag
   2719     String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
   2720 
   2721     // Loop over layers until we're sure there is no matching name
   2722     while (matchFound) {
   2723         matchFound = false;
   2724         mDrawingState.traverseInZOrder([&](Layer* layer) {
   2725             if (layer->getName() == uniqueName) {
   2726                 matchFound = true;
   2727                 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
   2728             }
   2729         });
   2730     }
   2731 
   2732     ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
   2733 
   2734     return uniqueName;
   2735 }
   2736 
   2737 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
   2738         const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
   2739         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
   2740 {
   2741     // initialize the surfaces
   2742     switch (format) {
   2743     case PIXEL_FORMAT_TRANSPARENT:
   2744     case PIXEL_FORMAT_TRANSLUCENT:
   2745         format = PIXEL_FORMAT_RGBA_8888;
   2746         break;
   2747     case PIXEL_FORMAT_OPAQUE:
   2748         format = PIXEL_FORMAT_RGBX_8888;
   2749         break;
   2750     }
   2751 
   2752     *outLayer = new Layer(this, client, name, w, h, flags);
   2753     status_t err = (*outLayer)->setBuffers(w, h, format, flags);
   2754     if (err == NO_ERROR) {
   2755         *handle = (*outLayer)->getHandle();
   2756         *gbp = (*outLayer)->getProducer();
   2757     }
   2758 
   2759     ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
   2760     return err;
   2761 }
   2762 
   2763 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
   2764         const String8& name, uint32_t w, uint32_t h, uint32_t flags,
   2765         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
   2766 {
   2767     *outLayer = new LayerDim(this, client, name, w, h, flags);
   2768     *handle = (*outLayer)->getHandle();
   2769     *gbp = (*outLayer)->getProducer();
   2770     return NO_ERROR;
   2771 }
   2772 
   2773 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
   2774 {
   2775     // called by a client when it wants to remove a Layer
   2776     status_t err = NO_ERROR;
   2777     sp<Layer> l(client->getLayerUser(handle));
   2778     if (l != NULL) {
   2779         mInterceptor.saveSurfaceDeletion(l);
   2780         err = removeLayer(l);
   2781         ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
   2782                 "error removing layer=%p (%s)", l.get(), strerror(-err));
   2783     }
   2784     return err;
   2785 }
   2786 
   2787 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
   2788 {
   2789     // called by ~LayerCleaner() when all references to the IBinder (handle)
   2790     // are gone
   2791     sp<Layer> l = layer.promote();
   2792     if (l == nullptr) {
   2793         // The layer has already been removed, carry on
   2794         return NO_ERROR;
   2795     }
   2796     // If we have a parent, then we can continue to live as long as it does.
   2797     return removeLayer(l, true);
   2798 }
   2799 
   2800 // ---------------------------------------------------------------------------
   2801 
   2802 void SurfaceFlinger::onInitializeDisplays() {
   2803     // reset screen orientation and use primary layer stack
   2804     Vector<ComposerState> state;
   2805     Vector<DisplayState> displays;
   2806     DisplayState d;
   2807     d.what = DisplayState::eDisplayProjectionChanged |
   2808              DisplayState::eLayerStackChanged;
   2809     d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
   2810     d.layerStack = 0;
   2811     d.orientation = DisplayState::eOrientationDefault;
   2812     d.frame.makeInvalid();
   2813     d.viewport.makeInvalid();
   2814     d.width = 0;
   2815     d.height = 0;
   2816     displays.add(d);
   2817     setTransactionState(state, displays, 0);
   2818     setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
   2819 
   2820     const nsecs_t period =
   2821             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
   2822     mAnimFrameTracker.setDisplayRefreshPeriod(period);
   2823 
   2824     // Use phase of 0 since phase is not known.
   2825     // Use latency of 0, which will snap to the ideal latency.
   2826     setCompositorTimingSnapped(0, period, 0);
   2827 }
   2828 
   2829 void SurfaceFlinger::initializeDisplays() {
   2830     class MessageScreenInitialized : public MessageBase {
   2831         SurfaceFlinger* flinger;
   2832     public:
   2833         explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
   2834         virtual bool handler() {
   2835             flinger->onInitializeDisplays();
   2836             return true;
   2837         }
   2838     };
   2839     sp<MessageBase> msg = new MessageScreenInitialized(this);
   2840     postMessageAsync(msg);  // we may be called from main thread, use async message
   2841 }
   2842 
   2843 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
   2844         int mode) {
   2845     ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
   2846             this);
   2847     int32_t type = hw->getDisplayType();
   2848     int currentMode = hw->getPowerMode();
   2849 
   2850     if (mode == currentMode) {
   2851         ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
   2852         return;
   2853     }
   2854 
   2855     hw->setPowerMode(mode);
   2856     if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
   2857         ALOGW("Trying to set power mode for virtual display");
   2858         return;
   2859     }
   2860 
   2861     if (mInterceptor.isEnabled()) {
   2862         Mutex::Autolock _l(mStateLock);
   2863         ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
   2864         if (idx < 0) {
   2865             ALOGW("Surface Interceptor SavePowerMode: invalid display token");
   2866             return;
   2867         }
   2868         mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
   2869     }
   2870 
   2871     if (currentMode == HWC_POWER_MODE_OFF) {
   2872         // Turn on the display
   2873         getHwComposer().setPowerMode(type, mode);
   2874         if (type == DisplayDevice::DISPLAY_PRIMARY &&
   2875             mode != HWC_POWER_MODE_DOZE_SUSPEND) {
   2876             // FIXME: eventthread only knows about the main display right now
   2877             mEventThread->onScreenAcquired();
   2878             resyncToHardwareVsync(true);
   2879         }
   2880 
   2881         mVisibleRegionsDirty = true;
   2882         mHasPoweredOff = true;
   2883         repaintEverything();
   2884 
   2885         struct sched_param param = {0};
   2886         param.sched_priority = 1;
   2887         if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
   2888             ALOGW("Couldn't set SCHED_FIFO on display on");
   2889         }
   2890     } else if (mode == HWC_POWER_MODE_OFF) {
   2891         // Turn off the display
   2892         struct sched_param param = {0};
   2893         if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
   2894             ALOGW("Couldn't set SCHED_OTHER on display off");
   2895         }
   2896 
   2897         if (type == DisplayDevice::DISPLAY_PRIMARY) {
   2898             disableHardwareVsync(true); // also cancels any in-progress resync
   2899 
   2900             // FIXME: eventthread only knows about the main display right now
   2901             mEventThread->onScreenReleased();
   2902         }
   2903 
   2904         getHwComposer().setPowerMode(type, mode);
   2905         mVisibleRegionsDirty = true;
   2906         // from this point on, SF will stop drawing on this display
   2907     } else if (mode == HWC_POWER_MODE_DOZE ||
   2908                mode == HWC_POWER_MODE_NORMAL) {
   2909         // Update display while dozing
   2910         getHwComposer().setPowerMode(type, mode);
   2911         if (type == DisplayDevice::DISPLAY_PRIMARY) {
   2912             // FIXME: eventthread only knows about the main display right now
   2913             mEventThread->onScreenAcquired();
   2914             resyncToHardwareVsync(true);
   2915         }
   2916     } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
   2917         // Leave display going to doze
   2918         if (type == DisplayDevice::DISPLAY_PRIMARY) {
   2919             disableHardwareVsync(true); // also cancels any in-progress resync
   2920             // FIXME: eventthread only knows about the main display right now
   2921             mEventThread->onScreenReleased();
   2922         }
   2923         getHwComposer().setPowerMode(type, mode);
   2924     } else {
   2925         ALOGE("Attempting to set unknown power mode: %d\n", mode);
   2926         getHwComposer().setPowerMode(type, mode);
   2927     }
   2928 }
   2929 
   2930 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
   2931     class MessageSetPowerMode: public MessageBase {
   2932         SurfaceFlinger& mFlinger;
   2933         sp<IBinder> mDisplay;
   2934         int mMode;
   2935     public:
   2936         MessageSetPowerMode(SurfaceFlinger& flinger,
   2937                 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
   2938                     mDisplay(disp) { mMode = mode; }
   2939         virtual bool handler() {
   2940             sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
   2941             if (hw == NULL) {
   2942                 ALOGE("Attempt to set power mode = %d for null display %p",
   2943                         mMode, mDisplay.get());
   2944             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
   2945                 ALOGW("Attempt to set power mode = %d for virtual display",
   2946                         mMode);
   2947             } else {
   2948                 mFlinger.setPowerModeInternal(hw, mMode);
   2949             }
   2950             return true;
   2951         }
   2952     };
   2953     sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
   2954     postMessageSync(msg);
   2955 }
   2956 
   2957 // ---------------------------------------------------------------------------
   2958 
   2959 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
   2960 {
   2961     String8 result;
   2962 
   2963     IPCThreadState* ipc = IPCThreadState::self();
   2964     const int pid = ipc->getCallingPid();
   2965     const int uid = ipc->getCallingUid();
   2966     if ((uid != AID_SHELL) &&
   2967             !PermissionCache::checkPermission(sDump, pid, uid)) {
   2968         result.appendFormat("Permission Denial: "
   2969                 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
   2970     } else {
   2971         // Try to get the main lock, but give up after one second
   2972         // (this would indicate SF is stuck, but we want to be able to
   2973         // print something in dumpsys).
   2974         status_t err = mStateLock.timedLock(s2ns(1));
   2975         bool locked = (err == NO_ERROR);
   2976         if (!locked) {
   2977             result.appendFormat(
   2978                     "SurfaceFlinger appears to be unresponsive (%s [%d]), "
   2979                     "dumping anyways (no locks held)\n", strerror(-err), err);
   2980         }
   2981 
   2982         bool dumpAll = true;
   2983         size_t index = 0;
   2984         size_t numArgs = args.size();
   2985         if (numArgs) {
   2986             if ((index < numArgs) &&
   2987                     (args[index] == String16("--list"))) {
   2988                 index++;
   2989                 listLayersLocked(args, index, result);
   2990                 dumpAll = false;
   2991             }
   2992 
   2993             if ((index < numArgs) &&
   2994                     (args[index] == String16("--latency"))) {
   2995                 index++;
   2996                 dumpStatsLocked(args, index, result);
   2997                 dumpAll = false;
   2998             }
   2999 
   3000             if ((index < numArgs) &&
   3001                     (args[index] == String16("--latency-clear"))) {
   3002                 index++;
   3003                 clearStatsLocked(args, index, result);
   3004                 dumpAll = false;
   3005             }
   3006 
   3007             if ((index < numArgs) &&
   3008                     (args[index] == String16("--dispsync"))) {
   3009                 index++;
   3010                 mPrimaryDispSync.dump(result);
   3011                 dumpAll = false;
   3012             }
   3013 
   3014             if ((index < numArgs) &&
   3015                     (args[index] == String16("--static-screen"))) {
   3016                 index++;
   3017                 dumpStaticScreenStats(result);
   3018                 dumpAll = false;
   3019             }
   3020 
   3021             if ((index < numArgs) &&
   3022                     (args[index] == String16("--frame-events"))) {
   3023                 index++;
   3024                 dumpFrameEventsLocked(result);
   3025                 dumpAll = false;
   3026             }
   3027         }
   3028 
   3029         if (dumpAll) {
   3030             dumpAllLocked(args, index, result);
   3031         }
   3032 
   3033         if (locked) {
   3034             mStateLock.unlock();
   3035         }
   3036     }
   3037     write(fd, result.string(), result.size());
   3038     return NO_ERROR;
   3039 }
   3040 
   3041 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
   3042         size_t& /* index */, String8& result) const
   3043 {
   3044     mCurrentState.traverseInZOrder([&](Layer* layer) {
   3045         result.appendFormat("%s\n", layer->getName().string());
   3046     });
   3047 }
   3048 
   3049 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
   3050         String8& result) const
   3051 {
   3052     String8 name;
   3053     if (index < args.size()) {
   3054         name = String8(args[index]);
   3055         index++;
   3056     }
   3057 
   3058     const nsecs_t period =
   3059             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
   3060     result.appendFormat("%" PRId64 "\n", period);
   3061 
   3062     if (name.isEmpty()) {
   3063         mAnimFrameTracker.dumpStats(result);
   3064     } else {
   3065         mCurrentState.traverseInZOrder([&](Layer* layer) {
   3066             if (name == layer->getName()) {
   3067                 layer->dumpFrameStats(result);
   3068             }
   3069         });
   3070     }
   3071 }
   3072 
   3073 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
   3074         String8& /* result */)
   3075 {
   3076     String8 name;
   3077     if (index < args.size()) {
   3078         name = String8(args[index]);
   3079         index++;
   3080     }
   3081 
   3082     mCurrentState.traverseInZOrder([&](Layer* layer) {
   3083         if (name.isEmpty() || (name == layer->getName())) {
   3084             layer->clearFrameStats();
   3085         }
   3086     });
   3087 
   3088     mAnimFrameTracker.clearStats();
   3089 }
   3090 
   3091 // This should only be called from the main thread.  Otherwise it would need
   3092 // the lock and should use mCurrentState rather than mDrawingState.
   3093 void SurfaceFlinger::logFrameStats() {
   3094     mDrawingState.traverseInZOrder([&](Layer* layer) {
   3095         layer->logFrameStats();
   3096     });
   3097 
   3098     mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
   3099 }
   3100 
   3101 void SurfaceFlinger::appendSfConfigString(String8& result) const
   3102 {
   3103     result.append(" [sf");
   3104     result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
   3105 
   3106     if (isLayerTripleBufferingDisabled())
   3107         result.append(" DISABLE_TRIPLE_BUFFERING");
   3108 
   3109     result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
   3110     result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
   3111     result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
   3112     result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
   3113     result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
   3114                         maxFrameBufferAcquiredBuffers);
   3115     result.append("]");
   3116 }
   3117 
   3118 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
   3119 {
   3120     result.appendFormat("Static screen stats:\n");
   3121     for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
   3122         float bucketTimeSec = mFrameBuckets[b] / 1e9;
   3123         float percent = 100.0f *
   3124                 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
   3125         result.appendFormat("  < %zd frames: %.3f s (%.1f%%)\n",
   3126                 b + 1, bucketTimeSec, percent);
   3127     }
   3128     float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
   3129     float percent = 100.0f *
   3130             static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
   3131     result.appendFormat("  %zd+ frames: %.3f s (%.1f%%)\n",
   3132             NUM_BUCKETS - 1, bucketTimeSec, percent);
   3133 }
   3134 
   3135 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
   3136     result.appendFormat("Layer frame timestamps:\n");
   3137 
   3138     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
   3139     const size_t count = currentLayers.size();
   3140     for (size_t i=0 ; i<count ; i++) {
   3141         currentLayers[i]->dumpFrameEvents(result);
   3142     }
   3143 }
   3144 
   3145 void SurfaceFlinger::recordBufferingStats(const char* layerName,
   3146         std::vector<OccupancyTracker::Segment>&& history) {
   3147     Mutex::Autolock lock(mBufferingStatsMutex);
   3148     auto& stats = mBufferingStats[layerName];
   3149     for (const auto& segment : history) {
   3150         if (!segment.usedThirdBuffer) {
   3151             stats.twoBufferTime += segment.totalTime;
   3152         }
   3153         if (segment.occupancyAverage < 1.0f) {
   3154             stats.doubleBufferedTime += segment.totalTime;
   3155         } else if (segment.occupancyAverage < 2.0f) {
   3156             stats.tripleBufferedTime += segment.totalTime;
   3157         }
   3158         ++stats.numSegments;
   3159         stats.totalTime += segment.totalTime;
   3160     }
   3161 }
   3162 
   3163 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
   3164     result.append("Buffering stats:\n");
   3165     result.append("  [Layer name] <Active time> <Two buffer> "
   3166             "<Double buffered> <Triple buffered>\n");
   3167     Mutex::Autolock lock(mBufferingStatsMutex);
   3168     typedef std::tuple<std::string, float, float, float> BufferTuple;
   3169     std::map<float, BufferTuple, std::greater<float>> sorted;
   3170     for (const auto& statsPair : mBufferingStats) {
   3171         const char* name = statsPair.first.c_str();
   3172         const BufferingStats& stats = statsPair.second;
   3173         if (stats.numSegments == 0) {
   3174             continue;
   3175         }
   3176         float activeTime = ns2ms(stats.totalTime) / 1000.0f;
   3177         float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
   3178                 stats.totalTime;
   3179         float doubleBufferRatio = static_cast<float>(
   3180                 stats.doubleBufferedTime) / stats.totalTime;
   3181         float tripleBufferRatio = static_cast<float>(
   3182                 stats.tripleBufferedTime) / stats.totalTime;
   3183         sorted.insert({activeTime, {name, twoBufferRatio,
   3184                 doubleBufferRatio, tripleBufferRatio}});
   3185     }
   3186     for (const auto& sortedPair : sorted) {
   3187         float activeTime = sortedPair.first;
   3188         const BufferTuple& values = sortedPair.second;
   3189         result.appendFormat("  [%s] %.2f %.3f %.3f %.3f\n",
   3190                 std::get<0>(values).c_str(), activeTime,
   3191                 std::get<1>(values), std::get<2>(values),
   3192                 std::get<3>(values));
   3193     }
   3194     result.append("\n");
   3195 }
   3196 
   3197 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
   3198         String8& result) const
   3199 {
   3200     bool colorize = false;
   3201     if (index < args.size()
   3202             && (args[index] == String16("--color"))) {
   3203         colorize = true;
   3204         index++;
   3205     }
   3206 
   3207     Colorizer colorizer(colorize);
   3208 
   3209     // figure out if we're stuck somewhere
   3210     const nsecs_t now = systemTime();
   3211     const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
   3212     const nsecs_t inTransaction(mDebugInTransaction);
   3213     nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
   3214     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
   3215 
   3216     /*
   3217      * Dump library configuration.
   3218      */
   3219 
   3220     colorizer.bold(result);
   3221     result.append("Build configuration:");
   3222     colorizer.reset(result);
   3223     appendSfConfigString(result);
   3224     appendUiConfigString(result);
   3225     appendGuiConfigString(result);
   3226     result.append("\n");
   3227 
   3228     colorizer.bold(result);
   3229     result.append("Sync configuration: ");
   3230     colorizer.reset(result);
   3231     result.append(SyncFeatures::getInstance().toString());
   3232     result.append("\n");
   3233 
   3234     colorizer.bold(result);
   3235     result.append("DispSync configuration: ");
   3236     colorizer.reset(result);
   3237     result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
   3238             "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
   3239         vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
   3240         mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
   3241     result.append("\n");
   3242 
   3243     // Dump static screen stats
   3244     result.append("\n");
   3245     dumpStaticScreenStats(result);
   3246     result.append("\n");
   3247 
   3248     dumpBufferingStats(result);
   3249 
   3250     /*
   3251      * Dump the visible layer list
   3252      */
   3253     colorizer.bold(result);
   3254     result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
   3255     colorizer.reset(result);
   3256     mCurrentState.traverseInZOrder([&](Layer* layer) {
   3257         layer->dump(result, colorizer);
   3258     });
   3259 
   3260     /*
   3261      * Dump Display state
   3262      */
   3263 
   3264     colorizer.bold(result);
   3265     result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
   3266     colorizer.reset(result);
   3267     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
   3268         const sp<const DisplayDevice>& hw(mDisplays[dpy]);
   3269         hw->dump(result);
   3270     }
   3271 
   3272     /*
   3273      * Dump SurfaceFlinger global state
   3274      */
   3275 
   3276     colorizer.bold(result);
   3277     result.append("SurfaceFlinger global state:\n");
   3278     colorizer.reset(result);
   3279 
   3280     HWComposer& hwc(getHwComposer());
   3281     sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
   3282 
   3283     colorizer.bold(result);
   3284     result.appendFormat("EGL implementation : %s\n",
   3285             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
   3286     colorizer.reset(result);
   3287     result.appendFormat("%s\n",
   3288             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
   3289 
   3290     mRenderEngine->dump(result);
   3291 
   3292     hw->undefinedRegion.dump(result, "undefinedRegion");
   3293     result.appendFormat("  orientation=%d, isDisplayOn=%d\n",
   3294             hw->getOrientation(), hw->isDisplayOn());
   3295     result.appendFormat(
   3296             "  last eglSwapBuffers() time: %f us\n"
   3297             "  last transaction time     : %f us\n"
   3298             "  transaction-flags         : %08x\n"
   3299             "  refresh-rate              : %f fps\n"
   3300             "  x-dpi                     : %f\n"
   3301             "  y-dpi                     : %f\n"
   3302             "  gpu_to_cpu_unsupported    : %d\n"
   3303             ,
   3304             mLastSwapBufferTime/1000.0,
   3305             mLastTransactionTime/1000.0,
   3306             mTransactionFlags,
   3307             1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
   3308             hwc.getDpiX(HWC_DISPLAY_PRIMARY),
   3309             hwc.getDpiY(HWC_DISPLAY_PRIMARY),
   3310             !mGpuToCpuSupported);
   3311 
   3312     result.appendFormat("  eglSwapBuffers time: %f us\n",
   3313             inSwapBuffersDuration/1000.0);
   3314 
   3315     result.appendFormat("  transaction time: %f us\n",
   3316             inTransactionDuration/1000.0);
   3317 
   3318     /*
   3319      * VSYNC state
   3320      */
   3321     mEventThread->dump(result);
   3322 
   3323     /*
   3324      * Dump HWComposer state
   3325      */
   3326     colorizer.bold(result);
   3327     result.append("h/w composer state:\n");
   3328     colorizer.reset(result);
   3329     result.appendFormat("  h/w composer %s and %s\n",
   3330             hwc.initCheck()==NO_ERROR ? "present" : "not present",
   3331                     (mDebugDisableHWC || mDebugRegion || mDaltonize
   3332                             || mHasColorMatrix) ? "disabled" : "enabled");
   3333     hwc.dump(result);
   3334 
   3335     /*
   3336      * Dump gralloc state
   3337      */
   3338     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
   3339     alloc.dump(result);
   3340 }
   3341 
   3342 const Vector< sp<Layer> >&
   3343 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
   3344     // Note: mStateLock is held here
   3345     wp<IBinder> dpy;
   3346     for (size_t i=0 ; i<mDisplays.size() ; i++) {
   3347         if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
   3348             dpy = mDisplays.keyAt(i);
   3349             break;
   3350         }
   3351     }
   3352     if (dpy == NULL) {
   3353         ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
   3354         // Just use the primary display so we have something to return
   3355         dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
   3356     }
   3357     return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
   3358 }
   3359 
   3360 bool SurfaceFlinger::startDdmConnection()
   3361 {
   3362     void* libddmconnection_dso =
   3363             dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
   3364     if (!libddmconnection_dso) {
   3365         return false;
   3366     }
   3367     void (*DdmConnection_start)(const char* name);
   3368     DdmConnection_start =
   3369             (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
   3370     if (!DdmConnection_start) {
   3371         dlclose(libddmconnection_dso);
   3372         return false;
   3373     }
   3374     (*DdmConnection_start)(getServiceName());
   3375     return true;
   3376 }
   3377 
   3378 status_t SurfaceFlinger::onTransact(
   3379     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   3380 {
   3381     switch (code) {
   3382         case CREATE_CONNECTION:
   3383         case CREATE_DISPLAY:
   3384         case BOOT_FINISHED:
   3385         case CLEAR_ANIMATION_FRAME_STATS:
   3386         case GET_ANIMATION_FRAME_STATS:
   3387         case SET_POWER_MODE:
   3388         case GET_HDR_CAPABILITIES:
   3389         {
   3390             // codes that require permission check
   3391             IPCThreadState* ipc = IPCThreadState::self();
   3392             const int pid = ipc->getCallingPid();
   3393             const int uid = ipc->getCallingUid();
   3394             if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
   3395                     !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
   3396                 ALOGE("Permission Denial: "
   3397                         "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
   3398                 return PERMISSION_DENIED;
   3399             }
   3400             break;
   3401         }
   3402         /*
   3403          * Calling setTransactionState is safe, because you need to have been
   3404          * granted a reference to Client* and Handle* to do anything with it.
   3405          *
   3406          * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
   3407          */
   3408         case SET_TRANSACTION_STATE:
   3409         case CREATE_SCOPED_CONNECTION:
   3410         {
   3411             break;
   3412         }
   3413         case CAPTURE_SCREEN:
   3414         {
   3415             // codes that require permission check
   3416             IPCThreadState* ipc = IPCThreadState::self();
   3417             const int pid = ipc->getCallingPid();
   3418             const int uid = ipc->getCallingUid();
   3419             if ((uid != AID_GRAPHICS) &&
   3420                     !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
   3421                 ALOGE("Permission Denial: "
   3422                         "can't read framebuffer pid=%d, uid=%d", pid, uid);
   3423                 return PERMISSION_DENIED;
   3424             }
   3425             break;
   3426         }
   3427     }
   3428 
   3429     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
   3430     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
   3431         CHECK_INTERFACE(ISurfaceComposer, data, reply);
   3432         if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
   3433             IPCThreadState* ipc = IPCThreadState::self();
   3434             const int pid = ipc->getCallingPid();
   3435             const int uid = ipc->getCallingUid();
   3436             ALOGE("Permission Denial: "
   3437                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
   3438             return PERMISSION_DENIED;
   3439         }
   3440         int n;
   3441         switch (code) {
   3442             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
   3443             case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
   3444                 return NO_ERROR;
   3445             case 1002:  // SHOW_UPDATES
   3446                 n = data.readInt32();
   3447                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
   3448                 invalidateHwcGeometry();
   3449                 repaintEverything();
   3450                 return NO_ERROR;
   3451             case 1004:{ // repaint everything
   3452                 repaintEverything();
   3453                 return NO_ERROR;
   3454             }
   3455             case 1005:{ // force transaction
   3456                 setTransactionFlags(
   3457                         eTransactionNeeded|
   3458                         eDisplayTransactionNeeded|
   3459                         eTraversalNeeded);
   3460                 return NO_ERROR;
   3461             }
   3462             case 1006:{ // send empty update
   3463                 signalRefresh();
   3464                 return NO_ERROR;
   3465             }
   3466             case 1008:  // toggle use of hw composer
   3467                 n = data.readInt32();
   3468                 mDebugDisableHWC = n ? 1 : 0;
   3469                 invalidateHwcGeometry();
   3470                 repaintEverything();
   3471                 return NO_ERROR;
   3472             case 1009:  // toggle use of transform hint
   3473                 n = data.readInt32();
   3474                 mDebugDisableTransformHint = n ? 1 : 0;
   3475                 invalidateHwcGeometry();
   3476                 repaintEverything();
   3477                 return NO_ERROR;
   3478             case 1010:  // interrogate.
   3479                 reply->writeInt32(0);
   3480                 reply->writeInt32(0);
   3481                 reply->writeInt32(mDebugRegion);
   3482                 reply->writeInt32(0);
   3483                 reply->writeInt32(mDebugDisableHWC);
   3484                 return NO_ERROR;
   3485             case 1013: {
   3486                 Mutex::Autolock _l(mStateLock);
   3487                 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
   3488                 reply->writeInt32(hw->getPageFlipCount());
   3489                 return NO_ERROR;
   3490             }
   3491             case 1014: {
   3492                 // daltonize
   3493                 n = data.readInt32();
   3494                 switch (n % 10) {
   3495                     case 1:
   3496                         mDaltonizer.setType(ColorBlindnessType::Protanomaly);
   3497                         break;
   3498                     case 2:
   3499                         mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
   3500                         break;
   3501                     case 3:
   3502                         mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
   3503                         break;
   3504                 }
   3505                 if (n >= 10) {
   3506                     mDaltonizer.setMode(ColorBlindnessMode::Correction);
   3507                 } else {
   3508                     mDaltonizer.setMode(ColorBlindnessMode::Simulation);
   3509                 }
   3510                 mDaltonize = n > 0;
   3511                 invalidateHwcGeometry();
   3512                 repaintEverything();
   3513                 return NO_ERROR;
   3514             }
   3515             case 1015: {
   3516                 // apply a color matrix
   3517                 n = data.readInt32();
   3518                 mHasColorMatrix = n ? 1 : 0;
   3519                 if (n) {
   3520                     // color matrix is sent as mat3 matrix followed by vec3
   3521                     // offset, then packed into a mat4 where the last row is
   3522                     // the offset and extra values are 0
   3523                     for (size_t i = 0 ; i < 4; i++) {
   3524                       for (size_t j = 0; j < 4; j++) {
   3525                           mColorMatrix[i][j] = data.readFloat();
   3526                       }
   3527                     }
   3528                 } else {
   3529                     mColorMatrix = mat4();
   3530                 }
   3531                 invalidateHwcGeometry();
   3532                 repaintEverything();
   3533                 return NO_ERROR;
   3534             }
   3535             // This is an experimental interface
   3536             // Needs to be shifted to proper binder interface when we productize
   3537             case 1016: {
   3538                 n = data.readInt32();
   3539                 mPrimaryDispSync.setRefreshSkipCount(n);
   3540                 return NO_ERROR;
   3541             }
   3542             case 1017: {
   3543                 n = data.readInt32();
   3544                 mForceFullDamage = static_cast<bool>(n);
   3545                 return NO_ERROR;
   3546             }
   3547             case 1018: { // Modify Choreographer's phase offset
   3548                 n = data.readInt32();
   3549                 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
   3550                 return NO_ERROR;
   3551             }
   3552             case 1019: { // Modify SurfaceFlinger's phase offset
   3553                 n = data.readInt32();
   3554                 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
   3555                 return NO_ERROR;
   3556             }
   3557             case 1020: { // Layer updates interceptor
   3558                 n = data.readInt32();
   3559                 if (n) {
   3560                     ALOGV("Interceptor enabled");
   3561                     mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
   3562                 }
   3563                 else{
   3564                     ALOGV("Interceptor disabled");
   3565                     mInterceptor.disable();
   3566                 }
   3567                 return NO_ERROR;
   3568             }
   3569             case 1021: { // Disable HWC virtual displays
   3570                 n = data.readInt32();
   3571                 mUseHwcVirtualDisplays = !n;
   3572                 return NO_ERROR;
   3573             }
   3574         }
   3575     }
   3576     return err;
   3577 }
   3578 
   3579 void SurfaceFlinger::repaintEverything() {
   3580     android_atomic_or(1, &mRepaintEverything);
   3581     signalTransaction();
   3582 }
   3583 
   3584 // ---------------------------------------------------------------------------
   3585 // Capture screen into an IGraphiBufferProducer
   3586 // ---------------------------------------------------------------------------
   3587 
   3588 /* The code below is here to handle b/8734824
   3589  *
   3590  * We create a IGraphicBufferProducer wrapper that forwards all calls
   3591  * from the surfaceflinger thread to the calling binder thread, where they
   3592  * are executed. This allows the calling thread in the calling process to be
   3593  * reused and not depend on having "enough" binder threads to handle the
   3594  * requests.
   3595  */
   3596 class GraphicProducerWrapper : public BBinder, public MessageHandler {
   3597     /* Parts of GraphicProducerWrapper are run on two different threads,
   3598      * communicating by sending messages via Looper but also by shared member
   3599      * data. Coherence maintenance is subtle and in places implicit (ugh).
   3600      *
   3601      * Don't rely on Looper's sendMessage/handleMessage providing
   3602      * release/acquire semantics for any data not actually in the Message.
   3603      * Data going from surfaceflinger to binder threads needs to be
   3604      * synchronized explicitly.
   3605      *
   3606      * Barrier open/wait do provide release/acquire semantics. This provides
   3607      * implicit synchronization for data coming back from binder to
   3608      * surfaceflinger threads.
   3609      */
   3610 
   3611     sp<IGraphicBufferProducer> impl;
   3612     sp<Looper> looper;
   3613     status_t result;
   3614     bool exitPending;
   3615     bool exitRequested;
   3616     Barrier barrier;
   3617     uint32_t code;
   3618     Parcel const* data;
   3619     Parcel* reply;
   3620 
   3621     enum {
   3622         MSG_API_CALL,
   3623         MSG_EXIT
   3624     };
   3625 
   3626     /*
   3627      * Called on surfaceflinger thread. This is called by our "fake"
   3628      * BpGraphicBufferProducer. We package the data and reply Parcel and
   3629      * forward them to the binder thread.
   3630      */
   3631     virtual status_t transact(uint32_t code,
   3632             const Parcel& data, Parcel* reply, uint32_t /* flags */) {
   3633         this->code = code;
   3634         this->data = &data;
   3635         this->reply = reply;
   3636         if (exitPending) {
   3637             // if we've exited, we run the message synchronously right here.
   3638             // note (JH): as far as I can tell from looking at the code, this
   3639             // never actually happens. if it does, i'm not sure if it happens
   3640             // on the surfaceflinger or binder thread.
   3641             handleMessage(Message(MSG_API_CALL));
   3642         } else {
   3643             barrier.close();
   3644             // Prevent stores to this->{code, data, reply} from being
   3645             // reordered later than the construction of Message.
   3646             atomic_thread_fence(memory_order_release);
   3647             looper->sendMessage(this, Message(MSG_API_CALL));
   3648             barrier.wait();
   3649         }
   3650         return result;
   3651     }
   3652 
   3653     /*
   3654      * here we run on the binder thread. All we've got to do is
   3655      * call the real BpGraphicBufferProducer.
   3656      */
   3657     virtual void handleMessage(const Message& message) {
   3658         int what = message.what;
   3659         // Prevent reads below from happening before the read from Message
   3660         atomic_thread_fence(memory_order_acquire);
   3661         if (what == MSG_API_CALL) {
   3662             result = IInterface::asBinder(impl)->transact(code, data[0], reply);
   3663             barrier.open();
   3664         } else if (what == MSG_EXIT) {
   3665             exitRequested = true;
   3666         }
   3667     }
   3668 
   3669 public:
   3670     explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
   3671     :   impl(impl),
   3672         looper(new Looper(true)),
   3673         result(NO_ERROR),
   3674         exitPending(false),
   3675         exitRequested(false),
   3676         code(0),
   3677         data(NULL),
   3678         reply(NULL)
   3679     {}
   3680 
   3681     // Binder thread
   3682     status_t waitForResponse() {
   3683         do {
   3684             looper->pollOnce(-1);
   3685         } while (!exitRequested);
   3686         return result;
   3687     }
   3688 
   3689     // Client thread
   3690     void exit(status_t result) {
   3691         this->result = result;
   3692         exitPending = true;
   3693         // Ensure this->result is visible to the binder thread before it
   3694         // handles the message.
   3695         atomic_thread_fence(memory_order_release);
   3696         looper->sendMessage(this, Message(MSG_EXIT));
   3697     }
   3698 };
   3699 
   3700 
   3701 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
   3702         const sp<IGraphicBufferProducer>& producer,
   3703         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
   3704         int32_t minLayerZ, int32_t maxLayerZ,
   3705         bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
   3706 
   3707     if (CC_UNLIKELY(display == 0))
   3708         return BAD_VALUE;
   3709 
   3710     if (CC_UNLIKELY(producer == 0))
   3711         return BAD_VALUE;
   3712 
   3713     // if we have secure windows on this display, never allow the screen capture
   3714     // unless the producer interface is local (i.e.: we can take a screenshot for
   3715     // ourselves).
   3716     bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
   3717 
   3718     // Convert to surfaceflinger's internal rotation type.
   3719     Transform::orientation_flags rotationFlags;
   3720     switch (rotation) {
   3721         case ISurfaceComposer::eRotateNone:
   3722             rotationFlags = Transform::ROT_0;
   3723             break;
   3724         case ISurfaceComposer::eRotate90:
   3725             rotationFlags = Transform::ROT_90;
   3726             break;
   3727         case ISurfaceComposer::eRotate180:
   3728             rotationFlags = Transform::ROT_180;
   3729             break;
   3730         case ISurfaceComposer::eRotate270:
   3731             rotationFlags = Transform::ROT_270;
   3732             break;
   3733         default:
   3734             rotationFlags = Transform::ROT_0;
   3735             ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
   3736             break;
   3737     }
   3738 
   3739     class MessageCaptureScreen : public MessageBase {
   3740         SurfaceFlinger* flinger;
   3741         sp<IBinder> display;
   3742         sp<IGraphicBufferProducer> producer;
   3743         Rect sourceCrop;
   3744         uint32_t reqWidth, reqHeight;
   3745         int32_t minLayerZ,maxLayerZ;
   3746         bool useIdentityTransform;
   3747         Transform::orientation_flags rotation;
   3748         status_t result;
   3749         bool isLocalScreenshot;
   3750     public:
   3751         MessageCaptureScreen(SurfaceFlinger* flinger,
   3752                 const sp<IBinder>& display,
   3753                 const sp<IGraphicBufferProducer>& producer,
   3754                 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
   3755                 int32_t minLayerZ, int32_t maxLayerZ,
   3756                 bool useIdentityTransform,
   3757                 Transform::orientation_flags rotation,
   3758                 bool isLocalScreenshot)
   3759             : flinger(flinger), display(display), producer(producer),
   3760               sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
   3761               minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
   3762               useIdentityTransform(useIdentityTransform),
   3763               rotation(rotation), result(PERMISSION_DENIED),
   3764               isLocalScreenshot(isLocalScreenshot)
   3765         {
   3766         }
   3767         status_t getResult() const {
   3768             return result;
   3769         }
   3770         virtual bool handler() {
   3771             Mutex::Autolock _l(flinger->mStateLock);
   3772             sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
   3773             result = flinger->captureScreenImplLocked(hw, producer,
   3774                     sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
   3775                     useIdentityTransform, rotation, isLocalScreenshot);
   3776             static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
   3777             return true;
   3778         }
   3779     };
   3780 
   3781     // this creates a "fake" BBinder which will serve as a "fake" remote
   3782     // binder to receive the marshaled calls and forward them to the
   3783     // real remote (a BpGraphicBufferProducer)
   3784     sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
   3785 
   3786     // the asInterface() call below creates our "fake" BpGraphicBufferProducer
   3787     // which does the marshaling work forwards to our "fake remote" above.
   3788     sp<MessageBase> msg = new MessageCaptureScreen(this,
   3789             display, IGraphicBufferProducer::asInterface( wrapper ),
   3790             sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
   3791             useIdentityTransform, rotationFlags, isLocalScreenshot);
   3792 
   3793     status_t res = postMessageAsync(msg);
   3794     if (res == NO_ERROR) {
   3795         res = wrapper->waitForResponse();
   3796     }
   3797     return res;
   3798 }
   3799 
   3800 
   3801 void SurfaceFlinger::renderScreenImplLocked(
   3802         const sp<const DisplayDevice>& hw,
   3803         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
   3804         int32_t minLayerZ, int32_t maxLayerZ,
   3805         bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
   3806 {
   3807     ATRACE_CALL();
   3808     RenderEngine& engine(getRenderEngine());
   3809 
   3810     // get screen geometry
   3811     const int32_t hw_w = hw->getWidth();
   3812     const int32_t hw_h = hw->getHeight();
   3813     const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
   3814                            static_cast<int32_t>(reqHeight) != hw_h;
   3815 
   3816     // if a default or invalid sourceCrop is passed in, set reasonable values
   3817     if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
   3818             !sourceCrop.isValid()) {
   3819         sourceCrop.setLeftTop(Point(0, 0));
   3820         sourceCrop.setRightBottom(Point(hw_w, hw_h));
   3821     }
   3822 
   3823     // ensure that sourceCrop is inside screen
   3824     if (sourceCrop.left < 0) {
   3825         ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
   3826     }
   3827     if (sourceCrop.right > hw_w) {
   3828         ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
   3829     }
   3830     if (sourceCrop.top < 0) {
   3831         ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
   3832     }
   3833     if (sourceCrop.bottom > hw_h) {
   3834         ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
   3835     }
   3836 
   3837     // make sure to clear all GL error flags
   3838     engine.checkErrors();
   3839 
   3840     // set-up our viewport
   3841     engine.setViewportAndProjection(
   3842         reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
   3843     engine.disableTexturing();
   3844 
   3845     // redraw the screen entirely...
   3846     engine.clearWithColor(0, 0, 0, 1);
   3847 
   3848     // We loop through the first level of layers without traversing,
   3849     // as we need to interpret min/max layer Z in the top level Z space.
   3850     for (const auto& layer : mDrawingState.layersSortedByZ) {
   3851         if (layer->getLayerStack() != hw->getLayerStack()) {
   3852             continue;
   3853         }
   3854         const Layer::State& state(layer->getDrawingState());
   3855         if (state.z < minLayerZ || state.z > maxLayerZ) {
   3856             continue;
   3857         }
   3858         layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
   3859             if (!layer->isVisible()) {
   3860                 return;
   3861             }
   3862             if (filtering) layer->setFiltering(true);
   3863             layer->draw(hw, useIdentityTransform);
   3864             if (filtering) layer->setFiltering(false);
   3865         });
   3866     }
   3867 
   3868     // compositionComplete is needed for older driver
   3869     hw->compositionComplete();
   3870     hw->setViewportAndProjection();
   3871 }
   3872 
   3873 
   3874 status_t SurfaceFlinger::captureScreenImplLocked(
   3875         const sp<const DisplayDevice>& hw,
   3876         const sp<IGraphicBufferProducer>& producer,
   3877         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
   3878         int32_t minLayerZ, int32_t maxLayerZ,
   3879         bool useIdentityTransform, Transform::orientation_flags rotation,
   3880         bool isLocalScreenshot)
   3881 {
   3882     ATRACE_CALL();
   3883 
   3884     // get screen geometry
   3885     uint32_t hw_w = hw->getWidth();
   3886     uint32_t hw_h = hw->getHeight();
   3887 
   3888     if (rotation & Transform::ROT_90) {
   3889         std::swap(hw_w, hw_h);
   3890     }
   3891 
   3892     if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
   3893         ALOGE("size mismatch (%d, %d) > (%d, %d)",
   3894                 reqWidth, reqHeight, hw_w, hw_h);
   3895         return BAD_VALUE;
   3896     }
   3897 
   3898     reqWidth  = (!reqWidth)  ? hw_w : reqWidth;
   3899     reqHeight = (!reqHeight) ? hw_h : reqHeight;
   3900 
   3901     bool secureLayerIsVisible = false;
   3902     for (const auto& layer : mDrawingState.layersSortedByZ) {
   3903         const Layer::State& state(layer->getDrawingState());
   3904         if ((layer->getLayerStack() != hw->getLayerStack()) ||
   3905                 (state.z < minLayerZ || state.z > maxLayerZ)) {
   3906             continue;
   3907         }
   3908         layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
   3909             secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
   3910                     layer->isSecure());
   3911         });
   3912     }
   3913 
   3914     if (!isLocalScreenshot && secureLayerIsVisible) {
   3915         ALOGW("FB is protected: PERMISSION_DENIED");
   3916         return PERMISSION_DENIED;
   3917     }
   3918 
   3919     // create a surface (because we're a producer, and we need to
   3920     // dequeue/queue a buffer)
   3921     sp<Surface> sur = new Surface(producer, false);
   3922     ANativeWindow* window = sur.get();
   3923 
   3924     status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
   3925     if (result == NO_ERROR) {
   3926         uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
   3927                         GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
   3928 
   3929         int err = 0;
   3930         err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
   3931         err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
   3932         err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
   3933         err |= native_window_set_usage(window, usage);
   3934 
   3935         if (err == NO_ERROR) {
   3936             ANativeWindowBuffer* buffer;
   3937             /* TODO: Once we have the sync framework everywhere this can use
   3938              * server-side waits on the fence that dequeueBuffer returns.
   3939              */
   3940             result = native_window_dequeue_buffer_and_wait(window,  &buffer);
   3941             if (result == NO_ERROR) {
   3942                 int syncFd = -1;
   3943                 // create an EGLImage from the buffer so we can later
   3944                 // turn it into a texture
   3945                 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
   3946                         EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
   3947                 if (image != EGL_NO_IMAGE_KHR) {
   3948                     // this binds the given EGLImage as a framebuffer for the
   3949                     // duration of this scope.
   3950                     RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
   3951                     if (imageBond.getStatus() == NO_ERROR) {
   3952                         // this will in fact render into our dequeued buffer
   3953                         // via an FBO, which means we didn't have to create
   3954                         // an EGLSurface and therefore we're not
   3955                         // dependent on the context's EGLConfig.
   3956                         renderScreenImplLocked(
   3957                             hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
   3958                             useIdentityTransform, rotation);
   3959 
   3960                         // Attempt to create a sync khr object that can produce a sync point. If that
   3961                         // isn't available, create a non-dupable sync object in the fallback path and
   3962                         // wait on it directly.
   3963                         EGLSyncKHR sync;
   3964                         if (!DEBUG_SCREENSHOTS) {
   3965                            sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
   3966                            // native fence fd will not be populated until flush() is done.
   3967                            getRenderEngine().flush();
   3968                         } else {
   3969                             sync = EGL_NO_SYNC_KHR;
   3970                         }
   3971                         if (sync != EGL_NO_SYNC_KHR) {
   3972                             // get the sync fd
   3973                             syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
   3974                             if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
   3975                                 ALOGW("captureScreen: failed to dup sync khr object");
   3976                                 syncFd = -1;
   3977                             }
   3978                             eglDestroySyncKHR(mEGLDisplay, sync);
   3979                         } else {
   3980                             // fallback path
   3981                             sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
   3982                             if (sync != EGL_NO_SYNC_KHR) {
   3983                                 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
   3984                                     EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
   3985                                 EGLint eglErr = eglGetError();
   3986                                 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
   3987                                     ALOGW("captureScreen: fence wait timed out");
   3988                                 } else {
   3989                                     ALOGW_IF(eglErr != EGL_SUCCESS,
   3990                                             "captureScreen: error waiting on EGL fence: %#x", eglErr);
   3991                                 }
   3992                                 eglDestroySyncKHR(mEGLDisplay, sync);
   3993                             } else {
   3994                                 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
   3995                             }
   3996                         }
   3997                         if (DEBUG_SCREENSHOTS) {
   3998                             uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
   3999                             getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
   4000                             checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
   4001                                     hw, minLayerZ, maxLayerZ);
   4002                             delete [] pixels;
   4003                         }
   4004 
   4005                     } else {
   4006                         ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
   4007                         result = INVALID_OPERATION;
   4008                         window->cancelBuffer(window, buffer, syncFd);
   4009                         buffer = NULL;
   4010                     }
   4011                     // destroy our image
   4012                     eglDestroyImageKHR(mEGLDisplay, image);
   4013                 } else {
   4014                     result = BAD_VALUE;
   4015                 }
   4016                 if (buffer) {
   4017                     // queueBuffer takes ownership of syncFd
   4018                     result = window->queueBuffer(window, buffer, syncFd);
   4019                 }
   4020             }
   4021         } else {
   4022             result = BAD_VALUE;
   4023         }
   4024         native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
   4025     }
   4026 
   4027     return result;
   4028 }
   4029 
   4030 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
   4031         const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
   4032     if (DEBUG_SCREENSHOTS) {
   4033         for (size_t y=0 ; y<h ; y++) {
   4034             uint32_t const * p = (uint32_t const *)vaddr + y*s;
   4035             for (size_t x=0 ; x<w ; x++) {
   4036                 if (p[x] != 0xFF000000) return;
   4037             }
   4038         }
   4039         ALOGE("*** we just took a black screenshot ***\n"
   4040                 "requested minz=%d, maxz=%d, layerStack=%d",
   4041                 minLayerZ, maxLayerZ, hw->getLayerStack());
   4042         size_t i = 0;
   4043         for (const auto& layer : mDrawingState.layersSortedByZ) {
   4044             const Layer::State& state(layer->getDrawingState());
   4045             if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
   4046                     state.z <= maxLayerZ) {
   4047                 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
   4048                     ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
   4049                             layer->isVisible() ? '+' : '-',
   4050                             i, layer->getName().string(), layer->getLayerStack(), state.z,
   4051                             layer->isVisible(), state.flags, state.alpha);
   4052                     i++;
   4053                 });
   4054             }
   4055         }
   4056     }
   4057 }
   4058 
   4059 // ---------------------------------------------------------------------------
   4060 
   4061 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
   4062     layersSortedByZ.traverseInZOrder(stateSet, visitor);
   4063 }
   4064 
   4065 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
   4066     layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
   4067 }
   4068 
   4069 }; // namespace android
   4070 
   4071 
   4072 #if defined(__gl_h_)
   4073 #error "don't include gl/gl.h in this file"
   4074 #endif
   4075 
   4076 #if defined(__gl2_h_)
   4077 #error "don't include gl2/gl2.h in this file"
   4078 #endif
   4079