Home | History | Annotate | Download | only in base
      1 /*
      2 // Copyright(c)2014 IntelCorporation
      3 //
      4 // LicensedundertheApacheLicense,Version2.0(the"License");
      5 // youmaynotusethisfileexceptincompliancewiththeLicense.
      6 // YoumayobtainacopyoftheLicenseat
      7 //
      8 // http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unlessrequiredbyapplicablelaworagreedtoinwriting,software
     11 // distributedundertheLicenseisdistributedonan"ASIS"BASIS,
     12 // WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
     13 // SeetheLicenseforthespecificlanguagegoverningpermissionsand
     14 // limitationsundertheLicense.
     15 */
     16 #include <common/utils/HwcTrace.h>
     17 #include <common/base/Drm.h>
     18 #include <common/base/HwcLayerList.h>
     19 #include <Hwcomposer.h>
     20 #include <GraphicBuffer.h>
     21 #include <IDisplayDevice.h>
     22 #include <PlaneCapabilities.h>
     23 #include <DisplayQuery.h>
     24 #include <hal_public.h>
     25 
     26 namespace android {
     27 namespace intel {
     28 
     29 HwcLayerList::HwcLayerList(hwc_display_contents_1_t *list, int disp)
     30     : mList(list),
     31       mLayerCount(0),
     32       mLayers(),
     33       mFBLayers(),
     34       mSpriteCandidates(),
     35       mOverlayCandidates(),
     36       mZOrderConfig(),
     37       mFrameBufferTarget(NULL),
     38       mDisplayIndex(disp)
     39 {
     40     initialize();
     41 }
     42 
     43 HwcLayerList::~HwcLayerList()
     44 {
     45     deinitialize();
     46 }
     47 
     48 bool HwcLayerList::checkSupported(int planeType, HwcLayer *hwcLayer)
     49 {
     50     bool valid = false;
     51     hwc_layer_1_t& layer = *(hwcLayer->getLayer());
     52 
     53     // if layer was forced to use FB
     54     if (hwcLayer->getType() == HwcLayer::LAYER_FORCE_FB) {
     55         VLOGTRACE("layer was forced to use HWC_FRAMEBUFFER");
     56         return false;
     57     }
     58 
     59     // check layer flags
     60     if (layer.flags & HWC_SKIP_LAYER) {
     61         VLOGTRACE("plane type %d: (skip layer flag was set)", planeType);
     62         return false;
     63     }
     64 
     65     if (layer.handle == 0) {
     66         WLOGTRACE("invalid buffer handle");
     67         return false;
     68     }
     69 
     70     // check usage
     71     if (!(hwcLayer->getUsage() & GRALLOC_USAGE_HW_COMPOSER)) {
     72         WLOGTRACE("not a composer layer");
     73         return false;
     74     }
     75 
     76     // check layer transform
     77     valid = PlaneCapabilities::isTransformSupported(planeType, hwcLayer);
     78     if (!valid) {
     79         VLOGTRACE("plane type %d: (bad transform)", planeType);
     80         return false;
     81     }
     82 
     83     // check buffer format
     84     valid = PlaneCapabilities::isFormatSupported(planeType, hwcLayer);
     85     if (!valid) {
     86         VLOGTRACE("plane type %d: (bad buffer format)", planeType);
     87         return false;
     88     }
     89 
     90     // check buffer size
     91     valid = PlaneCapabilities::isSizeSupported(planeType, hwcLayer);
     92     if (!valid) {
     93         VLOGTRACE("plane type %d: (bad buffer size)", planeType);
     94         return false;
     95     }
     96 
     97     // check layer blending
     98     valid = PlaneCapabilities::isBlendingSupported(planeType, hwcLayer);
     99     if (!valid) {
    100         VLOGTRACE("plane type %d: (bad blending)", planeType);
    101         return false;
    102     }
    103 
    104     // check layer scaling
    105     valid = PlaneCapabilities::isScalingSupported(planeType, hwcLayer);
    106     if (!valid) {
    107         VLOGTRACE("plane type %d: (bad scaling)", planeType);
    108         return false;
    109     }
    110 
    111     // TODO: check visible region?
    112     return true;
    113 }
    114 
    115 bool HwcLayerList::checkRgbOverlaySupported(HwcLayer *hwcLayer)
    116 {
    117     hwc_layer_1_t& layer = *(hwcLayer->getLayer());
    118 
    119     // if layer was forced to use FB
    120     if (hwcLayer->getType() == HwcLayer::LAYER_FORCE_FB) {
    121         VLOGTRACE("layer was forced to use HWC_FRAMEBUFFER");
    122         return false;
    123     }
    124 
    125     // check layer flags
    126     if (layer.flags & HWC_SKIP_LAYER) {
    127         VLOGTRACE("skip layer flag was set");
    128         return false;
    129     }
    130 
    131     if (layer.handle == 0) {
    132         WLOGTRACE("invalid buffer handle");
    133         return false;
    134     }
    135 
    136     // check usage
    137     if (!(hwcLayer->getUsage() & GRALLOC_USAGE_HW_COMPOSER)) {
    138         WLOGTRACE("not a composer layer");
    139         return false;
    140     }
    141 
    142     uint32_t format = hwcLayer->getFormat();
    143     if (format != HAL_PIXEL_FORMAT_BGRA_8888 &&
    144         format != HAL_PIXEL_FORMAT_BGRX_8888) {
    145         return false;
    146     }
    147 
    148     const stride_t& stride = hwcLayer->getBufferStride();
    149     if (stride.rgb.stride > 4096) {
    150         return false;
    151     }
    152 
    153     uint32_t blending = (uint32_t)hwcLayer->getLayer()->blending;
    154     if (blending != HWC_BLENDING_NONE) {
    155         return false;
    156     }
    157 
    158     uint32_t trans = hwcLayer->getLayer()->transform;
    159     if (trans != 0) {
    160         return false;
    161     }
    162 
    163     hwc_frect_t& src = hwcLayer->getLayer()->sourceCropf;
    164     hwc_rect_t& dest = hwcLayer->getLayer()->displayFrame;
    165     int srcW = (int)src.right - (int)src.left;
    166     int srcH = (int)src.bottom - (int)src.top;
    167     int dstW = dest.right - dest.left;
    168     int dstH = dest.bottom - dest.top;
    169     if (srcW != dstW || srcH != dstH) {
    170         return false;
    171     }
    172     return true;
    173 }
    174 
    175 bool HwcLayerList::checkCursorSupported(HwcLayer *hwcLayer)
    176 {
    177     hwc_layer_1_t& layer = *(hwcLayer->getLayer());
    178 
    179     // if layer was forced to use FB
    180     if (hwcLayer->getType() == HwcLayer::LAYER_FORCE_FB) {
    181         VLOGTRACE("layer was forced to use HWC_FRAMEBUFFER");
    182         return false;
    183     }
    184 
    185     // check layer flags
    186     if (layer.flags & HWC_SKIP_LAYER) {
    187         VLOGTRACE("skip layer flag was set");
    188         return false;
    189     }
    190 
    191     if (!(layer.flags & HWC_IS_CURSOR_LAYER)) {
    192         VLOGTRACE("not a cursor layer");
    193         return false;
    194     }
    195 
    196     if (hwcLayer->getIndex() != mLayerCount - 2) {
    197         WLOGTRACE("cursor layer is not on top of zorder");
    198         return false;
    199     }
    200 
    201     if (layer.handle == 0) {
    202         WLOGTRACE("invalid buffer handle");
    203         return false;
    204     }
    205 
    206     // check usage
    207     if (!(hwcLayer->getUsage() & GRALLOC_USAGE_HW_COMPOSER)) {
    208         WLOGTRACE("not a composer layer");
    209         return false;
    210     }
    211 
    212     uint32_t format = hwcLayer->getFormat();
    213     if (format != HAL_PIXEL_FORMAT_BGRA_8888 &&
    214         format != HAL_PIXEL_FORMAT_RGBA_8888) {
    215         WLOGTRACE("unexpected color format %u for cursor", format);
    216         return false;
    217     }
    218 
    219     uint32_t trans = hwcLayer->getLayer()->transform;
    220     if (trans != 0) {
    221         WLOGTRACE("unexpected transform %u for cursor", trans);
    222         return false;
    223     }
    224 
    225     hwc_frect_t& src = hwcLayer->getLayer()->sourceCropf;
    226     hwc_rect_t& dest = hwcLayer->getLayer()->displayFrame;
    227     int srcW = (int)src.right - (int)src.left;
    228     int srcH = (int)src.bottom - (int)src.top;
    229     int dstW = dest.right - dest.left;
    230     int dstH = dest.bottom - dest.top;
    231     if (srcW != dstW || srcH != dstH) {
    232         WLOGTRACE("unexpected scaling for cursor: %dx%d => %dx%d",
    233         srcW, srcH, dstW, dstH);
    234         //return false;
    235     }
    236 
    237     if (srcW > 256 || srcH > 256) {
    238         WLOGTRACE("unexpected size %dx%d for cursor", srcW, srcH);
    239         return false;
    240     }
    241 
    242     return true;
    243 }
    244 
    245 
    246 bool HwcLayerList::initialize()
    247 {
    248     if (!mList || mList->numHwLayers == 0) {
    249         ELOGTRACE("invalid hwc list");
    250         return false;
    251     }
    252 
    253     mLayerCount = (int)mList->numHwLayers;
    254     mLayers.setCapacity(mLayerCount);
    255     mFBLayers.setCapacity(mLayerCount);
    256     mSpriteCandidates.setCapacity(mLayerCount);
    257     mOverlayCandidates.setCapacity(mLayerCount);
    258     mCursorCandidates.setCapacity(mLayerCount);
    259     mZOrderConfig.setCapacity(mLayerCount);
    260 
    261     PriorityVector rgbOverlayLayers;
    262     rgbOverlayLayers.setCapacity(mLayerCount);
    263 
    264     for (int i = 0; i < mLayerCount; i++) {
    265         hwc_layer_1_t *layer = &mList->hwLayers[i];
    266         if (!layer) {
    267             DEINIT_AND_RETURN_FALSE("layer %d is null", i);
    268         }
    269 
    270         if ((layer->compositionType != HWC_FRAMEBUFFER_TARGET) &&
    271                 (layer->compositionType != HWC_FORCE_FRAMEBUFFER) &&
    272                 (layer->compositionType != HWC_SIDEBAND))
    273             layer->compositionType = HWC_FRAMEBUFFER;
    274 
    275         HwcLayer *hwcLayer = new HwcLayer(i, layer);
    276         if (!hwcLayer) {
    277             DEINIT_AND_RETURN_FALSE("failed to allocate hwc layer %d", i);
    278         }
    279 
    280         if (layer->compositionType == HWC_FRAMEBUFFER_TARGET) {
    281             hwcLayer->setType(HwcLayer::LAYER_FRAMEBUFFER_TARGET);
    282             mFrameBufferTarget = hwcLayer;
    283         } else if (layer->compositionType == HWC_OVERLAY){
    284             // skipped layer, filtered by Display Analyzer
    285             hwcLayer->setType(HwcLayer::LAYER_SKIPPED);
    286         } else if (layer->compositionType == HWC_FORCE_FRAMEBUFFER) {
    287             layer->compositionType = HWC_FRAMEBUFFER;
    288             hwcLayer->setType(HwcLayer::LAYER_FORCE_FB);
    289             // add layer to FB layer list for zorder check during plane assignment
    290             mFBLayers.add(hwcLayer);
    291         } else  if (layer->compositionType == HWC_FRAMEBUFFER) {
    292             // by default use GPU composition
    293             hwcLayer->setType(HwcLayer::LAYER_FB);
    294             mFBLayers.add(hwcLayer);
    295             if (!DisplayQuery::forceFbScaling(mDisplayIndex)) {
    296                 if (checkCursorSupported(hwcLayer)) {
    297                     mCursorCandidates.add(hwcLayer);
    298                 } else if (checkRgbOverlaySupported(hwcLayer)) {
    299                     rgbOverlayLayers.add(hwcLayer);
    300                 } else if (checkSupported(DisplayPlane::PLANE_SPRITE, hwcLayer)) {
    301                     mSpriteCandidates.add(hwcLayer);
    302                 } else if (checkSupported(DisplayPlane::PLANE_OVERLAY, hwcLayer)) {
    303                     mOverlayCandidates.add(hwcLayer);
    304                 } else {
    305                     // noncandidate layer
    306                 }
    307             } else {
    308                 if (checkSupported(DisplayPlane::PLANE_SPRITE, hwcLayer) &&
    309                     mLayerCount == 2) {
    310                     // if fb scaling, support only one RGB layer on HWC
    311                     mSpriteCandidates.add(hwcLayer);
    312                 } else if (checkSupported(DisplayPlane::PLANE_OVERLAY, hwcLayer)) {
    313                     mOverlayCandidates.add(hwcLayer);
    314                 } else {
    315                     // noncandidate layer
    316                 }
    317             }
    318         } else if (layer->compositionType == HWC_SIDEBAND){
    319             hwcLayer->setType(HwcLayer::LAYER_SIDEBAND);
    320         } else {
    321             DEINIT_AND_RETURN_FALSE("invalid composition type %d", layer->compositionType);
    322         }
    323         // add layer to layer list
    324         mLayers.add(hwcLayer);
    325     }
    326 
    327     if (mFrameBufferTarget == NULL) {
    328         ELOGTRACE("no frame buffer target?");
    329         return false;
    330     }
    331 
    332     // If has layer besides of FB_Target, but no FBLayers, skip plane allocation
    333     // Note: There is case that SF passes down a layerlist with only FB_Target
    334     // layer; we need to have this FB_Target to be flipped as well, otherwise it
    335     // will have the buffer queue blocked. (The buffer hold by driver cannot be
    336     // released if new buffers' flip is skipped).
    337     if ((mFBLayers.size() == 0) && (mLayers.size() > 1)) {
    338         VLOGTRACE("no FB layers, skip plane allocation");
    339         return true;
    340     }
    341 
    342     bool hasOverlay = mOverlayCandidates.size() != 0;
    343     while (rgbOverlayLayers.size()) {
    344         HwcLayer *hwcLayer = rgbOverlayLayers.top();
    345         if (hasOverlay) {
    346             mSpriteCandidates.add(hwcLayer);
    347         } else {
    348             mOverlayCandidates.add(hwcLayer);
    349         }
    350         rgbOverlayLayers.removeItemsAt(0);
    351     }
    352 
    353     allocatePlanes();
    354     //dump();
    355     return true;
    356 }
    357 
    358 void HwcLayerList::deinitialize()
    359 {
    360     if (mLayerCount == 0) {
    361         return;
    362     }
    363 
    364     DisplayPlaneManager *planeManager = Hwcomposer::getInstance().getPlaneManager();
    365     for (int i = 0; i < mLayerCount; i++) {
    366         HwcLayer *hwcLayer = mLayers.itemAt(i);
    367         if (hwcLayer) {
    368             DisplayPlane *plane = hwcLayer->detachPlane();
    369             if (plane) {
    370                 planeManager->reclaimPlane(mDisplayIndex, *plane);
    371             }
    372         }
    373         delete hwcLayer;
    374     }
    375 
    376     mLayers.clear();
    377     mFBLayers.clear();
    378     mOverlayCandidates.clear();
    379     mSpriteCandidates.clear();
    380     mCursorCandidates.clear();
    381     mZOrderConfig.clear();
    382     mFrameBufferTarget = NULL;
    383     mLayerCount = 0;
    384 }
    385 
    386 
    387 bool HwcLayerList::allocatePlanes()
    388 {
    389     return assignCursorPlanes();
    390 }
    391 
    392 bool HwcLayerList::assignCursorPlanes()
    393 {
    394     int cursorCandidates = (int)mCursorCandidates.size();
    395     if (cursorCandidates == 0) {
    396         return assignOverlayPlanes();
    397     }
    398 
    399     DisplayPlaneManager *planeManager = Hwcomposer::getInstance().getPlaneManager();
    400     int planeNumber = planeManager->getFreePlanes(mDisplayIndex, DisplayPlane::PLANE_CURSOR);
    401     if (planeNumber == 0) {
    402         DLOGTRACE("no cursor plane available. candidates %d", cursorCandidates);
    403         return assignOverlayPlanes();
    404     }
    405 
    406     if (planeNumber > cursorCandidates) {
    407         // assuming all cursor planes have the same capabilities, just
    408         // need up to number of candidates for plane assignment
    409         planeNumber = cursorCandidates;
    410     }
    411 
    412     for (int i = planeNumber; i >= 0; i--) {
    413         // assign as many cursor planes as possible
    414         if (assignCursorPlanes(0, i)) {
    415             return true;
    416         }
    417         if (mZOrderConfig.size() != 0) {
    418             ELOGTRACE("ZOrder config is not cleaned up!");
    419         }
    420     }
    421     return false;
    422 }
    423 
    424 
    425 bool HwcLayerList::assignCursorPlanes(int index, int planeNumber)
    426 {
    427     // index indicates position in mCursorCandidates to start plane assignment
    428     if (planeNumber == 0) {
    429         return assignOverlayPlanes();
    430     }
    431 
    432     int cursorCandidates = (int)mCursorCandidates.size();
    433     for (int i = index; i <= cursorCandidates - planeNumber; i++) {
    434         ZOrderLayer *zlayer = addZOrderLayer(DisplayPlane::PLANE_CURSOR, mCursorCandidates[i]);
    435         if (assignCursorPlanes(i + 1, planeNumber - 1)) {
    436             return true;
    437         }
    438         removeZOrderLayer(zlayer);
    439     }
    440     return false;
    441 }
    442 
    443 bool HwcLayerList::assignOverlayPlanes()
    444 {
    445     int overlayCandidates = (int)mOverlayCandidates.size();
    446     if (overlayCandidates == 0) {
    447         return assignSpritePlanes();
    448     }
    449 
    450     DisplayPlaneManager *planeManager = Hwcomposer::getInstance().getPlaneManager();
    451     int planeNumber = planeManager->getFreePlanes(mDisplayIndex, DisplayPlane::PLANE_OVERLAY);
    452     if (planeNumber == 0) {
    453         DLOGTRACE("no overlay plane available. candidates %d", overlayCandidates);
    454         return assignSpritePlanes();
    455     }
    456 
    457     if (planeNumber > overlayCandidates) {
    458         // assuming all overlay planes have the same capabilities, just
    459         // need up to number of candidates for plane assignment
    460         planeNumber = overlayCandidates;
    461     }
    462 
    463     for (int i = planeNumber; i >= 0; i--) {
    464         // assign as many overlay planes as possible
    465         if (assignOverlayPlanes(0, i)) {
    466             return true;
    467         }
    468         if (mZOrderConfig.size() != 0) {
    469             ELOGTRACE("ZOrder config is not cleaned up!");
    470         }
    471     }
    472     return false;
    473 }
    474 
    475 
    476 bool HwcLayerList::assignOverlayPlanes(int index, int planeNumber)
    477 {
    478     // index indicates position in mOverlayCandidates to start plane assignment
    479     if (planeNumber == 0) {
    480         return assignSpritePlanes();
    481     }
    482 
    483     int overlayCandidates = (int)mOverlayCandidates.size();
    484     for (int i = index; i <= overlayCandidates - planeNumber; i++) {
    485         ZOrderLayer *zlayer = addZOrderLayer(DisplayPlane::PLANE_OVERLAY, mOverlayCandidates[i]);
    486         if (assignOverlayPlanes(i + 1, planeNumber - 1)) {
    487             return true;
    488         }
    489         removeZOrderLayer(zlayer);
    490     }
    491     return false;
    492 }
    493 
    494 bool HwcLayerList::assignSpritePlanes()
    495 {
    496     int spriteCandidates = (int)mSpriteCandidates.size();
    497     if (spriteCandidates == 0) {
    498         return assignPrimaryPlane();
    499     }
    500 
    501     //  number does not include primary plane
    502     DisplayPlaneManager *planeManager = Hwcomposer::getInstance().getPlaneManager();
    503     int planeNumber = planeManager->getFreePlanes(mDisplayIndex, DisplayPlane::PLANE_SPRITE);
    504     if (planeNumber == 0) {
    505         VLOGTRACE("no sprite plane available, candidates %d", spriteCandidates);
    506         return assignPrimaryPlane();
    507     }
    508 
    509     if (planeNumber > spriteCandidates) {
    510         // assuming all sprite planes have the same capabilities, just
    511         // need up to number of candidates for plane assignment
    512         planeNumber = spriteCandidates;
    513     }
    514 
    515     for (int i = planeNumber; i >= 0; i--) {
    516         // assign as many sprite planes as possible
    517         if (assignSpritePlanes(0, i)) {
    518             return true;
    519         }
    520 
    521         if (mOverlayCandidates.size() == 0 && mZOrderConfig.size() != 0) {
    522             ELOGTRACE("ZOrder config is not cleaned up!");
    523         }
    524     }
    525     return false;
    526 }
    527 
    528 
    529 bool HwcLayerList::assignSpritePlanes(int index, int planeNumber)
    530 {
    531     if (planeNumber == 0) {
    532         return assignPrimaryPlane();
    533     }
    534 
    535     int spriteCandidates = (int)mSpriteCandidates.size();
    536     for (int i = index; i <= spriteCandidates - planeNumber; i++) {
    537         ZOrderLayer *zlayer = addZOrderLayer(DisplayPlane::PLANE_SPRITE, mSpriteCandidates[i]);
    538         if (assignSpritePlanes(i + 1, planeNumber - 1)) {
    539             return true;
    540         }
    541         removeZOrderLayer(zlayer);
    542     }
    543     return false;
    544 }
    545 
    546 bool HwcLayerList::assignPrimaryPlane()
    547 {
    548     // find a sprit layer that is not candidate but has lower priority than candidates.
    549     HwcLayer *spriteLayer = NULL;
    550     for (int i = (int)mSpriteCandidates.size() - 1; i >= 0; i--) {
    551         if (mSpriteCandidates[i]->mPlaneCandidate)
    552             break;
    553 
    554         spriteLayer = mSpriteCandidates[i];
    555     }
    556 
    557     int candidates = (int)mZOrderConfig.size();
    558     int layers = (int)mFBLayers.size();
    559     bool ok = false;
    560 
    561     if (candidates == layers - 1 && spriteLayer != NULL) {
    562         // primary plane is configured as sprite, all sprite candidates are offloaded to display planes
    563         ok = assignPrimaryPlaneHelper(spriteLayer);
    564         if (!ok) {
    565             VLOGTRACE("failed to use primary as sprite plane");
    566         }
    567     } else if (candidates == 0) {
    568         // none assigned, use primary plane for frame buffer target and set zorder to 0
    569         ok = assignPrimaryPlaneHelper(mFrameBufferTarget, 0);
    570         if (!ok) {
    571             ELOGTRACE("failed to compose all layers to primary plane, should never happen");
    572         }
    573     } else if (candidates == layers) {
    574         // all assigned, primary plane may be used during ZOrder config.
    575         ok = attachPlanes();
    576         if (!ok) {
    577             VLOGTRACE("failed to assign layers without primary");
    578         }
    579     } else {
    580         // check if the remaining planes can be composed to frame buffer target (FBT)
    581         // look up a legitimate Z order position to place FBT.
    582         for (int i = 0; i < layers && !ok; i++) {
    583             if (mFBLayers[i]->mPlaneCandidate) {
    584                 continue;
    585             }
    586             if (useAsFrameBufferTarget(mFBLayers[i])) {
    587                 ok = assignPrimaryPlaneHelper(mFrameBufferTarget, mFBLayers[i]->getZOrder());
    588                 if (!ok) {
    589                     VLOGTRACE("failed to use zorder %d for frame buffer target",
    590                         mFBLayers[i]->getZOrder());
    591                 }
    592             }
    593         }
    594         if (!ok) {
    595             VLOGTRACE("no possible zorder for frame buffer target");
    596         }
    597 
    598     }
    599     return ok;
    600 }
    601 
    602 bool HwcLayerList::assignPrimaryPlaneHelper(HwcLayer *hwcLayer, int zorder)
    603 {
    604     int type = DisplayPlane::PLANE_PRIMARY;
    605 
    606     ZOrderLayer *zlayer = addZOrderLayer(type, hwcLayer, zorder);
    607     bool ok = attachPlanes();
    608     if (!ok) {
    609         removeZOrderLayer(zlayer);
    610     }
    611     return ok;
    612 }
    613 
    614 bool HwcLayerList::attachPlanes()
    615 {
    616     DisplayPlaneManager *planeManager = Hwcomposer::getInstance().getPlaneManager();
    617     if (!planeManager->isValidZOrder(mDisplayIndex, mZOrderConfig)) {
    618         VLOGTRACE("invalid z order, size of config %d", mZOrderConfig.size());
    619         return false;
    620     }
    621 
    622     if (!planeManager->assignPlanes(mDisplayIndex, mZOrderConfig)) {
    623         WLOGTRACE("failed to assign planes");
    624         return false;
    625     }
    626 
    627     VLOGTRACE("============= plane assignment===================");
    628     for (int i = 0; i < (int)mZOrderConfig.size(); i++) {
    629         ZOrderLayer *zlayer = mZOrderConfig.itemAt(i);
    630         if (zlayer->plane == NULL || zlayer->hwcLayer == NULL) {
    631             ELOGTRACE("invalid ZOrderLayer, should never happen!!");
    632             return false;
    633         }
    634 
    635         zlayer->plane->setZOrder(i);
    636 
    637         if (zlayer->plane->getType() == DisplayPlane::PLANE_CURSOR) {
    638             zlayer->hwcLayer->setType(HwcLayer::LAYER_CURSOR_OVERLAY);
    639             mFBLayers.remove(zlayer->hwcLayer);
    640         } else if (zlayer->hwcLayer != mFrameBufferTarget) {
    641             zlayer->hwcLayer->setType(HwcLayer::LAYER_OVERLAY);
    642             // update FB layers for smart composition
    643             mFBLayers.remove(zlayer->hwcLayer);
    644         }
    645 
    646         zlayer->hwcLayer->attachPlane(zlayer->plane, mDisplayIndex);
    647 
    648         VLOGTRACE("total %d, layer %d, type %d, index %d, zorder %d",
    649             mLayerCount - 1,
    650             zlayer->hwcLayer->getIndex(),
    651             zlayer->plane->getType(),
    652             zlayer->plane->getIndex(),
    653             zlayer->zorder);
    654 
    655         delete zlayer;
    656     }
    657 
    658     mZOrderConfig.clear();
    659     return true;
    660 }
    661 
    662 bool HwcLayerList::useAsFrameBufferTarget(HwcLayer *target)
    663 {
    664     // check if zorder of target can be used as zorder of frame buffer target
    665     // eligible only when all noncandidate layers can be merged to the target layer:
    666     // 1) noncandidate layer and candidate layer below the target layer can't overlap
    667     // if candidate layer is on top of non candidate layer, as "noncandidate layer" needs
    668     // to be moved up to target layer in z order;
    669     // 2) noncandidate layer and candidate layers above the target layer can't overlap
    670     // if candidate layer is below noncandidate layer, as "noncandidate layer" needs
    671     // to be moved down to target layer in z order.
    672 
    673     int targetLayerIndex = target->getIndex();
    674 
    675     // check candidate and noncandidate layers below this candidate does not overlap
    676     for (int below = 0; below < targetLayerIndex; below++) {
    677         if (mFBLayers[below]->mPlaneCandidate) {
    678             continue;
    679         } else {
    680             // check candidate layer above this noncandidate layer does not overlap
    681             for (int above = below + 1; above < targetLayerIndex; above++) {
    682                 if (mFBLayers[above]->mPlaneCandidate == false) {
    683                     continue;
    684                 }
    685                 if (hasIntersection(mFBLayers[above], mFBLayers[below])) {
    686                     return false;
    687                 }
    688             }
    689         }
    690     }
    691 
    692     // check candidate and noncandidate layers above this candidate does not overlap
    693     for (unsigned int above = targetLayerIndex + 1; above < mFBLayers.size(); above++) {
    694         if (mFBLayers[above]->mPlaneCandidate) {
    695             continue;
    696         } else {
    697             // check candidate layer below this noncandidate layer does not overlap
    698             for (unsigned int below = targetLayerIndex + 1; below < above; below++) {
    699                 if (mFBLayers[below]->mPlaneCandidate == false) {
    700                     continue;
    701                 }
    702                 if (hasIntersection(mFBLayers[above], mFBLayers[below])) {
    703                     return false;
    704                 }
    705             }
    706         }
    707     }
    708 
    709     return true;
    710 }
    711 
    712 bool HwcLayerList::hasIntersection(HwcLayer *la, HwcLayer *lb)
    713 {
    714     hwc_layer_1_t *a = la->getLayer();
    715     hwc_layer_1_t *b = lb->getLayer();
    716     hwc_rect_t *aRect = &a->displayFrame;
    717     hwc_rect_t *bRect = &b->displayFrame;
    718 
    719     if (bRect->right <= aRect->left ||
    720         bRect->left >= aRect->right ||
    721         bRect->top >= aRect->bottom ||
    722         bRect->bottom <= aRect->top)
    723         return false;
    724 
    725     return true;
    726 }
    727 
    728 ZOrderLayer* HwcLayerList::addZOrderLayer(int type, HwcLayer *hwcLayer, int zorder)
    729 {
    730     ZOrderLayer *layer = new ZOrderLayer;
    731     layer->planeType = type;
    732     layer->hwcLayer = hwcLayer;
    733     layer->zorder = (zorder != -1) ? zorder : hwcLayer->getZOrder();
    734     layer->plane = NULL;
    735 
    736     if (hwcLayer->mPlaneCandidate) {
    737         ELOGTRACE("plane is candidate!, order = %d", zorder);
    738     }
    739 
    740     hwcLayer->mPlaneCandidate = true;
    741 
    742     if ((int)mZOrderConfig.indexOf(layer) >= 0) {
    743         ELOGTRACE("layer exists!");
    744     }
    745 
    746     mZOrderConfig.add(layer);
    747     return layer;
    748 }
    749 
    750 void HwcLayerList::removeZOrderLayer(ZOrderLayer *layer)
    751 {
    752     if ((int)mZOrderConfig.indexOf(layer) < 0) {
    753         ELOGTRACE("layer does not exist!");
    754     }
    755 
    756     mZOrderConfig.remove(layer);
    757 
    758     if (layer->hwcLayer->mPlaneCandidate == false) {
    759         ELOGTRACE("plane is not candidate!, order %d", layer->zorder);
    760     }
    761     layer->hwcLayer->mPlaneCandidate = false;
    762     delete layer;
    763 }
    764 
    765 void HwcLayerList::setupSmartComposition()
    766 {
    767     uint32_t compositionType = HWC_OVERLAY;
    768     HwcLayer *hwcLayer = NULL;
    769 
    770     // setup smart composition only there's no update on all FB layers
    771     for (size_t i = 0; i < mFBLayers.size(); i++) {
    772         hwcLayer = mFBLayers.itemAt(i);
    773         if (hwcLayer->isUpdated()) {
    774             compositionType = HWC_FRAMEBUFFER;
    775         }
    776     }
    777 
    778     VLOGTRACE("smart composition enabled %s",
    779            (compositionType == HWC_OVERLAY) ? "TRUE" : "FALSE");
    780     for (size_t i = 0; i < mFBLayers.size(); i++) {
    781         hwcLayer = mFBLayers.itemAt(i);
    782         switch (hwcLayer->getType()) {
    783         case HwcLayer::LAYER_FB:
    784         case HwcLayer::LAYER_FORCE_FB:
    785             hwcLayer->setCompositionType(compositionType);
    786             break;
    787         default:
    788             ELOGTRACE("Invalid layer type %d", hwcLayer->getType());
    789             break;
    790         }
    791     }
    792 }
    793 
    794 void HwcLayerList::updateFBT(hwc_display_contents_1_t *list) {
    795     mFrameBufferTarget->update(&list->hwLayers[mLayerCount - 1]);
    796 }
    797 
    798 #if 1  // support overlay fallback to GLES
    799 
    800 bool HwcLayerList::update(hwc_display_contents_1_t *list)
    801 {
    802     // basic check to make sure the consistance
    803     if (!list) {
    804         ELOGTRACE("null layer list");
    805         return false;
    806     }
    807 
    808     if ((int)list->numHwLayers != mLayerCount) {
    809         ELOGTRACE("layer count doesn't match (%d, %d)", list->numHwLayers, mLayerCount);
    810         return false;
    811     }
    812 
    813     // update list
    814     mList = list;
    815 
    816     bool ok = true;
    817     // update all layers, call each layer's update()
    818     for (int i = 0; i < mLayerCount; i++) {
    819         HwcLayer *hwcLayer = mLayers.itemAt(i);
    820         if (!hwcLayer) {
    821             ELOGTRACE("no HWC layer for layer %d", i);
    822             continue;
    823         }
    824 
    825         if (!hwcLayer->update(&list->hwLayers[i])) {
    826             ok = false;
    827             hwcLayer->setCompositionType(HWC_FORCE_FRAMEBUFFER);
    828         }
    829     }
    830 
    831     if (!ok) {
    832         ILOGTRACE("overlay fallback to GLES. flags: %#x", list->flags);
    833         for (int i = 0; i < mLayerCount - 1; i++) {
    834             HwcLayer *hwcLayer = mLayers.itemAt(i);
    835             if (hwcLayer->getPlane() &&
    836                 (hwcLayer->getCompositionType() == HWC_OVERLAY ||
    837                 hwcLayer->getCompositionType() == HWC_CURSOR_OVERLAY)) {
    838                 hwcLayer->setCompositionType(HWC_FRAMEBUFFER);
    839             }
    840         }
    841         mLayers.itemAt(mLayerCount - 1)->setCompositionType(HWC_FRAMEBUFFER_TARGET);
    842         deinitialize();
    843         mList = list;
    844         initialize();
    845 
    846         // update all layers again after plane re-allocation
    847         for (int i = 0; i < mLayerCount; i++) {
    848             HwcLayer *hwcLayer = mLayers.itemAt(i);
    849             if (!hwcLayer) {
    850                 ELOGTRACE("no HWC layer for layer %d", i);
    851                 continue;
    852             }
    853 
    854             if (!hwcLayer->update(&list->hwLayers[i])) {
    855                 DLOGTRACE("fallback to GLES update failed on layer[%d]!\n", i);
    856             }
    857         }
    858     }
    859 
    860     setupSmartComposition();
    861     return true;
    862 }
    863 
    864 #else
    865 
    866 bool HwcLayerList::update(hwc_display_contents_1_t *list)
    867 {
    868     bool ret;
    869 
    870     // basic check to make sure the consistance
    871     if (!list) {
    872         ELOGTRACE("null layer list");
    873         return false;
    874     }
    875 
    876     if ((int)list->numHwLayers != mLayerCount) {
    877         ELOGTRACE("layer count doesn't match (%d, %d)", list->numHwLayers, mLayerCount);
    878         return false;
    879     }
    880 
    881     // update list
    882     mList = list;
    883 
    884     // update all layers, call each layer's update()
    885     for (int i = 0; i < mLayerCount; i++) {
    886         HwcLayer *hwcLayer = mLayers.itemAt(i);
    887         if (!hwcLayer) {
    888             ELOGTRACE("no HWC layer for layer %d", i);
    889             continue;
    890         }
    891 
    892         hwcLayer->update(&list->hwLayers[i]);
    893     }
    894 
    895     setupSmartComposition();
    896     return true;
    897 }
    898 
    899 #endif
    900 
    901 DisplayPlane* HwcLayerList::getPlane(uint32_t index) const
    902 {
    903     HwcLayer *hwcLayer;
    904 
    905     if (index >= mLayers.size()) {
    906         ELOGTRACE("invalid layer index %d", index);
    907         return 0;
    908     }
    909 
    910     hwcLayer = mLayers.itemAt(index);
    911     if ((hwcLayer->getType() == HwcLayer::LAYER_FB) ||
    912         (hwcLayer->getType() == HwcLayer::LAYER_FORCE_FB) ||
    913         (hwcLayer->getType() == HwcLayer::LAYER_SKIPPED)) {
    914         return 0;
    915     }
    916 
    917     if (hwcLayer->getHandle() == 0) {
    918         DLOGTRACE("plane is attached with invalid handle");
    919         return 0;
    920     }
    921 
    922     return hwcLayer->getPlane();
    923 }
    924 
    925 void HwcLayerList::postFlip()
    926 {
    927     for (size_t i = 0; i < mLayers.size(); i++) {
    928         HwcLayer *hwcLayer = mLayers.itemAt(i);
    929         hwcLayer->postFlip();
    930     }
    931 }
    932 
    933 void HwcLayerList::dump(Dump& d)
    934 {
    935     d.append("Layer list: (number of layers %d):\n", mLayers.size());
    936     d.append(" LAYER |          TYPE          |   PLANE  | INDEX | Z Order \n");
    937     d.append("-------+------------------------+----------------------------\n");
    938     for (size_t i = 0; i < mLayers.size(); i++) {
    939         HwcLayer *hwcLayer = mLayers.itemAt(i);
    940         DisplayPlane *plane;
    941         int planeIndex = -1;
    942         int zorder = -1;
    943         const char *type = "HWC_FB";
    944         const char *planeType = "N/A";
    945 
    946         if (hwcLayer) {
    947             switch (hwcLayer->getType()) {
    948             case HwcLayer::LAYER_FB:
    949             case HwcLayer::LAYER_FORCE_FB:
    950                 type = "HWC_FB";
    951                 break;
    952             case HwcLayer::LAYER_OVERLAY:
    953             case HwcLayer::LAYER_SKIPPED:
    954                 type = "HWC_OVERLAY";
    955                 break;
    956             case HwcLayer::LAYER_FRAMEBUFFER_TARGET:
    957                 type = "HWC_FRAMEBUFFER_TARGET";
    958                 break;
    959             case HwcLayer::LAYER_SIDEBAND:
    960                 type = "HWC_SIDEBAND";
    961                 break;
    962             case HwcLayer::LAYER_CURSOR_OVERLAY:
    963                 type = "HWC_CURSOR_OVERLAY";
    964                 break;
    965             default:
    966                 type = "Unknown";
    967             }
    968 
    969             plane = hwcLayer->getPlane();
    970             if (plane) {
    971                 planeIndex = plane->getIndex();
    972                 zorder = plane->getZOrder();
    973                 switch (plane->getType()) {
    974                 case DisplayPlane::PLANE_OVERLAY:
    975                     planeType = "OVERLAY";
    976                     break;
    977                 case DisplayPlane::PLANE_SPRITE:
    978                     planeType = "SPRITE";
    979                     break;
    980                 case DisplayPlane::PLANE_PRIMARY:
    981                     planeType = "PRIMARY";
    982                     break;
    983                 case DisplayPlane::PLANE_CURSOR:
    984                     planeType = "CURSOR";
    985                     break;
    986                 default:
    987                     planeType = "Unknown";
    988                 }
    989             }
    990 
    991             d.append("  %2d   | %22s | %8s | %3D   | %3D \n",
    992                      i, type, planeType, planeIndex, zorder);
    993         }
    994     }
    995 }
    996 
    997 
    998 void HwcLayerList::dump()
    999 {
   1000     static char const* compositionTypeName[] = {
   1001         "GLES",
   1002         "HWC",
   1003         "BG",
   1004         "FBT",
   1005         "SB",
   1006         "CUR",
   1007         "N/A"};
   1008 
   1009     static char const* planeTypeName[] = {
   1010         "SPRITE",
   1011         "OVERLAY",
   1012         "PRIMARY",
   1013         "CURSOR",
   1014         "UNKNOWN"};
   1015 
   1016     DLOGTRACE(" numHwLayers = %u, flags = %08x", mList->numHwLayers, mList->flags);
   1017 
   1018     DLOGTRACE(" type |  handle  | hints | flags | tr | blend | alpha |  format  |           source crop             |            frame          | index | zorder |  plane  ");
   1019     DLOGTRACE("------+----------+-------+-------+----+-------+-------+----------+-----------------------------------+---------------------------+-------+--------+---------");
   1020 
   1021 
   1022     for (int i = 0 ; i < mLayerCount ; i++) {
   1023         const hwc_layer_1_t&l = mList->hwLayers[i];
   1024         DisplayPlane *plane = mLayers[i]->getPlane();
   1025         int planeIndex = -1;
   1026         int zorder = -1;
   1027         const char *planeType = "N/A";
   1028         if (plane) {
   1029             planeIndex = plane->getIndex();
   1030             zorder = plane->getZOrder();
   1031             planeType = planeTypeName[plane->getType()];
   1032         }
   1033 
   1034         DLOGTRACE(
   1035             " %4s | %8x | %5x | %5x | %2x | %5x | %5x | %8x | [%7.1f,%7.1f,%7.1f,%7.1f] | [%5d,%5d,%5d,%5d] | %5d | %6d | %7s ",
   1036             compositionTypeName[l.compositionType],
   1037             mLayers[i]->getHandle(), l.hints, l.flags, l.transform, l.blending, l.planeAlpha, mLayers[i]->getFormat(),
   1038             l.sourceCropf.left, l.sourceCropf.top, l.sourceCropf.right, l.sourceCropf.bottom,
   1039             l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
   1040             planeIndex, zorder, planeType);
   1041     }
   1042 
   1043 }
   1044 
   1045 
   1046 } // namespace intel
   1047 } // namespace android
   1048