SurfaceFlinger.cpp revision a49126087b4494f4ef50873f3a3f6727265f6621
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 <stdlib.h>
20#include <stdio.h>
21#include <stdint.h>
22#include <unistd.h>
23#include <fcntl.h>
24#include <errno.h>
25#include <math.h>
26#include <limits.h>
27#include <sys/types.h>
28#include <sys/stat.h>
29#include <sys/ioctl.h>
30
31#include <cutils/log.h>
32#include <cutils/properties.h>
33
34#include <binder/IPCThreadState.h>
35#include <binder/IServiceManager.h>
36#include <binder/MemoryHeapBase.h>
37#include <binder/PermissionCache.h>
38
39#include <gui/IDisplayEventConnection.h>
40
41#include <utils/String8.h>
42#include <utils/String16.h>
43#include <utils/StopWatch.h>
44#include <utils/Trace.h>
45
46#include <ui/GraphicBufferAllocator.h>
47#include <ui/PixelFormat.h>
48
49#include <GLES/gl.h>
50
51#include "clz.h"
52#include "DdmConnection.h"
53#include "DisplayHardware.h"
54#include "Client.h"
55#include "EventThread.h"
56#include "GLExtensions.h"
57#include "Layer.h"
58#include "LayerDim.h"
59#include "LayerScreenshot.h"
60#include "SurfaceFlinger.h"
61
62#include "DisplayHardware/FramebufferSurface.h"
63#include "DisplayHardware/HWComposer.h"
64
65#include <private/android_filesystem_config.h>
66#include <private/gui/SharedBufferStack.h>
67#include <gui/BitTube.h>
68#include <gui/SurfaceTextureClient.h>
69
70#define EGL_VERSION_HW_ANDROID  0x3143
71
72#define DISPLAY_COUNT       1
73
74namespace android {
75// ---------------------------------------------------------------------------
76
77const String16 sHardwareTest("android.permission.HARDWARE_TEST");
78const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
79const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
80const String16 sDump("android.permission.DUMP");
81
82// ---------------------------------------------------------------------------
83
84SurfaceFlinger::SurfaceFlinger()
85    :   BnSurfaceComposer(), Thread(false),
86        mTransactionFlags(0),
87        mTransationPending(false),
88        mLayersRemoved(false),
89        mBootTime(systemTime()),
90        mVisibleRegionsDirty(false),
91        mHwWorkListDirty(false),
92        mElectronBeamAnimationMode(0),
93        mDebugRegion(0),
94        mDebugDDMS(0),
95        mDebugDisableHWC(0),
96        mDebugDisableTransformHint(0),
97        mDebugInSwapBuffers(0),
98        mLastSwapBufferTime(0),
99        mDebugInTransaction(0),
100        mLastTransactionTime(0),
101        mBootFinished(false),
102        mExternalDisplaySurface(EGL_NO_SURFACE)
103{
104    init();
105}
106
107void SurfaceFlinger::init()
108{
109    ALOGI("SurfaceFlinger is starting");
110
111    // debugging stuff...
112    char value[PROPERTY_VALUE_MAX];
113
114    property_get("debug.sf.showupdates", value, "0");
115    mDebugRegion = atoi(value);
116
117#ifdef DDMS_DEBUGGING
118    property_get("debug.sf.ddms", value, "0");
119    mDebugDDMS = atoi(value);
120    if (mDebugDDMS) {
121        DdmConnection::start(getServiceName());
122    }
123#else
124#warning "DDMS_DEBUGGING disabled"
125#endif
126
127    ALOGI_IF(mDebugRegion,       "showupdates enabled");
128    ALOGI_IF(mDebugDDMS,         "DDMS debugging enabled");
129}
130
131void SurfaceFlinger::onFirstRef()
132{
133    mEventQueue.init(this);
134
135    run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
136
137    // Wait for the main thread to be done with its initialization
138    mReadyToRunBarrier.wait();
139}
140
141
142SurfaceFlinger::~SurfaceFlinger()
143{
144    glDeleteTextures(1, &mWormholeTexName);
145    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
146    eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
147    eglTerminate(display);
148}
149
150void SurfaceFlinger::binderDied(const wp<IBinder>& who)
151{
152    // the window manager died on us. prepare its eulogy.
153
154    // reset screen orientation
155    Vector<ComposerState> state;
156    setTransactionState(state, eOrientationDefault, 0);
157
158    // restart the boot-animation
159    startBootAnim();
160}
161
162sp<IMemoryHeap> SurfaceFlinger::getCblk() const
163{
164    return mServerHeap;
165}
166
167sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
168{
169    sp<ISurfaceComposerClient> bclient;
170    sp<Client> client(new Client(this));
171    status_t err = client->initCheck();
172    if (err == NO_ERROR) {
173        bclient = client;
174    }
175    return bclient;
176}
177
178sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
179{
180    sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
181    return gba;
182}
183
184void SurfaceFlinger::bootFinished()
185{
186    const nsecs_t now = systemTime();
187    const nsecs_t duration = now - mBootTime;
188    ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
189    mBootFinished = true;
190
191    // wait patiently for the window manager death
192    const String16 name("window");
193    sp<IBinder> window(defaultServiceManager()->getService(name));
194    if (window != 0) {
195        window->linkToDeath(this);
196    }
197
198    // stop boot animation
199    // formerly we would just kill the process, but we now ask it to exit so it
200    // can choose where to stop the animation.
201    property_set("service.bootanim.exit", "1");
202}
203
204status_t SurfaceFlinger::selectConfigForPixelFormat(
205        EGLDisplay dpy,
206        EGLint const* attrs,
207        PixelFormat format,
208        EGLConfig* outConfig)
209{
210    EGLConfig config = NULL;
211    EGLint numConfigs = -1, n=0;
212    eglGetConfigs(dpy, NULL, 0, &numConfigs);
213    EGLConfig* const configs = new EGLConfig[numConfigs];
214    eglChooseConfig(dpy, attrs, configs, numConfigs, &n);
215    for (int i=0 ; i<n ; i++) {
216        EGLint nativeVisualId = 0;
217        eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId);
218        if (nativeVisualId>0 && format == nativeVisualId) {
219            *outConfig = configs[i];
220            delete [] configs;
221            return NO_ERROR;
222        }
223    }
224    delete [] configs;
225    return NAME_NOT_FOUND;
226}
227
228EGLConfig SurfaceFlinger::selectEGLConfig(EGLDisplay display, EGLint nativeVisualId) {
229    // select our EGLConfig. It must support EGL_RECORDABLE_ANDROID if
230    // it is to be used with WIFI displays
231    EGLConfig config;
232    EGLint dummy;
233    status_t err;
234    EGLint attribs[] = {
235            EGL_SURFACE_TYPE,           EGL_WINDOW_BIT,
236            EGL_RECORDABLE_ANDROID,     EGL_TRUE,
237            EGL_NONE
238    };
239    err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
240    if (err) {
241        // maybe we failed because of EGL_RECORDABLE_ANDROID
242        ALOGW("couldn't find an EGLConfig with EGL_RECORDABLE_ANDROID");
243        attribs[2] = EGL_NONE;
244        err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
245    }
246    ALOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
247    if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) {
248        ALOGW_IF(dummy == EGL_SLOW_CONFIG, "EGL_SLOW_CONFIG selected!");
249    }
250    return config;
251}
252
253EGLContext SurfaceFlinger::createGLContext(EGLDisplay display, EGLConfig config) {
254    // Also create our EGLContext
255    EGLint contextAttributes[] = {
256#ifdef EGL_IMG_context_priority
257#ifdef HAS_CONTEXT_PRIORITY
258#warning "using EGL_IMG_context_priority"
259            EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_HIGH_IMG,
260#endif
261#endif
262            EGL_NONE, EGL_NONE
263    };
264    EGLContext ctxt = eglCreateContext(display, config, NULL, contextAttributes);
265    ALOGE_IF(ctxt==EGL_NO_CONTEXT, "EGLContext creation failed");
266    return ctxt;
267}
268
269void SurfaceFlinger::initializeGL(EGLDisplay display, EGLSurface surface) {
270    EGLBoolean result = eglMakeCurrent(display, surface, surface, mEGLContext);
271    if (!result) {
272        ALOGE("Couldn't create a working GLES context. check logs. exiting...");
273        exit(0);
274    }
275
276    GLExtensions& extensions(GLExtensions::getInstance());
277    extensions.initWithGLStrings(
278            glGetString(GL_VENDOR),
279            glGetString(GL_RENDERER),
280            glGetString(GL_VERSION),
281            glGetString(GL_EXTENSIONS),
282            eglQueryString(display, EGL_VENDOR),
283            eglQueryString(display, EGL_VERSION),
284            eglQueryString(display, EGL_EXTENSIONS));
285
286    EGLint w, h;
287    eglQuerySurface(display, surface, EGL_WIDTH,  &w);
288    eglQuerySurface(display, surface, EGL_HEIGHT, &h);
289
290    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
291    glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims);
292
293    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
294    glPixelStorei(GL_PACK_ALIGNMENT, 4);
295    glEnableClientState(GL_VERTEX_ARRAY);
296    glShadeModel(GL_FLAT);
297    glDisable(GL_DITHER);
298    glDisable(GL_CULL_FACE);
299
300    struct pack565 {
301        inline uint16_t operator() (int r, int g, int b) const {
302            return (r<<11)|(g<<5)|b;
303        }
304    } pack565;
305
306    const uint16_t g0 = pack565(0x0F,0x1F,0x0F);
307    const uint16_t g1 = pack565(0x17,0x2f,0x17);
308    const uint16_t wormholeTexData[4] = { g0, g1, g1, g0 };
309    glGenTextures(1, &mWormholeTexName);
310    glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
311    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
312    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
313    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
314    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
315    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,
316            GL_RGB, GL_UNSIGNED_SHORT_5_6_5, wormholeTexData);
317
318    const uint16_t protTexData[] = { pack565(0x03, 0x03, 0x03) };
319    glGenTextures(1, &mProtectedTexName);
320    glBindTexture(GL_TEXTURE_2D, mProtectedTexName);
321    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
322    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
323    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
324    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
325    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0,
326            GL_RGB, GL_UNSIGNED_SHORT_5_6_5, protTexData);
327
328    glViewport(0, 0, w, h);
329    glMatrixMode(GL_PROJECTION);
330    glLoadIdentity();
331    // put the origin in the left-bottom corner
332    glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h
333
334    // print some debugging info
335    EGLint r,g,b,a;
336    eglGetConfigAttrib(display, mEGLConfig, EGL_RED_SIZE,   &r);
337    eglGetConfigAttrib(display, mEGLConfig, EGL_GREEN_SIZE, &g);
338    eglGetConfigAttrib(display, mEGLConfig, EGL_BLUE_SIZE,  &b);
339    eglGetConfigAttrib(display, mEGLConfig, EGL_ALPHA_SIZE, &a);
340    ALOGI("EGL informations:");
341    ALOGI("vendor    : %s", extensions.getEglVendor());
342    ALOGI("version   : %s", extensions.getEglVersion());
343    ALOGI("extensions: %s", extensions.getEglExtension());
344    ALOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
345    ALOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, mEGLConfig);
346    ALOGI("OpenGL ES informations:");
347    ALOGI("vendor    : %s", extensions.getVendor());
348    ALOGI("renderer  : %s", extensions.getRenderer());
349    ALOGI("version   : %s", extensions.getVersion());
350    ALOGI("extensions: %s", extensions.getExtension());
351    ALOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
352    ALOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]);
353}
354
355surface_flinger_cblk_t* SurfaceFlinger::getControlBlock() const {
356    return mServerCblk;
357}
358
359status_t SurfaceFlinger::readyToRun()
360{
361    ALOGI(  "SurfaceFlinger's main thread ready to run. "
362            "Initializing graphics H/W...");
363
364    // create the shared control-block
365    mServerHeap = new MemoryHeapBase(4096,
366            MemoryHeapBase::READ_ONLY, "SurfaceFlinger read-only heap");
367    ALOGE_IF(mServerHeap==0, "can't create shared memory dealer");
368    mServerCblk = static_cast<surface_flinger_cblk_t*>(mServerHeap->getBase());
369    ALOGE_IF(mServerCblk==0, "can't get to shared control block's address");
370    new(mServerCblk) surface_flinger_cblk_t;
371
372
373    // initialize EGL
374    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
375    eglInitialize(display, NULL, NULL);
376
377    // Initialize the main display
378    // create native window to main display
379    sp<FramebufferSurface> anw = FramebufferSurface::create();
380    ANativeWindow* const window = anw.get();
381    if (!window) {
382        ALOGE("Display subsystem failed to initialize. check logs. exiting...");
383        exit(0);
384    }
385
386    // initialize the config and context
387    int format;
388    window->query(window, NATIVE_WINDOW_FORMAT, &format);
389    mEGLConfig  = selectEGLConfig(display, format);
390    mEGLContext = createGLContext(display, mEGLConfig);
391
392    // initialize our main display hardware
393    DisplayHardware* const hw = new DisplayHardware(this, 0, anw, mEGLConfig);
394    mDisplayHardwares[0] = hw;
395
396    //  initialize OpenGL ES
397    EGLSurface surface = hw->getEGLSurface();
398    initializeGL(display, surface);
399
400    // start the EventThread
401    mEventThread = new EventThread(this);
402    mEventQueue.setEventThread(mEventThread);
403
404    // We're now ready to accept clients...
405    mReadyToRunBarrier.open();
406
407    // start boot animation
408    startBootAnim();
409
410    return NO_ERROR;
411}
412
413void SurfaceFlinger::startBootAnim() {
414    // start boot animation
415    property_set("service.bootanim.exit", "0");
416    property_set("ctl.start", "bootanim");
417}
418
419uint32_t SurfaceFlinger::getMaxTextureSize() const {
420    return mMaxTextureSize;
421}
422
423uint32_t SurfaceFlinger::getMaxViewportDims() const {
424    return mMaxViewportDims[0] < mMaxViewportDims[1] ?
425            mMaxViewportDims[0] : mMaxViewportDims[1];
426}
427
428// ----------------------------------------------------------------------------
429
430bool SurfaceFlinger::authenticateSurfaceTexture(
431        const sp<ISurfaceTexture>& surfaceTexture) const {
432    Mutex::Autolock _l(mStateLock);
433    sp<IBinder> surfaceTextureBinder(surfaceTexture->asBinder());
434
435    // Check the visible layer list for the ISurface
436    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
437    size_t count = currentLayers.size();
438    for (size_t i=0 ; i<count ; i++) {
439        const sp<LayerBase>& layer(currentLayers[i]);
440        sp<LayerBaseClient> lbc(layer->getLayerBaseClient());
441        if (lbc != NULL) {
442            wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder();
443            if (lbcBinder == surfaceTextureBinder) {
444                return true;
445            }
446        }
447    }
448
449    // Check the layers in the purgatory.  This check is here so that if a
450    // SurfaceTexture gets destroyed before all the clients are done using it,
451    // the error will not be reported as "surface XYZ is not authenticated", but
452    // will instead fail later on when the client tries to use the surface,
453    // which should be reported as "surface XYZ returned an -ENODEV".  The
454    // purgatorized layers are no less authentic than the visible ones, so this
455    // should not cause any harm.
456    size_t purgatorySize =  mLayerPurgatory.size();
457    for (size_t i=0 ; i<purgatorySize ; i++) {
458        const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i));
459        sp<LayerBaseClient> lbc(layer->getLayerBaseClient());
460        if (lbc != NULL) {
461            wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder();
462            if (lbcBinder == surfaceTextureBinder) {
463                return true;
464            }
465        }
466    }
467
468    return false;
469}
470
471// ----------------------------------------------------------------------------
472
473sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
474    return mEventThread->createEventConnection();
475}
476
477void SurfaceFlinger::connectDisplay(const sp<ISurfaceTexture> display) {
478    const DisplayHardware& hw(getDefaultDisplayHardware());
479    EGLSurface result = EGL_NO_SURFACE;
480    EGLSurface old_surface = EGL_NO_SURFACE;
481    sp<SurfaceTextureClient> stc;
482
483    if (display != NULL) {
484        stc = new SurfaceTextureClient(display);
485        result = eglCreateWindowSurface(hw.getEGLDisplay(),
486                mEGLConfig, (EGLNativeWindowType)stc.get(), NULL);
487        ALOGE_IF(result == EGL_NO_SURFACE,
488                "eglCreateWindowSurface failed (ISurfaceTexture=%p)",
489                display.get());
490    }
491
492    { // scope for the lock
493        Mutex::Autolock _l(mStateLock);
494        old_surface = mExternalDisplaySurface;
495        mExternalDisplayNativeWindow = stc;
496        mExternalDisplaySurface = result;
497        ALOGD("mExternalDisplaySurface = %p", result);
498    }
499
500    if (old_surface != EGL_NO_SURFACE) {
501        // Note: EGL allows to destroy an object while its current
502        // it will fail to become current next time though.
503        eglDestroySurface(hw.getEGLDisplay(), old_surface);
504    }
505}
506
507EGLSurface SurfaceFlinger::getExternalDisplaySurface() const {
508    Mutex::Autolock _l(mStateLock);
509    return mExternalDisplaySurface;
510}
511
512// ----------------------------------------------------------------------------
513
514void SurfaceFlinger::waitForEvent() {
515    mEventQueue.waitMessage();
516}
517
518void SurfaceFlinger::signalTransaction() {
519    mEventQueue.invalidate();
520}
521
522void SurfaceFlinger::signalLayerUpdate() {
523    mEventQueue.invalidate();
524}
525
526void SurfaceFlinger::signalRefresh() {
527    mEventQueue.refresh();
528}
529
530status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
531        nsecs_t reltime, uint32_t flags) {
532    return mEventQueue.postMessage(msg, reltime);
533}
534
535status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
536        nsecs_t reltime, uint32_t flags) {
537    status_t res = mEventQueue.postMessage(msg, reltime);
538    if (res == NO_ERROR) {
539        msg->wait();
540    }
541    return res;
542}
543
544bool SurfaceFlinger::threadLoop() {
545    waitForEvent();
546    return true;
547}
548
549void SurfaceFlinger::onMessageReceived(int32_t what) {
550    ATRACE_CALL();
551    switch (what) {
552    case MessageQueue::INVALIDATE:
553        handleMessageTransaction();
554        handleMessageInvalidate();
555        signalRefresh();
556        break;
557    case MessageQueue::REFRESH:
558        handleMessageRefresh();
559        break;
560    }
561}
562
563void SurfaceFlinger::handleMessageTransaction() {
564    const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
565    uint32_t transactionFlags = peekTransactionFlags(mask);
566    if (transactionFlags) {
567        Region dirtyRegion;
568        dirtyRegion = handleTransaction(transactionFlags);
569        // XXX: dirtyRegion should be per screen
570        mDirtyRegion |= dirtyRegion;
571    }
572}
573
574void SurfaceFlinger::handleMessageInvalidate() {
575    Region dirtyRegion;
576    dirtyRegion = handlePageFlip();
577    // XXX: dirtyRegion should be per screen
578    mDirtyRegion |= dirtyRegion;
579}
580
581void SurfaceFlinger::handleMessageRefresh() {
582    handleRefresh();
583
584    if (mVisibleRegionsDirty) {
585        Region opaqueRegion;
586        Region dirtyRegion;
587        const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
588        computeVisibleRegions(currentLayers, dirtyRegion, opaqueRegion);
589        mDirtyRegion.orSelf(dirtyRegion);
590
591        /*
592         *  rebuild the visible layer list per screen
593         */
594
595        // TODO: iterate through all displays
596        DisplayHardware& hw(const_cast<DisplayHardware&>(getDisplayHardware(0)));
597
598        Vector< sp<LayerBase> > layersSortedByZ;
599        const size_t count = currentLayers.size();
600        for (size_t i=0 ; i<count ; i++) {
601            if (!currentLayers[i]->visibleRegion.isEmpty()) {
602                // TODO: also check that this layer is associated to this display
603                layersSortedByZ.add(currentLayers[i]);
604            }
605        }
606        hw.setVisibleLayersSortedByZ(layersSortedByZ);
607
608
609        // FIXME: mWormholeRegion needs to be calculated per screen
610        //const DisplayHardware& hw(getDefaultDisplayHardware()); // XXX: we can't keep that here
611        mWormholeRegion = Region(hw.getBounds()).subtract(
612                hw.getTransform().transform(opaqueRegion) );
613        mVisibleRegionsDirty = false;
614        invalidateHwcGeometry();
615    }
616
617
618    // XXX: dirtyRegion should be per screen, we should check all of them
619    if (mDirtyRegion.isEmpty()) {
620        return;
621    }
622
623    // TODO: iterate through all displays
624    const DisplayHardware& hw(getDisplayHardware(0));
625
626    // XXX: dirtyRegion should be per screen
627    // transform the dirty region into this screen's coordinate space
628    const Transform& planeTransform(hw.getTransform());
629    mDirtyRegion = planeTransform.transform(mDirtyRegion);
630    mDirtyRegion.orSelf(getAndClearInvalidateRegion());
631    mDirtyRegion.andSelf(hw.bounds());
632
633
634    if (CC_UNLIKELY(mHwWorkListDirty)) {
635        // build the h/w work list
636        handleWorkList(hw);
637    }
638
639    if (CC_LIKELY(hw.canDraw())) {
640        // repaint the framebuffer (if needed)
641        handleRepaint(hw);
642        // inform the h/w that we're done compositing
643        hw.compositionComplete();
644        postFramebuffer();
645    } else {
646        // pretend we did the post
647        hw.compositionComplete();
648    }
649
650    // render to the external display if we have one
651    EGLSurface externalDisplaySurface = getExternalDisplaySurface();
652    if (externalDisplaySurface != EGL_NO_SURFACE) {
653        EGLSurface cur = eglGetCurrentSurface(EGL_DRAW);
654        EGLBoolean success = eglMakeCurrent(eglGetCurrentDisplay(),
655                externalDisplaySurface, externalDisplaySurface,
656                eglGetCurrentContext());
657
658        ALOGE_IF(!success, "eglMakeCurrent -> external failed");
659
660        if (success) {
661            // redraw the screen entirely...
662            glDisable(GL_TEXTURE_EXTERNAL_OES);
663            glDisable(GL_TEXTURE_2D);
664            glClearColor(0,0,0,1);
665            glClear(GL_COLOR_BUFFER_BIT);
666            glMatrixMode(GL_MODELVIEW);
667            glLoadIdentity();
668
669            const Vector< sp<LayerBase> >& layers( hw.getVisibleLayersSortedByZ() );
670            const size_t count = layers.size();
671            for (size_t i=0 ; i<count ; ++i) {
672                const sp<LayerBase>& layer(layers[i]);
673                layer->drawForSreenShot(hw);
674            }
675
676            success = eglSwapBuffers(eglGetCurrentDisplay(), externalDisplaySurface);
677            ALOGE_IF(!success, "external display eglSwapBuffers failed");
678
679            hw.compositionComplete();
680        }
681
682        success = eglMakeCurrent(eglGetCurrentDisplay(),
683                cur, cur, eglGetCurrentContext());
684
685        ALOGE_IF(!success, "eglMakeCurrent -> internal failed");
686    }
687
688}
689
690void SurfaceFlinger::postFramebuffer()
691{
692    ATRACE_CALL();
693    // mSwapRegion can be empty here is some cases, for instance if a hidden
694    // or fully transparent window is updating.
695    // in that case, we need to flip anyways to not risk a deadlock with
696    // h/w composer.
697
698    const DisplayHardware& hw(getDefaultDisplayHardware());
699    HWComposer& hwc(hw.getHwComposer());
700    const Vector< sp<LayerBase> >& layers(hw.getVisibleLayersSortedByZ());
701    size_t numLayers = layers.size();
702    const nsecs_t now = systemTime();
703    mDebugInSwapBuffers = now;
704
705    if (hwc.initCheck() == NO_ERROR) {
706        HWComposer::LayerListIterator cur = hwc.begin();
707        const HWComposer::LayerListIterator end = hwc.end();
708        for (size_t i = 0; cur != end && i < numLayers; ++i, ++cur) {
709            if (cur->getCompositionType() == HWC_OVERLAY) {
710                layers[i]->setAcquireFence(*cur);
711            } else {
712                cur->setAcquireFenceFd(-1);
713            }
714        }
715    }
716
717    hw.flip(mSwapRegion);
718
719    if (hwc.initCheck() == NO_ERROR) {
720        HWComposer::LayerListIterator cur = hwc.begin();
721        const HWComposer::LayerListIterator end = hwc.end();
722        for (size_t i = 0; cur != end && i < numLayers; ++i, ++cur) {
723            layers[i]->onLayerDisplayed(&*cur);
724        }
725    } else {
726        for (size_t i = 0; i < numLayers; i++) {
727            layers[i]->onLayerDisplayed(NULL);
728        }
729    }
730
731    mLastSwapBufferTime = systemTime() - now;
732    mDebugInSwapBuffers = 0;
733    mSwapRegion.clear();
734}
735
736Region SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
737{
738    ATRACE_CALL();
739
740    Region dirtyRegion;
741
742    Mutex::Autolock _l(mStateLock);
743    const nsecs_t now = systemTime();
744    mDebugInTransaction = now;
745
746    // Here we're guaranteed that some transaction flags are set
747    // so we can call handleTransactionLocked() unconditionally.
748    // We call getTransactionFlags(), which will also clear the flags,
749    // with mStateLock held to guarantee that mCurrentState won't change
750    // until the transaction is committed.
751
752    const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
753    transactionFlags = getTransactionFlags(mask);
754    dirtyRegion = handleTransactionLocked(transactionFlags);
755
756    mLastTransactionTime = systemTime() - now;
757    mDebugInTransaction = 0;
758    invalidateHwcGeometry();
759    // here the transaction has been committed
760
761    return dirtyRegion;
762}
763
764Region SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
765{
766    Region dirtyRegion;
767    const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
768    const size_t count = currentLayers.size();
769
770    /*
771     * Traversal of the children
772     * (perform the transaction for each of them if needed)
773     */
774
775    const bool layersNeedTransaction = transactionFlags & eTraversalNeeded;
776    if (layersNeedTransaction) {
777        for (size_t i=0 ; i<count ; i++) {
778            const sp<LayerBase>& layer = currentLayers[i];
779            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
780            if (!trFlags) continue;
781
782            const uint32_t flags = layer->doTransaction(0);
783            if (flags & Layer::eVisibleRegion)
784                mVisibleRegionsDirty = true;
785        }
786    }
787
788    /*
789     * Perform our own transaction if needed
790     */
791
792    if (transactionFlags & eTransactionNeeded) {
793        if (mCurrentState.orientation != mDrawingState.orientation) {
794            // the orientation has changed, recompute all visible regions
795            // and invalidate everything.
796
797            const int dpy = 0; // TODO: should be a parameter
798            DisplayHardware& hw(const_cast<DisplayHardware&>(getDisplayHardware(dpy)));
799            const int orientation = mCurrentState.orientation;
800            hw.setOrientation(orientation);
801
802            // update the shared control block
803            volatile display_cblk_t* dcblk = mServerCblk->displays + dpy;
804            dcblk->orientation = orientation;
805            dcblk->w = hw.getUserWidth();
806            dcblk->h = hw.getUserHeight();
807
808            // FIXME: mVisibleRegionsDirty & mDirtyRegion should this be per DisplayHardware?
809            mVisibleRegionsDirty = true;
810            mDirtyRegion.set(hw.bounds());
811        }
812
813        if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {
814            // layers have been added
815            mVisibleRegionsDirty = true;
816        }
817
818        // some layers might have been removed, so
819        // we need to update the regions they're exposing.
820        if (mLayersRemoved) {
821            mLayersRemoved = false;
822            mVisibleRegionsDirty = true;
823            const LayerVector& previousLayers(mDrawingState.layersSortedByZ);
824            const size_t count = previousLayers.size();
825            for (size_t i=0 ; i<count ; i++) {
826                const sp<LayerBase>& layer(previousLayers[i]);
827                if (currentLayers.indexOf( layer ) < 0) {
828                    // this layer is not visible anymore
829                    // TODO: we could traverse the tree from front to back and compute the actual visible region
830                    // TODO: we could cache the transformed region
831                    Layer::State front(layer->drawingState());
832                    Region visibleReg = front.transform.transform(
833                            Region(Rect(front.active.w, front.active.h)));
834                    dirtyRegion.orSelf(visibleReg);
835                }
836            }
837        }
838    }
839
840    commitTransaction();
841    return dirtyRegion;
842}
843
844void SurfaceFlinger::commitTransaction()
845{
846    if (!mLayersPendingRemoval.isEmpty()) {
847        // Notify removed layers now that they can't be drawn from
848        for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
849            mLayersPendingRemoval[i]->onRemoved();
850        }
851        mLayersPendingRemoval.clear();
852    }
853
854    mDrawingState = mCurrentState;
855    mTransationPending = false;
856    mTransactionCV.broadcast();
857}
858
859void SurfaceFlinger::computeVisibleRegions(
860    const LayerVector& currentLayers, Region& dirtyRegion, Region& opaqueRegion)
861{
862    ATRACE_CALL();
863
864    Region aboveOpaqueLayers;
865    Region aboveCoveredLayers;
866    Region dirty;
867
868    dirtyRegion.clear();
869
870    size_t i = currentLayers.size();
871    while (i--) {
872        const sp<LayerBase>& layer = currentLayers[i];
873
874        // start with the whole surface at its current location
875        const Layer::State& s(layer->drawingState());
876
877        /*
878         * opaqueRegion: area of a surface that is fully opaque.
879         */
880        Region opaqueRegion;
881
882        /*
883         * visibleRegion: area of a surface that is visible on screen
884         * and not fully transparent. This is essentially the layer's
885         * footprint minus the opaque regions above it.
886         * Areas covered by a translucent surface are considered visible.
887         */
888        Region visibleRegion;
889
890        /*
891         * coveredRegion: area of a surface that is covered by all
892         * visible regions above it (which includes the translucent areas).
893         */
894        Region coveredRegion;
895
896
897        // handle hidden surfaces by setting the visible region to empty
898        if (CC_LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
899            const bool translucent = !layer->isOpaque();
900            Rect bounds(layer->computeBounds());
901            visibleRegion.set(bounds);
902            if (!visibleRegion.isEmpty()) {
903                // Remove the transparent area from the visible region
904                if (translucent) {
905                    Region transparentRegionScreen;
906                    const Transform tr(s.transform);
907                    if (tr.transformed()) {
908                        if (tr.preserveRects()) {
909                            // transform the transparent region
910                            transparentRegionScreen = tr.transform(s.transparentRegion);
911                        } else {
912                            // transformation too complex, can't do the
913                            // transparent region optimization.
914                            transparentRegionScreen.clear();
915                        }
916                    } else {
917                        transparentRegionScreen = s.transparentRegion;
918                    }
919                    visibleRegion.subtractSelf(transparentRegionScreen);
920                }
921
922                // compute the opaque region
923                const int32_t layerOrientation = s.transform.getOrientation();
924                if (s.alpha==255 && !translucent &&
925                        ((layerOrientation & Transform::ROT_INVALID) == false)) {
926                    // the opaque region is the layer's footprint
927                    opaqueRegion = visibleRegion;
928                }
929            }
930        }
931
932        // Clip the covered region to the visible region
933        coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
934
935        // Update aboveCoveredLayers for next (lower) layer
936        aboveCoveredLayers.orSelf(visibleRegion);
937
938        // subtract the opaque region covered by the layers above us
939        visibleRegion.subtractSelf(aboveOpaqueLayers);
940
941        // compute this layer's dirty region
942        if (layer->contentDirty) {
943            // we need to invalidate the whole region
944            dirty = visibleRegion;
945            // as well, as the old visible region
946            dirty.orSelf(layer->visibleRegion);
947            layer->contentDirty = false;
948        } else {
949            /* compute the exposed region:
950             *   the exposed region consists of two components:
951             *   1) what's VISIBLE now and was COVERED before
952             *   2) what's EXPOSED now less what was EXPOSED before
953             *
954             * note that (1) is conservative, we start with the whole
955             * visible region but only keep what used to be covered by
956             * something -- which mean it may have been exposed.
957             *
958             * (2) handles areas that were not covered by anything but got
959             * exposed because of a resize.
960             */
961            const Region newExposed = visibleRegion - coveredRegion;
962            const Region oldVisibleRegion = layer->visibleRegion;
963            const Region oldCoveredRegion = layer->coveredRegion;
964            const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
965            dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
966        }
967        dirty.subtractSelf(aboveOpaqueLayers);
968
969        // accumulate to the screen dirty region
970        dirtyRegion.orSelf(dirty);
971
972        // Update aboveOpaqueLayers for next (lower) layer
973        aboveOpaqueLayers.orSelf(opaqueRegion);
974
975        // Store the visible region is screen space
976        layer->setVisibleRegion(visibleRegion);
977        layer->setCoveredRegion(coveredRegion);
978    }
979
980    opaqueRegion = aboveOpaqueLayers;
981}
982
983Region SurfaceFlinger::handlePageFlip()
984{
985    ATRACE_CALL();
986    Region dirtyRegion;
987
988    const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
989
990    bool visibleRegions = false;
991    const size_t count = currentLayers.size();
992    sp<LayerBase> const* layers = currentLayers.array();
993    for (size_t i=0 ; i<count ; i++) {
994        const sp<LayerBase>& layer(layers[i]);
995        dirtyRegion.orSelf( layer->latchBuffer(visibleRegions) );
996    }
997
998    mVisibleRegionsDirty |= visibleRegions;
999
1000    return dirtyRegion;
1001}
1002
1003void SurfaceFlinger::invalidateHwcGeometry()
1004{
1005    mHwWorkListDirty = true;
1006}
1007
1008void SurfaceFlinger::handleRefresh()
1009{
1010    bool needInvalidate = false;
1011    const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
1012    const size_t count = currentLayers.size();
1013    for (size_t i=0 ; i<count ; i++) {
1014        const sp<LayerBase>& layer(currentLayers[i]);
1015        if (layer->onPreComposition()) {
1016            needInvalidate = true;
1017        }
1018    }
1019    if (needInvalidate) {
1020        signalLayerUpdate();
1021    }
1022}
1023
1024
1025void SurfaceFlinger::handleWorkList(const DisplayHardware& hw)
1026{
1027    mHwWorkListDirty = false;
1028    HWComposer& hwc(hw.getHwComposer());
1029    if (hwc.initCheck() == NO_ERROR) {
1030        const Vector< sp<LayerBase> >& currentLayers(hw.getVisibleLayersSortedByZ());
1031        const size_t count = currentLayers.size();
1032        hwc.createWorkList(count);
1033
1034        HWComposer::LayerListIterator cur = hwc.begin();
1035        const HWComposer::LayerListIterator end = hwc.end();
1036        for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1037            currentLayers[i]->setGeometry(hw, *cur);
1038            if (mDebugDisableHWC || mDebugRegion) {
1039                cur->setSkip(true);
1040            }
1041        }
1042    }
1043}
1044
1045void SurfaceFlinger::handleRepaint(const DisplayHardware& hw)
1046{
1047    ATRACE_CALL();
1048
1049    // compute the invalid region
1050    mSwapRegion.orSelf(mDirtyRegion);
1051
1052    if (CC_UNLIKELY(mDebugRegion)) {
1053        debugFlashRegions(hw);
1054    }
1055
1056    // set the frame buffer
1057    glMatrixMode(GL_MODELVIEW);
1058    glLoadIdentity();
1059
1060    uint32_t flags = hw.getFlags();
1061    if (flags & DisplayHardware::SWAP_RECTANGLE) {
1062        // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1063        // takes a rectangle, we must make sure to update that whole
1064        // rectangle in that case
1065        mDirtyRegion.set(mSwapRegion.bounds());
1066    } else {
1067        if (flags & DisplayHardware::PARTIAL_UPDATES) {
1068            // We need to redraw the rectangle that will be updated
1069            // (pushed to the framebuffer).
1070            // This is needed because PARTIAL_UPDATES only takes one
1071            // rectangle instead of a region (see DisplayHardware::flip())
1072            mDirtyRegion.set(mSwapRegion.bounds());
1073        } else {
1074            // we need to redraw everything (the whole screen)
1075            mDirtyRegion.set(hw.bounds());
1076            mSwapRegion = mDirtyRegion;
1077        }
1078    }
1079
1080    setupHardwareComposer(hw);
1081    composeSurfaces(hw, mDirtyRegion);
1082
1083    // update the swap region and clear the dirty region
1084    mSwapRegion.orSelf(mDirtyRegion);
1085    mDirtyRegion.clear();
1086}
1087
1088void SurfaceFlinger::setupHardwareComposer(const DisplayHardware& hw)
1089{
1090    HWComposer& hwc(hw.getHwComposer());
1091    HWComposer::LayerListIterator cur = hwc.begin();
1092    const HWComposer::LayerListIterator end = hwc.end();
1093    if (cur == end) {
1094        return;
1095    }
1096
1097    const Vector< sp<LayerBase> >& layers(hw.getVisibleLayersSortedByZ());
1098    size_t count = layers.size();
1099
1100    ALOGE_IF(hwc.getNumLayers() != count,
1101            "HAL number of layers (%d) doesn't match surfaceflinger (%d)",
1102            hwc.getNumLayers(), count);
1103
1104    // just to be extra-safe, use the smallest count
1105    if (hwc.initCheck() == NO_ERROR) {
1106        count = count < hwc.getNumLayers() ? count : hwc.getNumLayers();
1107    }
1108
1109    /*
1110     *  update the per-frame h/w composer data for each layer
1111     *  and build the transparent region of the FB
1112     */
1113    for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1114        const sp<LayerBase>& layer(layers[i]);
1115        layer->setPerFrameData(*cur);
1116    }
1117    status_t err = hwc.prepare();
1118    ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1119}
1120
1121void SurfaceFlinger::composeSurfaces(const DisplayHardware& hw, const Region& dirty)
1122{
1123    HWComposer& hwc(hw.getHwComposer());
1124    HWComposer::LayerListIterator cur = hwc.begin();
1125    const HWComposer::LayerListIterator end = hwc.end();
1126
1127    const size_t fbLayerCount = hwc.getLayerCount(HWC_FRAMEBUFFER);
1128    if (cur==end || fbLayerCount) {
1129        // Never touch the framebuffer if we don't have any framebuffer layers
1130
1131        if (hwc.getLayerCount(HWC_OVERLAY)) {
1132            // when using overlays, we assume a fully transparent framebuffer
1133            // NOTE: we could reduce how much we need to clear, for instance
1134            // remove where there are opaque FB layers. however, on some
1135            // GPUs doing a "clean slate" glClear might be more efficient.
1136            // We'll revisit later if needed.
1137            glClearColor(0, 0, 0, 0);
1138            glClear(GL_COLOR_BUFFER_BIT);
1139        } else {
1140            // screen is already cleared here
1141            if (!mWormholeRegion.isEmpty()) {
1142                // can happen with SurfaceView
1143                drawWormhole();
1144            }
1145        }
1146
1147        /*
1148         * and then, render the layers targeted at the framebuffer
1149         */
1150
1151        const Vector< sp<LayerBase> >& layers(hw.getVisibleLayersSortedByZ());
1152        const size_t count = layers.size();
1153        const Transform& tr = hw.getTransform();
1154        for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1155            const sp<LayerBase>& layer(layers[i]);
1156            const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
1157            if (!clip.isEmpty()) {
1158                if (cur->getCompositionType() == HWC_OVERLAY) {
1159                    if (i && (cur->getHints() & HWC_HINT_CLEAR_FB)
1160                            && layer->isOpaque()) {
1161                        // never clear the very first layer since we're
1162                        // guaranteed the FB is already cleared
1163                        layer->clearWithOpenGL(hw, clip);
1164                    }
1165                    continue;
1166                }
1167                // render the layer
1168                layer->draw(hw, clip);
1169            }
1170        }
1171    }
1172}
1173
1174void SurfaceFlinger::debugFlashRegions(const DisplayHardware& hw)
1175{
1176    const uint32_t flags = hw.getFlags();
1177    const int32_t height = hw.getHeight();
1178    if (mSwapRegion.isEmpty()) {
1179        return;
1180    }
1181
1182    if (!(flags & DisplayHardware::SWAP_RECTANGLE)) {
1183        const Region repaint((flags & DisplayHardware::PARTIAL_UPDATES) ?
1184                mDirtyRegion.bounds() : hw.bounds());
1185        composeSurfaces(hw, repaint);
1186    }
1187
1188    glDisable(GL_TEXTURE_EXTERNAL_OES);
1189    glDisable(GL_TEXTURE_2D);
1190    glDisable(GL_BLEND);
1191
1192    static int toggle = 0;
1193    toggle = 1 - toggle;
1194    if (toggle) {
1195        glColor4f(1, 0, 1, 1);
1196    } else {
1197        glColor4f(1, 1, 0, 1);
1198    }
1199
1200    Region::const_iterator it = mDirtyRegion.begin();
1201    Region::const_iterator const end = mDirtyRegion.end();
1202    while (it != end) {
1203        const Rect& r = *it++;
1204        GLfloat vertices[][2] = {
1205                { r.left,  height - r.top },
1206                { r.left,  height - r.bottom },
1207                { r.right, height - r.bottom },
1208                { r.right, height - r.top }
1209        };
1210        glVertexPointer(2, GL_FLOAT, 0, vertices);
1211        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
1212    }
1213
1214    hw.flip(mSwapRegion);
1215
1216    if (mDebugRegion > 1)
1217        usleep(mDebugRegion * 1000);
1218}
1219
1220void SurfaceFlinger::drawWormhole() const
1221{
1222    const Region region(mWormholeRegion.intersect(mDirtyRegion));
1223    if (region.isEmpty())
1224        return;
1225
1226    glDisable(GL_TEXTURE_EXTERNAL_OES);
1227    glDisable(GL_TEXTURE_2D);
1228    glDisable(GL_BLEND);
1229    glColor4f(0,0,0,0);
1230
1231    GLfloat vertices[4][2];
1232    glVertexPointer(2, GL_FLOAT, 0, vertices);
1233    Region::const_iterator it = region.begin();
1234    Region::const_iterator const end = region.end();
1235    while (it != end) {
1236        const Rect& r = *it++;
1237        vertices[0][0] = r.left;
1238        vertices[0][1] = r.top;
1239        vertices[1][0] = r.right;
1240        vertices[1][1] = r.top;
1241        vertices[2][0] = r.right;
1242        vertices[2][1] = r.bottom;
1243        vertices[3][0] = r.left;
1244        vertices[3][1] = r.bottom;
1245        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
1246    }
1247}
1248
1249status_t SurfaceFlinger::addLayer(const sp<LayerBase>& layer)
1250{
1251    Mutex::Autolock _l(mStateLock);
1252    addLayer_l(layer);
1253    setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
1254    return NO_ERROR;
1255}
1256
1257status_t SurfaceFlinger::addLayer_l(const sp<LayerBase>& layer)
1258{
1259    ssize_t i = mCurrentState.layersSortedByZ.add(layer);
1260    return (i < 0) ? status_t(i) : status_t(NO_ERROR);
1261}
1262
1263ssize_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
1264        const sp<LayerBaseClient>& lbc)
1265{
1266    // attach this layer to the client
1267    size_t name = client->attachLayer(lbc);
1268
1269    Mutex::Autolock _l(mStateLock);
1270
1271    // add this layer to the current state list
1272    addLayer_l(lbc);
1273
1274    return ssize_t(name);
1275}
1276
1277status_t SurfaceFlinger::removeLayer(const sp<LayerBase>& layer)
1278{
1279    Mutex::Autolock _l(mStateLock);
1280    status_t err = purgatorizeLayer_l(layer);
1281    if (err == NO_ERROR)
1282        setTransactionFlags(eTransactionNeeded);
1283    return err;
1284}
1285
1286status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase)
1287{
1288    sp<LayerBaseClient> lbc(layerBase->getLayerBaseClient());
1289    if (lbc != 0) {
1290        mLayerMap.removeItem( lbc->getSurfaceBinder() );
1291    }
1292    ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
1293    if (index >= 0) {
1294        mLayersRemoved = true;
1295        return NO_ERROR;
1296    }
1297    return status_t(index);
1298}
1299
1300status_t SurfaceFlinger::purgatorizeLayer_l(const sp<LayerBase>& layerBase)
1301{
1302    // First add the layer to the purgatory list, which makes sure it won't
1303    // go away, then remove it from the main list (through a transaction).
1304    ssize_t err = removeLayer_l(layerBase);
1305    if (err >= 0) {
1306        mLayerPurgatory.add(layerBase);
1307    }
1308
1309    mLayersPendingRemoval.push(layerBase);
1310
1311    // it's possible that we don't find a layer, because it might
1312    // have been destroyed already -- this is not technically an error
1313    // from the user because there is a race between Client::destroySurface(),
1314    // ~Client() and ~ISurface().
1315    return (err == NAME_NOT_FOUND) ? status_t(NO_ERROR) : err;
1316}
1317
1318status_t SurfaceFlinger::invalidateLayerVisibility(const sp<LayerBase>& layer)
1319{
1320    layer->forceVisibilityTransaction();
1321    setTransactionFlags(eTraversalNeeded);
1322    return NO_ERROR;
1323}
1324
1325uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t flags)
1326{
1327    return android_atomic_release_load(&mTransactionFlags);
1328}
1329
1330uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags)
1331{
1332    return android_atomic_and(~flags, &mTransactionFlags) & flags;
1333}
1334
1335uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags)
1336{
1337    uint32_t old = android_atomic_or(flags, &mTransactionFlags);
1338    if ((old & flags)==0) { // wake the server up
1339        signalTransaction();
1340    }
1341    return old;
1342}
1343
1344
1345void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state,
1346        int orientation, uint32_t flags) {
1347    Mutex::Autolock _l(mStateLock);
1348
1349    uint32_t transactionFlags = 0;
1350    if (mCurrentState.orientation != orientation) {
1351        if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
1352            mCurrentState.orientation = orientation;
1353            transactionFlags |= eTransactionNeeded;
1354        } else if (orientation != eOrientationUnchanged) {
1355            ALOGW("setTransactionState: ignoring unrecognized orientation: %d",
1356                    orientation);
1357        }
1358    }
1359
1360    const size_t count = state.size();
1361    for (size_t i=0 ; i<count ; i++) {
1362        const ComposerState& s(state[i]);
1363        sp<Client> client( static_cast<Client *>(s.client.get()) );
1364        transactionFlags |= setClientStateLocked(client, s.state);
1365    }
1366
1367    if (transactionFlags) {
1368        // this triggers the transaction
1369        setTransactionFlags(transactionFlags);
1370
1371        // if this is a synchronous transaction, wait for it to take effect
1372        // before returning.
1373        if (flags & eSynchronous) {
1374            mTransationPending = true;
1375        }
1376        while (mTransationPending) {
1377            status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
1378            if (CC_UNLIKELY(err != NO_ERROR)) {
1379                // just in case something goes wrong in SF, return to the
1380                // called after a few seconds.
1381                ALOGW_IF(err == TIMED_OUT, "closeGlobalTransaction timed out!");
1382                mTransationPending = false;
1383                break;
1384            }
1385        }
1386    }
1387}
1388
1389sp<ISurface> SurfaceFlinger::createSurface(
1390        ISurfaceComposerClient::surface_data_t* params,
1391        const String8& name,
1392        const sp<Client>& client,
1393        DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
1394        uint32_t flags)
1395{
1396    sp<LayerBaseClient> layer;
1397    sp<ISurface> surfaceHandle;
1398
1399    if (int32_t(w|h) < 0) {
1400        ALOGE("createSurface() failed, w or h is negative (w=%d, h=%d)",
1401                int(w), int(h));
1402        return surfaceHandle;
1403    }
1404
1405    //ALOGD("createSurface for (%d x %d), name=%s", w, h, name.string());
1406    sp<Layer> normalLayer;
1407    switch (flags & eFXSurfaceMask) {
1408        case eFXSurfaceNormal:
1409            normalLayer = createNormalSurface(client, d, w, h, flags, format);
1410            layer = normalLayer;
1411            break;
1412        case eFXSurfaceBlur:
1413            // for now we treat Blur as Dim, until we can implement it
1414            // efficiently.
1415        case eFXSurfaceDim:
1416            layer = createDimSurface(client, d, w, h, flags);
1417            break;
1418        case eFXSurfaceScreenshot:
1419            layer = createScreenshotSurface(client, d, w, h, flags);
1420            break;
1421    }
1422
1423    if (layer != 0) {
1424        layer->initStates(w, h, flags);
1425        layer->setName(name);
1426        ssize_t token = addClientLayer(client, layer);
1427
1428        surfaceHandle = layer->getSurface();
1429        if (surfaceHandle != 0) {
1430            params->token = token;
1431            params->identity = layer->getIdentity();
1432            if (normalLayer != 0) {
1433                Mutex::Autolock _l(mStateLock);
1434                mLayerMap.add(layer->getSurfaceBinder(), normalLayer);
1435            }
1436        }
1437
1438        setTransactionFlags(eTransactionNeeded);
1439    }
1440
1441    return surfaceHandle;
1442}
1443
1444sp<Layer> SurfaceFlinger::createNormalSurface(
1445        const sp<Client>& client, DisplayID display,
1446        uint32_t w, uint32_t h, uint32_t flags,
1447        PixelFormat& format)
1448{
1449    // initialize the surfaces
1450    switch (format) { // TODO: take h/w into account
1451    case PIXEL_FORMAT_TRANSPARENT:
1452    case PIXEL_FORMAT_TRANSLUCENT:
1453        format = PIXEL_FORMAT_RGBA_8888;
1454        break;
1455    case PIXEL_FORMAT_OPAQUE:
1456#ifdef NO_RGBX_8888
1457        format = PIXEL_FORMAT_RGB_565;
1458#else
1459        format = PIXEL_FORMAT_RGBX_8888;
1460#endif
1461        break;
1462    }
1463
1464#ifdef NO_RGBX_8888
1465    if (format == PIXEL_FORMAT_RGBX_8888)
1466        format = PIXEL_FORMAT_RGBA_8888;
1467#endif
1468
1469    sp<Layer> layer = new Layer(this, display, client);
1470    status_t err = layer->setBuffers(w, h, format, flags);
1471    if (CC_LIKELY(err != NO_ERROR)) {
1472        ALOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
1473        layer.clear();
1474    }
1475    return layer;
1476}
1477
1478sp<LayerDim> SurfaceFlinger::createDimSurface(
1479        const sp<Client>& client, DisplayID display,
1480        uint32_t w, uint32_t h, uint32_t flags)
1481{
1482    sp<LayerDim> layer = new LayerDim(this, display, client);
1483    return layer;
1484}
1485
1486sp<LayerScreenshot> SurfaceFlinger::createScreenshotSurface(
1487        const sp<Client>& client, DisplayID display,
1488        uint32_t w, uint32_t h, uint32_t flags)
1489{
1490    sp<LayerScreenshot> layer = new LayerScreenshot(this, display, client);
1491    return layer;
1492}
1493
1494status_t SurfaceFlinger::removeSurface(const sp<Client>& client, SurfaceID sid)
1495{
1496    /*
1497     * called by the window manager, when a surface should be marked for
1498     * destruction.
1499     *
1500     * The surface is removed from the current and drawing lists, but placed
1501     * in the purgatory queue, so it's not destroyed right-away (we need
1502     * to wait for all client's references to go away first).
1503     */
1504
1505    status_t err = NAME_NOT_FOUND;
1506    Mutex::Autolock _l(mStateLock);
1507    sp<LayerBaseClient> layer = client->getLayerUser(sid);
1508
1509    if (layer != 0) {
1510        err = purgatorizeLayer_l(layer);
1511        if (err == NO_ERROR) {
1512            setTransactionFlags(eTransactionNeeded);
1513        }
1514    }
1515    return err;
1516}
1517
1518status_t SurfaceFlinger::destroySurface(const wp<LayerBaseClient>& layer)
1519{
1520    // called by ~ISurface() when all references are gone
1521    status_t err = NO_ERROR;
1522    sp<LayerBaseClient> l(layer.promote());
1523    if (l != NULL) {
1524        Mutex::Autolock _l(mStateLock);
1525        err = removeLayer_l(l);
1526        if (err == NAME_NOT_FOUND) {
1527            // The surface wasn't in the current list, which means it was
1528            // removed already, which means it is in the purgatory,
1529            // and need to be removed from there.
1530            ssize_t idx = mLayerPurgatory.remove(l);
1531            ALOGE_IF(idx < 0,
1532                    "layer=%p is not in the purgatory list", l.get());
1533        }
1534        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
1535                "error removing layer=%p (%s)", l.get(), strerror(-err));
1536    }
1537    return err;
1538}
1539
1540uint32_t SurfaceFlinger::setClientStateLocked(
1541        const sp<Client>& client,
1542        const layer_state_t& s)
1543{
1544    uint32_t flags = 0;
1545    sp<LayerBaseClient> layer(client->getLayerUser(s.surface));
1546    if (layer != 0) {
1547        const uint32_t what = s.what;
1548        if (what & ePositionChanged) {
1549            if (layer->setPosition(s.x, s.y))
1550                flags |= eTraversalNeeded;
1551        }
1552        if (what & eLayerChanged) {
1553            ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
1554            if (layer->setLayer(s.z)) {
1555                mCurrentState.layersSortedByZ.removeAt(idx);
1556                mCurrentState.layersSortedByZ.add(layer);
1557                // we need traversal (state changed)
1558                // AND transaction (list changed)
1559                flags |= eTransactionNeeded|eTraversalNeeded;
1560            }
1561        }
1562        if (what & eSizeChanged) {
1563            if (layer->setSize(s.w, s.h)) {
1564                flags |= eTraversalNeeded;
1565            }
1566        }
1567        if (what & eAlphaChanged) {
1568            if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
1569                flags |= eTraversalNeeded;
1570        }
1571        if (what & eMatrixChanged) {
1572            if (layer->setMatrix(s.matrix))
1573                flags |= eTraversalNeeded;
1574        }
1575        if (what & eTransparentRegionChanged) {
1576            if (layer->setTransparentRegionHint(s.transparentRegion))
1577                flags |= eTraversalNeeded;
1578        }
1579        if (what & eVisibilityChanged) {
1580            if (layer->setFlags(s.flags, s.mask))
1581                flags |= eTraversalNeeded;
1582        }
1583        if (what & eCropChanged) {
1584            if (layer->setCrop(s.crop))
1585                flags |= eTraversalNeeded;
1586        }
1587    }
1588    return flags;
1589}
1590
1591// ---------------------------------------------------------------------------
1592
1593void SurfaceFlinger::onScreenAcquired() {
1594    ALOGD("Screen about to return, flinger = %p", this);
1595    const DisplayHardware& hw(getDefaultDisplayHardware()); // XXX: this should be per DisplayHardware
1596    hw.acquireScreen();
1597    mEventThread->onScreenAcquired();
1598    // this is a temporary work-around, eventually this should be called
1599    // by the power-manager
1600    SurfaceFlinger::turnElectronBeamOn(mElectronBeamAnimationMode);
1601    // from this point on, SF will process updates again
1602    repaintEverything();
1603}
1604
1605void SurfaceFlinger::onScreenReleased() {
1606    ALOGD("About to give-up screen, flinger = %p", this);
1607    const DisplayHardware& hw(getDefaultDisplayHardware()); // XXX: this should be per DisplayHardware
1608    if (hw.isScreenAcquired()) {
1609        mEventThread->onScreenReleased();
1610        hw.releaseScreen();
1611        // from this point on, SF will stop drawing
1612    }
1613}
1614
1615void SurfaceFlinger::unblank() {
1616    class MessageScreenAcquired : public MessageBase {
1617        SurfaceFlinger* flinger;
1618    public:
1619        MessageScreenAcquired(SurfaceFlinger* flinger) : flinger(flinger) { }
1620        virtual bool handler() {
1621            flinger->onScreenAcquired();
1622            return true;
1623        }
1624    };
1625    sp<MessageBase> msg = new MessageScreenAcquired(this);
1626    postMessageSync(msg);
1627}
1628
1629void SurfaceFlinger::blank() {
1630    class MessageScreenReleased : public MessageBase {
1631        SurfaceFlinger* flinger;
1632    public:
1633        MessageScreenReleased(SurfaceFlinger* flinger) : flinger(flinger) { }
1634        virtual bool handler() {
1635            flinger->onScreenReleased();
1636            return true;
1637        }
1638    };
1639    sp<MessageBase> msg = new MessageScreenReleased(this);
1640    postMessageSync(msg);
1641}
1642
1643// ---------------------------------------------------------------------------
1644
1645status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
1646{
1647    const size_t SIZE = 4096;
1648    char buffer[SIZE];
1649    String8 result;
1650
1651    if (!PermissionCache::checkCallingPermission(sDump)) {
1652        snprintf(buffer, SIZE, "Permission Denial: "
1653                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
1654                IPCThreadState::self()->getCallingPid(),
1655                IPCThreadState::self()->getCallingUid());
1656        result.append(buffer);
1657    } else {
1658        // Try to get the main lock, but don't insist if we can't
1659        // (this would indicate SF is stuck, but we want to be able to
1660        // print something in dumpsys).
1661        int retry = 3;
1662        while (mStateLock.tryLock()<0 && --retry>=0) {
1663            usleep(1000000);
1664        }
1665        const bool locked(retry >= 0);
1666        if (!locked) {
1667            snprintf(buffer, SIZE,
1668                    "SurfaceFlinger appears to be unresponsive, "
1669                    "dumping anyways (no locks held)\n");
1670            result.append(buffer);
1671        }
1672
1673        bool dumpAll = true;
1674        size_t index = 0;
1675        size_t numArgs = args.size();
1676        if (numArgs) {
1677            if ((index < numArgs) &&
1678                    (args[index] == String16("--list"))) {
1679                index++;
1680                listLayersLocked(args, index, result, buffer, SIZE);
1681                dumpAll = false;
1682            }
1683
1684            if ((index < numArgs) &&
1685                    (args[index] == String16("--latency"))) {
1686                index++;
1687                dumpStatsLocked(args, index, result, buffer, SIZE);
1688                dumpAll = false;
1689            }
1690
1691            if ((index < numArgs) &&
1692                    (args[index] == String16("--latency-clear"))) {
1693                index++;
1694                clearStatsLocked(args, index, result, buffer, SIZE);
1695                dumpAll = false;
1696            }
1697        }
1698
1699        if (dumpAll) {
1700            dumpAllLocked(result, buffer, SIZE);
1701        }
1702
1703        if (locked) {
1704            mStateLock.unlock();
1705        }
1706    }
1707    write(fd, result.string(), result.size());
1708    return NO_ERROR;
1709}
1710
1711void SurfaceFlinger::listLayersLocked(const Vector<String16>& args, size_t& index,
1712        String8& result, char* buffer, size_t SIZE) const
1713{
1714    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
1715    const size_t count = currentLayers.size();
1716    for (size_t i=0 ; i<count ; i++) {
1717        const sp<LayerBase>& layer(currentLayers[i]);
1718        snprintf(buffer, SIZE, "%s\n", layer->getName().string());
1719        result.append(buffer);
1720    }
1721}
1722
1723void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
1724        String8& result, char* buffer, size_t SIZE) const
1725{
1726    String8 name;
1727    if (index < args.size()) {
1728        name = String8(args[index]);
1729        index++;
1730    }
1731
1732    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
1733    const size_t count = currentLayers.size();
1734    for (size_t i=0 ; i<count ; i++) {
1735        const sp<LayerBase>& layer(currentLayers[i]);
1736        if (name.isEmpty()) {
1737            snprintf(buffer, SIZE, "%s\n", layer->getName().string());
1738            result.append(buffer);
1739        }
1740        if (name.isEmpty() || (name == layer->getName())) {
1741            layer->dumpStats(result, buffer, SIZE);
1742        }
1743    }
1744}
1745
1746void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
1747        String8& result, char* buffer, size_t SIZE) const
1748{
1749    String8 name;
1750    if (index < args.size()) {
1751        name = String8(args[index]);
1752        index++;
1753    }
1754
1755    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
1756    const size_t count = currentLayers.size();
1757    for (size_t i=0 ; i<count ; i++) {
1758        const sp<LayerBase>& layer(currentLayers[i]);
1759        if (name.isEmpty() || (name == layer->getName())) {
1760            layer->clearStats();
1761        }
1762    }
1763}
1764
1765void SurfaceFlinger::dumpAllLocked(
1766        String8& result, char* buffer, size_t SIZE) const
1767{
1768    // figure out if we're stuck somewhere
1769    const nsecs_t now = systemTime();
1770    const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
1771    const nsecs_t inTransaction(mDebugInTransaction);
1772    nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
1773    nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
1774
1775    /*
1776     * Dump the visible layer list
1777     */
1778    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
1779    const size_t count = currentLayers.size();
1780    snprintf(buffer, SIZE, "Visible layers (count = %d)\n", count);
1781    result.append(buffer);
1782    for (size_t i=0 ; i<count ; i++) {
1783        const sp<LayerBase>& layer(currentLayers[i]);
1784        layer->dump(result, buffer, SIZE);
1785    }
1786
1787    /*
1788     * Dump the layers in the purgatory
1789     */
1790
1791    const size_t purgatorySize = mLayerPurgatory.size();
1792    snprintf(buffer, SIZE, "Purgatory state (%d entries)\n", purgatorySize);
1793    result.append(buffer);
1794    for (size_t i=0 ; i<purgatorySize ; i++) {
1795        const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i));
1796        layer->shortDump(result, buffer, SIZE);
1797    }
1798
1799    /*
1800     * Dump SurfaceFlinger global state
1801     */
1802
1803    snprintf(buffer, SIZE, "SurfaceFlinger global state:\n");
1804    result.append(buffer);
1805
1806    const DisplayHardware& hw(getDefaultDisplayHardware());
1807    const GLExtensions& extensions(GLExtensions::getInstance());
1808    snprintf(buffer, SIZE, "GLES: %s, %s, %s\n",
1809            extensions.getVendor(),
1810            extensions.getRenderer(),
1811            extensions.getVersion());
1812    result.append(buffer);
1813
1814    snprintf(buffer, SIZE, "EGL : %s\n",
1815            eglQueryString(hw.getEGLDisplay(),
1816                    EGL_VERSION_HW_ANDROID));
1817    result.append(buffer);
1818
1819    snprintf(buffer, SIZE, "EXTS: %s\n", extensions.getExtension());
1820    result.append(buffer);
1821
1822    mWormholeRegion.dump(result, "WormholeRegion");
1823    snprintf(buffer, SIZE,
1824            "  orientation=%d, canDraw=%d\n",
1825            mCurrentState.orientation, hw.canDraw());
1826    result.append(buffer);
1827    snprintf(buffer, SIZE,
1828            "  last eglSwapBuffers() time: %f us\n"
1829            "  last transaction time     : %f us\n"
1830            "  transaction-flags         : %08x\n"
1831            "  refresh-rate              : %f fps\n"
1832            "  x-dpi                     : %f\n"
1833            "  y-dpi                     : %f\n"
1834            "  density                   : %f\n",
1835            mLastSwapBufferTime/1000.0,
1836            mLastTransactionTime/1000.0,
1837            mTransactionFlags,
1838            hw.getRefreshRate(),
1839            hw.getDpiX(),
1840            hw.getDpiY(),
1841            hw.getDensity());
1842    result.append(buffer);
1843
1844    snprintf(buffer, SIZE, "  eglSwapBuffers time: %f us\n",
1845            inSwapBuffersDuration/1000.0);
1846    result.append(buffer);
1847
1848    snprintf(buffer, SIZE, "  transaction time: %f us\n",
1849            inTransactionDuration/1000.0);
1850    result.append(buffer);
1851
1852    /*
1853     * VSYNC state
1854     */
1855    mEventThread->dump(result, buffer, SIZE);
1856
1857    /*
1858     * Dump HWComposer state
1859     */
1860    HWComposer& hwc(hw.getHwComposer());
1861    snprintf(buffer, SIZE, "h/w composer state:\n");
1862    result.append(buffer);
1863    snprintf(buffer, SIZE, "  h/w composer %s and %s\n",
1864            hwc.initCheck()==NO_ERROR ? "present" : "not present",
1865                    (mDebugDisableHWC || mDebugRegion) ? "disabled" : "enabled");
1866    result.append(buffer);
1867    hwc.dump(result, buffer, SIZE, hw.getVisibleLayersSortedByZ());
1868
1869    /*
1870     * Dump gralloc state
1871     */
1872    const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
1873    alloc.dump(result);
1874    hw.dump(result);
1875}
1876
1877status_t SurfaceFlinger::onTransact(
1878    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1879{
1880    switch (code) {
1881        case CREATE_CONNECTION:
1882        case SET_TRANSACTION_STATE:
1883        case SET_ORIENTATION:
1884        case BOOT_FINISHED:
1885        case TURN_ELECTRON_BEAM_OFF:
1886        case TURN_ELECTRON_BEAM_ON:
1887        case BLANK:
1888        case UNBLANK:
1889        {
1890            // codes that require permission check
1891            IPCThreadState* ipc = IPCThreadState::self();
1892            const int pid = ipc->getCallingPid();
1893            const int uid = ipc->getCallingUid();
1894            if ((uid != AID_GRAPHICS) &&
1895                    !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
1896                ALOGE("Permission Denial: "
1897                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
1898                return PERMISSION_DENIED;
1899            }
1900            break;
1901        }
1902        case CAPTURE_SCREEN:
1903        {
1904            // codes that require permission check
1905            IPCThreadState* ipc = IPCThreadState::self();
1906            const int pid = ipc->getCallingPid();
1907            const int uid = ipc->getCallingUid();
1908            if ((uid != AID_GRAPHICS) &&
1909                    !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
1910                ALOGE("Permission Denial: "
1911                        "can't read framebuffer pid=%d, uid=%d", pid, uid);
1912                return PERMISSION_DENIED;
1913            }
1914            break;
1915        }
1916    }
1917
1918    status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
1919    if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
1920        CHECK_INTERFACE(ISurfaceComposer, data, reply);
1921        if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
1922            IPCThreadState* ipc = IPCThreadState::self();
1923            const int pid = ipc->getCallingPid();
1924            const int uid = ipc->getCallingUid();
1925            ALOGE("Permission Denial: "
1926                    "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
1927            return PERMISSION_DENIED;
1928        }
1929        int n;
1930        switch (code) {
1931            case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
1932            case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
1933                return NO_ERROR;
1934            case 1002:  // SHOW_UPDATES
1935                n = data.readInt32();
1936                mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
1937                invalidateHwcGeometry();
1938                repaintEverything();
1939                return NO_ERROR;
1940            case 1004:{ // repaint everything
1941                repaintEverything();
1942                return NO_ERROR;
1943            }
1944            case 1005:{ // force transaction
1945                setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
1946                return NO_ERROR;
1947            }
1948            case 1006:{ // send empty update
1949                signalRefresh();
1950                return NO_ERROR;
1951            }
1952            case 1008:  // toggle use of hw composer
1953                n = data.readInt32();
1954                mDebugDisableHWC = n ? 1 : 0;
1955                invalidateHwcGeometry();
1956                repaintEverything();
1957                return NO_ERROR;
1958            case 1009:  // toggle use of transform hint
1959                n = data.readInt32();
1960                mDebugDisableTransformHint = n ? 1 : 0;
1961                invalidateHwcGeometry();
1962                repaintEverything();
1963                return NO_ERROR;
1964            case 1010:  // interrogate.
1965                reply->writeInt32(0);
1966                reply->writeInt32(0);
1967                reply->writeInt32(mDebugRegion);
1968                reply->writeInt32(0);
1969                reply->writeInt32(mDebugDisableHWC);
1970                return NO_ERROR;
1971            case 1013: {
1972                Mutex::Autolock _l(mStateLock);
1973                const DisplayHardware& hw(getDefaultDisplayHardware());
1974                reply->writeInt32(hw.getPageFlipCount());
1975            }
1976            return NO_ERROR;
1977        }
1978    }
1979    return err;
1980}
1981
1982void SurfaceFlinger::repaintEverything() {
1983    const DisplayHardware& hw(getDefaultDisplayHardware()); // FIXME: this cannot be bound the default display
1984    const Rect bounds(hw.getBounds());
1985    setInvalidateRegion(Region(bounds));
1986    signalTransaction();
1987}
1988
1989void SurfaceFlinger::setInvalidateRegion(const Region& reg) {
1990    Mutex::Autolock _l(mInvalidateLock);
1991    mInvalidateRegion = reg;
1992}
1993
1994Region SurfaceFlinger::getAndClearInvalidateRegion() {
1995    Mutex::Autolock _l(mInvalidateLock);
1996    Region reg(mInvalidateRegion);
1997    mInvalidateRegion.clear();
1998    return reg;
1999}
2000
2001// ---------------------------------------------------------------------------
2002
2003status_t SurfaceFlinger::renderScreenToTexture(DisplayID dpy,
2004        GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
2005{
2006    Mutex::Autolock _l(mStateLock);
2007    return renderScreenToTextureLocked(dpy, textureName, uOut, vOut);
2008}
2009
2010status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
2011        GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
2012{
2013    ATRACE_CALL();
2014
2015    if (!GLExtensions::getInstance().haveFramebufferObject())
2016        return INVALID_OPERATION;
2017
2018    // get screen geometry
2019    const DisplayHardware& hw(getDisplayHardware(dpy));
2020    const uint32_t hw_w = hw.getWidth();
2021    const uint32_t hw_h = hw.getHeight();
2022    GLfloat u = 1;
2023    GLfloat v = 1;
2024
2025    // make sure to clear all GL error flags
2026    while ( glGetError() != GL_NO_ERROR ) ;
2027
2028    // create a FBO
2029    GLuint name, tname;
2030    glGenTextures(1, &tname);
2031    glBindTexture(GL_TEXTURE_2D, tname);
2032    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2033    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2034    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
2035            hw_w, hw_h, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2036    if (glGetError() != GL_NO_ERROR) {
2037        while ( glGetError() != GL_NO_ERROR ) ;
2038        GLint tw = (2 << (31 - clz(hw_w)));
2039        GLint th = (2 << (31 - clz(hw_h)));
2040        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
2041                tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2042        u = GLfloat(hw_w) / tw;
2043        v = GLfloat(hw_h) / th;
2044    }
2045    glGenFramebuffersOES(1, &name);
2046    glBindFramebufferOES(GL_FRAMEBUFFER_OES, name);
2047    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES,
2048            GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0);
2049
2050    // redraw the screen entirely...
2051    glDisable(GL_TEXTURE_EXTERNAL_OES);
2052    glDisable(GL_TEXTURE_2D);
2053    glClearColor(0,0,0,1);
2054    glClear(GL_COLOR_BUFFER_BIT);
2055    glMatrixMode(GL_MODELVIEW);
2056    glLoadIdentity();
2057    const Vector< sp<LayerBase> >& layers(hw.getVisibleLayersSortedByZ());
2058    const size_t count = layers.size();
2059    for (size_t i=0 ; i<count ; ++i) {
2060        const sp<LayerBase>& layer(layers[i]);
2061        layer->drawForSreenShot(hw);
2062    }
2063
2064    hw.compositionComplete();
2065
2066    // back to main framebuffer
2067    glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
2068    glDeleteFramebuffersOES(1, &name);
2069
2070    *textureName = tname;
2071    *uOut = u;
2072    *vOut = v;
2073    return NO_ERROR;
2074}
2075
2076// ---------------------------------------------------------------------------
2077
2078class VSyncWaiter {
2079    DisplayEventReceiver::Event buffer[4];
2080    sp<Looper> looper;
2081    sp<IDisplayEventConnection> events;
2082    sp<BitTube> eventTube;
2083public:
2084    VSyncWaiter(const sp<EventThread>& eventThread) {
2085        looper = new Looper(true);
2086        events = eventThread->createEventConnection();
2087        eventTube = events->getDataChannel();
2088        looper->addFd(eventTube->getFd(), 0, ALOOPER_EVENT_INPUT, 0, 0);
2089        events->requestNextVsync();
2090    }
2091
2092    void wait() {
2093        ssize_t n;
2094
2095        looper->pollOnce(-1);
2096        // we don't handle any errors here, it doesn't matter
2097        // and we don't want to take the risk to get stuck.
2098
2099        // drain the events...
2100        while ((n = DisplayEventReceiver::getEvents(
2101                eventTube, buffer, 4)) > 0) ;
2102
2103        events->requestNextVsync();
2104    }
2105};
2106
2107status_t SurfaceFlinger::electronBeamOffAnimationImplLocked()
2108{
2109    // get screen geometry
2110    const DisplayHardware& hw(getDefaultDisplayHardware());
2111    const uint32_t hw_w = hw.getWidth();
2112    const uint32_t hw_h = hw.getHeight();
2113    const Region screenBounds(hw.getBounds());
2114
2115    GLfloat u, v;
2116    GLuint tname;
2117    status_t result = renderScreenToTextureLocked(0, &tname, &u, &v);
2118    if (result != NO_ERROR) {
2119        return result;
2120    }
2121
2122    GLfloat vtx[8];
2123    const GLfloat texCoords[4][2] = { {0,0}, {0,v}, {u,v}, {u,0} };
2124    glBindTexture(GL_TEXTURE_2D, tname);
2125    glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2126    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2127    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2128    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2129    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2130    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
2131    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
2132    glVertexPointer(2, GL_FLOAT, 0, vtx);
2133
2134    /*
2135     * Texture coordinate mapping
2136     *
2137     *                 u
2138     *    1 +----------+---+
2139     *      |     |    |   |  image is inverted
2140     *      |     V    |   |  w.r.t. the texture
2141     *  1-v +----------+   |  coordinates
2142     *      |              |
2143     *      |              |
2144     *      |              |
2145     *    0 +--------------+
2146     *      0              1
2147     *
2148     */
2149
2150    class s_curve_interpolator {
2151        const float nbFrames, s, v;
2152    public:
2153        s_curve_interpolator(int nbFrames, float s)
2154        : nbFrames(1.0f / (nbFrames-1)), s(s),
2155          v(1.0f + expf(-s + 0.5f*s)) {
2156        }
2157        float operator()(int f) {
2158            const float x = f * nbFrames;
2159            return ((1.0f/(1.0f + expf(-x*s + 0.5f*s))) - 0.5f) * v + 0.5f;
2160        }
2161    };
2162
2163    class v_stretch {
2164        const GLfloat hw_w, hw_h;
2165    public:
2166        v_stretch(uint32_t hw_w, uint32_t hw_h)
2167        : hw_w(hw_w), hw_h(hw_h) {
2168        }
2169        void operator()(GLfloat* vtx, float v) {
2170            const GLfloat w = hw_w + (hw_w * v);
2171            const GLfloat h = hw_h - (hw_h * v);
2172            const GLfloat x = (hw_w - w) * 0.5f;
2173            const GLfloat y = (hw_h - h) * 0.5f;
2174            vtx[0] = x;         vtx[1] = y;
2175            vtx[2] = x;         vtx[3] = y + h;
2176            vtx[4] = x + w;     vtx[5] = y + h;
2177            vtx[6] = x + w;     vtx[7] = y;
2178        }
2179    };
2180
2181    class h_stretch {
2182        const GLfloat hw_w, hw_h;
2183    public:
2184        h_stretch(uint32_t hw_w, uint32_t hw_h)
2185        : hw_w(hw_w), hw_h(hw_h) {
2186        }
2187        void operator()(GLfloat* vtx, float v) {
2188            const GLfloat w = hw_w - (hw_w * v);
2189            const GLfloat h = 1.0f;
2190            const GLfloat x = (hw_w - w) * 0.5f;
2191            const GLfloat y = (hw_h - h) * 0.5f;
2192            vtx[0] = x;         vtx[1] = y;
2193            vtx[2] = x;         vtx[3] = y + h;
2194            vtx[4] = x + w;     vtx[5] = y + h;
2195            vtx[6] = x + w;     vtx[7] = y;
2196        }
2197    };
2198
2199    VSyncWaiter vsync(mEventThread);
2200
2201    // the full animation is 24 frames
2202    char value[PROPERTY_VALUE_MAX];
2203    property_get("debug.sf.electron_frames", value, "24");
2204    int nbFrames = (atoi(value) + 1) >> 1;
2205    if (nbFrames <= 0) // just in case
2206        nbFrames = 24;
2207
2208    s_curve_interpolator itr(nbFrames, 7.5f);
2209    s_curve_interpolator itg(nbFrames, 8.0f);
2210    s_curve_interpolator itb(nbFrames, 8.5f);
2211
2212    v_stretch vverts(hw_w, hw_h);
2213
2214    glMatrixMode(GL_TEXTURE);
2215    glLoadIdentity();
2216    glMatrixMode(GL_MODELVIEW);
2217    glLoadIdentity();
2218
2219    glEnable(GL_BLEND);
2220    glBlendFunc(GL_ONE, GL_ONE);
2221    for (int i=0 ; i<nbFrames ; i++) {
2222        float x, y, w, h;
2223        const float vr = itr(i);
2224        const float vg = itg(i);
2225        const float vb = itb(i);
2226
2227        // wait for vsync
2228        vsync.wait();
2229
2230        // clear screen
2231        glColorMask(1,1,1,1);
2232        glClear(GL_COLOR_BUFFER_BIT);
2233        glEnable(GL_TEXTURE_2D);
2234
2235        // draw the red plane
2236        vverts(vtx, vr);
2237        glColorMask(1,0,0,1);
2238        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2239
2240        // draw the green plane
2241        vverts(vtx, vg);
2242        glColorMask(0,1,0,1);
2243        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2244
2245        // draw the blue plane
2246        vverts(vtx, vb);
2247        glColorMask(0,0,1,1);
2248        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2249
2250        // draw the white highlight (we use the last vertices)
2251        glDisable(GL_TEXTURE_2D);
2252        glColorMask(1,1,1,1);
2253        glColor4f(vg, vg, vg, 1);
2254        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2255        hw.flip(screenBounds);
2256    }
2257
2258    h_stretch hverts(hw_w, hw_h);
2259    glDisable(GL_BLEND);
2260    glDisable(GL_TEXTURE_2D);
2261    glColorMask(1,1,1,1);
2262    for (int i=0 ; i<nbFrames ; i++) {
2263        const float v = itg(i);
2264        hverts(vtx, v);
2265
2266        // wait for vsync
2267        vsync.wait();
2268
2269        glClear(GL_COLOR_BUFFER_BIT);
2270        glColor4f(1-v, 1-v, 1-v, 1);
2271        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2272        hw.flip(screenBounds);
2273    }
2274
2275    glColorMask(1,1,1,1);
2276    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2277    glDeleteTextures(1, &tname);
2278    glDisable(GL_TEXTURE_2D);
2279    glDisable(GL_BLEND);
2280    return NO_ERROR;
2281}
2282
2283status_t SurfaceFlinger::electronBeamOnAnimationImplLocked()
2284{
2285    status_t result = PERMISSION_DENIED;
2286
2287    if (!GLExtensions::getInstance().haveFramebufferObject())
2288        return INVALID_OPERATION;
2289
2290
2291    // get screen geometry
2292    const DisplayHardware& hw(getDefaultDisplayHardware());
2293    const uint32_t hw_w = hw.getWidth();
2294    const uint32_t hw_h = hw.getHeight();
2295    const Region screenBounds(hw.bounds());
2296
2297    GLfloat u, v;
2298    GLuint tname;
2299    result = renderScreenToTextureLocked(0, &tname, &u, &v);
2300    if (result != NO_ERROR) {
2301        return result;
2302    }
2303
2304    GLfloat vtx[8];
2305    const GLfloat texCoords[4][2] = { {0,v}, {0,0}, {u,0}, {u,v} };
2306    glBindTexture(GL_TEXTURE_2D, tname);
2307    glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2308    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2309    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2310    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2311    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2312    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
2313    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
2314    glVertexPointer(2, GL_FLOAT, 0, vtx);
2315
2316    class s_curve_interpolator {
2317        const float nbFrames, s, v;
2318    public:
2319        s_curve_interpolator(int nbFrames, float s)
2320        : nbFrames(1.0f / (nbFrames-1)), s(s),
2321          v(1.0f + expf(-s + 0.5f*s)) {
2322        }
2323        float operator()(int f) {
2324            const float x = f * nbFrames;
2325            return ((1.0f/(1.0f + expf(-x*s + 0.5f*s))) - 0.5f) * v + 0.5f;
2326        }
2327    };
2328
2329    class v_stretch {
2330        const GLfloat hw_w, hw_h;
2331    public:
2332        v_stretch(uint32_t hw_w, uint32_t hw_h)
2333        : hw_w(hw_w), hw_h(hw_h) {
2334        }
2335        void operator()(GLfloat* vtx, float v) {
2336            const GLfloat w = hw_w + (hw_w * v);
2337            const GLfloat h = hw_h - (hw_h * v);
2338            const GLfloat x = (hw_w - w) * 0.5f;
2339            const GLfloat y = (hw_h - h) * 0.5f;
2340            vtx[0] = x;         vtx[1] = y;
2341            vtx[2] = x;         vtx[3] = y + h;
2342            vtx[4] = x + w;     vtx[5] = y + h;
2343            vtx[6] = x + w;     vtx[7] = y;
2344        }
2345    };
2346
2347    class h_stretch {
2348        const GLfloat hw_w, hw_h;
2349    public:
2350        h_stretch(uint32_t hw_w, uint32_t hw_h)
2351        : hw_w(hw_w), hw_h(hw_h) {
2352        }
2353        void operator()(GLfloat* vtx, float v) {
2354            const GLfloat w = hw_w - (hw_w * v);
2355            const GLfloat h = 1.0f;
2356            const GLfloat x = (hw_w - w) * 0.5f;
2357            const GLfloat y = (hw_h - h) * 0.5f;
2358            vtx[0] = x;         vtx[1] = y;
2359            vtx[2] = x;         vtx[3] = y + h;
2360            vtx[4] = x + w;     vtx[5] = y + h;
2361            vtx[6] = x + w;     vtx[7] = y;
2362        }
2363    };
2364
2365    VSyncWaiter vsync(mEventThread);
2366
2367    // the full animation is 12 frames
2368    int nbFrames = 8;
2369    s_curve_interpolator itr(nbFrames, 7.5f);
2370    s_curve_interpolator itg(nbFrames, 8.0f);
2371    s_curve_interpolator itb(nbFrames, 8.5f);
2372
2373    h_stretch hverts(hw_w, hw_h);
2374    glDisable(GL_BLEND);
2375    glDisable(GL_TEXTURE_2D);
2376    glColorMask(1,1,1,1);
2377    for (int i=nbFrames-1 ; i>=0 ; i--) {
2378        const float v = itg(i);
2379        hverts(vtx, v);
2380
2381        // wait for vsync
2382        vsync.wait();
2383
2384        glClear(GL_COLOR_BUFFER_BIT);
2385        glColor4f(1-v, 1-v, 1-v, 1);
2386        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2387        hw.flip(screenBounds);
2388    }
2389
2390    nbFrames = 4;
2391    v_stretch vverts(hw_w, hw_h);
2392    glEnable(GL_BLEND);
2393    glBlendFunc(GL_ONE, GL_ONE);
2394    for (int i=nbFrames-1 ; i>=0 ; i--) {
2395        float x, y, w, h;
2396        const float vr = itr(i);
2397        const float vg = itg(i);
2398        const float vb = itb(i);
2399
2400        // wait for vsync
2401        vsync.wait();
2402
2403        // clear screen
2404        glColorMask(1,1,1,1);
2405        glClear(GL_COLOR_BUFFER_BIT);
2406        glEnable(GL_TEXTURE_2D);
2407
2408        // draw the red plane
2409        vverts(vtx, vr);
2410        glColorMask(1,0,0,1);
2411        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2412
2413        // draw the green plane
2414        vverts(vtx, vg);
2415        glColorMask(0,1,0,1);
2416        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2417
2418        // draw the blue plane
2419        vverts(vtx, vb);
2420        glColorMask(0,0,1,1);
2421        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
2422
2423        hw.flip(screenBounds);
2424    }
2425
2426    glColorMask(1,1,1,1);
2427    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2428    glDeleteTextures(1, &tname);
2429    glDisable(GL_TEXTURE_2D);
2430    glDisable(GL_BLEND);
2431
2432    return NO_ERROR;
2433}
2434
2435// ---------------------------------------------------------------------------
2436
2437status_t SurfaceFlinger::turnElectronBeamOffImplLocked(int32_t mode)
2438{
2439    ATRACE_CALL();
2440
2441    DisplayHardware& hw(const_cast<DisplayHardware&>(getDefaultDisplayHardware()));
2442    if (!hw.canDraw()) {
2443        // we're already off
2444        return NO_ERROR;
2445    }
2446
2447    // turn off hwc while we're doing the animation
2448    hw.getHwComposer().disable();
2449    // and make sure to turn it back on (if needed) next time we compose
2450    invalidateHwcGeometry();
2451
2452    if (mode & ISurfaceComposer::eElectronBeamAnimationOff) {
2453        electronBeamOffAnimationImplLocked();
2454    }
2455
2456    // always clear the whole screen at the end of the animation
2457    glClearColor(0,0,0,1);
2458    glClear(GL_COLOR_BUFFER_BIT);
2459    hw.flip( Region(hw.bounds()) );
2460
2461    return NO_ERROR;
2462}
2463
2464status_t SurfaceFlinger::turnElectronBeamOff(int32_t mode)
2465{
2466    class MessageTurnElectronBeamOff : public MessageBase {
2467        SurfaceFlinger* flinger;
2468        int32_t mode;
2469        status_t result;
2470    public:
2471        MessageTurnElectronBeamOff(SurfaceFlinger* flinger, int32_t mode)
2472            : flinger(flinger), mode(mode), result(PERMISSION_DENIED) {
2473        }
2474        status_t getResult() const {
2475            return result;
2476        }
2477        virtual bool handler() {
2478            Mutex::Autolock _l(flinger->mStateLock);
2479            result = flinger->turnElectronBeamOffImplLocked(mode);
2480            return true;
2481        }
2482    };
2483
2484    sp<MessageBase> msg = new MessageTurnElectronBeamOff(this, mode);
2485    status_t res = postMessageSync(msg);
2486    if (res == NO_ERROR) {
2487        res = static_cast<MessageTurnElectronBeamOff*>( msg.get() )->getResult();
2488
2489        // work-around: when the power-manager calls us we activate the
2490        // animation. eventually, the "on" animation will be called
2491        // by the power-manager itself
2492        mElectronBeamAnimationMode = mode;
2493    }
2494    return res;
2495}
2496
2497// ---------------------------------------------------------------------------
2498
2499status_t SurfaceFlinger::turnElectronBeamOnImplLocked(int32_t mode)
2500{
2501    DisplayHardware& hw(const_cast<DisplayHardware&>(getDefaultDisplayHardware()));
2502    if (hw.canDraw()) {
2503        // we're already on
2504        return NO_ERROR;
2505    }
2506    if (mode & ISurfaceComposer::eElectronBeamAnimationOn) {
2507        electronBeamOnAnimationImplLocked();
2508    }
2509
2510    // make sure to redraw the whole screen when the animation is done
2511    mDirtyRegion.set(hw.bounds());
2512    signalTransaction();
2513
2514    return NO_ERROR;
2515}
2516
2517status_t SurfaceFlinger::turnElectronBeamOn(int32_t mode)
2518{
2519    class MessageTurnElectronBeamOn : public MessageBase {
2520        SurfaceFlinger* flinger;
2521        int32_t mode;
2522        status_t result;
2523    public:
2524        MessageTurnElectronBeamOn(SurfaceFlinger* flinger, int32_t mode)
2525            : flinger(flinger), mode(mode), result(PERMISSION_DENIED) {
2526        }
2527        status_t getResult() const {
2528            return result;
2529        }
2530        virtual bool handler() {
2531            Mutex::Autolock _l(flinger->mStateLock);
2532            result = flinger->turnElectronBeamOnImplLocked(mode);
2533            return true;
2534        }
2535    };
2536
2537    postMessageAsync( new MessageTurnElectronBeamOn(this, mode) );
2538    return NO_ERROR;
2539}
2540
2541// ---------------------------------------------------------------------------
2542
2543status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy,
2544        sp<IMemoryHeap>* heap,
2545        uint32_t* w, uint32_t* h, PixelFormat* f,
2546        uint32_t sw, uint32_t sh,
2547        uint32_t minLayerZ, uint32_t maxLayerZ)
2548{
2549    ATRACE_CALL();
2550
2551    status_t result = PERMISSION_DENIED;
2552
2553    // only one display supported for now
2554    if (CC_UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT)) {
2555        return BAD_VALUE;
2556    }
2557
2558    if (!GLExtensions::getInstance().haveFramebufferObject()) {
2559        return INVALID_OPERATION;
2560    }
2561
2562    // get screen geometry
2563    const DisplayHardware& hw(getDisplayHardware(dpy));
2564    const uint32_t hw_w = hw.getWidth();
2565    const uint32_t hw_h = hw.getHeight();
2566
2567    // if we have secure windows on this display, never allow the screen capture
2568    if (hw.getSecureLayerVisible()) {
2569        return PERMISSION_DENIED;
2570    }
2571
2572    if ((sw > hw_w) || (sh > hw_h)) {
2573        return BAD_VALUE;
2574    }
2575
2576    sw = (!sw) ? hw_w : sw;
2577    sh = (!sh) ? hw_h : sh;
2578    const size_t size = sw * sh * 4;
2579
2580    //ALOGD("screenshot: sw=%d, sh=%d, minZ=%d, maxZ=%d",
2581    //        sw, sh, minLayerZ, maxLayerZ);
2582
2583    // make sure to clear all GL error flags
2584    while ( glGetError() != GL_NO_ERROR ) ;
2585
2586    // create a FBO
2587    GLuint name, tname;
2588    glGenRenderbuffersOES(1, &tname);
2589    glBindRenderbufferOES(GL_RENDERBUFFER_OES, tname);
2590    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, sw, sh);
2591
2592    glGenFramebuffersOES(1, &name);
2593    glBindFramebufferOES(GL_FRAMEBUFFER_OES, name);
2594    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,
2595            GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, tname);
2596
2597    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
2598
2599    if (status == GL_FRAMEBUFFER_COMPLETE_OES) {
2600
2601        // invert everything, b/c glReadPixel() below will invert the FB
2602        glViewport(0, 0, sw, sh);
2603        glMatrixMode(GL_PROJECTION);
2604        glPushMatrix();
2605        glLoadIdentity();
2606        glOrthof(0, hw_w, hw_h, 0, 0, 1);
2607        glMatrixMode(GL_MODELVIEW);
2608
2609        // redraw the screen entirely...
2610        glClearColor(0,0,0,1);
2611        glClear(GL_COLOR_BUFFER_BIT);
2612
2613        const LayerVector& layers(mDrawingState.layersSortedByZ);
2614        const size_t count = layers.size();
2615        for (size_t i=0 ; i<count ; ++i) {
2616            const sp<LayerBase>& layer(layers[i]);
2617            const uint32_t flags = layer->drawingState().flags;
2618            if (!(flags & ISurfaceComposer::eLayerHidden)) {
2619                const uint32_t z = layer->drawingState().z;
2620                if (z >= minLayerZ && z <= maxLayerZ) {
2621                    layer->drawForSreenShot(hw);
2622                }
2623            }
2624        }
2625
2626        // check for errors and return screen capture
2627        if (glGetError() != GL_NO_ERROR) {
2628            // error while rendering
2629            result = INVALID_OPERATION;
2630        } else {
2631            // allocate shared memory large enough to hold the
2632            // screen capture
2633            sp<MemoryHeapBase> base(
2634                    new MemoryHeapBase(size, 0, "screen-capture") );
2635            void* const ptr = base->getBase();
2636            if (ptr) {
2637                // capture the screen with glReadPixels()
2638                ScopedTrace _t(ATRACE_TAG, "glReadPixels");
2639                glReadPixels(0, 0, sw, sh, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
2640                if (glGetError() == GL_NO_ERROR) {
2641                    *heap = base;
2642                    *w = sw;
2643                    *h = sh;
2644                    *f = PIXEL_FORMAT_RGBA_8888;
2645                    result = NO_ERROR;
2646                }
2647            } else {
2648                result = NO_MEMORY;
2649            }
2650        }
2651        glViewport(0, 0, hw_w, hw_h);
2652        glMatrixMode(GL_PROJECTION);
2653        glPopMatrix();
2654        glMatrixMode(GL_MODELVIEW);
2655    } else {
2656        result = BAD_VALUE;
2657    }
2658
2659    // release FBO resources
2660    glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
2661    glDeleteRenderbuffersOES(1, &tname);
2662    glDeleteFramebuffersOES(1, &name);
2663
2664    hw.compositionComplete();
2665
2666    // ALOGD("screenshot: result = %s", result<0 ? strerror(result) : "OK");
2667
2668    return result;
2669}
2670
2671
2672status_t SurfaceFlinger::captureScreen(DisplayID dpy,
2673        sp<IMemoryHeap>* heap,
2674        uint32_t* width, uint32_t* height, PixelFormat* format,
2675        uint32_t sw, uint32_t sh,
2676        uint32_t minLayerZ, uint32_t maxLayerZ)
2677{
2678    // only one display supported for now
2679    if (CC_UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
2680        return BAD_VALUE;
2681
2682    if (!GLExtensions::getInstance().haveFramebufferObject())
2683        return INVALID_OPERATION;
2684
2685    class MessageCaptureScreen : public MessageBase {
2686        SurfaceFlinger* flinger;
2687        DisplayID dpy;
2688        sp<IMemoryHeap>* heap;
2689        uint32_t* w;
2690        uint32_t* h;
2691        PixelFormat* f;
2692        uint32_t sw;
2693        uint32_t sh;
2694        uint32_t minLayerZ;
2695        uint32_t maxLayerZ;
2696        status_t result;
2697    public:
2698        MessageCaptureScreen(SurfaceFlinger* flinger, DisplayID dpy,
2699                sp<IMemoryHeap>* heap, uint32_t* w, uint32_t* h, PixelFormat* f,
2700                uint32_t sw, uint32_t sh,
2701                uint32_t minLayerZ, uint32_t maxLayerZ)
2702            : flinger(flinger), dpy(dpy),
2703              heap(heap), w(w), h(h), f(f), sw(sw), sh(sh),
2704              minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
2705              result(PERMISSION_DENIED)
2706        {
2707        }
2708        status_t getResult() const {
2709            return result;
2710        }
2711        virtual bool handler() {
2712            Mutex::Autolock _l(flinger->mStateLock);
2713            result = flinger->captureScreenImplLocked(dpy,
2714                    heap, w, h, f, sw, sh, minLayerZ, maxLayerZ);
2715            return true;
2716        }
2717    };
2718
2719    sp<MessageBase> msg = new MessageCaptureScreen(this,
2720            dpy, heap, width, height, format, sw, sh, minLayerZ, maxLayerZ);
2721    status_t res = postMessageSync(msg);
2722    if (res == NO_ERROR) {
2723        res = static_cast<MessageCaptureScreen*>( msg.get() )->getResult();
2724    }
2725    return res;
2726}
2727
2728// ---------------------------------------------------------------------------
2729
2730sp<Layer> SurfaceFlinger::getLayer(const sp<ISurface>& sur) const
2731{
2732    sp<Layer> result;
2733    Mutex::Autolock _l(mStateLock);
2734    result = mLayerMap.valueFor( sur->asBinder() ).promote();
2735    return result;
2736}
2737
2738// ---------------------------------------------------------------------------
2739
2740GraphicBufferAlloc::GraphicBufferAlloc() {}
2741
2742GraphicBufferAlloc::~GraphicBufferAlloc() {}
2743
2744sp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t w, uint32_t h,
2745        PixelFormat format, uint32_t usage, status_t* error) {
2746    sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(w, h, format, usage));
2747    status_t err = graphicBuffer->initCheck();
2748    *error = err;
2749    if (err != 0 || graphicBuffer->handle == 0) {
2750        if (err == NO_MEMORY) {
2751            GraphicBuffer::dumpAllocationsToSystemLog();
2752        }
2753        ALOGE("GraphicBufferAlloc::createGraphicBuffer(w=%d, h=%d) "
2754             "failed (%s), handle=%p",
2755                w, h, strerror(-err), graphicBuffer->handle);
2756        return 0;
2757    }
2758    return graphicBuffer;
2759}
2760
2761// ---------------------------------------------------------------------------
2762
2763}; // namespace android
2764