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