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