SurfaceFlinger.cpp revision 1210f2ab822e4c24333abd4af498ff20af0224fa
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
19#include <stdint.h>
20#include <sys/types.h>
21#include <errno.h>
22#include <math.h>
23#include <dlfcn.h>
24#include <inttypes.h>
25
26#include <EGL/egl.h>
27
28#include <cutils/log.h>
29#include <cutils/properties.h>
30
31#include <binder/IPCThreadState.h>
32#include <binder/IServiceManager.h>
33#include <binder/MemoryHeapBase.h>
34#include <binder/PermissionCache.h>
35
36#include <ui/DisplayInfo.h>
37
38#include <gui/BitTube.h>
39#include <gui/BufferQueue.h>
40#include <gui/GuiConfig.h>
41#include <gui/IDisplayEventConnection.h>
42#include <gui/Surface.h>
43#include <gui/GraphicBufferAlloc.h>
44
45#include <ui/GraphicBufferAllocator.h>
46#include <ui/PixelFormat.h>
47#include <ui/UiConfig.h>
48
49#include <utils/misc.h>
50#include <utils/String8.h>
51#include <utils/String16.h>
52#include <utils/StopWatch.h>
53#include <utils/Trace.h>
54
55#include <private/android_filesystem_config.h>
56#include <private/gui/SyncFeatures.h>
57
58#include "Client.h"
59#include "clz.h"
60#include "Colorizer.h"
61#include "DdmConnection.h"
62#include "DisplayDevice.h"
63#include "DispSync.h"
64#include "EventControlThread.h"
65#include "EventThread.h"
66#include "Layer.h"
67#include "LayerDim.h"
68#include "SurfaceFlinger.h"
69
70#include "DisplayHardware/FramebufferSurface.h"
71#include "DisplayHardware/HWComposer.h"
72#include "DisplayHardware/VirtualDisplaySurface.h"
73
74#include "Effects/Daltonizer.h"
75
76#include "RenderEngine/RenderEngine.h"
77#include <cutils/compiler.h>
78
79#define DISPLAY_COUNT       1
80
81/*
82 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
83 * black pixels.
84 */
85#define DEBUG_SCREENSHOTS   false
86
87EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
88
89namespace android {
90
91// This is the phase offset in nanoseconds of the software vsync event
92// relative to the vsync event reported by HWComposer.  The software vsync
93// event is when SurfaceFlinger and Choreographer-based applications run each
94// frame.
95//
96// This phase offset allows adjustment of the minimum latency from application
97// wake-up (by Choregographer) time to the time at which the resulting window
98// image is displayed.  This value may be either positive (after the HW vsync)
99// or negative (before the HW vsync).  Setting it to 0 will result in a
100// minimum latency of two vsync periods because the app and SurfaceFlinger
101// will run just after the HW vsync.  Setting it to a positive number will
102// result in the minimum latency being:
103//
104//     (2 * VSYNC_PERIOD - (vsyncPhaseOffsetNs % VSYNC_PERIOD))
105//
106// Note that reducing this latency makes it more likely for the applications
107// to not have their window content image ready in time.  When this happens
108// the latency will end up being an additional vsync period, and animations
109// will hiccup.  Therefore, this latency should be tuned somewhat
110// conservatively (or at least with awareness of the trade-off being made).
111static const int64_t vsyncPhaseOffsetNs = VSYNC_EVENT_PHASE_OFFSET_NS;
112
113// This is the phase offset at which SurfaceFlinger's composition runs.
114static const int64_t sfVsyncPhaseOffsetNs = SF_VSYNC_EVENT_PHASE_OFFSET_NS;
115
116// ---------------------------------------------------------------------------
117
118const String16 sHardwareTest("android.permission.HARDWARE_TEST");
119const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
120const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
121const String16 sDump("android.permission.DUMP");
122
123// ---------------------------------------------------------------------------
124
125SurfaceFlinger::SurfaceFlinger()
126    :   BnSurfaceComposer(),
127        mTransactionFlags(0),
128        mTransactionPending(false),
129        mAnimTransactionPending(false),
130        mLayersRemoved(false),
131        mRepaintEverything(0),
132        mRenderEngine(NULL),
133        mBootTime(systemTime()),
134        mVisibleRegionsDirty(false),
135        mHwWorkListDirty(false),
136        mAnimCompositionPending(false),
137        mDebugRegion(0),
138        mDebugDDMS(0),
139        mDebugDisableHWC(0),
140        mDebugDisableTransformHint(0),
141        mDebugInSwapBuffers(0),
142        mLastSwapBufferTime(0),
143        mDebugInTransaction(0),
144        mLastTransactionTime(0),
145        mBootFinished(false),
146        mPrimaryHWVsyncEnabled(false),
147        mHWVsyncAvailable(false),
148        mDaltonize(false),
149        mHasColorMatrix(false)
150{
151    ALOGI("SurfaceFlinger is starting");
152
153    // debugging stuff...
154    char value[PROPERTY_VALUE_MAX];
155
156    property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
157    mGpuToCpuSupported = !atoi(value);
158
159    property_get("debug.sf.showupdates", value, "0");
160    mDebugRegion = atoi(value);
161
162    property_get("debug.sf.ddms", value, "0");
163    mDebugDDMS = atoi(value);
164    if (mDebugDDMS) {
165        if (!startDdmConnection()) {
166            // start failed, and DDMS debugging not enabled
167            mDebugDDMS = 0;
168        }
169    }
170    ALOGI_IF(mDebugRegion, "showupdates enabled");
171    ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
172}
173
174void SurfaceFlinger::onFirstRef()
175{
176    mEventQueue.init(this);
177}
178
179SurfaceFlinger::~SurfaceFlinger()
180{
181    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
182    eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
183    eglTerminate(display);
184}
185
186void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
187{
188    // the window manager died on us. prepare its eulogy.
189
190    // restore initial conditions (default device unblank, etc)
191    initializeDisplays();
192
193    // restart the boot-animation
194    startBootAnim();
195}
196
197sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
198{
199    sp<ISurfaceComposerClient> bclient;
200    sp<Client> client(new Client(this));
201    status_t err = client->initCheck();
202    if (err == NO_ERROR) {
203        bclient = client;
204    }
205    return bclient;
206}
207
208sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
209        bool secure)
210{
211    class DisplayToken : public BBinder {
212        sp<SurfaceFlinger> flinger;
213        virtual ~DisplayToken() {
214             // no more references, this display must be terminated
215             Mutex::Autolock _l(flinger->mStateLock);
216             flinger->mCurrentState.displays.removeItem(this);
217             flinger->setTransactionFlags(eDisplayTransactionNeeded);
218         }
219     public:
220        DisplayToken(const sp<SurfaceFlinger>& flinger)
221            : flinger(flinger) {
222        }
223    };
224
225    sp<BBinder> token = new DisplayToken(this);
226
227    Mutex::Autolock _l(mStateLock);
228    DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL);
229    info.displayName = displayName;
230    info.isSecure = secure;
231    mCurrentState.displays.add(token, info);
232
233    return token;
234}
235
236void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
237    Mutex::Autolock _l(mStateLock);
238
239    ssize_t idx = mCurrentState.displays.indexOfKey(display);
240    if (idx < 0) {
241        ALOGW("destroyDisplay: invalid display token");
242        return;
243    }
244
245    const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
246    if (!info.isVirtualDisplay()) {
247        ALOGE("destroyDisplay called for non-virtual display");
248        return;
249    }
250
251    mCurrentState.displays.removeItemsAt(idx);
252    setTransactionFlags(eDisplayTransactionNeeded);
253}
254
255void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
256    ALOGW_IF(mBuiltinDisplays[type],
257            "Overwriting display token for display type %d", type);
258    mBuiltinDisplays[type] = new BBinder();
259    DisplayDeviceState info(type);
260    // All non-virtual displays are currently considered secure.
261    info.isSecure = true;
262    mCurrentState.displays.add(mBuiltinDisplays[type], info);
263}
264
265sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
266    if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
267        ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
268        return NULL;
269    }
270    return mBuiltinDisplays[id];
271}
272
273sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
274{
275    sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
276    return gba;
277}
278
279void SurfaceFlinger::bootFinished()
280{
281    const nsecs_t now = systemTime();
282    const nsecs_t duration = now - mBootTime;
283    ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
284    mBootFinished = true;
285
286    // wait patiently for the window manager death
287    const String16 name("window");
288    sp<IBinder> window(defaultServiceManager()->getService(name));
289    if (window != 0) {
290        window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
291    }
292
293    // stop boot animation
294    // formerly we would just kill the process, but we now ask it to exit so it
295    // can choose where to stop the animation.
296    property_set("service.bootanim.exit", "1");
297}
298
299void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
300    class MessageDestroyGLTexture : public MessageBase {
301        RenderEngine& engine;
302        uint32_t texture;
303    public:
304        MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
305            : engine(engine), texture(texture) {
306        }
307        virtual bool handler() {
308            engine.deleteTextures(1, &texture);
309            return true;
310        }
311    };
312    postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
313}
314
315class DispSyncSource : public VSyncSource, private DispSync::Callback {
316public:
317    DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
318        const char* label) :
319            mValue(0),
320            mPhaseOffset(phaseOffset),
321            mTraceVsync(traceVsync),
322            mVsyncOnLabel(String8::format("VsyncOn-%s", label)),
323            mVsyncEventLabel(String8::format("VSYNC-%s", label)),
324            mDispSync(dispSync) {}
325
326    virtual ~DispSyncSource() {}
327
328    virtual void setVSyncEnabled(bool enable) {
329        // Do NOT lock the mutex here so as to avoid any mutex ordering issues
330        // with locking it in the onDispSyncEvent callback.
331        if (enable) {
332            status_t err = mDispSync->addEventListener(mPhaseOffset,
333                    static_cast<DispSync::Callback*>(this));
334            if (err != NO_ERROR) {
335                ALOGE("error registering vsync callback: %s (%d)",
336                        strerror(-err), err);
337            }
338            //ATRACE_INT(mVsyncOnLabel.string(), 1);
339        } else {
340            status_t err = mDispSync->removeEventListener(
341                    static_cast<DispSync::Callback*>(this));
342            if (err != NO_ERROR) {
343                ALOGE("error unregistering vsync callback: %s (%d)",
344                        strerror(-err), err);
345            }
346            //ATRACE_INT(mVsyncOnLabel.string(), 0);
347        }
348    }
349
350    virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
351        Mutex::Autolock lock(mMutex);
352        mCallback = callback;
353    }
354
355private:
356    virtual void onDispSyncEvent(nsecs_t when) {
357        sp<VSyncSource::Callback> callback;
358        {
359            Mutex::Autolock lock(mMutex);
360            callback = mCallback;
361
362            if (mTraceVsync) {
363                mValue = (mValue + 1) % 2;
364                ATRACE_INT(mVsyncEventLabel.string(), mValue);
365            }
366        }
367
368        if (callback != NULL) {
369            callback->onVSyncEvent(when);
370        }
371    }
372
373    int mValue;
374
375    const nsecs_t mPhaseOffset;
376    const bool mTraceVsync;
377    const String8 mVsyncOnLabel;
378    const String8 mVsyncEventLabel;
379
380    DispSync* mDispSync;
381    sp<VSyncSource::Callback> mCallback;
382    Mutex mMutex;
383};
384
385void SurfaceFlinger::init() {
386    ALOGI(  "SurfaceFlinger's main thread ready to run. "
387            "Initializing graphics H/W...");
388
389    status_t err;
390    Mutex::Autolock _l(mStateLock);
391
392    // initialize EGL for the default display
393    mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
394    eglInitialize(mEGLDisplay, NULL, NULL);
395
396    // Initialize the H/W composer object.  There may or may not be an
397    // actual hardware composer underneath.
398    mHwc = new HWComposer(this,
399            *static_cast<HWComposer::EventHandler *>(this));
400
401    // get a RenderEngine for the given display / config (can't fail)
402    mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
403
404    // retrieve the EGL context that was selected/created
405    mEGLContext = mRenderEngine->getEGLContext();
406
407    LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
408            "couldn't create EGLContext");
409
410    // initialize our non-virtual displays
411    for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
412        DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
413        // set-up the displays that are already connected
414        if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
415            // All non-virtual displays are currently considered secure.
416            bool isSecure = true;
417            createBuiltinDisplayLocked(type);
418            wp<IBinder> token = mBuiltinDisplays[i];
419
420            sp<IGraphicBufferProducer> producer;
421            sp<IGraphicBufferConsumer> consumer;
422            BufferQueue::createBufferQueue(&producer, &consumer,
423                    new GraphicBufferAlloc());
424
425            sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
426                    consumer);
427            int32_t hwcId = allocateHwcDisplayId(type);
428            sp<DisplayDevice> hw = new DisplayDevice(this,
429                    type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
430                    fbs, producer,
431                    mRenderEngine->getEGLConfig());
432            if (i > DisplayDevice::DISPLAY_PRIMARY) {
433                // FIXME: currently we don't get blank/unblank requests
434                // for displays other than the main display, so we always
435                // assume a connected display is unblanked.
436                ALOGD("marking display %zu as acquired/unblanked", i);
437                hw->acquireScreen();
438            }
439            mDisplays.add(token, hw);
440        }
441    }
442
443    // make the GLContext current so that we can create textures when creating Layers
444    // (which may happens before we render something)
445    getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
446
447    // start the EventThread
448    sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
449            vsyncPhaseOffsetNs, true, "app");
450    mEventThread = new EventThread(vsyncSrc);
451    sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
452            sfVsyncPhaseOffsetNs, true, "sf");
453    mSFEventThread = new EventThread(sfVsyncSrc);
454    mEventQueue.setEventThread(mSFEventThread);
455
456    mEventControlThread = new EventControlThread(this);
457    mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
458
459    // set a fake vsync period if there is no HWComposer
460    if (mHwc->initCheck() != NO_ERROR) {
461        mPrimaryDispSync.setPeriod(16666667);
462    }
463
464    // initialize our drawing state
465    mDrawingState = mCurrentState;
466
467    // set initial conditions (e.g. unblank default device)
468    initializeDisplays();
469
470    // start boot animation
471    startBootAnim();
472}
473
474int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
475    return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
476            type : mHwc->allocateDisplayId();
477}
478
479void SurfaceFlinger::startBootAnim() {
480    // start boot animation
481    property_set("service.bootanim.exit", "0");
482    property_set("ctl.start", "bootanim");
483}
484
485size_t SurfaceFlinger::getMaxTextureSize() const {
486    return mRenderEngine->getMaxTextureSize();
487}
488
489size_t SurfaceFlinger::getMaxViewportDims() const {
490    return mRenderEngine->getMaxViewportDims();
491}
492
493// ----------------------------------------------------------------------------
494
495bool SurfaceFlinger::authenticateSurfaceTexture(
496        const sp<IGraphicBufferProducer>& bufferProducer) const {
497    Mutex::Autolock _l(mStateLock);
498    sp<IBinder> surfaceTextureBinder(bufferProducer->asBinder());
499    return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
500}
501
502status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
503        Vector<DisplayInfo>* configs) {
504    if (configs == NULL) {
505        return BAD_VALUE;
506    }
507
508    int32_t type = NAME_NOT_FOUND;
509    for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
510        if (display == mBuiltinDisplays[i]) {
511            type = i;
512            break;
513        }
514    }
515
516    if (type < 0) {
517        return type;
518    }
519
520    // TODO: Not sure if display density should handled by SF any longer
521    class Density {
522        static int getDensityFromProperty(char const* propName) {
523            char property[PROPERTY_VALUE_MAX];
524            int density = 0;
525            if (property_get(propName, property, NULL) > 0) {
526                density = atoi(property);
527            }
528            return density;
529        }
530    public:
531        static int getEmuDensity() {
532            return getDensityFromProperty("qemu.sf.lcd_density"); }
533        static int getBuildDensity()  {
534            return getDensityFromProperty("ro.sf.lcd_density"); }
535    };
536
537    configs->clear();
538
539    const Vector<HWComposer::DisplayConfig>& hwConfigs =
540            getHwComposer().getConfigs(type);
541    for (size_t c = 0; c < hwConfigs.size(); ++c) {
542        const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
543        DisplayInfo info = DisplayInfo();
544
545        float xdpi = hwConfig.xdpi;
546        float ydpi = hwConfig.ydpi;
547
548        if (type == DisplayDevice::DISPLAY_PRIMARY) {
549            // The density of the device is provided by a build property
550            float density = Density::getBuildDensity() / 160.0f;
551            if (density == 0) {
552                // the build doesn't provide a density -- this is wrong!
553                // use xdpi instead
554                ALOGE("ro.sf.lcd_density must be defined as a build property");
555                density = xdpi / 160.0f;
556            }
557            if (Density::getEmuDensity()) {
558                // if "qemu.sf.lcd_density" is specified, it overrides everything
559                xdpi = ydpi = density = Density::getEmuDensity();
560                density /= 160.0f;
561            }
562            info.density = density;
563
564            // TODO: this needs to go away (currently needed only by webkit)
565            sp<const DisplayDevice> hw(getDefaultDisplayDevice());
566            info.orientation = hw->getOrientation();
567        } else {
568            // TODO: where should this value come from?
569            static const int TV_DENSITY = 213;
570            info.density = TV_DENSITY / 160.0f;
571            info.orientation = 0;
572        }
573
574        info.w = hwConfig.width;
575        info.h = hwConfig.height;
576        info.xdpi = xdpi;
577        info.ydpi = ydpi;
578        info.fps = float(1e9 / hwConfig.refresh);
579
580        // All non-virtual displays are currently considered secure.
581        info.secure = true;
582
583        configs->push_back(info);
584    }
585
586    return NO_ERROR;
587}
588
589int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
590    return 0;
591}
592
593status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int id) {
594    return NO_ERROR;
595}
596
597status_t SurfaceFlinger::clearAnimationFrameStats() {
598    Mutex::Autolock _l(mStateLock);
599    mAnimFrameTracker.clearStats();
600    return NO_ERROR;
601}
602
603status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
604    Mutex::Autolock _l(mStateLock);
605    mAnimFrameTracker.getStats(outStats);
606    return NO_ERROR;
607}
608
609// ----------------------------------------------------------------------------
610
611sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
612    return mEventThread->createEventConnection();
613}
614
615// ----------------------------------------------------------------------------
616
617void SurfaceFlinger::waitForEvent() {
618    mEventQueue.waitMessage();
619}
620
621void SurfaceFlinger::signalTransaction() {
622    mEventQueue.invalidate();
623}
624
625void SurfaceFlinger::signalLayerUpdate() {
626    mEventQueue.invalidate();
627}
628
629void SurfaceFlinger::signalRefresh() {
630    mEventQueue.refresh();
631}
632
633status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
634        nsecs_t reltime, uint32_t /* flags */) {
635    return mEventQueue.postMessage(msg, reltime);
636}
637
638status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
639        nsecs_t reltime, uint32_t /* flags */) {
640    status_t res = mEventQueue.postMessage(msg, reltime);
641    if (res == NO_ERROR) {
642        msg->wait();
643    }
644    return res;
645}
646
647void SurfaceFlinger::run() {
648    do {
649        waitForEvent();
650    } while (true);
651}
652
653void SurfaceFlinger::enableHardwareVsync() {
654    Mutex::Autolock _l(mHWVsyncLock);
655    if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
656        mPrimaryDispSync.beginResync();
657        //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
658        mEventControlThread->setVsyncEnabled(true);
659        mPrimaryHWVsyncEnabled = true;
660    }
661}
662
663void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
664    Mutex::Autolock _l(mHWVsyncLock);
665
666    if (makeAvailable) {
667        mHWVsyncAvailable = true;
668    } else if (!mHWVsyncAvailable) {
669        ALOGE("resyncToHardwareVsync called when HW vsync unavailable");
670        return;
671    }
672
673    const nsecs_t period =
674            getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
675
676    mPrimaryDispSync.reset();
677    mPrimaryDispSync.setPeriod(period);
678
679    if (!mPrimaryHWVsyncEnabled) {
680        mPrimaryDispSync.beginResync();
681        //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
682        mEventControlThread->setVsyncEnabled(true);
683        mPrimaryHWVsyncEnabled = true;
684    }
685}
686
687void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
688    Mutex::Autolock _l(mHWVsyncLock);
689    if (mPrimaryHWVsyncEnabled) {
690        //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
691        mEventControlThread->setVsyncEnabled(false);
692        mPrimaryDispSync.endResync();
693        mPrimaryHWVsyncEnabled = false;
694    }
695    if (makeUnavailable) {
696        mHWVsyncAvailable = false;
697    }
698}
699
700void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
701    bool needsHwVsync = false;
702
703    { // Scope for the lock
704        Mutex::Autolock _l(mHWVsyncLock);
705        if (type == 0 && mPrimaryHWVsyncEnabled) {
706            needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
707        }
708    }
709
710    if (needsHwVsync) {
711        enableHardwareVsync();
712    } else {
713        disableHardwareVsync(false);
714    }
715}
716
717void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
718    if (mEventThread == NULL) {
719        // This is a temporary workaround for b/7145521.  A non-null pointer
720        // does not mean EventThread has finished initializing, so this
721        // is not a correct fix.
722        ALOGW("WARNING: EventThread not started, ignoring hotplug");
723        return;
724    }
725
726    if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
727        Mutex::Autolock _l(mStateLock);
728        if (connected) {
729            createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
730        } else {
731            mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
732            mBuiltinDisplays[type].clear();
733        }
734        setTransactionFlags(eDisplayTransactionNeeded);
735
736        // Defer EventThread notification until SF has updated mDisplays.
737    }
738}
739
740void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
741    ATRACE_CALL();
742    getHwComposer().eventControl(disp, event, enabled);
743}
744
745void SurfaceFlinger::onMessageReceived(int32_t what) {
746    ATRACE_CALL();
747    switch (what) {
748    case MessageQueue::TRANSACTION:
749        handleMessageTransaction();
750        break;
751    case MessageQueue::INVALIDATE:
752        handleMessageTransaction();
753        handleMessageInvalidate();
754        signalRefresh();
755        break;
756    case MessageQueue::REFRESH:
757        handleMessageRefresh();
758        break;
759    }
760}
761
762void SurfaceFlinger::handleMessageTransaction() {
763    uint32_t transactionFlags = peekTransactionFlags(eTransactionMask);
764    if (transactionFlags) {
765        handleTransaction(transactionFlags);
766    }
767}
768
769void SurfaceFlinger::handleMessageInvalidate() {
770    ATRACE_CALL();
771    handlePageFlip();
772}
773
774void SurfaceFlinger::handleMessageRefresh() {
775    ATRACE_CALL();
776    preComposition();
777    rebuildLayerStacks();
778    setUpHWComposer();
779    doDebugFlashRegions();
780    doComposition();
781    postComposition();
782}
783
784void SurfaceFlinger::doDebugFlashRegions()
785{
786    // is debugging enabled
787    if (CC_LIKELY(!mDebugRegion))
788        return;
789
790    const bool repaintEverything = mRepaintEverything;
791    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
792        const sp<DisplayDevice>& hw(mDisplays[dpy]);
793        if (hw->canDraw()) {
794            // transform the dirty region into this screen's coordinate space
795            const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
796            if (!dirtyRegion.isEmpty()) {
797                // redraw the whole screen
798                doComposeSurfaces(hw, Region(hw->bounds()));
799
800                // and draw the dirty region
801                const int32_t height = hw->getHeight();
802                RenderEngine& engine(getRenderEngine());
803                engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
804
805                hw->compositionComplete();
806                hw->swapBuffers(getHwComposer());
807            }
808        }
809    }
810
811    postFramebuffer();
812
813    if (mDebugRegion > 1) {
814        usleep(mDebugRegion * 1000);
815    }
816
817    HWComposer& hwc(getHwComposer());
818    if (hwc.initCheck() == NO_ERROR) {
819        status_t err = hwc.prepare();
820        ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
821    }
822}
823
824void SurfaceFlinger::preComposition()
825{
826    bool needExtraInvalidate = false;
827    const LayerVector& layers(mDrawingState.layersSortedByZ);
828    const size_t count = layers.size();
829    for (size_t i=0 ; i<count ; i++) {
830        if (layers[i]->onPreComposition()) {
831            needExtraInvalidate = true;
832        }
833    }
834    if (needExtraInvalidate) {
835        signalLayerUpdate();
836    }
837}
838
839void SurfaceFlinger::postComposition()
840{
841    const LayerVector& layers(mDrawingState.layersSortedByZ);
842    const size_t count = layers.size();
843    for (size_t i=0 ; i<count ; i++) {
844        layers[i]->onPostComposition();
845    }
846
847    const HWComposer& hwc = getHwComposer();
848    sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
849
850    if (presentFence->isValid()) {
851        if (mPrimaryDispSync.addPresentFence(presentFence)) {
852            enableHardwareVsync();
853        } else {
854            disableHardwareVsync(false);
855        }
856    }
857
858    if (kIgnorePresentFences) {
859        const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
860        if (hw->isScreenAcquired()) {
861            enableHardwareVsync();
862        }
863    }
864
865    if (mAnimCompositionPending) {
866        mAnimCompositionPending = false;
867
868        if (presentFence->isValid()) {
869            mAnimFrameTracker.setActualPresentFence(presentFence);
870        } else {
871            // The HWC doesn't support present fences, so use the refresh
872            // timestamp instead.
873            nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
874            mAnimFrameTracker.setActualPresentTime(presentTime);
875        }
876        mAnimFrameTracker.advanceFrame();
877    }
878}
879
880void SurfaceFlinger::rebuildLayerStacks() {
881    // rebuild the visible layer list per screen
882    if (CC_UNLIKELY(mVisibleRegionsDirty)) {
883        ATRACE_CALL();
884        mVisibleRegionsDirty = false;
885        invalidateHwcGeometry();
886
887        const LayerVector& layers(mDrawingState.layersSortedByZ);
888        for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
889            Region opaqueRegion;
890            Region dirtyRegion;
891            Vector< sp<Layer> > layersSortedByZ;
892            const sp<DisplayDevice>& hw(mDisplays[dpy]);
893            const Transform& tr(hw->getTransform());
894            const Rect bounds(hw->getBounds());
895            if (hw->canDraw()) {
896                SurfaceFlinger::computeVisibleRegions(layers,
897                        hw->getLayerStack(), dirtyRegion, opaqueRegion);
898
899                const size_t count = layers.size();
900                for (size_t i=0 ; i<count ; i++) {
901                    const sp<Layer>& layer(layers[i]);
902                    const Layer::State& s(layer->getDrawingState());
903                    if (s.layerStack == hw->getLayerStack()) {
904                        Region drawRegion(tr.transform(
905                                layer->visibleNonTransparentRegion));
906                        drawRegion.andSelf(bounds);
907                        if (!drawRegion.isEmpty()) {
908                            layersSortedByZ.add(layer);
909                        }
910                    }
911                }
912            }
913            hw->setVisibleLayersSortedByZ(layersSortedByZ);
914            hw->undefinedRegion.set(bounds);
915            hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
916            hw->dirtyRegion.orSelf(dirtyRegion);
917        }
918    }
919}
920
921void SurfaceFlinger::setUpHWComposer() {
922    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
923        bool mustRecompose =
924                !(mDisplays[dpy]->getDirtyRegion(false).isEmpty());
925        mDisplays[dpy]->beginFrame(mustRecompose);
926    }
927
928    HWComposer& hwc(getHwComposer());
929    if (hwc.initCheck() == NO_ERROR) {
930        // build the h/w work list
931        if (CC_UNLIKELY(mHwWorkListDirty)) {
932            mHwWorkListDirty = false;
933            for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
934                sp<const DisplayDevice> hw(mDisplays[dpy]);
935                const int32_t id = hw->getHwcDisplayId();
936                if (id >= 0) {
937                    const Vector< sp<Layer> >& currentLayers(
938                        hw->getVisibleLayersSortedByZ());
939                    const size_t count = currentLayers.size();
940                    if (hwc.createWorkList(id, count) == NO_ERROR) {
941                        HWComposer::LayerListIterator cur = hwc.begin(id);
942                        const HWComposer::LayerListIterator end = hwc.end(id);
943                        for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
944                            const sp<Layer>& layer(currentLayers[i]);
945                            layer->setGeometry(hw, *cur);
946                            if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
947                                cur->setSkip(true);
948                            }
949                        }
950                    }
951                }
952            }
953        }
954
955        // set the per-frame data
956        for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
957            sp<const DisplayDevice> hw(mDisplays[dpy]);
958            const int32_t id = hw->getHwcDisplayId();
959            if (id >= 0) {
960                const Vector< sp<Layer> >& currentLayers(
961                    hw->getVisibleLayersSortedByZ());
962                const size_t count = currentLayers.size();
963                HWComposer::LayerListIterator cur = hwc.begin(id);
964                const HWComposer::LayerListIterator end = hwc.end(id);
965                for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
966                    /*
967                     * update the per-frame h/w composer data for each layer
968                     * and build the transparent region of the FB
969                     */
970                    const sp<Layer>& layer(currentLayers[i]);
971                    layer->setPerFrameData(hw, *cur);
972                }
973            }
974        }
975
976        status_t err = hwc.prepare();
977        ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
978
979        for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
980            sp<const DisplayDevice> hw(mDisplays[dpy]);
981            hw->prepareFrame(hwc);
982        }
983    }
984}
985
986void SurfaceFlinger::doComposition() {
987    ATRACE_CALL();
988    const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
989    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
990        const sp<DisplayDevice>& hw(mDisplays[dpy]);
991        if (hw->canDraw()) {
992            // transform the dirty region into this screen's coordinate space
993            const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
994
995            // repaint the framebuffer (if needed)
996            doDisplayComposition(hw, dirtyRegion);
997
998            hw->dirtyRegion.clear();
999            hw->flip(hw->swapRegion);
1000            hw->swapRegion.clear();
1001        }
1002        // inform the h/w that we're done compositing
1003        hw->compositionComplete();
1004    }
1005    postFramebuffer();
1006}
1007
1008void SurfaceFlinger::postFramebuffer()
1009{
1010    ATRACE_CALL();
1011
1012    const nsecs_t now = systemTime();
1013    mDebugInSwapBuffers = now;
1014
1015    HWComposer& hwc(getHwComposer());
1016    if (hwc.initCheck() == NO_ERROR) {
1017        if (!hwc.supportsFramebufferTarget()) {
1018            // EGL spec says:
1019            //   "surface must be bound to the calling thread's current context,
1020            //    for the current rendering API."
1021            getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1022        }
1023        hwc.commit();
1024    }
1025
1026    // make the default display current because the VirtualDisplayDevice code cannot
1027    // deal with dequeueBuffer() being called outside of the composition loop; however
1028    // the code below can call glFlush() which is allowed (and does in some case) call
1029    // dequeueBuffer().
1030    getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1031
1032    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1033        sp<const DisplayDevice> hw(mDisplays[dpy]);
1034        const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1035        hw->onSwapBuffersCompleted(hwc);
1036        const size_t count = currentLayers.size();
1037        int32_t id = hw->getHwcDisplayId();
1038        if (id >=0 && hwc.initCheck() == NO_ERROR) {
1039            HWComposer::LayerListIterator cur = hwc.begin(id);
1040            const HWComposer::LayerListIterator end = hwc.end(id);
1041            for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1042                currentLayers[i]->onLayerDisplayed(hw, &*cur);
1043            }
1044        } else {
1045            for (size_t i = 0; i < count; i++) {
1046                currentLayers[i]->onLayerDisplayed(hw, NULL);
1047            }
1048        }
1049    }
1050
1051    mLastSwapBufferTime = systemTime() - now;
1052    mDebugInSwapBuffers = 0;
1053
1054    uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1055    if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1056        logFrameStats();
1057    }
1058}
1059
1060void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1061{
1062    ATRACE_CALL();
1063
1064    // here we keep a copy of the drawing state (that is the state that's
1065    // going to be overwritten by handleTransactionLocked()) outside of
1066    // mStateLock so that the side-effects of the State assignment
1067    // don't happen with mStateLock held (which can cause deadlocks).
1068    State drawingState(mDrawingState);
1069
1070    Mutex::Autolock _l(mStateLock);
1071    const nsecs_t now = systemTime();
1072    mDebugInTransaction = now;
1073
1074    // Here we're guaranteed that some transaction flags are set
1075    // so we can call handleTransactionLocked() unconditionally.
1076    // We call getTransactionFlags(), which will also clear the flags,
1077    // with mStateLock held to guarantee that mCurrentState won't change
1078    // until the transaction is committed.
1079
1080    transactionFlags = getTransactionFlags(eTransactionMask);
1081    handleTransactionLocked(transactionFlags);
1082
1083    mLastTransactionTime = systemTime() - now;
1084    mDebugInTransaction = 0;
1085    invalidateHwcGeometry();
1086    // here the transaction has been committed
1087}
1088
1089void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1090{
1091    const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
1092    const size_t count = currentLayers.size();
1093
1094    /*
1095     * Traversal of the children
1096     * (perform the transaction for each of them if needed)
1097     */
1098
1099    if (transactionFlags & eTraversalNeeded) {
1100        for (size_t i=0 ; i<count ; i++) {
1101            const sp<Layer>& layer(currentLayers[i]);
1102            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1103            if (!trFlags) continue;
1104
1105            const uint32_t flags = layer->doTransaction(0);
1106            if (flags & Layer::eVisibleRegion)
1107                mVisibleRegionsDirty = true;
1108        }
1109    }
1110
1111    /*
1112     * Perform display own transactions if needed
1113     */
1114
1115    if (transactionFlags & eDisplayTransactionNeeded) {
1116        // here we take advantage of Vector's copy-on-write semantics to
1117        // improve performance by skipping the transaction entirely when
1118        // know that the lists are identical
1119        const KeyedVector<  wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1120        const KeyedVector<  wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1121        if (!curr.isIdenticalTo(draw)) {
1122            mVisibleRegionsDirty = true;
1123            const size_t cc = curr.size();
1124                  size_t dc = draw.size();
1125
1126            // find the displays that were removed
1127            // (ie: in drawing state but not in current state)
1128            // also handle displays that changed
1129            // (ie: displays that are in both lists)
1130            for (size_t i=0 ; i<dc ; i++) {
1131                const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1132                if (j < 0) {
1133                    // in drawing state but not in current state
1134                    if (!draw[i].isMainDisplay()) {
1135                        // Call makeCurrent() on the primary display so we can
1136                        // be sure that nothing associated with this display
1137                        // is current.
1138                        const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1139                        defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1140                        sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1141                        if (hw != NULL)
1142                            hw->disconnect(getHwComposer());
1143                        if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1144                            mEventThread->onHotplugReceived(draw[i].type, false);
1145                        mDisplays.removeItem(draw.keyAt(i));
1146                    } else {
1147                        ALOGW("trying to remove the main display");
1148                    }
1149                } else {
1150                    // this display is in both lists. see if something changed.
1151                    const DisplayDeviceState& state(curr[j]);
1152                    const wp<IBinder>& display(curr.keyAt(j));
1153                    if (state.surface->asBinder() != draw[i].surface->asBinder()) {
1154                        // changing the surface is like destroying and
1155                        // recreating the DisplayDevice, so we just remove it
1156                        // from the drawing state, so that it get re-added
1157                        // below.
1158                        sp<DisplayDevice> hw(getDisplayDevice(display));
1159                        if (hw != NULL)
1160                            hw->disconnect(getHwComposer());
1161                        mDisplays.removeItem(display);
1162                        mDrawingState.displays.removeItemsAt(i);
1163                        dc--; i--;
1164                        // at this point we must loop to the next item
1165                        continue;
1166                    }
1167
1168                    const sp<DisplayDevice> disp(getDisplayDevice(display));
1169                    if (disp != NULL) {
1170                        if (state.layerStack != draw[i].layerStack) {
1171                            disp->setLayerStack(state.layerStack);
1172                        }
1173                        if ((state.orientation != draw[i].orientation)
1174                                || (state.viewport != draw[i].viewport)
1175                                || (state.frame != draw[i].frame))
1176                        {
1177                            disp->setProjection(state.orientation,
1178                                    state.viewport, state.frame);
1179                        }
1180                    }
1181                }
1182            }
1183
1184            // find displays that were added
1185            // (ie: in current state but not in drawing state)
1186            for (size_t i=0 ; i<cc ; i++) {
1187                if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1188                    const DisplayDeviceState& state(curr[i]);
1189
1190                    sp<DisplaySurface> dispSurface;
1191                    sp<IGraphicBufferProducer> producer;
1192                    sp<IGraphicBufferProducer> bqProducer;
1193                    sp<IGraphicBufferConsumer> bqConsumer;
1194                    BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1195                            new GraphicBufferAlloc());
1196
1197                    int32_t hwcDisplayId = -1;
1198                    if (state.isVirtualDisplay()) {
1199                        // Virtual displays without a surface are dormant:
1200                        // they have external state (layer stack, projection,
1201                        // etc.) but no internal state (i.e. a DisplayDevice).
1202                        if (state.surface != NULL) {
1203
1204                            hwcDisplayId = allocateHwcDisplayId(state.type);
1205                            sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1206                                    *mHwc, hwcDisplayId, state.surface,
1207                                    bqProducer, bqConsumer, state.displayName);
1208
1209                            dispSurface = vds;
1210                            if (hwcDisplayId >= 0) {
1211                                producer = vds;
1212                            } else {
1213                                // There won't be any interaction with HWC for this virtual display,
1214                                // so the GLES driver can pass buffers directly to the sink.
1215                                producer = state.surface;
1216                            }
1217                        }
1218                    } else {
1219                        ALOGE_IF(state.surface!=NULL,
1220                                "adding a supported display, but rendering "
1221                                "surface is provided (%p), ignoring it",
1222                                state.surface.get());
1223                        hwcDisplayId = allocateHwcDisplayId(state.type);
1224                        // for supported (by hwc) displays we provide our
1225                        // own rendering surface
1226                        dispSurface = new FramebufferSurface(*mHwc, state.type,
1227                                bqConsumer);
1228                        producer = bqProducer;
1229                    }
1230
1231                    const wp<IBinder>& display(curr.keyAt(i));
1232                    if (dispSurface != NULL) {
1233                        sp<DisplayDevice> hw = new DisplayDevice(this,
1234                                state.type, hwcDisplayId,
1235                                mHwc->getFormat(hwcDisplayId), state.isSecure,
1236                                display, dispSurface, producer,
1237                                mRenderEngine->getEGLConfig());
1238                        hw->setLayerStack(state.layerStack);
1239                        hw->setProjection(state.orientation,
1240                                state.viewport, state.frame);
1241                        hw->setDisplayName(state.displayName);
1242                        mDisplays.add(display, hw);
1243                        if (state.isVirtualDisplay()) {
1244                            if (hwcDisplayId >= 0) {
1245                                mHwc->setVirtualDisplayProperties(hwcDisplayId,
1246                                        hw->getWidth(), hw->getHeight(),
1247                                        hw->getFormat());
1248                            }
1249                        } else {
1250                            mEventThread->onHotplugReceived(state.type, true);
1251                        }
1252                    }
1253                }
1254            }
1255        }
1256    }
1257
1258    if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1259        // The transform hint might have changed for some layers
1260        // (either because a display has changed, or because a layer
1261        // as changed).
1262        //
1263        // Walk through all the layers in currentLayers,
1264        // and update their transform hint.
1265        //
1266        // If a layer is visible only on a single display, then that
1267        // display is used to calculate the hint, otherwise we use the
1268        // default display.
1269        //
1270        // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1271        // the hint is set before we acquire a buffer from the surface texture.
1272        //
1273        // NOTE: layer transactions have taken place already, so we use their
1274        // drawing state. However, SurfaceFlinger's own transaction has not
1275        // happened yet, so we must use the current state layer list
1276        // (soon to become the drawing state list).
1277        //
1278        sp<const DisplayDevice> disp;
1279        uint32_t currentlayerStack = 0;
1280        for (size_t i=0; i<count; i++) {
1281            // NOTE: we rely on the fact that layers are sorted by
1282            // layerStack first (so we don't have to traverse the list
1283            // of displays for every layer).
1284            const sp<Layer>& layer(currentLayers[i]);
1285            uint32_t layerStack = layer->getDrawingState().layerStack;
1286            if (i==0 || currentlayerStack != layerStack) {
1287                currentlayerStack = layerStack;
1288                // figure out if this layerstack is mirrored
1289                // (more than one display) if so, pick the default display,
1290                // if not, pick the only display it's on.
1291                disp.clear();
1292                for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1293                    sp<const DisplayDevice> hw(mDisplays[dpy]);
1294                    if (hw->getLayerStack() == currentlayerStack) {
1295                        if (disp == NULL) {
1296                            disp = hw;
1297                        } else {
1298                            disp = NULL;
1299                            break;
1300                        }
1301                    }
1302                }
1303            }
1304            if (disp == NULL) {
1305                // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1306                // redraw after transform hint changes. See bug 8508397.
1307
1308                // could be null when this layer is using a layerStack
1309                // that is not visible on any display. Also can occur at
1310                // screen off/on times.
1311                disp = getDefaultDisplayDevice();
1312            }
1313            layer->updateTransformHint(disp);
1314        }
1315    }
1316
1317
1318    /*
1319     * Perform our own transaction if needed
1320     */
1321
1322    const LayerVector& layers(mDrawingState.layersSortedByZ);
1323    if (currentLayers.size() > layers.size()) {
1324        // layers have been added
1325        mVisibleRegionsDirty = true;
1326    }
1327
1328    // some layers might have been removed, so
1329    // we need to update the regions they're exposing.
1330    if (mLayersRemoved) {
1331        mLayersRemoved = false;
1332        mVisibleRegionsDirty = true;
1333        const size_t count = layers.size();
1334        for (size_t i=0 ; i<count ; i++) {
1335            const sp<Layer>& layer(layers[i]);
1336            if (currentLayers.indexOf(layer) < 0) {
1337                // this layer is not visible anymore
1338                // TODO: we could traverse the tree from front to back and
1339                //       compute the actual visible region
1340                // TODO: we could cache the transformed region
1341                const Layer::State& s(layer->getDrawingState());
1342                Region visibleReg = s.transform.transform(
1343                        Region(Rect(s.active.w, s.active.h)));
1344                invalidateLayerStack(s.layerStack, visibleReg);
1345            }
1346        }
1347    }
1348
1349    commitTransaction();
1350}
1351
1352void SurfaceFlinger::commitTransaction()
1353{
1354    if (!mLayersPendingRemoval.isEmpty()) {
1355        // Notify removed layers now that they can't be drawn from
1356        for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
1357            mLayersPendingRemoval[i]->onRemoved();
1358        }
1359        mLayersPendingRemoval.clear();
1360    }
1361
1362    // If this transaction is part of a window animation then the next frame
1363    // we composite should be considered an animation as well.
1364    mAnimCompositionPending = mAnimTransactionPending;
1365
1366    mDrawingState = mCurrentState;
1367    mTransactionPending = false;
1368    mAnimTransactionPending = false;
1369    mTransactionCV.broadcast();
1370}
1371
1372void SurfaceFlinger::computeVisibleRegions(
1373        const LayerVector& currentLayers, uint32_t layerStack,
1374        Region& outDirtyRegion, Region& outOpaqueRegion)
1375{
1376    ATRACE_CALL();
1377
1378    Region aboveOpaqueLayers;
1379    Region aboveCoveredLayers;
1380    Region dirty;
1381
1382    outDirtyRegion.clear();
1383
1384    size_t i = currentLayers.size();
1385    while (i--) {
1386        const sp<Layer>& layer = currentLayers[i];
1387
1388        // start with the whole surface at its current location
1389        const Layer::State& s(layer->getDrawingState());
1390
1391        // only consider the layers on the given layer stack
1392        if (s.layerStack != layerStack)
1393            continue;
1394
1395        /*
1396         * opaqueRegion: area of a surface that is fully opaque.
1397         */
1398        Region opaqueRegion;
1399
1400        /*
1401         * visibleRegion: area of a surface that is visible on screen
1402         * and not fully transparent. This is essentially the layer's
1403         * footprint minus the opaque regions above it.
1404         * Areas covered by a translucent surface are considered visible.
1405         */
1406        Region visibleRegion;
1407
1408        /*
1409         * coveredRegion: area of a surface that is covered by all
1410         * visible regions above it (which includes the translucent areas).
1411         */
1412        Region coveredRegion;
1413
1414        /*
1415         * transparentRegion: area of a surface that is hinted to be completely
1416         * transparent. This is only used to tell when the layer has no visible
1417         * non-transparent regions and can be removed from the layer list. It
1418         * does not affect the visibleRegion of this layer or any layers
1419         * beneath it. The hint may not be correct if apps don't respect the
1420         * SurfaceView restrictions (which, sadly, some don't).
1421         */
1422        Region transparentRegion;
1423
1424
1425        // handle hidden surfaces by setting the visible region to empty
1426        if (CC_LIKELY(layer->isVisible())) {
1427            const bool translucent = !layer->isOpaque(s);
1428            Rect bounds(s.transform.transform(layer->computeBounds()));
1429            visibleRegion.set(bounds);
1430            if (!visibleRegion.isEmpty()) {
1431                // Remove the transparent area from the visible region
1432                if (translucent) {
1433                    const Transform tr(s.transform);
1434                    if (tr.transformed()) {
1435                        if (tr.preserveRects()) {
1436                            // transform the transparent region
1437                            transparentRegion = tr.transform(s.activeTransparentRegion);
1438                        } else {
1439                            // transformation too complex, can't do the
1440                            // transparent region optimization.
1441                            transparentRegion.clear();
1442                        }
1443                    } else {
1444                        transparentRegion = s.activeTransparentRegion;
1445                    }
1446                }
1447
1448                // compute the opaque region
1449                const int32_t layerOrientation = s.transform.getOrientation();
1450                if (s.alpha==255 && !translucent &&
1451                        ((layerOrientation & Transform::ROT_INVALID) == false)) {
1452                    // the opaque region is the layer's footprint
1453                    opaqueRegion = visibleRegion;
1454                }
1455            }
1456        }
1457
1458        // Clip the covered region to the visible region
1459        coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1460
1461        // Update aboveCoveredLayers for next (lower) layer
1462        aboveCoveredLayers.orSelf(visibleRegion);
1463
1464        // subtract the opaque region covered by the layers above us
1465        visibleRegion.subtractSelf(aboveOpaqueLayers);
1466
1467        // compute this layer's dirty region
1468        if (layer->contentDirty) {
1469            // we need to invalidate the whole region
1470            dirty = visibleRegion;
1471            // as well, as the old visible region
1472            dirty.orSelf(layer->visibleRegion);
1473            layer->contentDirty = false;
1474        } else {
1475            /* compute the exposed region:
1476             *   the exposed region consists of two components:
1477             *   1) what's VISIBLE now and was COVERED before
1478             *   2) what's EXPOSED now less what was EXPOSED before
1479             *
1480             * note that (1) is conservative, we start with the whole
1481             * visible region but only keep what used to be covered by
1482             * something -- which mean it may have been exposed.
1483             *
1484             * (2) handles areas that were not covered by anything but got
1485             * exposed because of a resize.
1486             */
1487            const Region newExposed = visibleRegion - coveredRegion;
1488            const Region oldVisibleRegion = layer->visibleRegion;
1489            const Region oldCoveredRegion = layer->coveredRegion;
1490            const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1491            dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1492        }
1493        dirty.subtractSelf(aboveOpaqueLayers);
1494
1495        // accumulate to the screen dirty region
1496        outDirtyRegion.orSelf(dirty);
1497
1498        // Update aboveOpaqueLayers for next (lower) layer
1499        aboveOpaqueLayers.orSelf(opaqueRegion);
1500
1501        // Store the visible region in screen space
1502        layer->setVisibleRegion(visibleRegion);
1503        layer->setCoveredRegion(coveredRegion);
1504        layer->setVisibleNonTransparentRegion(
1505                visibleRegion.subtract(transparentRegion));
1506    }
1507
1508    outOpaqueRegion = aboveOpaqueLayers;
1509}
1510
1511void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
1512        const Region& dirty) {
1513    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1514        const sp<DisplayDevice>& hw(mDisplays[dpy]);
1515        if (hw->getLayerStack() == layerStack) {
1516            hw->dirtyRegion.orSelf(dirty);
1517        }
1518    }
1519}
1520
1521void SurfaceFlinger::handlePageFlip()
1522{
1523    Region dirtyRegion;
1524
1525    bool visibleRegions = false;
1526    const LayerVector& layers(mDrawingState.layersSortedByZ);
1527    const size_t count = layers.size();
1528    for (size_t i=0 ; i<count ; i++) {
1529        const sp<Layer>& layer(layers[i]);
1530        const Region dirty(layer->latchBuffer(visibleRegions));
1531        const Layer::State& s(layer->getDrawingState());
1532        invalidateLayerStack(s.layerStack, dirty);
1533    }
1534
1535    mVisibleRegionsDirty |= visibleRegions;
1536}
1537
1538void SurfaceFlinger::invalidateHwcGeometry()
1539{
1540    mHwWorkListDirty = true;
1541}
1542
1543
1544void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
1545        const Region& inDirtyRegion)
1546{
1547    // We only need to actually compose the display if:
1548    // 1) It is being handled by hardware composer, which may need this to
1549    //    keep its virtual display state machine in sync, or
1550    // 2) There is work to be done (the dirty region isn't empty)
1551    bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
1552    if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
1553        return;
1554    }
1555
1556    Region dirtyRegion(inDirtyRegion);
1557
1558    // compute the invalid region
1559    hw->swapRegion.orSelf(dirtyRegion);
1560
1561    uint32_t flags = hw->getFlags();
1562    if (flags & DisplayDevice::SWAP_RECTANGLE) {
1563        // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1564        // takes a rectangle, we must make sure to update that whole
1565        // rectangle in that case
1566        dirtyRegion.set(hw->swapRegion.bounds());
1567    } else {
1568        if (flags & DisplayDevice::PARTIAL_UPDATES) {
1569            // We need to redraw the rectangle that will be updated
1570            // (pushed to the framebuffer).
1571            // This is needed because PARTIAL_UPDATES only takes one
1572            // rectangle instead of a region (see DisplayDevice::flip())
1573            dirtyRegion.set(hw->swapRegion.bounds());
1574        } else {
1575            // we need to redraw everything (the whole screen)
1576            dirtyRegion.set(hw->bounds());
1577            hw->swapRegion = dirtyRegion;
1578        }
1579    }
1580
1581    if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
1582        doComposeSurfaces(hw, dirtyRegion);
1583    } else {
1584        RenderEngine& engine(getRenderEngine());
1585        mat4 colorMatrix = mColorMatrix;
1586        if (mDaltonize) {
1587            colorMatrix = colorMatrix * mDaltonizer();
1588        }
1589        engine.beginGroup(colorMatrix);
1590        doComposeSurfaces(hw, dirtyRegion);
1591        engine.endGroup();
1592    }
1593
1594    // update the swap region and clear the dirty region
1595    hw->swapRegion.orSelf(dirtyRegion);
1596
1597    // swap buffers (presentation)
1598    hw->swapBuffers(getHwComposer());
1599}
1600
1601void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
1602{
1603    RenderEngine& engine(getRenderEngine());
1604    const int32_t id = hw->getHwcDisplayId();
1605    HWComposer& hwc(getHwComposer());
1606    HWComposer::LayerListIterator cur = hwc.begin(id);
1607    const HWComposer::LayerListIterator end = hwc.end(id);
1608
1609    bool hasGlesComposition = hwc.hasGlesComposition(id);
1610    if (hasGlesComposition) {
1611        if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
1612            ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
1613                  hw->getDisplayName().string());
1614            return;
1615        }
1616
1617        // Never touch the framebuffer if we don't have any framebuffer layers
1618        const bool hasHwcComposition = hwc.hasHwcComposition(id);
1619        if (hasHwcComposition) {
1620            // when using overlays, we assume a fully transparent framebuffer
1621            // NOTE: we could reduce how much we need to clear, for instance
1622            // remove where there are opaque FB layers. however, on some
1623            // GPUs doing a "clean slate" clear might be more efficient.
1624            // We'll revisit later if needed.
1625            engine.clearWithColor(0, 0, 0, 0);
1626        } else {
1627            // we start with the whole screen area
1628            const Region bounds(hw->getBounds());
1629
1630            // we remove the scissor part
1631            // we're left with the letterbox region
1632            // (common case is that letterbox ends-up being empty)
1633            const Region letterbox(bounds.subtract(hw->getScissor()));
1634
1635            // compute the area to clear
1636            Region region(hw->undefinedRegion.merge(letterbox));
1637
1638            // but limit it to the dirty region
1639            region.andSelf(dirty);
1640
1641            // screen is already cleared here
1642            if (!region.isEmpty()) {
1643                // can happen with SurfaceView
1644                drawWormhole(hw, region);
1645            }
1646        }
1647
1648        if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
1649            // just to be on the safe side, we don't set the
1650            // scissor on the main display. It should never be needed
1651            // anyways (though in theory it could since the API allows it).
1652            const Rect& bounds(hw->getBounds());
1653            const Rect& scissor(hw->getScissor());
1654            if (scissor != bounds) {
1655                // scissor doesn't match the screen's dimensions, so we
1656                // need to clear everything outside of it and enable
1657                // the GL scissor so we don't draw anything where we shouldn't
1658
1659                // enable scissor for this frame
1660                const uint32_t height = hw->getHeight();
1661                engine.setScissor(scissor.left, height - scissor.bottom,
1662                        scissor.getWidth(), scissor.getHeight());
1663            }
1664        }
1665    }
1666
1667    /*
1668     * and then, render the layers targeted at the framebuffer
1669     */
1670
1671    const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
1672    const size_t count = layers.size();
1673    const Transform& tr = hw->getTransform();
1674    if (cur != end) {
1675        // we're using h/w composer
1676        for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
1677            const sp<Layer>& layer(layers[i]);
1678            const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
1679            if (!clip.isEmpty()) {
1680                switch (cur->getCompositionType()) {
1681                    case HWC_OVERLAY: {
1682                        const Layer::State& state(layer->getDrawingState());
1683                        if ((cur->getHints() & HWC_HINT_CLEAR_FB)
1684                                && i
1685                                && layer->isOpaque(state) && (state.alpha == 0xFF)
1686                                && hasGlesComposition) {
1687                            // never clear the very first layer since we're
1688                            // guaranteed the FB is already cleared
1689                            layer->clearWithOpenGL(hw, clip);
1690                        }
1691                        break;
1692                    }
1693                    case HWC_FRAMEBUFFER: {
1694                        layer->draw(hw, clip);
1695                        break;
1696                    }
1697                    case HWC_FRAMEBUFFER_TARGET: {
1698                        // this should not happen as the iterator shouldn't
1699                        // let us get there.
1700                        ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
1701                        break;
1702                    }
1703                }
1704            }
1705            layer->setAcquireFence(hw, *cur);
1706        }
1707    } else {
1708        // we're not using h/w composer
1709        for (size_t i=0 ; i<count ; ++i) {
1710            const sp<Layer>& layer(layers[i]);
1711            const Region clip(dirty.intersect(
1712                    tr.transform(layer->visibleRegion)));
1713            if (!clip.isEmpty()) {
1714                layer->draw(hw, clip);
1715            }
1716        }
1717    }
1718
1719    // disable scissor at the end of the frame
1720    engine.disableScissor();
1721}
1722
1723void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
1724    const int32_t height = hw->getHeight();
1725    RenderEngine& engine(getRenderEngine());
1726    engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
1727}
1728
1729void SurfaceFlinger::addClientLayer(const sp<Client>& client,
1730        const sp<IBinder>& handle,
1731        const sp<IGraphicBufferProducer>& gbc,
1732        const sp<Layer>& lbc)
1733{
1734    // attach this layer to the client
1735    client->attachLayer(handle, lbc);
1736
1737    // add this layer to the current state list
1738    Mutex::Autolock _l(mStateLock);
1739    mCurrentState.layersSortedByZ.add(lbc);
1740    mGraphicBufferProducerList.add(gbc->asBinder());
1741}
1742
1743status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
1744    Mutex::Autolock _l(mStateLock);
1745    ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
1746    if (index >= 0) {
1747        mLayersPendingRemoval.push(layer);
1748        mLayersRemoved = true;
1749        setTransactionFlags(eTransactionNeeded);
1750        return NO_ERROR;
1751    }
1752    return status_t(index);
1753}
1754
1755uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t /* flags */) {
1756    return android_atomic_release_load(&mTransactionFlags);
1757}
1758
1759uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
1760    return android_atomic_and(~flags, &mTransactionFlags) & flags;
1761}
1762
1763uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
1764    uint32_t old = android_atomic_or(flags, &mTransactionFlags);
1765    if ((old & flags)==0) { // wake the server up
1766        signalTransaction();
1767    }
1768    return old;
1769}
1770
1771void SurfaceFlinger::setTransactionState(
1772        const Vector<ComposerState>& state,
1773        const Vector<DisplayState>& displays,
1774        uint32_t flags)
1775{
1776    ATRACE_CALL();
1777    Mutex::Autolock _l(mStateLock);
1778    uint32_t transactionFlags = 0;
1779
1780    if (flags & eAnimation) {
1781        // For window updates that are part of an animation we must wait for
1782        // previous animation "frames" to be handled.
1783        while (mAnimTransactionPending) {
1784            status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
1785            if (CC_UNLIKELY(err != NO_ERROR)) {
1786                // just in case something goes wrong in SF, return to the
1787                // caller after a few seconds.
1788                ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
1789                        "waiting for previous animation frame");
1790                mAnimTransactionPending = false;
1791                break;
1792            }
1793        }
1794    }
1795
1796    size_t count = displays.size();
1797    for (size_t i=0 ; i<count ; i++) {
1798        const DisplayState& s(displays[i]);
1799        transactionFlags |= setDisplayStateLocked(s);
1800    }
1801
1802    count = state.size();
1803    for (size_t i=0 ; i<count ; i++) {
1804        const ComposerState& s(state[i]);
1805        // Here we need to check that the interface we're given is indeed
1806        // one of our own. A malicious client could give us a NULL
1807        // IInterface, or one of its own or even one of our own but a
1808        // different type. All these situations would cause us to crash.
1809        //
1810        // NOTE: it would be better to use RTTI as we could directly check
1811        // that we have a Client*. however, RTTI is disabled in Android.
1812        if (s.client != NULL) {
1813            sp<IBinder> binder = s.client->asBinder();
1814            if (binder != NULL) {
1815                String16 desc(binder->getInterfaceDescriptor());
1816                if (desc == ISurfaceComposerClient::descriptor) {
1817                    sp<Client> client( static_cast<Client *>(s.client.get()) );
1818                    transactionFlags |= setClientStateLocked(client, s.state);
1819                }
1820            }
1821        }
1822    }
1823
1824    if (transactionFlags) {
1825        // this triggers the transaction
1826        setTransactionFlags(transactionFlags);
1827
1828        // if this is a synchronous transaction, wait for it to take effect
1829        // before returning.
1830        if (flags & eSynchronous) {
1831            mTransactionPending = true;
1832        }
1833        if (flags & eAnimation) {
1834            mAnimTransactionPending = true;
1835        }
1836        while (mTransactionPending) {
1837            status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
1838            if (CC_UNLIKELY(err != NO_ERROR)) {
1839                // just in case something goes wrong in SF, return to the
1840                // called after a few seconds.
1841                ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
1842                mTransactionPending = false;
1843                break;
1844            }
1845        }
1846    }
1847}
1848
1849uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
1850{
1851    ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
1852    if (dpyIdx < 0)
1853        return 0;
1854
1855    uint32_t flags = 0;
1856    DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
1857    if (disp.isValid()) {
1858        const uint32_t what = s.what;
1859        if (what & DisplayState::eSurfaceChanged) {
1860            if (disp.surface->asBinder() != s.surface->asBinder()) {
1861                disp.surface = s.surface;
1862                flags |= eDisplayTransactionNeeded;
1863            }
1864        }
1865        if (what & DisplayState::eLayerStackChanged) {
1866            if (disp.layerStack != s.layerStack) {
1867                disp.layerStack = s.layerStack;
1868                flags |= eDisplayTransactionNeeded;
1869            }
1870        }
1871        if (what & DisplayState::eDisplayProjectionChanged) {
1872            if (disp.orientation != s.orientation) {
1873                disp.orientation = s.orientation;
1874                flags |= eDisplayTransactionNeeded;
1875            }
1876            if (disp.frame != s.frame) {
1877                disp.frame = s.frame;
1878                flags |= eDisplayTransactionNeeded;
1879            }
1880            if (disp.viewport != s.viewport) {
1881                disp.viewport = s.viewport;
1882                flags |= eDisplayTransactionNeeded;
1883            }
1884        }
1885    }
1886    return flags;
1887}
1888
1889uint32_t SurfaceFlinger::setClientStateLocked(
1890        const sp<Client>& client,
1891        const layer_state_t& s)
1892{
1893    uint32_t flags = 0;
1894    sp<Layer> layer(client->getLayerUser(s.surface));
1895    if (layer != 0) {
1896        const uint32_t what = s.what;
1897        if (what & layer_state_t::ePositionChanged) {
1898            if (layer->setPosition(s.x, s.y))
1899                flags |= eTraversalNeeded;
1900        }
1901        if (what & layer_state_t::eLayerChanged) {
1902            // NOTE: index needs to be calculated before we update the state
1903            ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
1904            if (layer->setLayer(s.z)) {
1905                mCurrentState.layersSortedByZ.removeAt(idx);
1906                mCurrentState.layersSortedByZ.add(layer);
1907                // we need traversal (state changed)
1908                // AND transaction (list changed)
1909                flags |= eTransactionNeeded|eTraversalNeeded;
1910            }
1911        }
1912        if (what & layer_state_t::eSizeChanged) {
1913            if (layer->setSize(s.w, s.h)) {
1914                flags |= eTraversalNeeded;
1915            }
1916        }
1917        if (what & layer_state_t::eAlphaChanged) {
1918            if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
1919                flags |= eTraversalNeeded;
1920        }
1921        if (what & layer_state_t::eMatrixChanged) {
1922            if (layer->setMatrix(s.matrix))
1923                flags |= eTraversalNeeded;
1924        }
1925        if (what & layer_state_t::eTransparentRegionChanged) {
1926            if (layer->setTransparentRegionHint(s.transparentRegion))
1927                flags |= eTraversalNeeded;
1928        }
1929        if ((what & layer_state_t::eVisibilityChanged) ||
1930                (what & layer_state_t::eOpacityChanged)) {
1931            // TODO: should we just use an eFlagsChanged for this?
1932            if (layer->setFlags(s.flags, s.mask))
1933                flags |= eTraversalNeeded;
1934        }
1935        if (what & layer_state_t::eCropChanged) {
1936            if (layer->setCrop(s.crop))
1937                flags |= eTraversalNeeded;
1938        }
1939        if (what & layer_state_t::eLayerStackChanged) {
1940            // NOTE: index needs to be calculated before we update the state
1941            ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
1942            if (layer->setLayerStack(s.layerStack)) {
1943                mCurrentState.layersSortedByZ.removeAt(idx);
1944                mCurrentState.layersSortedByZ.add(layer);
1945                // we need traversal (state changed)
1946                // AND transaction (list changed)
1947                flags |= eTransactionNeeded|eTraversalNeeded;
1948            }
1949        }
1950    }
1951    return flags;
1952}
1953
1954status_t SurfaceFlinger::createLayer(
1955        const String8& name,
1956        const sp<Client>& client,
1957        uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
1958        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
1959{
1960    //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
1961    if (int32_t(w|h) < 0) {
1962        ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
1963                int(w), int(h));
1964        return BAD_VALUE;
1965    }
1966
1967    status_t result = NO_ERROR;
1968
1969    sp<Layer> layer;
1970
1971    switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
1972        case ISurfaceComposerClient::eFXSurfaceNormal:
1973            result = createNormalLayer(client,
1974                    name, w, h, flags, format,
1975                    handle, gbp, &layer);
1976            break;
1977        case ISurfaceComposerClient::eFXSurfaceDim:
1978            result = createDimLayer(client,
1979                    name, w, h, flags,
1980                    handle, gbp, &layer);
1981            break;
1982        default:
1983            result = BAD_VALUE;
1984            break;
1985    }
1986
1987    if (result == NO_ERROR) {
1988        addClientLayer(client, *handle, *gbp, layer);
1989        setTransactionFlags(eTransactionNeeded);
1990    }
1991    return result;
1992}
1993
1994status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
1995        const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
1996        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
1997{
1998    // initialize the surfaces
1999    switch (format) {
2000    case PIXEL_FORMAT_TRANSPARENT:
2001    case PIXEL_FORMAT_TRANSLUCENT:
2002        format = PIXEL_FORMAT_RGBA_8888;
2003        break;
2004    case PIXEL_FORMAT_OPAQUE:
2005        format = PIXEL_FORMAT_RGBX_8888;
2006        break;
2007    }
2008
2009    *outLayer = new Layer(this, client, name, w, h, flags);
2010    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2011    if (err == NO_ERROR) {
2012        *handle = (*outLayer)->getHandle();
2013        *gbp = (*outLayer)->getProducer();
2014    }
2015
2016    ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2017    return err;
2018}
2019
2020status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2021        const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2022        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2023{
2024    *outLayer = new LayerDim(this, client, name, w, h, flags);
2025    *handle = (*outLayer)->getHandle();
2026    *gbp = (*outLayer)->getProducer();
2027    return NO_ERROR;
2028}
2029
2030status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2031{
2032    // called by the window manager when it wants to remove a Layer
2033    status_t err = NO_ERROR;
2034    sp<Layer> l(client->getLayerUser(handle));
2035    if (l != NULL) {
2036        err = removeLayer(l);
2037        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2038                "error removing layer=%p (%s)", l.get(), strerror(-err));
2039    }
2040    return err;
2041}
2042
2043status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2044{
2045    // called by ~LayerCleaner() when all references to the IBinder (handle)
2046    // are gone
2047    status_t err = NO_ERROR;
2048    sp<Layer> l(layer.promote());
2049    if (l != NULL) {
2050        err = removeLayer(l);
2051        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2052                "error removing layer=%p (%s)", l.get(), strerror(-err));
2053    }
2054    return err;
2055}
2056
2057// ---------------------------------------------------------------------------
2058
2059void SurfaceFlinger::onInitializeDisplays() {
2060    // reset screen orientation and use primary layer stack
2061    Vector<ComposerState> state;
2062    Vector<DisplayState> displays;
2063    DisplayState d;
2064    d.what = DisplayState::eDisplayProjectionChanged |
2065             DisplayState::eLayerStackChanged;
2066    d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2067    d.layerStack = 0;
2068    d.orientation = DisplayState::eOrientationDefault;
2069    d.frame.makeInvalid();
2070    d.viewport.makeInvalid();
2071    displays.add(d);
2072    setTransactionState(state, displays, 0);
2073    onScreenAcquired(getDefaultDisplayDevice());
2074
2075    const nsecs_t period =
2076            getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2077    mAnimFrameTracker.setDisplayRefreshPeriod(period);
2078}
2079
2080void SurfaceFlinger::initializeDisplays() {
2081    class MessageScreenInitialized : public MessageBase {
2082        SurfaceFlinger* flinger;
2083    public:
2084        MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2085        virtual bool handler() {
2086            flinger->onInitializeDisplays();
2087            return true;
2088        }
2089    };
2090    sp<MessageBase> msg = new MessageScreenInitialized(this);
2091    postMessageAsync(msg);  // we may be called from main thread, use async message
2092}
2093
2094
2095void SurfaceFlinger::onScreenAcquired(const sp<const DisplayDevice>& hw) {
2096    ALOGD("Screen acquired, type=%d flinger=%p", hw->getDisplayType(), this);
2097    if (hw->isScreenAcquired()) {
2098        // this is expected, e.g. when power manager wakes up during boot
2099        ALOGD(" screen was previously acquired");
2100        return;
2101    }
2102
2103    hw->acquireScreen();
2104    int32_t type = hw->getDisplayType();
2105    if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2106        // built-in display, tell the HWC
2107        getHwComposer().acquire(type);
2108
2109        if (type == DisplayDevice::DISPLAY_PRIMARY) {
2110            // FIXME: eventthread only knows about the main display right now
2111            mEventThread->onScreenAcquired();
2112
2113            resyncToHardwareVsync(true);
2114        }
2115    }
2116    mVisibleRegionsDirty = true;
2117    repaintEverything();
2118}
2119
2120void SurfaceFlinger::onScreenReleased(const sp<const DisplayDevice>& hw) {
2121    ALOGD("Screen released, type=%d flinger=%p", hw->getDisplayType(), this);
2122    if (!hw->isScreenAcquired()) {
2123        ALOGD(" screen was previously released");
2124        return;
2125    }
2126
2127    hw->releaseScreen();
2128    int32_t type = hw->getDisplayType();
2129    if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2130        if (type == DisplayDevice::DISPLAY_PRIMARY) {
2131            disableHardwareVsync(true); // also cancels any in-progress resync
2132
2133            // FIXME: eventthread only knows about the main display right now
2134            mEventThread->onScreenReleased();
2135        }
2136
2137        // built-in display, tell the HWC
2138        getHwComposer().release(type);
2139    }
2140    mVisibleRegionsDirty = true;
2141    // from this point on, SF will stop drawing on this display
2142}
2143
2144void SurfaceFlinger::unblank(const sp<IBinder>& display) {
2145    class MessageScreenAcquired : public MessageBase {
2146        SurfaceFlinger& mFlinger;
2147        sp<IBinder> mDisplay;
2148    public:
2149        MessageScreenAcquired(SurfaceFlinger& flinger,
2150                const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
2151        virtual bool handler() {
2152            const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2153            if (hw == NULL) {
2154                ALOGE("Attempt to unblank null display %p", mDisplay.get());
2155            } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2156                ALOGW("Attempt to unblank virtual display");
2157            } else {
2158                mFlinger.onScreenAcquired(hw);
2159            }
2160            return true;
2161        }
2162    };
2163    sp<MessageBase> msg = new MessageScreenAcquired(*this, display);
2164    postMessageSync(msg);
2165}
2166
2167void SurfaceFlinger::blank(const sp<IBinder>& display) {
2168    class MessageScreenReleased : public MessageBase {
2169        SurfaceFlinger& mFlinger;
2170        sp<IBinder> mDisplay;
2171    public:
2172        MessageScreenReleased(SurfaceFlinger& flinger,
2173                const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
2174        virtual bool handler() {
2175            const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2176            if (hw == NULL) {
2177                ALOGE("Attempt to blank null display %p", mDisplay.get());
2178            } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2179                ALOGW("Attempt to blank virtual display");
2180            } else {
2181                mFlinger.onScreenReleased(hw);
2182            }
2183            return true;
2184        }
2185    };
2186    sp<MessageBase> msg = new MessageScreenReleased(*this, display);
2187    postMessageSync(msg);
2188}
2189
2190// ---------------------------------------------------------------------------
2191
2192status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2193{
2194    String8 result;
2195
2196    IPCThreadState* ipc = IPCThreadState::self();
2197    const int pid = ipc->getCallingPid();
2198    const int uid = ipc->getCallingUid();
2199    if ((uid != AID_SHELL) &&
2200            !PermissionCache::checkPermission(sDump, pid, uid)) {
2201        result.appendFormat("Permission Denial: "
2202                "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2203    } else {
2204        // Try to get the main lock, but don't insist if we can't
2205        // (this would indicate SF is stuck, but we want to be able to
2206        // print something in dumpsys).
2207        int retry = 3;
2208        while (mStateLock.tryLock()<0 && --retry>=0) {
2209            usleep(1000000);
2210        }
2211        const bool locked(retry >= 0);
2212        if (!locked) {
2213            result.append(
2214                    "SurfaceFlinger appears to be unresponsive, "
2215                    "dumping anyways (no locks held)\n");
2216        }
2217
2218        bool dumpAll = true;
2219        size_t index = 0;
2220        size_t numArgs = args.size();
2221        if (numArgs) {
2222            if ((index < numArgs) &&
2223                    (args[index] == String16("--list"))) {
2224                index++;
2225                listLayersLocked(args, index, result);
2226                dumpAll = false;
2227            }
2228
2229            if ((index < numArgs) &&
2230                    (args[index] == String16("--latency"))) {
2231                index++;
2232                dumpStatsLocked(args, index, result);
2233                dumpAll = false;
2234            }
2235
2236            if ((index < numArgs) &&
2237                    (args[index] == String16("--latency-clear"))) {
2238                index++;
2239                clearStatsLocked(args, index, result);
2240                dumpAll = false;
2241            }
2242
2243            if ((index < numArgs) &&
2244                    (args[index] == String16("--dispsync"))) {
2245                index++;
2246                mPrimaryDispSync.dump(result);
2247                dumpAll = false;
2248            }
2249        }
2250
2251        if (dumpAll) {
2252            dumpAllLocked(args, index, result);
2253        }
2254
2255        if (locked) {
2256            mStateLock.unlock();
2257        }
2258    }
2259    write(fd, result.string(), result.size());
2260    return NO_ERROR;
2261}
2262
2263void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2264        size_t& /* index */, String8& result) const
2265{
2266    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2267    const size_t count = currentLayers.size();
2268    for (size_t i=0 ; i<count ; i++) {
2269        const sp<Layer>& layer(currentLayers[i]);
2270        result.appendFormat("%s\n", layer->getName().string());
2271    }
2272}
2273
2274void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2275        String8& result) const
2276{
2277    String8 name;
2278    if (index < args.size()) {
2279        name = String8(args[index]);
2280        index++;
2281    }
2282
2283    const nsecs_t period =
2284            getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2285    result.appendFormat("%" PRId64 "\n", period);
2286
2287    if (name.isEmpty()) {
2288        mAnimFrameTracker.dumpStats(result);
2289    } else {
2290        const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2291        const size_t count = currentLayers.size();
2292        for (size_t i=0 ; i<count ; i++) {
2293            const sp<Layer>& layer(currentLayers[i]);
2294            if (name == layer->getName()) {
2295                layer->dumpFrameStats(result);
2296            }
2297        }
2298    }
2299}
2300
2301void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2302        String8& /* result */)
2303{
2304    String8 name;
2305    if (index < args.size()) {
2306        name = String8(args[index]);
2307        index++;
2308    }
2309
2310    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2311    const size_t count = currentLayers.size();
2312    for (size_t i=0 ; i<count ; i++) {
2313        const sp<Layer>& layer(currentLayers[i]);
2314        if (name.isEmpty() || (name == layer->getName())) {
2315            layer->clearFrameStats();
2316        }
2317    }
2318
2319    mAnimFrameTracker.clearStats();
2320}
2321
2322// This should only be called from the main thread.  Otherwise it would need
2323// the lock and should use mCurrentState rather than mDrawingState.
2324void SurfaceFlinger::logFrameStats() {
2325    const LayerVector& drawingLayers = mDrawingState.layersSortedByZ;
2326    const size_t count = drawingLayers.size();
2327    for (size_t i=0 ; i<count ; i++) {
2328        const sp<Layer>& layer(drawingLayers[i]);
2329        layer->logFrameStats();
2330    }
2331
2332    mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2333}
2334
2335/*static*/ void SurfaceFlinger::appendSfConfigString(String8& result)
2336{
2337    static const char* config =
2338            " [sf"
2339#ifdef HAS_CONTEXT_PRIORITY
2340            " HAS_CONTEXT_PRIORITY"
2341#endif
2342#ifdef NEVER_DEFAULT_TO_ASYNC_MODE
2343            " NEVER_DEFAULT_TO_ASYNC_MODE"
2344#endif
2345#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
2346            " TARGET_DISABLE_TRIPLE_BUFFERING"
2347#endif
2348            "]";
2349    result.append(config);
2350}
2351
2352void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
2353        String8& result) const
2354{
2355    bool colorize = false;
2356    if (index < args.size()
2357            && (args[index] == String16("--color"))) {
2358        colorize = true;
2359        index++;
2360    }
2361
2362    Colorizer colorizer(colorize);
2363
2364    // figure out if we're stuck somewhere
2365    const nsecs_t now = systemTime();
2366    const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
2367    const nsecs_t inTransaction(mDebugInTransaction);
2368    nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
2369    nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
2370
2371    /*
2372     * Dump library configuration.
2373     */
2374
2375    colorizer.bold(result);
2376    result.append("Build configuration:");
2377    colorizer.reset(result);
2378    appendSfConfigString(result);
2379    appendUiConfigString(result);
2380    appendGuiConfigString(result);
2381    result.append("\n");
2382
2383    colorizer.bold(result);
2384    result.append("Sync configuration: ");
2385    colorizer.reset(result);
2386    result.append(SyncFeatures::getInstance().toString());
2387    result.append("\n");
2388
2389    colorizer.bold(result);
2390    result.append("DispSync configuration: ");
2391    colorizer.reset(result);
2392    result.appendFormat("app phase %"PRId64" ns, sf phase %"PRId64" ns, "
2393            "present offset %d ns (refresh %"PRId64" ns)",
2394        vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
2395        mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
2396    result.append("\n");
2397
2398    /*
2399     * Dump the visible layer list
2400     */
2401    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2402    const size_t count = currentLayers.size();
2403    colorizer.bold(result);
2404    result.appendFormat("Visible layers (count = %zu)\n", count);
2405    colorizer.reset(result);
2406    for (size_t i=0 ; i<count ; i++) {
2407        const sp<Layer>& layer(currentLayers[i]);
2408        layer->dump(result, colorizer);
2409    }
2410
2411    /*
2412     * Dump Display state
2413     */
2414
2415    colorizer.bold(result);
2416    result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
2417    colorizer.reset(result);
2418    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2419        const sp<const DisplayDevice>& hw(mDisplays[dpy]);
2420        hw->dump(result);
2421    }
2422
2423    /*
2424     * Dump SurfaceFlinger global state
2425     */
2426
2427    colorizer.bold(result);
2428    result.append("SurfaceFlinger global state:\n");
2429    colorizer.reset(result);
2430
2431    HWComposer& hwc(getHwComposer());
2432    sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2433
2434    colorizer.bold(result);
2435    result.appendFormat("EGL implementation : %s\n",
2436            eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
2437    colorizer.reset(result);
2438    result.appendFormat("%s\n",
2439            eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
2440
2441    mRenderEngine->dump(result);
2442
2443    hw->undefinedRegion.dump(result, "undefinedRegion");
2444    result.appendFormat("  orientation=%d, canDraw=%d\n",
2445            hw->getOrientation(), hw->canDraw());
2446    result.appendFormat(
2447            "  last eglSwapBuffers() time: %f us\n"
2448            "  last transaction time     : %f us\n"
2449            "  transaction-flags         : %08x\n"
2450            "  refresh-rate              : %f fps\n"
2451            "  x-dpi                     : %f\n"
2452            "  y-dpi                     : %f\n"
2453            "  gpu_to_cpu_unsupported    : %d\n"
2454            ,
2455            mLastSwapBufferTime/1000.0,
2456            mLastTransactionTime/1000.0,
2457            mTransactionFlags,
2458            1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
2459            hwc.getDpiX(HWC_DISPLAY_PRIMARY),
2460            hwc.getDpiY(HWC_DISPLAY_PRIMARY),
2461            !mGpuToCpuSupported);
2462
2463    result.appendFormat("  eglSwapBuffers time: %f us\n",
2464            inSwapBuffersDuration/1000.0);
2465
2466    result.appendFormat("  transaction time: %f us\n",
2467            inTransactionDuration/1000.0);
2468
2469    /*
2470     * VSYNC state
2471     */
2472    mEventThread->dump(result);
2473
2474    /*
2475     * Dump HWComposer state
2476     */
2477    colorizer.bold(result);
2478    result.append("h/w composer state:\n");
2479    colorizer.reset(result);
2480    result.appendFormat("  h/w composer %s and %s\n",
2481            hwc.initCheck()==NO_ERROR ? "present" : "not present",
2482                    (mDebugDisableHWC || mDebugRegion || mDaltonize
2483                            || mHasColorMatrix) ? "disabled" : "enabled");
2484    hwc.dump(result);
2485
2486    /*
2487     * Dump gralloc state
2488     */
2489    const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
2490    alloc.dump(result);
2491}
2492
2493const Vector< sp<Layer> >&
2494SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
2495    // Note: mStateLock is held here
2496    wp<IBinder> dpy;
2497    for (size_t i=0 ; i<mDisplays.size() ; i++) {
2498        if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
2499            dpy = mDisplays.keyAt(i);
2500            break;
2501        }
2502    }
2503    if (dpy == NULL) {
2504        ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
2505        // Just use the primary display so we have something to return
2506        dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
2507    }
2508    return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
2509}
2510
2511bool SurfaceFlinger::startDdmConnection()
2512{
2513    void* libddmconnection_dso =
2514            dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
2515    if (!libddmconnection_dso) {
2516        return false;
2517    }
2518    void (*DdmConnection_start)(const char* name);
2519    DdmConnection_start =
2520            (typeof DdmConnection_start)dlsym(libddmconnection_dso, "DdmConnection_start");
2521    if (!DdmConnection_start) {
2522        dlclose(libddmconnection_dso);
2523        return false;
2524    }
2525    (*DdmConnection_start)(getServiceName());
2526    return true;
2527}
2528
2529status_t SurfaceFlinger::onTransact(
2530    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2531{
2532    switch (code) {
2533        case CREATE_CONNECTION:
2534        case CREATE_DISPLAY:
2535        case SET_TRANSACTION_STATE:
2536        case BOOT_FINISHED:
2537        case BLANK:
2538        case UNBLANK:
2539        case CLEAR_ANIMATION_FRAME_STATS:
2540        case GET_ANIMATION_FRAME_STATS:
2541        {
2542            // codes that require permission check
2543            IPCThreadState* ipc = IPCThreadState::self();
2544            const int pid = ipc->getCallingPid();
2545            const int uid = ipc->getCallingUid();
2546            if ((uid != AID_GRAPHICS) &&
2547                    !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
2548                ALOGE("Permission Denial: "
2549                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2550                return PERMISSION_DENIED;
2551            }
2552            break;
2553        }
2554        case CAPTURE_SCREEN:
2555        {
2556            // codes that require permission check
2557            IPCThreadState* ipc = IPCThreadState::self();
2558            const int pid = ipc->getCallingPid();
2559            const int uid = ipc->getCallingUid();
2560            if ((uid != AID_GRAPHICS) &&
2561                    !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
2562                ALOGE("Permission Denial: "
2563                        "can't read framebuffer pid=%d, uid=%d", pid, uid);
2564                return PERMISSION_DENIED;
2565            }
2566            break;
2567        }
2568    }
2569
2570    status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
2571    if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
2572        CHECK_INTERFACE(ISurfaceComposer, data, reply);
2573        if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
2574            IPCThreadState* ipc = IPCThreadState::self();
2575            const int pid = ipc->getCallingPid();
2576            const int uid = ipc->getCallingUid();
2577            ALOGE("Permission Denial: "
2578                    "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2579            return PERMISSION_DENIED;
2580        }
2581        int n;
2582        switch (code) {
2583            case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
2584            case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
2585                return NO_ERROR;
2586            case 1002:  // SHOW_UPDATES
2587                n = data.readInt32();
2588                mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
2589                invalidateHwcGeometry();
2590                repaintEverything();
2591                return NO_ERROR;
2592            case 1004:{ // repaint everything
2593                repaintEverything();
2594                return NO_ERROR;
2595            }
2596            case 1005:{ // force transaction
2597                setTransactionFlags(
2598                        eTransactionNeeded|
2599                        eDisplayTransactionNeeded|
2600                        eTraversalNeeded);
2601                return NO_ERROR;
2602            }
2603            case 1006:{ // send empty update
2604                signalRefresh();
2605                return NO_ERROR;
2606            }
2607            case 1008:  // toggle use of hw composer
2608                n = data.readInt32();
2609                mDebugDisableHWC = n ? 1 : 0;
2610                invalidateHwcGeometry();
2611                repaintEverything();
2612                return NO_ERROR;
2613            case 1009:  // toggle use of transform hint
2614                n = data.readInt32();
2615                mDebugDisableTransformHint = n ? 1 : 0;
2616                invalidateHwcGeometry();
2617                repaintEverything();
2618                return NO_ERROR;
2619            case 1010:  // interrogate.
2620                reply->writeInt32(0);
2621                reply->writeInt32(0);
2622                reply->writeInt32(mDebugRegion);
2623                reply->writeInt32(0);
2624                reply->writeInt32(mDebugDisableHWC);
2625                return NO_ERROR;
2626            case 1013: {
2627                Mutex::Autolock _l(mStateLock);
2628                sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2629                reply->writeInt32(hw->getPageFlipCount());
2630                return NO_ERROR;
2631            }
2632            case 1014: {
2633                // daltonize
2634                n = data.readInt32();
2635                switch (n % 10) {
2636                    case 1: mDaltonizer.setType(Daltonizer::protanomaly);   break;
2637                    case 2: mDaltonizer.setType(Daltonizer::deuteranomaly); break;
2638                    case 3: mDaltonizer.setType(Daltonizer::tritanomaly);   break;
2639                }
2640                if (n >= 10) {
2641                    mDaltonizer.setMode(Daltonizer::correction);
2642                } else {
2643                    mDaltonizer.setMode(Daltonizer::simulation);
2644                }
2645                mDaltonize = n > 0;
2646                invalidateHwcGeometry();
2647                repaintEverything();
2648                return NO_ERROR;
2649            }
2650            case 1015: {
2651                // apply a color matrix
2652                n = data.readInt32();
2653                mHasColorMatrix = n ? 1 : 0;
2654                if (n) {
2655                    // color matrix is sent as mat3 matrix followed by vec3
2656                    // offset, then packed into a mat4 where the last row is
2657                    // the offset and extra values are 0
2658                    for (size_t i = 0 ; i < 4; i++) {
2659                      for (size_t j = 0; j < 4; j++) {
2660                          mColorMatrix[i][j] = data.readFloat();
2661                      }
2662                    }
2663                } else {
2664                    mColorMatrix = mat4();
2665                }
2666                invalidateHwcGeometry();
2667                repaintEverything();
2668                return NO_ERROR;
2669            }
2670            // This is an experimental interface
2671            // Needs to be shifted to proper binder interface when we productize
2672            case 1016: {
2673                n = data.readInt32();
2674                mPrimaryDispSync.setRefreshSkipCount(n);
2675                return NO_ERROR;
2676            }
2677        }
2678    }
2679    return err;
2680}
2681
2682void SurfaceFlinger::repaintEverything() {
2683    android_atomic_or(1, &mRepaintEverything);
2684    signalTransaction();
2685}
2686
2687// ---------------------------------------------------------------------------
2688// Capture screen into an IGraphiBufferProducer
2689// ---------------------------------------------------------------------------
2690
2691/* The code below is here to handle b/8734824
2692 *
2693 * We create a IGraphicBufferProducer wrapper that forwards all calls
2694 * to the calling binder thread, where they are executed. This allows
2695 * the calling thread to be reused (on the other side) and not
2696 * depend on having "enough" binder threads to handle the requests.
2697 *
2698 */
2699
2700class GraphicProducerWrapper : public BBinder, public MessageHandler {
2701    sp<IGraphicBufferProducer> impl;
2702    sp<Looper> looper;
2703    status_t result;
2704    bool exitPending;
2705    bool exitRequested;
2706    mutable Barrier barrier;
2707    volatile int32_t memoryBarrier;
2708    uint32_t code;
2709    Parcel const* data;
2710    Parcel* reply;
2711
2712    enum {
2713        MSG_API_CALL,
2714        MSG_EXIT
2715    };
2716
2717    /*
2718     * this is called by our "fake" BpGraphicBufferProducer. We package the
2719     * data and reply Parcel and forward them to the calling thread.
2720     */
2721    virtual status_t transact(uint32_t code,
2722            const Parcel& data, Parcel* reply, uint32_t /* flags */) {
2723        this->code = code;
2724        this->data = &data;
2725        this->reply = reply;
2726        android_atomic_acquire_store(0, &memoryBarrier);
2727        if (exitPending) {
2728            // if we've exited, we run the message synchronously right here
2729            handleMessage(Message(MSG_API_CALL));
2730        } else {
2731            barrier.close();
2732            looper->sendMessage(this, Message(MSG_API_CALL));
2733            barrier.wait();
2734        }
2735        return result;
2736    }
2737
2738    /*
2739     * here we run on the binder calling thread. All we've got to do is
2740     * call the real BpGraphicBufferProducer.
2741     */
2742    virtual void handleMessage(const Message& message) {
2743        android_atomic_release_load(&memoryBarrier);
2744        if (message.what == MSG_API_CALL) {
2745            result = impl->asBinder()->transact(code, data[0], reply);
2746            barrier.open();
2747        } else if (message.what == MSG_EXIT) {
2748            exitRequested = true;
2749        }
2750    }
2751
2752public:
2753    GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl) :
2754        impl(impl), looper(new Looper(true)), result(NO_ERROR),
2755        exitPending(false), exitRequested(false) {
2756    }
2757
2758    status_t waitForResponse() {
2759        do {
2760            looper->pollOnce(-1);
2761        } while (!exitRequested);
2762        return result;
2763    }
2764
2765    void exit(status_t result) {
2766        this->result = result;
2767        exitPending = true;
2768        looper->sendMessage(this, Message(MSG_EXIT));
2769    }
2770};
2771
2772
2773status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
2774        const sp<IGraphicBufferProducer>& producer,
2775        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
2776        uint32_t minLayerZ, uint32_t maxLayerZ,
2777        bool useIdentityTransform) {
2778
2779    if (CC_UNLIKELY(display == 0))
2780        return BAD_VALUE;
2781
2782    if (CC_UNLIKELY(producer == 0))
2783        return BAD_VALUE;
2784
2785    // if we have secure windows on this display, never allow the screen capture
2786    // unless the producer interface is local (i.e.: we can take a screenshot for
2787    // ourselves).
2788    if (!producer->asBinder()->localBinder()) {
2789        Mutex::Autolock _l(mStateLock);
2790        sp<const DisplayDevice> hw(getDisplayDevice(display));
2791        if (hw->getSecureLayerVisible()) {
2792            ALOGW("FB is protected: PERMISSION_DENIED");
2793            return PERMISSION_DENIED;
2794        }
2795    }
2796
2797    class MessageCaptureScreen : public MessageBase {
2798        SurfaceFlinger* flinger;
2799        sp<IBinder> display;
2800        sp<IGraphicBufferProducer> producer;
2801        Rect sourceCrop;
2802        uint32_t reqWidth, reqHeight;
2803        uint32_t minLayerZ,maxLayerZ;
2804        bool useIdentityTransform;
2805        status_t result;
2806    public:
2807        MessageCaptureScreen(SurfaceFlinger* flinger,
2808                const sp<IBinder>& display,
2809                const sp<IGraphicBufferProducer>& producer,
2810                Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
2811                uint32_t minLayerZ, uint32_t maxLayerZ,
2812                bool useIdentityTransform)
2813            : flinger(flinger), display(display), producer(producer),
2814              sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
2815              minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
2816              useIdentityTransform(useIdentityTransform),
2817              result(PERMISSION_DENIED)
2818        {
2819        }
2820        status_t getResult() const {
2821            return result;
2822        }
2823        virtual bool handler() {
2824            Mutex::Autolock _l(flinger->mStateLock);
2825            sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
2826            result = flinger->captureScreenImplLocked(hw, producer,
2827                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
2828                    useIdentityTransform);
2829            static_cast<GraphicProducerWrapper*>(producer->asBinder().get())->exit(result);
2830            return true;
2831        }
2832    };
2833
2834    // make sure to process transactions before screenshots -- a transaction
2835    // might already be pending but scheduled for VSYNC; this guarantees we
2836    // will handle it before the screenshot. When VSYNC finally arrives
2837    // the scheduled transaction will be a no-op. If no transactions are
2838    // scheduled at this time, this will end-up being a no-op as well.
2839    mEventQueue.invalidateTransactionNow();
2840
2841    // this creates a "fake" BBinder which will serve as a "fake" remote
2842    // binder to receive the marshaled calls and forward them to the
2843    // real remote (a BpGraphicBufferProducer)
2844    sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
2845
2846    // the asInterface() call below creates our "fake" BpGraphicBufferProducer
2847    // which does the marshaling work forwards to our "fake remote" above.
2848    sp<MessageBase> msg = new MessageCaptureScreen(this,
2849            display, IGraphicBufferProducer::asInterface( wrapper ),
2850            sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
2851            useIdentityTransform);
2852
2853    status_t res = postMessageAsync(msg);
2854    if (res == NO_ERROR) {
2855        res = wrapper->waitForResponse();
2856    }
2857    return res;
2858}
2859
2860
2861void SurfaceFlinger::renderScreenImplLocked(
2862        const sp<const DisplayDevice>& hw,
2863        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
2864        uint32_t minLayerZ, uint32_t maxLayerZ,
2865        bool yswap, bool useIdentityTransform)
2866{
2867    ATRACE_CALL();
2868    RenderEngine& engine(getRenderEngine());
2869
2870    // get screen geometry
2871    const uint32_t hw_w = hw->getWidth();
2872    const uint32_t hw_h = hw->getHeight();
2873    const bool filtering = reqWidth != hw_w || reqWidth != hw_h;
2874
2875    // if a default or invalid sourceCrop is passed in, set reasonable values
2876    if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
2877            !sourceCrop.isValid()) {
2878        sourceCrop.setLeftTop(Point(0, 0));
2879        sourceCrop.setRightBottom(Point(hw_w, hw_h));
2880    }
2881
2882    // ensure that sourceCrop is inside screen
2883    if (sourceCrop.left < 0) {
2884        ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
2885    }
2886    if (sourceCrop.right >= hw_w) {
2887        ALOGE("Invalid crop rect: r = %d (>= %d)", sourceCrop.right, hw_w);
2888    }
2889    if (sourceCrop.top < 0) {
2890        ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
2891    }
2892    if (sourceCrop.bottom >= hw_h) {
2893        ALOGE("Invalid crop rect: b = %d (>= %d)", sourceCrop.bottom, hw_h);
2894    }
2895
2896    // make sure to clear all GL error flags
2897    engine.checkErrors();
2898
2899    // set-up our viewport
2900    engine.setViewportAndProjection(reqWidth, reqHeight, sourceCrop, hw_h, yswap);
2901    engine.disableTexturing();
2902
2903    // redraw the screen entirely...
2904    engine.clearWithColor(0, 0, 0, 1);
2905
2906    const LayerVector& layers( mDrawingState.layersSortedByZ );
2907    const size_t count = layers.size();
2908    for (size_t i=0 ; i<count ; ++i) {
2909        const sp<Layer>& layer(layers[i]);
2910        const Layer::State& state(layer->getDrawingState());
2911        if (state.layerStack == hw->getLayerStack()) {
2912            if (state.z >= minLayerZ && state.z <= maxLayerZ) {
2913                if (layer->isVisible()) {
2914                    if (filtering) layer->setFiltering(true);
2915                    layer->draw(hw, useIdentityTransform);
2916                    if (filtering) layer->setFiltering(false);
2917                }
2918            }
2919        }
2920    }
2921
2922    // compositionComplete is needed for older driver
2923    hw->compositionComplete();
2924    hw->setViewportAndProjection();
2925}
2926
2927
2928status_t SurfaceFlinger::captureScreenImplLocked(
2929        const sp<const DisplayDevice>& hw,
2930        const sp<IGraphicBufferProducer>& producer,
2931        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
2932        uint32_t minLayerZ, uint32_t maxLayerZ,
2933        bool useIdentityTransform)
2934{
2935    ATRACE_CALL();
2936
2937    // get screen geometry
2938    const uint32_t hw_w = hw->getWidth();
2939    const uint32_t hw_h = hw->getHeight();
2940
2941    if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
2942        ALOGE("size mismatch (%d, %d) > (%d, %d)",
2943                reqWidth, reqHeight, hw_w, hw_h);
2944        return BAD_VALUE;
2945    }
2946
2947    reqWidth  = (!reqWidth)  ? hw_w : reqWidth;
2948    reqHeight = (!reqHeight) ? hw_h : reqHeight;
2949
2950    // create a surface (because we're a producer, and we need to
2951    // dequeue/queue a buffer)
2952    sp<Surface> sur = new Surface(producer, false);
2953    ANativeWindow* window = sur.get();
2954
2955    status_t result = NO_ERROR;
2956    if (native_window_api_connect(window, NATIVE_WINDOW_API_EGL) == NO_ERROR) {
2957        uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
2958                        GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
2959
2960        int err = 0;
2961        err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
2962        err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
2963        err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
2964        err |= native_window_set_usage(window, usage);
2965
2966        if (err == NO_ERROR) {
2967            ANativeWindowBuffer* buffer;
2968            /* TODO: Once we have the sync framework everywhere this can use
2969             * server-side waits on the fence that dequeueBuffer returns.
2970             */
2971            result = native_window_dequeue_buffer_and_wait(window,  &buffer);
2972            if (result == NO_ERROR) {
2973                // create an EGLImage from the buffer so we can later
2974                // turn it into a texture
2975                EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
2976                        EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
2977                if (image != EGL_NO_IMAGE_KHR) {
2978                    // this binds the given EGLImage as a framebuffer for the
2979                    // duration of this scope.
2980                    RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
2981                    if (imageBond.getStatus() == NO_ERROR) {
2982                        // this will in fact render into our dequeued buffer
2983                        // via an FBO, which means we didn't have to create
2984                        // an EGLSurface and therefore we're not
2985                        // dependent on the context's EGLConfig.
2986                        renderScreenImplLocked(hw, sourceCrop, reqWidth, reqHeight,
2987                                minLayerZ, maxLayerZ, true, useIdentityTransform);
2988
2989                        // Create a sync point and wait on it, so we know the buffer is
2990                        // ready before we pass it along.  We can't trivially call glFlush(),
2991                        // so we use a wait flag instead.
2992                        // TODO: pass a sync fd to queueBuffer() and let the consumer wait.
2993                        EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
2994                        if (sync != EGL_NO_SYNC_KHR) {
2995                            EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
2996                                    EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
2997                            EGLint eglErr = eglGetError();
2998                            eglDestroySyncKHR(mEGLDisplay, sync);
2999                            if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3000                                ALOGW("captureScreen: fence wait timed out");
3001                            } else {
3002                                ALOGW_IF(eglErr != EGL_SUCCESS,
3003                                        "captureScreen: error waiting on EGL fence: %#x", eglErr);
3004                            }
3005                        } else {
3006                            ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3007                            // not fatal
3008                        }
3009
3010                        if (DEBUG_SCREENSHOTS) {
3011                            uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3012                            getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3013                            checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3014                                    hw, minLayerZ, maxLayerZ);
3015                            delete [] pixels;
3016                        }
3017
3018                    } else {
3019                        ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3020                        result = INVALID_OPERATION;
3021                    }
3022                    // destroy our image
3023                    eglDestroyImageKHR(mEGLDisplay, image);
3024                } else {
3025                    result = BAD_VALUE;
3026                }
3027                window->queueBuffer(window, buffer, -1);
3028            }
3029        } else {
3030            result = BAD_VALUE;
3031        }
3032        native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3033    }
3034
3035    return result;
3036}
3037
3038void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
3039        const sp<const DisplayDevice>& hw, uint32_t minLayerZ, uint32_t maxLayerZ) {
3040    if (DEBUG_SCREENSHOTS) {
3041        for (size_t y=0 ; y<h ; y++) {
3042            uint32_t const * p = (uint32_t const *)vaddr + y*s;
3043            for (size_t x=0 ; x<w ; x++) {
3044                if (p[x] != 0xFF000000) return;
3045            }
3046        }
3047        ALOGE("*** we just took a black screenshot ***\n"
3048                "requested minz=%d, maxz=%d, layerStack=%d",
3049                minLayerZ, maxLayerZ, hw->getLayerStack());
3050        const LayerVector& layers( mDrawingState.layersSortedByZ );
3051        const size_t count = layers.size();
3052        for (size_t i=0 ; i<count ; ++i) {
3053            const sp<Layer>& layer(layers[i]);
3054            const Layer::State& state(layer->getDrawingState());
3055            const bool visible = (state.layerStack == hw->getLayerStack())
3056                                && (state.z >= minLayerZ && state.z <= maxLayerZ)
3057                                && (layer->isVisible());
3058            ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3059                    visible ? '+' : '-',
3060                            i, layer->getName().string(), state.layerStack, state.z,
3061                            layer->isVisible(), state.flags, state.alpha);
3062        }
3063    }
3064}
3065
3066// ---------------------------------------------------------------------------
3067
3068SurfaceFlinger::LayerVector::LayerVector() {
3069}
3070
3071SurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs)
3072    : SortedVector<sp<Layer> >(rhs) {
3073}
3074
3075int SurfaceFlinger::LayerVector::do_compare(const void* lhs,
3076    const void* rhs) const
3077{
3078    // sort layers per layer-stack, then by z-order and finally by sequence
3079    const sp<Layer>& l(*reinterpret_cast<const sp<Layer>*>(lhs));
3080    const sp<Layer>& r(*reinterpret_cast<const sp<Layer>*>(rhs));
3081
3082    uint32_t ls = l->getCurrentState().layerStack;
3083    uint32_t rs = r->getCurrentState().layerStack;
3084    if (ls != rs)
3085        return ls - rs;
3086
3087    uint32_t lz = l->getCurrentState().z;
3088    uint32_t rz = r->getCurrentState().z;
3089    if (lz != rz)
3090        return lz - rz;
3091
3092    return l->sequence - r->sequence;
3093}
3094
3095// ---------------------------------------------------------------------------
3096
3097SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
3098    : type(DisplayDevice::DISPLAY_ID_INVALID) {
3099}
3100
3101SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type)
3102    : type(type), layerStack(DisplayDevice::NO_LAYER_STACK), orientation(0) {
3103    viewport.makeInvalid();
3104    frame.makeInvalid();
3105}
3106
3107// ---------------------------------------------------------------------------
3108
3109}; // namespace android
3110
3111
3112#if defined(__gl_h_)
3113#error "don't include gl/gl.h in this file"
3114#endif
3115
3116#if defined(__gl2_h_)
3117#error "don't include gl2/gl2.h in this file"
3118#endif
3119