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