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