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/PixelFormat.h>
     42 
     43 #include <pixelflinger/pixelflinger.h>
     44 #include <GLES/gl.h>
     45 
     46 #include "clz.h"
     47 #include "Layer.h"
     48 #include "LayerBlur.h"
     49 #include "LayerBuffer.h"
     50 #include "LayerDim.h"
     51 #include "SurfaceFlinger.h"
     52 
     53 #include "DisplayHardware/DisplayHardware.h"
     54 
     55 /* ideally AID_GRAPHICS would be in a semi-public header
     56  * or there would be a way to map a user/group name to its id
     57  */
     58 #ifndef AID_GRAPHICS
     59 #define AID_GRAPHICS 1003
     60 #endif
     61 
     62 #define DISPLAY_COUNT       1
     63 
     64 namespace android {
     65 
     66 // ---------------------------------------------------------------------------
     67 
     68 void SurfaceFlinger::instantiate() {
     69     defaultServiceManager()->addService(
     70             String16("SurfaceFlinger"), new SurfaceFlinger());
     71 }
     72 
     73 void SurfaceFlinger::shutdown() {
     74     // we should unregister here, but not really because
     75     // when (if) the service manager goes away, all the services
     76     // it has a reference to will leave too.
     77 }
     78 
     79 // ---------------------------------------------------------------------------
     80 
     81 SurfaceFlinger::LayerVector::LayerVector(const SurfaceFlinger::LayerVector& rhs)
     82     : lookup(rhs.lookup), layers(rhs.layers)
     83 {
     84 }
     85 
     86 ssize_t SurfaceFlinger::LayerVector::indexOf(
     87         const sp<LayerBase>& key, size_t guess) const
     88 {
     89     if (guess<size() && lookup.keyAt(guess) == key)
     90         return guess;
     91     const ssize_t i = lookup.indexOfKey(key);
     92     if (i>=0) {
     93         const size_t idx = lookup.valueAt(i);
     94         LOGE_IF(layers[idx]!=key,
     95             "LayerVector[%p]: layers[%d]=%p, key=%p",
     96             this, int(idx), layers[idx].get(), key.get());
     97         return idx;
     98     }
     99     return i;
    100 }
    101 
    102 ssize_t SurfaceFlinger::LayerVector::add(
    103         const sp<LayerBase>& layer,
    104         Vector< sp<LayerBase> >::compar_t cmp)
    105 {
    106     size_t count = layers.size();
    107     ssize_t l = 0;
    108     ssize_t h = count-1;
    109     ssize_t mid;
    110     sp<LayerBase> const* a = layers.array();
    111     while (l <= h) {
    112         mid = l + (h - l)/2;
    113         const int c = cmp(a+mid, &layer);
    114         if (c == 0)     { l = mid; break; }
    115         else if (c<0)   { l = mid+1; }
    116         else            { h = mid-1; }
    117     }
    118     size_t order = l;
    119     while (order<count && !cmp(&layer, a+order)) {
    120         order++;
    121     }
    122     count = lookup.size();
    123     for (size_t i=0 ; i<count ; i++) {
    124         if (lookup.valueAt(i) >= order) {
    125             lookup.editValueAt(i)++;
    126         }
    127     }
    128     layers.insertAt(layer, order);
    129     lookup.add(layer, order);
    130     return order;
    131 }
    132 
    133 ssize_t SurfaceFlinger::LayerVector::remove(const sp<LayerBase>& layer)
    134 {
    135     const ssize_t keyIndex = lookup.indexOfKey(layer);
    136     if (keyIndex >= 0) {
    137         const size_t index = lookup.valueAt(keyIndex);
    138         LOGE_IF(layers[index]!=layer,
    139                 "LayerVector[%p]: layers[%u]=%p, layer=%p",
    140                 this, int(index), layers[index].get(), layer.get());
    141         layers.removeItemsAt(index);
    142         lookup.removeItemsAt(keyIndex);
    143         const size_t count = lookup.size();
    144         for (size_t i=0 ; i<count ; i++) {
    145             if (lookup.valueAt(i) >= size_t(index)) {
    146                 lookup.editValueAt(i)--;
    147             }
    148         }
    149         return index;
    150     }
    151     return NAME_NOT_FOUND;
    152 }
    153 
    154 ssize_t SurfaceFlinger::LayerVector::reorder(
    155         const sp<LayerBase>& layer,
    156         Vector< sp<LayerBase> >::compar_t cmp)
    157 {
    158     // XXX: it's a little lame. but oh well...
    159     ssize_t err = remove(layer);
    160     if (err >=0)
    161         err = add(layer, cmp);
    162     return err;
    163 }
    164 
    165 // ---------------------------------------------------------------------------
    166 #if 0
    167 #pragma mark -
    168 #endif
    169 
    170 SurfaceFlinger::SurfaceFlinger()
    171     :   BnSurfaceComposer(), Thread(false),
    172         mTransactionFlags(0),
    173         mTransactionCount(0),
    174         mResizeTransationPending(false),
    175         mLayersRemoved(false),
    176         mBootTime(systemTime()),
    177         mHardwareTest("android.permission.HARDWARE_TEST"),
    178         mAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER"),
    179         mDump("android.permission.DUMP"),
    180         mVisibleRegionsDirty(false),
    181         mDeferReleaseConsole(false),
    182         mFreezeDisplay(false),
    183         mFreezeCount(0),
    184         mFreezeDisplayTime(0),
    185         mDebugRegion(0),
    186         mDebugBackground(0),
    187         mDebugInSwapBuffers(0),
    188         mLastSwapBufferTime(0),
    189         mDebugInTransaction(0),
    190         mLastTransactionTime(0),
    191         mBootFinished(false),
    192         mConsoleSignals(0),
    193         mSecureFrameBuffer(0)
    194 {
    195     init();
    196 }
    197 
    198 void SurfaceFlinger::init()
    199 {
    200     LOGI("SurfaceFlinger is starting");
    201 
    202     // debugging stuff...
    203     char value[PROPERTY_VALUE_MAX];
    204     property_get("debug.sf.showupdates", value, "0");
    205     mDebugRegion = atoi(value);
    206     property_get("debug.sf.showbackground", value, "0");
    207     mDebugBackground = atoi(value);
    208 
    209     LOGI_IF(mDebugRegion,           "showupdates enabled");
    210     LOGI_IF(mDebugBackground,       "showbackground enabled");
    211 }
    212 
    213 SurfaceFlinger::~SurfaceFlinger()
    214 {
    215     glDeleteTextures(1, &mWormholeTexName);
    216 }
    217 
    218 overlay_control_device_t* SurfaceFlinger::getOverlayEngine() const
    219 {
    220     return graphicPlane(0).displayHardware().getOverlayEngine();
    221 }
    222 
    223 sp<IMemoryHeap> SurfaceFlinger::getCblk() const
    224 {
    225     return mServerHeap;
    226 }
    227 
    228 sp<ISurfaceFlingerClient> SurfaceFlinger::createConnection()
    229 {
    230     Mutex::Autolock _l(mStateLock);
    231     uint32_t token = mTokens.acquire();
    232 
    233     sp<Client> client = new Client(token, this);
    234     if (client->ctrlblk == 0) {
    235         mTokens.release(token);
    236         return 0;
    237     }
    238     status_t err = mClientsMap.add(token, client);
    239     if (err < 0) {
    240         mTokens.release(token);
    241         return 0;
    242     }
    243     sp<BClient> bclient =
    244         new BClient(this, token, client->getControlBlockMemory());
    245     return bclient;
    246 }
    247 
    248 void SurfaceFlinger::destroyConnection(ClientID cid)
    249 {
    250     Mutex::Autolock _l(mStateLock);
    251     sp<Client> client = mClientsMap.valueFor(cid);
    252     if (client != 0) {
    253         // free all the layers this client owns
    254         Vector< wp<LayerBaseClient> > layers(client->getLayers());
    255         const size_t count = layers.size();
    256         for (size_t i=0 ; i<count ; i++) {
    257             sp<LayerBaseClient> layer(layers[i].promote());
    258             if (layer != 0) {
    259                 purgatorizeLayer_l(layer);
    260             }
    261         }
    262 
    263         // the resources associated with this client will be freed
    264         // during the next transaction, after these surfaces have been
    265         // properly removed from the screen
    266 
    267         // remove this client from our ClientID->Client mapping.
    268         mClientsMap.removeItem(cid);
    269 
    270         // and add it to the list of disconnected clients
    271         mDisconnectedClients.add(client);
    272 
    273         // request a transaction
    274         setTransactionFlags(eTransactionNeeded);
    275     }
    276 }
    277 
    278 const GraphicPlane& SurfaceFlinger::graphicPlane(int dpy) const
    279 {
    280     LOGE_IF(uint32_t(dpy) >= DISPLAY_COUNT, "Invalid DisplayID %d", dpy);
    281     const GraphicPlane& plane(mGraphicPlanes[dpy]);
    282     return plane;
    283 }
    284 
    285 GraphicPlane& SurfaceFlinger::graphicPlane(int dpy)
    286 {
    287     return const_cast<GraphicPlane&>(
    288         const_cast<SurfaceFlinger const *>(this)->graphicPlane(dpy));
    289 }
    290 
    291 void SurfaceFlinger::bootFinished()
    292 {
    293     const nsecs_t now = systemTime();
    294     const nsecs_t duration = now - mBootTime;
    295     LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
    296     mBootFinished = true;
    297     property_set("ctl.stop", "bootanim");
    298 }
    299 
    300 void SurfaceFlinger::onFirstRef()
    301 {
    302     run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
    303 
    304     // Wait for the main thread to be done with its initialization
    305     mReadyToRunBarrier.wait();
    306 }
    307 
    308 static inline uint16_t pack565(int r, int g, int b) {
    309     return (r<<11)|(g<<5)|b;
    310 }
    311 
    312 status_t SurfaceFlinger::readyToRun()
    313 {
    314     LOGI(   "SurfaceFlinger's main thread ready to run. "
    315             "Initializing graphics H/W...");
    316 
    317     // we only support one display currently
    318     int dpy = 0;
    319 
    320     {
    321         // initialize the main display
    322         GraphicPlane& plane(graphicPlane(dpy));
    323         DisplayHardware* const hw = new DisplayHardware(this, dpy);
    324         plane.setDisplayHardware(hw);
    325     }
    326 
    327     // create the shared control-block
    328     mServerHeap = new MemoryHeapBase(4096,
    329             MemoryHeapBase::READ_ONLY, "SurfaceFlinger read-only heap");
    330     LOGE_IF(mServerHeap==0, "can't create shared memory dealer");
    331 
    332     mServerCblk = static_cast<surface_flinger_cblk_t*>(mServerHeap->getBase());
    333     LOGE_IF(mServerCblk==0, "can't get to shared control block's address");
    334 
    335     new(mServerCblk) surface_flinger_cblk_t;
    336 
    337     // initialize primary screen
    338     // (other display should be initialized in the same manner, but
    339     // asynchronously, as they could come and go. None of this is supported
    340     // yet).
    341     const GraphicPlane& plane(graphicPlane(dpy));
    342     const DisplayHardware& hw = plane.displayHardware();
    343     const uint32_t w = hw.getWidth();
    344     const uint32_t h = hw.getHeight();
    345     const uint32_t f = hw.getFormat();
    346     hw.makeCurrent();
    347 
    348     // initialize the shared control block
    349     mServerCblk->connected |= 1<<dpy;
    350     display_cblk_t* dcblk = mServerCblk->displays + dpy;
    351     memset(dcblk, 0, sizeof(display_cblk_t));
    352     dcblk->w            = plane.getWidth();
    353     dcblk->h            = plane.getHeight();
    354     dcblk->format       = f;
    355     dcblk->orientation  = ISurfaceComposer::eOrientationDefault;
    356     dcblk->xdpi         = hw.getDpiX();
    357     dcblk->ydpi         = hw.getDpiY();
    358     dcblk->fps          = hw.getRefreshRate();
    359     dcblk->density      = hw.getDensity();
    360     asm volatile ("":::"memory");
    361 
    362     // Initialize OpenGL|ES
    363     glActiveTexture(GL_TEXTURE0);
    364     glBindTexture(GL_TEXTURE_2D, 0);
    365     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    366     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    367     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    368     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    369     glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    370     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
    371     glPixelStorei(GL_PACK_ALIGNMENT, 4);
    372     glEnableClientState(GL_VERTEX_ARRAY);
    373     glEnable(GL_SCISSOR_TEST);
    374     glShadeModel(GL_FLAT);
    375     glDisable(GL_DITHER);
    376     glDisable(GL_CULL_FACE);
    377 
    378     const uint16_t g0 = pack565(0x0F,0x1F,0x0F);
    379     const uint16_t g1 = pack565(0x17,0x2f,0x17);
    380     const uint16_t textureData[4] = { g0, g1, g1, g0 };
    381     glGenTextures(1, &mWormholeTexName);
    382     glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
    383     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    384     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    385     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    386     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    387     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,
    388             GL_RGB, GL_UNSIGNED_SHORT_5_6_5, textureData);
    389 
    390     glViewport(0, 0, w, h);
    391     glMatrixMode(GL_PROJECTION);
    392     glLoadIdentity();
    393     glOrthof(0, w, h, 0, 0, 1);
    394 
    395    LayerDim::initDimmer(this, w, h);
    396 
    397     mReadyToRunBarrier.open();
    398 
    399     /*
    400      *  We're now ready to accept clients...
    401      */
    402 
    403     // start boot animation
    404     property_set("ctl.start", "bootanim");
    405 
    406     return NO_ERROR;
    407 }
    408 
    409 // ----------------------------------------------------------------------------
    410 #if 0
    411 #pragma mark -
    412 #pragma mark Events Handler
    413 #endif
    414 
    415 void SurfaceFlinger::waitForEvent()
    416 {
    417     while (true) {
    418         nsecs_t timeout = -1;
    419         const nsecs_t freezeDisplayTimeout = ms2ns(5000);
    420         if (UNLIKELY(isFrozen())) {
    421             // wait 5 seconds
    422             const nsecs_t now = systemTime();
    423             if (mFreezeDisplayTime == 0) {
    424                 mFreezeDisplayTime = now;
    425             }
    426             nsecs_t waitTime = freezeDisplayTimeout - (now - mFreezeDisplayTime);
    427             timeout = waitTime>0 ? waitTime : 0;
    428         }
    429 
    430         MessageList::value_type msg = mEventQueue.waitMessage(timeout);
    431 
    432         // see if we timed out
    433         if (isFrozen()) {
    434             const nsecs_t now = systemTime();
    435             nsecs_t frozenTime = (now - mFreezeDisplayTime);
    436             if (frozenTime >= freezeDisplayTimeout) {
    437                 // we timed out and are still frozen
    438                 LOGW("timeout expired mFreezeDisplay=%d, mFreezeCount=%d",
    439                         mFreezeDisplay, mFreezeCount);
    440                 mFreezeDisplayTime = 0;
    441                 mFreezeCount = 0;
    442                 mFreezeDisplay = false;
    443             }
    444         }
    445 
    446         if (msg != 0) {
    447             switch (msg->what) {
    448                 case MessageQueue::INVALIDATE:
    449                     // invalidate message, just return to the main loop
    450                     return;
    451             }
    452         }
    453     }
    454 }
    455 
    456 void SurfaceFlinger::signalEvent() {
    457     mEventQueue.invalidate();
    458 }
    459 
    460 void SurfaceFlinger::signal() const {
    461     // this is the IPC call
    462     const_cast<SurfaceFlinger*>(this)->signalEvent();
    463 }
    464 
    465 void SurfaceFlinger::signalDelayedEvent(nsecs_t delay)
    466 {
    467     mEventQueue.postMessage( new MessageBase(MessageQueue::INVALIDATE), delay);
    468 }
    469 
    470 // ----------------------------------------------------------------------------
    471 #if 0
    472 #pragma mark -
    473 #pragma mark Main loop
    474 #endif
    475 
    476 bool SurfaceFlinger::threadLoop()
    477 {
    478     waitForEvent();
    479 
    480     // check for transactions
    481     if (UNLIKELY(mConsoleSignals)) {
    482         handleConsoleEvents();
    483     }
    484 
    485     if (LIKELY(mTransactionCount == 0)) {
    486         // if we're in a global transaction, don't do anything.
    487         const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
    488         uint32_t transactionFlags = getTransactionFlags(mask);
    489         if (LIKELY(transactionFlags)) {
    490             handleTransaction(transactionFlags);
    491         }
    492     }
    493 
    494     // post surfaces (if needed)
    495     handlePageFlip();
    496 
    497     const DisplayHardware& hw(graphicPlane(0).displayHardware());
    498     if (LIKELY(hw.canDraw() && !isFrozen())) {
    499         // repaint the framebuffer (if needed)
    500         handleRepaint();
    501 
    502         // inform the h/w that we're done compositing
    503         hw.compositionComplete();
    504 
    505         // release the clients before we flip ('cause flip might block)
    506         unlockClients();
    507 
    508         postFramebuffer();
    509     } else {
    510         // pretend we did the post
    511         unlockClients();
    512         usleep(16667); // 60 fps period
    513     }
    514     return true;
    515 }
    516 
    517 void SurfaceFlinger::postFramebuffer()
    518 {
    519     if (!mInvalidRegion.isEmpty()) {
    520         const DisplayHardware& hw(graphicPlane(0).displayHardware());
    521         const nsecs_t now = systemTime();
    522         mDebugInSwapBuffers = now;
    523         hw.flip(mInvalidRegion);
    524         mLastSwapBufferTime = systemTime() - now;
    525         mDebugInSwapBuffers = 0;
    526         mInvalidRegion.clear();
    527     }
    528 }
    529 
    530 void SurfaceFlinger::handleConsoleEvents()
    531 {
    532     // something to do with the console
    533     const DisplayHardware& hw = graphicPlane(0).displayHardware();
    534 
    535     int what = android_atomic_and(0, &mConsoleSignals);
    536     if (what & eConsoleAcquired) {
    537         hw.acquireScreen();
    538     }
    539 
    540     if (mDeferReleaseConsole && hw.canDraw()) {
    541         // We got the release signal before the acquire signal
    542         mDeferReleaseConsole = false;
    543         hw.releaseScreen();
    544     }
    545 
    546     if (what & eConsoleReleased) {
    547         if (hw.canDraw()) {
    548             hw.releaseScreen();
    549         } else {
    550             mDeferReleaseConsole = true;
    551         }
    552     }
    553 
    554     mDirtyRegion.set(hw.bounds());
    555 }
    556 
    557 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
    558 {
    559     Vector< sp<LayerBase> > ditchedLayers;
    560 
    561     { // scope for the lock
    562         Mutex::Autolock _l(mStateLock);
    563         const nsecs_t now = systemTime();
    564         mDebugInTransaction = now;
    565         handleTransactionLocked(transactionFlags, ditchedLayers);
    566         mLastTransactionTime = systemTime() - now;
    567         mDebugInTransaction = 0;
    568     }
    569 
    570     // do this without lock held
    571     const size_t count = ditchedLayers.size();
    572     for (size_t i=0 ; i<count ; i++) {
    573         if (ditchedLayers[i] != 0) {
    574             //LOGD("ditching layer %p", ditchedLayers[i].get());
    575             ditchedLayers[i]->ditch();
    576         }
    577     }
    578 }
    579 
    580 void SurfaceFlinger::handleTransactionLocked(
    581         uint32_t transactionFlags, Vector< sp<LayerBase> >& ditchedLayers)
    582 {
    583     const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
    584     const size_t count = currentLayers.size();
    585 
    586     /*
    587      * Traversal of the children
    588      * (perform the transaction for each of them if needed)
    589      */
    590 
    591     const bool layersNeedTransaction = transactionFlags & eTraversalNeeded;
    592     if (layersNeedTransaction) {
    593         for (size_t i=0 ; i<count ; i++) {
    594             const sp<LayerBase>& layer = currentLayers[i];
    595             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
    596             if (!trFlags) continue;
    597 
    598             const uint32_t flags = layer->doTransaction(0);
    599             if (flags & Layer::eVisibleRegion)
    600                 mVisibleRegionsDirty = true;
    601         }
    602     }
    603 
    604     /*
    605      * Perform our own transaction if needed
    606      */
    607 
    608     if (transactionFlags & eTransactionNeeded) {
    609         if (mCurrentState.orientation != mDrawingState.orientation) {
    610             // the orientation has changed, recompute all visible regions
    611             // and invalidate everything.
    612 
    613             const int dpy = 0;
    614             const int orientation = mCurrentState.orientation;
    615             const uint32_t type = mCurrentState.orientationType;
    616             GraphicPlane& plane(graphicPlane(dpy));
    617             plane.setOrientation(orientation);
    618 
    619             // update the shared control block
    620             const DisplayHardware& hw(plane.displayHardware());
    621             volatile display_cblk_t* dcblk = mServerCblk->displays + dpy;
    622             dcblk->orientation = orientation;
    623             dcblk->w = plane.getWidth();
    624             dcblk->h = plane.getHeight();
    625 
    626             mVisibleRegionsDirty = true;
    627             mDirtyRegion.set(hw.bounds());
    628         }
    629 
    630         if (mCurrentState.freezeDisplay != mDrawingState.freezeDisplay) {
    631             // freezing or unfreezing the display -> trigger animation if needed
    632             mFreezeDisplay = mCurrentState.freezeDisplay;
    633             if (mFreezeDisplay)
    634                  mFreezeDisplayTime = 0;
    635         }
    636 
    637         if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {
    638             // layers have been added
    639             mVisibleRegionsDirty = true;
    640         }
    641 
    642         // some layers might have been removed, so
    643         // we need to update the regions they're exposing.
    644         if (mLayersRemoved) {
    645             mLayersRemoved = false;
    646             mVisibleRegionsDirty = true;
    647             const LayerVector& previousLayers(mDrawingState.layersSortedByZ);
    648             const size_t count = previousLayers.size();
    649             for (size_t i=0 ; i<count ; i++) {
    650                 const sp<LayerBase>& layer(previousLayers[i]);
    651                 if (currentLayers.indexOf( layer ) < 0) {
    652                     // this layer is not visible anymore
    653                     ditchedLayers.add(layer);
    654                     mDirtyRegionRemovedLayer.orSelf(layer->visibleRegionScreen);
    655                 }
    656             }
    657         }
    658 
    659         // get rid of all resources we don't need anymore
    660         // (layers and clients)
    661         free_resources_l();
    662     }
    663 
    664     commitTransaction();
    665 }
    666 
    667 sp<FreezeLock> SurfaceFlinger::getFreezeLock() const
    668 {
    669     return new FreezeLock(const_cast<SurfaceFlinger *>(this));
    670 }
    671 
    672 void SurfaceFlinger::computeVisibleRegions(
    673     LayerVector& currentLayers, Region& dirtyRegion, Region& opaqueRegion)
    674 {
    675     const GraphicPlane& plane(graphicPlane(0));
    676     const Transform& planeTransform(plane.transform());
    677     const DisplayHardware& hw(plane.displayHardware());
    678     const Region screenRegion(hw.bounds());
    679 
    680     Region aboveOpaqueLayers;
    681     Region aboveCoveredLayers;
    682     Region dirty;
    683 
    684     bool secureFrameBuffer = false;
    685 
    686     size_t i = currentLayers.size();
    687     while (i--) {
    688         const sp<LayerBase>& layer = currentLayers[i];
    689         layer->validateVisibility(planeTransform);
    690 
    691         // start with the whole surface at its current location
    692         const Layer::State& s(layer->drawingState());
    693 
    694         /*
    695          * opaqueRegion: area of a surface that is fully opaque.
    696          */
    697         Region opaqueRegion;
    698 
    699         /*
    700          * visibleRegion: area of a surface that is visible on screen
    701          * and not fully transparent. This is essentially the layer's
    702          * footprint minus the opaque regions above it.
    703          * Areas covered by a translucent surface are considered visible.
    704          */
    705         Region visibleRegion;
    706 
    707         /*
    708          * coveredRegion: area of a surface that is covered by all
    709          * visible regions above it (which includes the translucent areas).
    710          */
    711         Region coveredRegion;
    712 
    713 
    714         // handle hidden surfaces by setting the visible region to empty
    715         if (LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
    716             const bool translucent = layer->needsBlending();
    717             const Rect bounds(layer->visibleBounds());
    718             visibleRegion.set(bounds);
    719             visibleRegion.andSelf(screenRegion);
    720             if (!visibleRegion.isEmpty()) {
    721                 // Remove the transparent area from the visible region
    722                 if (translucent) {
    723                     visibleRegion.subtractSelf(layer->transparentRegionScreen);
    724                 }
    725 
    726                 // compute the opaque region
    727                 const int32_t layerOrientation = layer->getOrientation();
    728                 if (s.alpha==255 && !translucent &&
    729                         ((layerOrientation & Transform::ROT_INVALID) == false)) {
    730                     // the opaque region is the layer's footprint
    731                     opaqueRegion = visibleRegion;
    732                 }
    733             }
    734         }
    735 
    736         // Clip the covered region to the visible region
    737         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
    738 
    739         // Update aboveCoveredLayers for next (lower) layer
    740         aboveCoveredLayers.orSelf(visibleRegion);
    741 
    742         // subtract the opaque region covered by the layers above us
    743         visibleRegion.subtractSelf(aboveOpaqueLayers);
    744 
    745         // compute this layer's dirty region
    746         if (layer->contentDirty) {
    747             // we need to invalidate the whole region
    748             dirty = visibleRegion;
    749             // as well, as the old visible region
    750             dirty.orSelf(layer->visibleRegionScreen);
    751             layer->contentDirty = false;
    752         } else {
    753             /* compute the exposed region:
    754              *   the exposed region consists of two components:
    755              *   1) what's VISIBLE now and was COVERED before
    756              *   2) what's EXPOSED now less what was EXPOSED before
    757              *
    758              * note that (1) is conservative, we start with the whole
    759              * visible region but only keep what used to be covered by
    760              * something -- which mean it may have been exposed.
    761              *
    762              * (2) handles areas that were not covered by anything but got
    763              * exposed because of a resize.
    764              */
    765             const Region newExposed = visibleRegion - coveredRegion;
    766             const Region oldVisibleRegion = layer->visibleRegionScreen;
    767             const Region oldCoveredRegion = layer->coveredRegionScreen;
    768             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
    769             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
    770         }
    771         dirty.subtractSelf(aboveOpaqueLayers);
    772 
    773         // accumulate to the screen dirty region
    774         dirtyRegion.orSelf(dirty);
    775 
    776         // Update aboveOpaqueLayers for next (lower) layer
    777         aboveOpaqueLayers.orSelf(opaqueRegion);
    778 
    779         // Store the visible region is screen space
    780         layer->setVisibleRegion(visibleRegion);
    781         layer->setCoveredRegion(coveredRegion);
    782 
    783         // If a secure layer is partially visible, lock-down the screen!
    784         if (layer->isSecure() && !visibleRegion.isEmpty()) {
    785             secureFrameBuffer = true;
    786         }
    787     }
    788 
    789     // invalidate the areas where a layer was removed
    790     dirtyRegion.orSelf(mDirtyRegionRemovedLayer);
    791     mDirtyRegionRemovedLayer.clear();
    792 
    793     mSecureFrameBuffer = secureFrameBuffer;
    794     opaqueRegion = aboveOpaqueLayers;
    795 }
    796 
    797 
    798 void SurfaceFlinger::commitTransaction()
    799 {
    800     mDrawingState = mCurrentState;
    801     mResizeTransationPending = false;
    802     mTransactionCV.broadcast();
    803 }
    804 
    805 void SurfaceFlinger::handlePageFlip()
    806 {
    807     bool visibleRegions = mVisibleRegionsDirty;
    808     LayerVector& currentLayers = const_cast<LayerVector&>(mDrawingState.layersSortedByZ);
    809     visibleRegions |= lockPageFlip(currentLayers);
    810 
    811         const DisplayHardware& hw = graphicPlane(0).displayHardware();
    812         const Region screenRegion(hw.bounds());
    813         if (visibleRegions) {
    814             Region opaqueRegion;
    815             computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);
    816             mWormholeRegion = screenRegion.subtract(opaqueRegion);
    817             mVisibleRegionsDirty = false;
    818         }
    819 
    820     unlockPageFlip(currentLayers);
    821     mDirtyRegion.andSelf(screenRegion);
    822 }
    823 
    824 bool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers)
    825 {
    826     bool recomputeVisibleRegions = false;
    827     size_t count = currentLayers.size();
    828     sp<LayerBase> const* layers = currentLayers.array();
    829     for (size_t i=0 ; i<count ; i++) {
    830         const sp<LayerBase>& layer = layers[i];
    831         layer->lockPageFlip(recomputeVisibleRegions);
    832     }
    833     return recomputeVisibleRegions;
    834 }
    835 
    836 void SurfaceFlinger::unlockPageFlip(const LayerVector& currentLayers)
    837 {
    838     const GraphicPlane& plane(graphicPlane(0));
    839     const Transform& planeTransform(plane.transform());
    840     size_t count = currentLayers.size();
    841     sp<LayerBase> const* layers = currentLayers.array();
    842     for (size_t i=0 ; i<count ; i++) {
    843         const sp<LayerBase>& layer = layers[i];
    844         layer->unlockPageFlip(planeTransform, mDirtyRegion);
    845     }
    846 }
    847 
    848 
    849 void SurfaceFlinger::handleRepaint()
    850 {
    851     // compute the invalid region
    852     mInvalidRegion.orSelf(mDirtyRegion);
    853     if (mInvalidRegion.isEmpty()) {
    854         // nothing to do
    855         return;
    856     }
    857 
    858     if (UNLIKELY(mDebugRegion)) {
    859         debugFlashRegions();
    860     }
    861 
    862     // set the frame buffer
    863     const DisplayHardware& hw(graphicPlane(0).displayHardware());
    864     glMatrixMode(GL_MODELVIEW);
    865     glLoadIdentity();
    866 
    867     uint32_t flags = hw.getFlags();
    868     if ((flags & DisplayHardware::SWAP_RECTANGLE) ||
    869         (flags & DisplayHardware::BUFFER_PRESERVED))
    870     {
    871         // we can redraw only what's dirty, but since SWAP_RECTANGLE only
    872         // takes a rectangle, we must make sure to update that whole
    873         // rectangle in that case
    874         if (flags & DisplayHardware::SWAP_RECTANGLE) {
    875             // FIXME: we really should be able to pass a region to
    876             // SWAP_RECTANGLE so that we don't have to redraw all this.
    877             mDirtyRegion.set(mInvalidRegion.bounds());
    878         } else {
    879             // in the BUFFER_PRESERVED case, obviously, we can update only
    880             // what's needed and nothing more.
    881             // NOTE: this is NOT a common case, as preserving the backbuffer
    882             // is costly and usually involves copying the whole update back.
    883         }
    884     } else {
    885         if (flags & DisplayHardware::PARTIAL_UPDATES) {
    886             // We need to redraw the rectangle that will be updated
    887             // (pushed to the framebuffer).
    888             // This is needed because PARTIAL_UPDATES only takes one
    889             // rectangle instead of a region (see DisplayHardware::flip())
    890             mDirtyRegion.set(mInvalidRegion.bounds());
    891         } else {
    892             // we need to redraw everything (the whole screen)
    893             mDirtyRegion.set(hw.bounds());
    894             mInvalidRegion = mDirtyRegion;
    895         }
    896     }
    897 
    898     // compose all surfaces
    899     composeSurfaces(mDirtyRegion);
    900 
    901     // clear the dirty regions
    902     mDirtyRegion.clear();
    903 }
    904 
    905 void SurfaceFlinger::composeSurfaces(const Region& dirty)
    906 {
    907     if (UNLIKELY(!mWormholeRegion.isEmpty())) {
    908         // should never happen unless the window manager has a bug
    909         // draw something...
    910         drawWormhole();
    911     }
    912     const SurfaceFlinger& flinger(*this);
    913     const LayerVector& drawingLayers(mDrawingState.layersSortedByZ);
    914     const size_t count = drawingLayers.size();
    915     sp<LayerBase> const* const layers = drawingLayers.array();
    916     for (size_t i=0 ; i<count ; ++i) {
    917         const sp<LayerBase>& layer = layers[i];
    918         const Region& visibleRegion(layer->visibleRegionScreen);
    919         if (!visibleRegion.isEmpty())  {
    920             const Region clip(dirty.intersect(visibleRegion));
    921             if (!clip.isEmpty()) {
    922                 layer->draw(clip);
    923             }
    924         }
    925     }
    926 }
    927 
    928 void SurfaceFlinger::unlockClients()
    929 {
    930     const LayerVector& drawingLayers(mDrawingState.layersSortedByZ);
    931     const size_t count = drawingLayers.size();
    932     sp<LayerBase> const* const layers = drawingLayers.array();
    933     for (size_t i=0 ; i<count ; ++i) {
    934         const sp<LayerBase>& layer = layers[i];
    935         layer->finishPageFlip();
    936     }
    937 }
    938 
    939 void SurfaceFlinger::debugFlashRegions()
    940 {
    941      const DisplayHardware& hw(graphicPlane(0).displayHardware());
    942      const uint32_t flags = hw.getFlags();
    943 
    944      if (!((flags & DisplayHardware::SWAP_RECTANGLE) ||
    945              (flags & DisplayHardware::BUFFER_PRESERVED))) {
    946          const Region repaint((flags & DisplayHardware::PARTIAL_UPDATES) ?
    947                  mDirtyRegion.bounds() : hw.bounds());
    948          composeSurfaces(repaint);
    949      }
    950 
    951     glDisable(GL_TEXTURE_2D);
    952     glDisable(GL_BLEND);
    953     glDisable(GL_DITHER);
    954     glDisable(GL_SCISSOR_TEST);
    955 
    956     static int toggle = 0;
    957     toggle = 1 - toggle;
    958     if (toggle) {
    959         glColor4x(0x10000, 0, 0x10000, 0x10000);
    960     } else {
    961         glColor4x(0x10000, 0x10000, 0, 0x10000);
    962     }
    963 
    964     Region::const_iterator it = mDirtyRegion.begin();
    965     Region::const_iterator const end = mDirtyRegion.end();
    966     while (it != end) {
    967         const Rect& r = *it++;
    968         GLfloat vertices[][2] = {
    969                 { r.left,  r.top },
    970                 { r.left,  r.bottom },
    971                 { r.right, r.bottom },
    972                 { r.right, r.top }
    973         };
    974         glVertexPointer(2, GL_FLOAT, 0, vertices);
    975         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    976     }
    977 
    978     if (mInvalidRegion.isEmpty()) {
    979         mDirtyRegion.dump("mDirtyRegion");
    980         mInvalidRegion.dump("mInvalidRegion");
    981     }
    982     hw.flip(mInvalidRegion);
    983 
    984     if (mDebugRegion > 1)
    985        usleep(mDebugRegion * 1000);
    986 
    987     glEnable(GL_SCISSOR_TEST);
    988     //mDirtyRegion.dump("mDirtyRegion");
    989 }
    990 
    991 void SurfaceFlinger::drawWormhole() const
    992 {
    993     const Region region(mWormholeRegion.intersect(mDirtyRegion));
    994     if (region.isEmpty())
    995         return;
    996 
    997     const DisplayHardware& hw(graphicPlane(0).displayHardware());
    998     const int32_t width = hw.getWidth();
    999     const int32_t height = hw.getHeight();
   1000 
   1001     glDisable(GL_BLEND);
   1002     glDisable(GL_DITHER);
   1003 
   1004     if (LIKELY(!mDebugBackground)) {
   1005         glClearColorx(0,0,0,0);
   1006         Region::const_iterator it = region.begin();
   1007         Region::const_iterator const end = region.end();
   1008         while (it != end) {
   1009             const Rect& r = *it++;
   1010             const GLint sy = height - (r.top + r.height());
   1011             glScissor(r.left, sy, r.width(), r.height());
   1012             glClear(GL_COLOR_BUFFER_BIT);
   1013         }
   1014     } else {
   1015         const GLshort vertices[][2] = { { 0, 0 }, { width, 0 },
   1016                 { width, height }, { 0, height }  };
   1017         const GLshort tcoords[][2] = { { 0, 0 }, { 1, 0 },  { 1, 1 }, { 0, 1 } };
   1018         glVertexPointer(2, GL_SHORT, 0, vertices);
   1019         glTexCoordPointer(2, GL_SHORT, 0, tcoords);
   1020         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
   1021         glEnable(GL_TEXTURE_2D);
   1022         glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
   1023         glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
   1024         glMatrixMode(GL_TEXTURE);
   1025         glLoadIdentity();
   1026         glScalef(width*(1.0f/32.0f), height*(1.0f/32.0f), 1);
   1027         Region::const_iterator it = region.begin();
   1028         Region::const_iterator const end = region.end();
   1029         while (it != end) {
   1030             const Rect& r = *it++;
   1031             const GLint sy = height - (r.top + r.height());
   1032             glScissor(r.left, sy, r.width(), r.height());
   1033             glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
   1034         }
   1035         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
   1036     }
   1037 }
   1038 
   1039 void SurfaceFlinger::debugShowFPS() const
   1040 {
   1041     static int mFrameCount;
   1042     static int mLastFrameCount = 0;
   1043     static nsecs_t mLastFpsTime = 0;
   1044     static float mFps = 0;
   1045     mFrameCount++;
   1046     nsecs_t now = systemTime();
   1047     nsecs_t diff = now - mLastFpsTime;
   1048     if (diff > ms2ns(250)) {
   1049         mFps =  ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
   1050         mLastFpsTime = now;
   1051         mLastFrameCount = mFrameCount;
   1052     }
   1053     // XXX: mFPS has the value we want
   1054  }
   1055 
   1056 status_t SurfaceFlinger::addLayer(const sp<LayerBase>& layer)
   1057 {
   1058     Mutex::Autolock _l(mStateLock);
   1059     addLayer_l(layer);
   1060     setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
   1061     return NO_ERROR;
   1062 }
   1063 
   1064 status_t SurfaceFlinger::removeLayer(const sp<LayerBase>& layer)
   1065 {
   1066     Mutex::Autolock _l(mStateLock);
   1067     status_t err = purgatorizeLayer_l(layer);
   1068     if (err == NO_ERROR)
   1069         setTransactionFlags(eTransactionNeeded);
   1070     return err;
   1071 }
   1072 
   1073 status_t SurfaceFlinger::invalidateLayerVisibility(const sp<LayerBase>& layer)
   1074 {
   1075     layer->forceVisibilityTransaction();
   1076     setTransactionFlags(eTraversalNeeded);
   1077     return NO_ERROR;
   1078 }
   1079 
   1080 status_t SurfaceFlinger::addLayer_l(const sp<LayerBase>& layer)
   1081 {
   1082     if (layer == 0)
   1083         return BAD_VALUE;
   1084     ssize_t i = mCurrentState.layersSortedByZ.add(
   1085                 layer, &LayerBase::compareCurrentStateZ);
   1086     sp<LayerBaseClient> lbc = LayerBase::dynamicCast< LayerBaseClient* >(layer.get());
   1087     if (lbc != 0) {
   1088         mLayerMap.add(lbc->serverIndex(), lbc);
   1089     }
   1090     return NO_ERROR;
   1091 }
   1092 
   1093 status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase)
   1094 {
   1095     ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
   1096     if (index >= 0) {
   1097         mLayersRemoved = true;
   1098         sp<LayerBaseClient> layer =
   1099             LayerBase::dynamicCast< LayerBaseClient* >(layerBase.get());
   1100         if (layer != 0) {
   1101             mLayerMap.removeItem(layer->serverIndex());
   1102         }
   1103         return NO_ERROR;
   1104     }
   1105     return status_t(index);
   1106 }
   1107 
   1108 status_t SurfaceFlinger::purgatorizeLayer_l(const sp<LayerBase>& layerBase)
   1109 {
   1110     // remove the layer from the main list (through a transaction).
   1111     ssize_t err = removeLayer_l(layerBase);
   1112 
   1113     layerBase->onRemoved();
   1114 
   1115     // it's possible that we don't find a layer, because it might
   1116     // have been destroyed already -- this is not technically an error
   1117     // from the user because there is a race between BClient::destroySurface(),
   1118     // ~BClient() and ~ISurface().
   1119     return (err == NAME_NOT_FOUND) ? status_t(NO_ERROR) : err;
   1120 }
   1121 
   1122 
   1123 void SurfaceFlinger::free_resources_l()
   1124 {
   1125     // free resources associated with disconnected clients
   1126     Vector< sp<Client> >& disconnectedClients(mDisconnectedClients);
   1127     const size_t count = disconnectedClients.size();
   1128     for (size_t i=0 ; i<count ; i++) {
   1129         sp<Client> client = disconnectedClients[i];
   1130         mTokens.release(client->cid);
   1131     }
   1132     disconnectedClients.clear();
   1133 }
   1134 
   1135 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags)
   1136 {
   1137     return android_atomic_and(~flags, &mTransactionFlags) & flags;
   1138 }
   1139 
   1140 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags, nsecs_t delay)
   1141 {
   1142     uint32_t old = android_atomic_or(flags, &mTransactionFlags);
   1143     if ((old & flags)==0) { // wake the server up
   1144         if (delay > 0) {
   1145             signalDelayedEvent(delay);
   1146         } else {
   1147             signalEvent();
   1148         }
   1149     }
   1150     return old;
   1151 }
   1152 
   1153 void SurfaceFlinger::openGlobalTransaction()
   1154 {
   1155     android_atomic_inc(&mTransactionCount);
   1156 }
   1157 
   1158 void SurfaceFlinger::closeGlobalTransaction()
   1159 {
   1160     if (android_atomic_dec(&mTransactionCount) == 1) {
   1161         signalEvent();
   1162 
   1163         // if there is a transaction with a resize, wait for it to
   1164         // take effect before returning.
   1165         Mutex::Autolock _l(mStateLock);
   1166         while (mResizeTransationPending) {
   1167             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
   1168             if (CC_UNLIKELY(err != NO_ERROR)) {
   1169                 // just in case something goes wrong in SF, return to the
   1170                 // called after a few seconds.
   1171                 LOGW_IF(err == TIMED_OUT, "closeGlobalTransaction timed out!");
   1172                 mResizeTransationPending = false;
   1173                 break;
   1174             }
   1175         }
   1176     }
   1177 }
   1178 
   1179 status_t SurfaceFlinger::freezeDisplay(DisplayID dpy, uint32_t flags)
   1180 {
   1181     if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
   1182         return BAD_VALUE;
   1183 
   1184     Mutex::Autolock _l(mStateLock);
   1185     mCurrentState.freezeDisplay = 1;
   1186     setTransactionFlags(eTransactionNeeded);
   1187 
   1188     // flags is intended to communicate some sort of animation behavior
   1189     // (for instance fading)
   1190     return NO_ERROR;
   1191 }
   1192 
   1193 status_t SurfaceFlinger::unfreezeDisplay(DisplayID dpy, uint32_t flags)
   1194 {
   1195     if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
   1196         return BAD_VALUE;
   1197 
   1198     Mutex::Autolock _l(mStateLock);
   1199     mCurrentState.freezeDisplay = 0;
   1200     setTransactionFlags(eTransactionNeeded);
   1201 
   1202     // flags is intended to communicate some sort of animation behavior
   1203     // (for instance fading)
   1204     return NO_ERROR;
   1205 }
   1206 
   1207 int SurfaceFlinger::setOrientation(DisplayID dpy,
   1208         int orientation, uint32_t flags)
   1209 {
   1210     if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
   1211         return BAD_VALUE;
   1212 
   1213     Mutex::Autolock _l(mStateLock);
   1214     if (mCurrentState.orientation != orientation) {
   1215         if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
   1216             mCurrentState.orientationType = flags;
   1217             mCurrentState.orientation = orientation;
   1218             setTransactionFlags(eTransactionNeeded);
   1219             mTransactionCV.wait(mStateLock);
   1220         } else {
   1221             orientation = BAD_VALUE;
   1222         }
   1223     }
   1224     return orientation;
   1225 }
   1226 
   1227 sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
   1228         const String8& name, ISurfaceFlingerClient::surface_data_t* params,
   1229         DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
   1230         uint32_t flags)
   1231 {
   1232     sp<LayerBaseClient> layer;
   1233     sp<LayerBaseClient::Surface> surfaceHandle;
   1234 
   1235     if (int32_t(w|h) < 0) {
   1236         LOGE("createSurface() failed, w or h is negative (w=%d, h=%d)",
   1237                 int(w), int(h));
   1238         return surfaceHandle;
   1239     }
   1240 
   1241     Mutex::Autolock _l(mStateLock);
   1242     sp<Client> client = mClientsMap.valueFor(clientId);
   1243     if (UNLIKELY(client == 0)) {
   1244         LOGE("createSurface() failed, client not found (id=%d)", clientId);
   1245         return surfaceHandle;
   1246     }
   1247 
   1248     //LOGD("createSurface for pid %d (%d x %d)", pid, w, h);
   1249     int32_t id = client->generateId(pid);
   1250     if (uint32_t(id) >= NUM_LAYERS_MAX) {
   1251         LOGE("createSurface() failed, generateId = %d", id);
   1252         return surfaceHandle;
   1253     }
   1254 
   1255     switch (flags & eFXSurfaceMask) {
   1256         case eFXSurfaceNormal:
   1257             if (UNLIKELY(flags & ePushBuffers)) {
   1258                 layer = createPushBuffersSurfaceLocked(client, d, id,
   1259                         w, h, flags);
   1260             } else {
   1261                 layer = createNormalSurfaceLocked(client, d, id,
   1262                         w, h, flags, format);
   1263             }
   1264             break;
   1265         case eFXSurfaceBlur:
   1266             layer = createBlurSurfaceLocked(client, d, id, w, h, flags);
   1267             break;
   1268         case eFXSurfaceDim:
   1269             layer = createDimSurfaceLocked(client, d, id, w, h, flags);
   1270             break;
   1271     }
   1272 
   1273     if (layer != 0) {
   1274         layer->setName(name);
   1275         setTransactionFlags(eTransactionNeeded);
   1276         surfaceHandle = layer->getSurface();
   1277         if (surfaceHandle != 0) {
   1278             params->token = surfaceHandle->getToken();
   1279             params->identity = surfaceHandle->getIdentity();
   1280             params->width = w;
   1281             params->height = h;
   1282             params->format = format;
   1283         }
   1284     }
   1285 
   1286     return surfaceHandle;
   1287 }
   1288 
   1289 sp<LayerBaseClient> SurfaceFlinger::createNormalSurfaceLocked(
   1290         const sp<Client>& client, DisplayID display,
   1291         int32_t id, uint32_t w, uint32_t h, uint32_t flags,
   1292         PixelFormat& format)
   1293 {
   1294     // initialize the surfaces
   1295     switch (format) { // TODO: take h/w into account
   1296     case PIXEL_FORMAT_TRANSPARENT:
   1297     case PIXEL_FORMAT_TRANSLUCENT:
   1298         format = PIXEL_FORMAT_RGBA_8888;
   1299         break;
   1300     case PIXEL_FORMAT_OPAQUE:
   1301         format = PIXEL_FORMAT_RGB_565;
   1302         break;
   1303     }
   1304 
   1305     sp<Layer> layer = new Layer(this, display, client, id);
   1306     status_t err = layer->setBuffers(w, h, format, flags);
   1307     if (LIKELY(err == NO_ERROR)) {
   1308         layer->initStates(w, h, flags);
   1309         addLayer_l(layer);
   1310     } else {
   1311         LOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
   1312         layer.clear();
   1313     }
   1314     return layer;
   1315 }
   1316 
   1317 sp<LayerBaseClient> SurfaceFlinger::createBlurSurfaceLocked(
   1318         const sp<Client>& client, DisplayID display,
   1319         int32_t id, uint32_t w, uint32_t h, uint32_t flags)
   1320 {
   1321     sp<LayerBlur> layer = new LayerBlur(this, display, client, id);
   1322     layer->initStates(w, h, flags);
   1323     addLayer_l(layer);
   1324     return layer;
   1325 }
   1326 
   1327 sp<LayerBaseClient> SurfaceFlinger::createDimSurfaceLocked(
   1328         const sp<Client>& client, DisplayID display,
   1329         int32_t id, uint32_t w, uint32_t h, uint32_t flags)
   1330 {
   1331     sp<LayerDim> layer = new LayerDim(this, display, client, id);
   1332     layer->initStates(w, h, flags);
   1333     addLayer_l(layer);
   1334     return layer;
   1335 }
   1336 
   1337 sp<LayerBaseClient> SurfaceFlinger::createPushBuffersSurfaceLocked(
   1338         const sp<Client>& client, DisplayID display,
   1339         int32_t id, uint32_t w, uint32_t h, uint32_t flags)
   1340 {
   1341     sp<LayerBuffer> layer = new LayerBuffer(this, display, client, id);
   1342     layer->initStates(w, h, flags);
   1343     addLayer_l(layer);
   1344     return layer;
   1345 }
   1346 
   1347 status_t SurfaceFlinger::removeSurface(SurfaceID index)
   1348 {
   1349     /*
   1350      * called by the window manager, when a surface should be marked for
   1351      * destruction.
   1352      *
   1353      * The surface is removed from the current and drawing lists, but placed
   1354      * in the purgatory queue, so it's not destroyed right-away (we need
   1355      * to wait for all client's references to go away first).
   1356      */
   1357 
   1358     status_t err = NAME_NOT_FOUND;
   1359     Mutex::Autolock _l(mStateLock);
   1360     sp<LayerBaseClient> layer = getLayerUser_l(index);
   1361     if (layer != 0) {
   1362         err = purgatorizeLayer_l(layer);
   1363         if (err == NO_ERROR) {
   1364             setTransactionFlags(eTransactionNeeded);
   1365         }
   1366     }
   1367     return err;
   1368 }
   1369 
   1370 status_t SurfaceFlinger::destroySurface(const sp<LayerBaseClient>& layer)
   1371 {
   1372     // called by ~ISurface() when all references are gone
   1373 
   1374     class MessageDestroySurface : public MessageBase {
   1375         SurfaceFlinger* flinger;
   1376         sp<LayerBaseClient> layer;
   1377     public:
   1378         MessageDestroySurface(
   1379                 SurfaceFlinger* flinger, const sp<LayerBaseClient>& layer)
   1380             : flinger(flinger), layer(layer) { }
   1381         virtual bool handler() {
   1382             sp<LayerBaseClient> l(layer);
   1383             layer.clear(); // clear it outside of the lock;
   1384             Mutex::Autolock _l(flinger->mStateLock);
   1385             /*
   1386              * remove the layer from the current list -- chances are that it's
   1387              * not in the list anyway, because it should have been removed
   1388              * already upon request of the client (eg: window manager).
   1389              * However, a buggy client could have not done that.
   1390              * Since we know we don't have any more clients, we don't need
   1391              * to use the purgatory.
   1392              */
   1393             status_t err = flinger->removeLayer_l(l);
   1394             LOGE_IF(err<0 && err != NAME_NOT_FOUND,
   1395                     "error removing layer=%p (%s)", l.get(), strerror(-err));
   1396             return true;
   1397         }
   1398     };
   1399 
   1400     mEventQueue.postMessage( new MessageDestroySurface(this, layer) );
   1401     return NO_ERROR;
   1402 }
   1403 
   1404 status_t SurfaceFlinger::setClientState(
   1405         ClientID cid,
   1406         int32_t count,
   1407         const layer_state_t* states)
   1408 {
   1409     Mutex::Autolock _l(mStateLock);
   1410     uint32_t flags = 0;
   1411     cid <<= 16;
   1412     for (int i=0 ; i<count ; i++) {
   1413         const layer_state_t& s = states[i];
   1414         sp<LayerBaseClient> layer(getLayerUser_l(s.surface | cid));
   1415         if (layer != 0) {
   1416             const uint32_t what = s.what;
   1417             if (what & ePositionChanged) {
   1418                 if (layer->setPosition(s.x, s.y))
   1419                     flags |= eTraversalNeeded;
   1420             }
   1421             if (what & eLayerChanged) {
   1422                 if (layer->setLayer(s.z)) {
   1423                     mCurrentState.layersSortedByZ.reorder(
   1424                             layer, &Layer::compareCurrentStateZ);
   1425                     // we need traversal (state changed)
   1426                     // AND transaction (list changed)
   1427                     flags |= eTransactionNeeded|eTraversalNeeded;
   1428                 }
   1429             }
   1430             if (what & eSizeChanged) {
   1431                 if (layer->setSize(s.w, s.h)) {
   1432                     flags |= eTraversalNeeded;
   1433                     mResizeTransationPending = true;
   1434                 }
   1435             }
   1436             if (what & eAlphaChanged) {
   1437                 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
   1438                     flags |= eTraversalNeeded;
   1439             }
   1440             if (what & eMatrixChanged) {
   1441                 if (layer->setMatrix(s.matrix))
   1442                     flags |= eTraversalNeeded;
   1443             }
   1444             if (what & eTransparentRegionChanged) {
   1445                 if (layer->setTransparentRegionHint(s.transparentRegion))
   1446                     flags |= eTraversalNeeded;
   1447             }
   1448             if (what & eVisibilityChanged) {
   1449                 if (layer->setFlags(s.flags, s.mask))
   1450                     flags |= eTraversalNeeded;
   1451             }
   1452         }
   1453     }
   1454     if (flags) {
   1455         setTransactionFlags(flags);
   1456     }
   1457     return NO_ERROR;
   1458 }
   1459 
   1460 sp<LayerBaseClient> SurfaceFlinger::getLayerUser_l(SurfaceID s) const
   1461 {
   1462     sp<LayerBaseClient> layer = mLayerMap.valueFor(s);
   1463     return layer;
   1464 }
   1465 
   1466 void SurfaceFlinger::screenReleased(int dpy)
   1467 {
   1468     // this may be called by a signal handler, we can't do too much in here
   1469     android_atomic_or(eConsoleReleased, &mConsoleSignals);
   1470     signalEvent();
   1471 }
   1472 
   1473 void SurfaceFlinger::screenAcquired(int dpy)
   1474 {
   1475     // this may be called by a signal handler, we can't do too much in here
   1476     android_atomic_or(eConsoleAcquired, &mConsoleSignals);
   1477     signalEvent();
   1478 }
   1479 
   1480 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
   1481 {
   1482     const size_t SIZE = 1024;
   1483     char buffer[SIZE];
   1484     String8 result;
   1485     if (!mDump.checkCalling()) {
   1486         snprintf(buffer, SIZE, "Permission Denial: "
   1487                 "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
   1488                 IPCThreadState::self()->getCallingPid(),
   1489                 IPCThreadState::self()->getCallingUid());
   1490         result.append(buffer);
   1491     } else {
   1492 
   1493         // figure out if we're stuck somewhere
   1494         const nsecs_t now = systemTime();
   1495         const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
   1496         const nsecs_t inTransaction(mDebugInTransaction);
   1497         nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
   1498         nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
   1499 
   1500         // Try to get the main lock, but don't insist if we can't
   1501         // (this would indicate SF is stuck, but we want to be able to
   1502         // print something in dumpsys).
   1503         int retry = 3;
   1504         while (mStateLock.tryLock()<0 && --retry>=0) {
   1505             usleep(1000000);
   1506         }
   1507         const bool locked(retry >= 0);
   1508         if (!locked) {
   1509             snprintf(buffer, SIZE,
   1510                     "SurfaceFlinger appears to be unresponsive, "
   1511                     "dumping anyways (no locks held)\n");
   1512             result.append(buffer);
   1513         }
   1514 
   1515         size_t s = mClientsMap.size();
   1516         char name[64];
   1517         for (size_t i=0 ; i<s ; i++) {
   1518             sp<Client> client = mClientsMap.valueAt(i);
   1519             sprintf(name, "  Client (id=0x%08x)", client->cid);
   1520             client->dump(name);
   1521         }
   1522         const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
   1523         const size_t count = currentLayers.size();
   1524         for (size_t i=0 ; i<count ; i++) {
   1525             /*** LayerBase ***/
   1526             const sp<LayerBase>& layer = currentLayers[i];
   1527             const Layer::State& s = layer->drawingState();
   1528             snprintf(buffer, SIZE,
   1529                     "+ %s %p\n"
   1530                     "      "
   1531                     "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
   1532                     "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, "
   1533                     "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
   1534                     layer->getTypeID(), layer.get(),
   1535                     s.z, layer->tx(), layer->ty(), s.w, s.h,
   1536                     layer->needsBlending(), layer->needsDithering(),
   1537                     layer->contentDirty,
   1538                     s.alpha, s.flags,
   1539                     s.transform[0][0], s.transform[0][1],
   1540                     s.transform[1][0], s.transform[1][1]);
   1541             result.append(buffer);
   1542             buffer[0] = 0;
   1543             /*** LayerBaseClient ***/
   1544             sp<LayerBaseClient> lbc =
   1545                 LayerBase::dynamicCast< LayerBaseClient* >(layer.get());
   1546             if (lbc != 0) {
   1547                 sp<Client> client(lbc->client.promote());
   1548                 snprintf(buffer, SIZE,
   1549                         "      name=%s\n", lbc->getName().string());
   1550                 result.append(buffer);
   1551                 snprintf(buffer, SIZE,
   1552                         "      id=0x%08x, client=0x%08x, identity=%u\n",
   1553                         lbc->clientIndex(), client.get() ? client->cid : 0,
   1554                         lbc->getIdentity());
   1555 
   1556                 result.append(buffer);
   1557                 buffer[0] = 0;
   1558             }
   1559             /*** Layer ***/
   1560             sp<Layer> l = LayerBase::dynamicCast< Layer* >(layer.get());
   1561             if (l != 0) {
   1562                 SharedBufferStack::Statistics stats = l->lcblk->getStats();
   1563                 result.append( l->lcblk->dump("      ") );
   1564                 sp<const GraphicBuffer> buf0(l->getBuffer(0));
   1565                 sp<const GraphicBuffer> buf1(l->getBuffer(1));
   1566                 uint32_t w0=0, h0=0, s0=0;
   1567                 uint32_t w1=0, h1=0, s1=0;
   1568                 if (buf0 != 0) {
   1569                     w0 = buf0->getWidth();
   1570                     h0 = buf0->getHeight();
   1571                     s0 = buf0->getStride();
   1572                 }
   1573                 if (buf1 != 0) {
   1574                     w1 = buf1->getWidth();
   1575                     h1 = buf1->getHeight();
   1576                     s1 = buf1->getStride();
   1577                 }
   1578                 snprintf(buffer, SIZE,
   1579                         "      "
   1580                         "format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u],"
   1581                         " freezeLock=%p, dq-q-time=%u us\n",
   1582                         l->pixelFormat(),
   1583                         w0, h0, s0, w1, h1, s1,
   1584                         l->getFreezeLock().get(), stats.totalTime);
   1585                 result.append(buffer);
   1586                 buffer[0] = 0;
   1587             }
   1588             s.transparentRegion.dump(result, "transparentRegion");
   1589             layer->transparentRegionScreen.dump(result, "transparentRegionScreen");
   1590             layer->visibleRegionScreen.dump(result, "visibleRegionScreen");
   1591         }
   1592         mWormholeRegion.dump(result, "WormholeRegion");
   1593         const DisplayHardware& hw(graphicPlane(0).displayHardware());
   1594         snprintf(buffer, SIZE,
   1595                 "  display frozen: %s, freezeCount=%d, orientation=%d, canDraw=%d\n",
   1596                 mFreezeDisplay?"yes":"no", mFreezeCount,
   1597                 mCurrentState.orientation, hw.canDraw());
   1598         result.append(buffer);
   1599         snprintf(buffer, SIZE,
   1600                 "  last eglSwapBuffers() time: %f us\n"
   1601                 "  last transaction time     : %f us\n",
   1602                 mLastSwapBufferTime/1000.0, mLastTransactionTime/1000.0);
   1603         result.append(buffer);
   1604         if (inSwapBuffersDuration || !locked) {
   1605             snprintf(buffer, SIZE, "  eglSwapBuffers time: %f us\n",
   1606                     inSwapBuffersDuration/1000.0);
   1607             result.append(buffer);
   1608         }
   1609         if (inTransactionDuration || !locked) {
   1610             snprintf(buffer, SIZE, "  transaction time: %f us\n",
   1611                     inTransactionDuration/1000.0);
   1612             result.append(buffer);
   1613         }
   1614         snprintf(buffer, SIZE, "  client count: %d\n", mClientsMap.size());
   1615         result.append(buffer);
   1616         const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
   1617         alloc.dump(result);
   1618 
   1619         if (locked) {
   1620             mStateLock.unlock();
   1621         }
   1622     }
   1623     write(fd, result.string(), result.size());
   1624     return NO_ERROR;
   1625 }
   1626 
   1627 status_t SurfaceFlinger::onTransact(
   1628     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   1629 {
   1630     switch (code) {
   1631         case CREATE_CONNECTION:
   1632         case OPEN_GLOBAL_TRANSACTION:
   1633         case CLOSE_GLOBAL_TRANSACTION:
   1634         case SET_ORIENTATION:
   1635         case FREEZE_DISPLAY:
   1636         case UNFREEZE_DISPLAY:
   1637         case BOOT_FINISHED:
   1638         {
   1639             // codes that require permission check
   1640             IPCThreadState* ipc = IPCThreadState::self();
   1641             const int pid = ipc->getCallingPid();
   1642             const int uid = ipc->getCallingUid();
   1643             if ((uid != AID_GRAPHICS) && !mAccessSurfaceFlinger.check(pid, uid)) {
   1644                 LOGE("Permission Denial: "
   1645                         "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
   1646                 return PERMISSION_DENIED;
   1647             }
   1648         }
   1649     }
   1650     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
   1651     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
   1652         CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1653         if (UNLIKELY(!mHardwareTest.checkCalling())) {
   1654             IPCThreadState* ipc = IPCThreadState::self();
   1655             const int pid = ipc->getCallingPid();
   1656             const int uid = ipc->getCallingUid();
   1657             LOGE("Permission Denial: "
   1658                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
   1659             return PERMISSION_DENIED;
   1660         }
   1661         int n;
   1662         switch (code) {
   1663             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
   1664                 return NO_ERROR;
   1665             case 1001:  // SHOW_FPS, NOT SUPPORTED ANYMORE
   1666                 return NO_ERROR;
   1667             case 1002:  // SHOW_UPDATES
   1668                 n = data.readInt32();
   1669                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
   1670                 return NO_ERROR;
   1671             case 1003:  // SHOW_BACKGROUND
   1672                 n = data.readInt32();
   1673                 mDebugBackground = n ? 1 : 0;
   1674                 return NO_ERROR;
   1675             case 1004:{ // repaint everything
   1676                 Mutex::Autolock _l(mStateLock);
   1677                 const DisplayHardware& hw(graphicPlane(0).displayHardware());
   1678                 mDirtyRegion.set(hw.bounds()); // careful that's not thread-safe
   1679                 signalEvent();
   1680                 return NO_ERROR;
   1681             }
   1682             case 1005:{ // force transaction
   1683                 setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
   1684                 return NO_ERROR;
   1685             }
   1686             case 1007: // set mFreezeCount
   1687                 mFreezeCount = data.readInt32();
   1688                 mFreezeDisplayTime = 0;
   1689                 return NO_ERROR;
   1690             case 1010:  // interrogate.
   1691                 reply->writeInt32(0);
   1692                 reply->writeInt32(0);
   1693                 reply->writeInt32(mDebugRegion);
   1694                 reply->writeInt32(mDebugBackground);
   1695                 return NO_ERROR;
   1696             case 1013: {
   1697                 Mutex::Autolock _l(mStateLock);
   1698                 const DisplayHardware& hw(graphicPlane(0).displayHardware());
   1699                 reply->writeInt32(hw.getPageFlipCount());
   1700             }
   1701             return NO_ERROR;
   1702         }
   1703     }
   1704     return err;
   1705 }
   1706 
   1707 // ---------------------------------------------------------------------------
   1708 #if 0
   1709 #pragma mark -
   1710 #endif
   1711 
   1712 Client::Client(ClientID clientID, const sp<SurfaceFlinger>& flinger)
   1713     : ctrlblk(0), cid(clientID), mPid(0), mBitmap(0), mFlinger(flinger)
   1714 {
   1715     const int pgsize = getpagesize();
   1716     const int cblksize = ((sizeof(SharedClient)+(pgsize-1))&~(pgsize-1));
   1717 
   1718     mCblkHeap = new MemoryHeapBase(cblksize, 0,
   1719             "SurfaceFlinger Client control-block");
   1720 
   1721     ctrlblk = static_cast<SharedClient *>(mCblkHeap->getBase());
   1722     if (ctrlblk) { // construct the shared structure in-place.
   1723         new(ctrlblk) SharedClient;
   1724     }
   1725 }
   1726 
   1727 Client::~Client() {
   1728     if (ctrlblk) {
   1729         ctrlblk->~SharedClient();  // destroy our shared-structure.
   1730     }
   1731 }
   1732 
   1733 int32_t Client::generateId(int pid)
   1734 {
   1735     const uint32_t i = clz( ~mBitmap );
   1736     if (i >= NUM_LAYERS_MAX) {
   1737         return NO_MEMORY;
   1738     }
   1739     mPid = pid;
   1740     mInUse.add(uint8_t(i));
   1741     mBitmap |= 1<<(31-i);
   1742     return i;
   1743 }
   1744 
   1745 status_t Client::bindLayer(const sp<LayerBaseClient>& layer, int32_t id)
   1746 {
   1747     ssize_t idx = mInUse.indexOf(id);
   1748     if (idx < 0)
   1749         return NAME_NOT_FOUND;
   1750     return mLayers.insertAt(layer, idx);
   1751 }
   1752 
   1753 void Client::free(int32_t id)
   1754 {
   1755     ssize_t idx = mInUse.remove(uint8_t(id));
   1756     if (idx >= 0) {
   1757         mBitmap &= ~(1<<(31-id));
   1758         mLayers.removeItemsAt(idx);
   1759     }
   1760 }
   1761 
   1762 bool Client::isValid(int32_t i) const {
   1763     return (uint32_t(i)<NUM_LAYERS_MAX) && (mBitmap & (1<<(31-i)));
   1764 }
   1765 
   1766 sp<LayerBaseClient> Client::getLayerUser(int32_t i) const {
   1767     sp<LayerBaseClient> lbc;
   1768     ssize_t idx = mInUse.indexOf(uint8_t(i));
   1769     if (idx >= 0) {
   1770         lbc = mLayers[idx].promote();
   1771         LOGE_IF(lbc==0, "getLayerUser(i=%d), idx=%d is dead", int(i), int(idx));
   1772     }
   1773     return lbc;
   1774 }
   1775 
   1776 void Client::dump(const char* what)
   1777 {
   1778 }
   1779 
   1780 // ---------------------------------------------------------------------------
   1781 #if 0
   1782 #pragma mark -
   1783 #endif
   1784 
   1785 BClient::BClient(SurfaceFlinger *flinger, ClientID cid, const sp<IMemoryHeap>& cblk)
   1786     : mId(cid), mFlinger(flinger), mCblk(cblk)
   1787 {
   1788 }
   1789 
   1790 BClient::~BClient() {
   1791     // destroy all resources attached to this client
   1792     mFlinger->destroyConnection(mId);
   1793 }
   1794 
   1795 sp<IMemoryHeap> BClient::getControlBlock() const {
   1796     return mCblk;
   1797 }
   1798 
   1799 sp<ISurface> BClient::createSurface(
   1800         ISurfaceFlingerClient::surface_data_t* params, int pid,
   1801         const String8& name,
   1802         DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
   1803         uint32_t flags)
   1804 {
   1805     return mFlinger->createSurface(mId, pid, name, params, display, w, h,
   1806             format, flags);
   1807 }
   1808 
   1809 status_t BClient::destroySurface(SurfaceID sid)
   1810 {
   1811     sid |= (mId << 16); // add the client-part to id
   1812     return mFlinger->removeSurface(sid);
   1813 }
   1814 
   1815 status_t BClient::setState(int32_t count, const layer_state_t* states)
   1816 {
   1817     return mFlinger->setClientState(mId, count, states);
   1818 }
   1819 
   1820 // ---------------------------------------------------------------------------
   1821 
   1822 GraphicPlane::GraphicPlane()
   1823     : mHw(0)
   1824 {
   1825 }
   1826 
   1827 GraphicPlane::~GraphicPlane() {
   1828     delete mHw;
   1829 }
   1830 
   1831 bool GraphicPlane::initialized() const {
   1832     return mHw ? true : false;
   1833 }
   1834 
   1835 int GraphicPlane::getWidth() const {
   1836     return mWidth;
   1837 }
   1838 
   1839 int GraphicPlane::getHeight() const {
   1840     return mHeight;
   1841 }
   1842 
   1843 void GraphicPlane::setDisplayHardware(DisplayHardware *hw)
   1844 {
   1845     mHw = hw;
   1846 
   1847     // initialize the display orientation transform.
   1848     // it's a constant that should come from the display driver.
   1849     int displayOrientation = ISurfaceComposer::eOrientationDefault;
   1850     char property[PROPERTY_VALUE_MAX];
   1851     if (property_get("ro.sf.hwrotation", property, NULL) > 0) {
   1852         //displayOrientation
   1853         switch (atoi(property)) {
   1854         case 90:
   1855             displayOrientation = ISurfaceComposer::eOrientation90;
   1856             break;
   1857         case 270:
   1858             displayOrientation = ISurfaceComposer::eOrientation270;
   1859             break;
   1860         }
   1861     }
   1862 
   1863     const float w = hw->getWidth();
   1864     const float h = hw->getHeight();
   1865     GraphicPlane::orientationToTransfrom(displayOrientation, w, h,
   1866             &mDisplayTransform);
   1867     if (displayOrientation & ISurfaceComposer::eOrientationSwapMask) {
   1868         mDisplayWidth = h;
   1869         mDisplayHeight = w;
   1870     } else {
   1871         mDisplayWidth = w;
   1872         mDisplayHeight = h;
   1873     }
   1874 
   1875     setOrientation(ISurfaceComposer::eOrientationDefault);
   1876 }
   1877 
   1878 status_t GraphicPlane::orientationToTransfrom(
   1879         int orientation, int w, int h, Transform* tr)
   1880 {
   1881     uint32_t flags = 0;
   1882     switch (orientation) {
   1883     case ISurfaceComposer::eOrientationDefault:
   1884         flags = Transform::ROT_0;
   1885         break;
   1886     case ISurfaceComposer::eOrientation90:
   1887         flags = Transform::ROT_90;
   1888         break;
   1889     case ISurfaceComposer::eOrientation180:
   1890         flags = Transform::ROT_180;
   1891         break;
   1892     case ISurfaceComposer::eOrientation270:
   1893         flags = Transform::ROT_270;
   1894         break;
   1895     default:
   1896         return BAD_VALUE;
   1897     }
   1898     tr->set(flags, w, h);
   1899     return NO_ERROR;
   1900 }
   1901 
   1902 status_t GraphicPlane::setOrientation(int orientation)
   1903 {
   1904     // If the rotation can be handled in hardware, this is where
   1905     // the magic should happen.
   1906 
   1907     const DisplayHardware& hw(displayHardware());
   1908     const float w = mDisplayWidth;
   1909     const float h = mDisplayHeight;
   1910     mWidth = int(w);
   1911     mHeight = int(h);
   1912 
   1913     Transform orientationTransform;
   1914     GraphicPlane::orientationToTransfrom(orientation, w, h,
   1915             &orientationTransform);
   1916     if (orientation & ISurfaceComposer::eOrientationSwapMask) {
   1917         mWidth = int(h);
   1918         mHeight = int(w);
   1919     }
   1920 
   1921     mOrientation = orientation;
   1922     mGlobalTransform = mDisplayTransform * orientationTransform;
   1923     return NO_ERROR;
   1924 }
   1925 
   1926 const DisplayHardware& GraphicPlane::displayHardware() const {
   1927     return *mHw;
   1928 }
   1929 
   1930 const Transform& GraphicPlane::transform() const {
   1931     return mGlobalTransform;
   1932 }
   1933 
   1934 EGLDisplay GraphicPlane::getEGLDisplay() const {
   1935     return mHw->getEGLDisplay();
   1936 }
   1937 
   1938 // ---------------------------------------------------------------------------
   1939 
   1940 }; // namespace android
   1941