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