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