HwcLayerList.cpp revision d4e9a8ac464ef6fde755c1a8c0902dc02a1270ec
1/* 2 * Copyright © 2012 Intel Corporation 3 * All rights reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22 * IN THE SOFTWARE. 23 * 24 * Authors: 25 * Jackie Li <yaodong.li@intel.com> 26 * 27 */ 28#include <HwcTrace.h> 29#include <Drm.h> 30#include <HwcLayerList.h> 31#include <Hwcomposer.h> 32#include <GraphicBuffer.h> 33#include <IDisplayDevice.h> 34#include <PlaneCapabilities.h> 35#include <DisplayQuery.h> 36 37namespace android { 38namespace intel { 39 40HwcLayer::HwcLayer(int index, hwc_layer_1_t *layer) 41 : mIndex(index), 42 mLayer(layer), 43 mPlane(0), 44 mFormat(DataBuffer::FORMAT_INVALID), 45 mUsage(0), 46 mIsProtected(false), 47 mType(LAYER_FB) 48{ 49 setupAttributes(); 50} 51 52bool HwcLayer::attachPlane(DisplayPlane* plane) 53{ 54 if (mPlane) { 55 ETRACE("failed to attach plane, plane exists"); 56 return false; 57 } 58 59 mPlane = plane; 60 return true; 61} 62 63DisplayPlane* HwcLayer::detachPlane() 64{ 65 DisplayPlane *plane = mPlane; 66 mPlane = 0; 67 return plane; 68} 69 70void HwcLayer::setType(uint32_t type) 71{ 72 if (!mLayer) 73 return; 74 75 switch (type) { 76 case LAYER_OVERLAY: 77 mLayer->compositionType = HWC_OVERLAY; 78 mLayer->hints |= HWC_HINT_CLEAR_FB; 79 break; 80 // NOTE: set compositionType to HWC_FRAMEBUFFER here so that we have 81 // a chance to submit the primary changes to HW. 82 // Upper layer HWComposer will reset the compositionType automatically. 83 case LAYER_FRAMEBUFFER_TARGET: 84 case LAYER_FB: 85 default: 86 mLayer->compositionType = HWC_FRAMEBUFFER; 87 break; 88 } 89 90 mType = type; 91} 92 93uint32_t HwcLayer::getType() const 94{ 95 return mType; 96} 97 98int HwcLayer::getIndex() const 99{ 100 return mIndex; 101} 102 103uint32_t HwcLayer::getFormat() const 104{ 105 return mFormat; 106} 107 108uint32_t HwcLayer::getUsage() const 109{ 110 return mUsage; 111} 112 113bool HwcLayer::isProtected() const 114{ 115 return mIsProtected; 116} 117 118hwc_layer_1_t* HwcLayer::getLayer() const 119{ 120 return mLayer; 121} 122 123DisplayPlane* HwcLayer::getPlane() const 124{ 125 return mPlane; 126} 127 128bool HwcLayer::update(hwc_layer_1_t *layer, int disp) 129{ 130 bool ret; 131 132 // update layer 133 mLayer = layer; 134 setupAttributes(); 135 136 // if not a FB layer & a plane was attached update plane's data buffer 137 if (mPlane) { 138 mPlane->assignToDevice(disp); 139 mPlane->setPosition(layer->displayFrame.left, 140 layer->displayFrame.top, 141 layer->displayFrame.right - layer->displayFrame.left, 142 layer->displayFrame.bottom - layer->displayFrame.top); 143 mPlane->setSourceCrop(layer->sourceCrop.left, 144 layer->sourceCrop.top, 145 layer->sourceCrop.right - layer->sourceCrop.left, 146 layer->sourceCrop.bottom - layer->sourceCrop.top); 147 mPlane->setTransform(layer->transform); 148 ret = mPlane->setDataBuffer((uint32_t)layer->handle); 149 if (ret == true) { 150 return true; 151 } 152 ETRACE("failed to set data buffer"); 153 if (!mIsProtected) { 154 return false; 155 } else { 156 // protected video has to be rendered using overlay. 157 // if buffer is not ready overlay will still be attached to this layer 158 // but rendering needs to be skipped. 159 ETRACE("ignoring result of data buffer setting for protected video"); 160 return true; 161 } 162 } 163 164 return true; 165} 166 167void HwcLayer::setupAttributes() 168{ 169 if (mFormat != DataBuffer::FORMAT_INVALID) { 170 return; 171 } 172 173 if (mLayer->handle == NULL) { 174 VTRACE("invalid handle"); 175 return; 176 } 177 178 BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 179 if (bm == NULL) { 180 // TODO: this check is redundant 181 return; 182 } 183 184 DataBuffer *buffer = bm->get((uint32_t)mLayer->handle); 185 if (!buffer) { 186 ETRACE("failed to get buffer"); 187 } else { 188 mFormat = buffer->getFormat(); 189 GraphicBuffer *gBuffer = (GraphicBuffer*)buffer; 190 mUsage = gBuffer->getUsage(); 191 mIsProtected = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer); 192 bm->put(*buffer); 193 } 194} 195 196//------------------------------------------------------------------------------ 197HwcLayerList::HwcLayerList(hwc_display_contents_1_t *list, 198 DisplayPlaneManager& dpm, 199 DisplayPlane* primary, 200 int disp) 201 : mList(list), 202 mLayerCount(0), 203 mDisplayPlaneManager(dpm), 204 mPrimaryPlane(primary), 205 mFramebufferTarget(0), 206 mDisplayIndex(disp) 207{ 208 if (mList) { 209 VTRACE("layer count = %d", list->numHwLayers); 210 mLayers.setCapacity(list->numHwLayers); 211 mOverlayLayers.setCapacity(list->numHwLayers); 212 mFBLayers.setCapacity(list->numHwLayers); 213 mLayerCount = list->numHwLayers; 214 // analysis list from the top layer 215 analyze(mLayerCount - 1); 216 } 217} 218 219HwcLayerList::~HwcLayerList() 220{ 221 // reclaim planes 222 for (size_t i = 0; i < mLayers.size(); i++) { 223 HwcLayer *hwcLayer = mLayers.itemAt(i); 224 if (hwcLayer) { 225 DisplayPlane *plane = hwcLayer->detachPlane(); 226 if (plane) 227 mDisplayPlaneManager.reclaimPlane(*plane); 228 } 229 // delete HWC layer 230 delete hwcLayer; 231 } 232 mLayers.clear(); 233} 234 235//------------------------------------------------------------------------------ 236 237HwcLayerList::HwcLayerVector::HwcLayerVector() 238{ 239 240} 241 242int HwcLayerList::HwcLayerVector::do_compare(const void* lhs, 243 const void* rhs) const 244{ 245 const HwcLayer* l = *(HwcLayer**)lhs; 246 const HwcLayer* r = *(HwcLayer**)rhs; 247 248 // sorted from index 0 to n 249 return l->getIndex() - r->getIndex(); 250} 251//------------------------------------------------------------------------------ 252bool HwcLayerList::checkSupported(int planeType, HwcLayer *hwcLayer) 253{ 254 bool valid = false; 255 hwc_layer_1_t& layer = *(hwcLayer->getLayer()); 256 257 // check layer flags 258 if (layer.flags & HWC_SKIP_LAYER) { 259 VTRACE("plane type %d: (skip layer flag was set)", planeType); 260 return false; 261 } 262 263 if (layer.handle == 0) { 264 WTRACE("invalid buffer handle"); 265 return false; 266 } 267 268 // check usage 269 if (!hwcLayer->getUsage() & GRALLOC_USAGE_HW_COMPOSER) { 270 WTRACE("not a composer layer"); 271 return false; 272 } 273 274 // check buffer format 275 valid = PlaneCapabilities::isFormatSupported(planeType, hwcLayer->getFormat()); 276 if (!valid) { 277 VTRACE("plane type %d: (bad buffer format)", planeType); 278 goto check_out; 279 } 280 281 valid = PlaneCapabilities::isTransformSupported(planeType, 282 layer.transform); 283 if (!valid) { 284 VTRACE("plane type %d: (bad transform)", planeType); 285 goto check_out; 286 } 287 288 // check layer blending 289 valid = PlaneCapabilities::isBlendingSupported(planeType, 290 (uint32_t)layer.blending); 291 if (!valid) { 292 VTRACE("plane type %d: (bad blending)", planeType); 293 goto check_out; 294 } 295 296 // check layer scaling 297 valid = PlaneCapabilities::isScalingSupported(planeType, 298 layer.sourceCrop, 299 layer.displayFrame); 300 if (!valid) { 301 VTRACE("plane type %d: (bad scaling)", planeType); 302 goto check_out; 303 } 304 305 // check visible region? 306check_out: 307 return valid; 308} 309 310void HwcLayerList::setZOrder() 311{ 312 ZOrderConfig zorder; 313 int primaryIndex; 314 int overlayCount; 315 int planeCount; 316 bool primaryAvailable; 317 318 // set the primary to bottom by default; 319 primaryIndex = -1; 320 overlayCount = 0; 321 planeCount = 0; 322 primaryAvailable = true; 323 for (int i = mOverlayLayers.size() - 1; i >= 0; i--) { 324 HwcLayer *hwcLayer = mOverlayLayers.itemAt(i); 325 if (!hwcLayer) 326 continue; 327 DisplayPlane *plane = hwcLayer->getPlane(); 328 if (!plane) 329 continue; 330 331 planeCount++; 332 333 switch (plane->getType()) { 334 case DisplayPlane::PLANE_SPRITE: 335 break; 336 case DisplayPlane::PLANE_OVERLAY: 337 zorder.overlayIndexes[overlayCount++] = i; 338 break; 339 case DisplayPlane::PLANE_PRIMARY: 340 primaryIndex = i; 341 primaryAvailable = false; 342 break; 343 } 344 } 345 346 // primary wasn't found, set primary plane to the bottom 347 if (primaryAvailable) 348 primaryIndex = 0; 349 350 // generate final z order config and pass it to all active planes 351 zorder.layerCount = mLayers.size(); 352 zorder.planeCount = planeCount; 353 zorder.overlayCount = overlayCount; 354 zorder.primaryIndex = primaryIndex; 355 356 for (int i = mOverlayLayers.size() - 1; i >= 0; i--) { 357 HwcLayer *hwcLayer = mOverlayLayers.itemAt(i); 358 if (!hwcLayer) 359 continue; 360 DisplayPlane *plane = hwcLayer->getPlane(); 361 if (!plane) 362 continue; 363 plane->setZOrderConfig(zorder); 364 } 365} 366 367// This function takes following actions: 368// 1) re-check plane assignment, adjust the assignment to meet 369// display controller requirement. 370// 2) after re-checking, try to attach primary a layer as much as possible. 371// 3) generate a final plane z-order configure for current layer list. 372// NOTE: current implementation will treat overlay Layer as higher priority. 373void HwcLayerList::revisit() 374{ 375 bool primaryPlaneUsed = false; 376 377 if (!mPrimaryPlane) { 378 WTRACE("no primary plane"); 379 return; 380 } 381 382 // detach primaryPlane 383 // FIXME: make it more efficient 384 for (size_t i = 0; i < mLayers.size(); i++) { 385 HwcLayer *hwcLayer = mLayers.itemAt(i); 386 if (!hwcLayer) { 387 WTRACE("no HWC layer for layer %d", i); 388 continue; 389 } 390 // detach primary plane 391 if (hwcLayer->getPlane() == mPrimaryPlane) { 392 hwcLayer->detachPlane(); 393 hwcLayer->setType(HwcLayer::LAYER_FB); 394 // remove it from overlay list 395 mOverlayLayers.remove(hwcLayer); 396 // add it to fb layer list 397 mFBLayers.add(hwcLayer); 398 } 399 } 400 401 // check whether we can take over the layer by using primary 402 // we can use primary plane only when: 403 // 0) Be able to be accepted by primary plane which this list layer 404 // attached to. 405 // 1) all the other layers have been set to OVERLAY layer. 406 if ((mFBLayers.size() == 1)) { 407 HwcLayer *hwcLayer = mFBLayers.itemAt(0); 408 if (checkSupported(DisplayPlane::PLANE_PRIMARY, hwcLayer)) { 409 VTRACE("primary check passed for primary layer"); 410 // attach primary to hwc layer 411 hwcLayer->attachPlane(mPrimaryPlane); 412 // set the layer type to overlay 413 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 414 // remove layer from FBLayers 415 mFBLayers.remove(hwcLayer); 416 // add layer to overlay layers 417 mOverlayLayers.add(hwcLayer); 418 419 primaryPlaneUsed = true; 420 } 421 } 422 423 // if there is still FB layers, attach frame buffer target 424 if (mFramebufferTarget && !primaryPlaneUsed) { 425 VTRACE("using frame buffer target"); 426 // attach primary plane 427 mFramebufferTarget->attachPlane(mPrimaryPlane); 428 mFramebufferTarget->setType(HwcLayer::LAYER_FRAMEBUFFER_TARGET); 429 // still add it to overlay list 430 mOverlayLayers.add(mFramebufferTarget); 431 } 432 433 // generate z order config 434 setZOrder(); 435} 436 437void HwcLayerList::analyze(uint32_t index) 438{ 439 Hwcomposer& hwc = Hwcomposer::getInstance(); 440 Drm *drm = hwc.getDrm(); 441 DisplayPlane *plane; 442 443 if (!mList || index >= mLayerCount || !drm) 444 return; 445 446 // go through layer list from top to bottom 447 for (int i = index; i >= 0; i--) { 448 hwc_layer_1_t *layer = &mList->hwLayers[i]; 449 if (!layer) { 450 // this will cause index and plane out of sync, see getPlane API 451 ETRACE("layer %d is null", i); 452 continue; 453 } 454 455 // new hwc layer 456 HwcLayer *hwcLayer = new HwcLayer(i, layer); 457 if (!hwcLayer) { 458 ETRACE("failed to allocate hwc layer"); 459 continue; 460 } 461 462 // insert layer to layers 463 mLayers.add(hwcLayer); 464 465 if (layer->compositionType == HWC_OVERLAY) { 466 // layer has been preprocessed 467 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 468 mOverlayLayers.add(hwcLayer); 469 continue; 470 } 471 472 // if a HWC_FRAMEBUFFER_TARGET layer, save it to the last 473 if (layer->compositionType == HWC_FRAMEBUFFER_TARGET) { 474 mFramebufferTarget = hwcLayer; 475 continue; 476 } 477 478 if (layer->handle == NULL) { 479 VTRACE("null buffer handle"); 480 mFBLayers.add(hwcLayer); 481 continue; 482 } 483 484 // check whether the layer can be handled by sprite plane 485 if (checkSupported(DisplayPlane::PLANE_SPRITE, hwcLayer)) { 486 VTRACE("sprite check passed for layer %d", i); 487 plane = mDisplayPlaneManager.getSpritePlane(); 488 if (plane) { 489 // enable plane 490 if (!plane->enable()) { 491 ETRACE("sprite plane is not ready"); 492 mDisplayPlaneManager.putSpritePlane(*plane); 493 continue; 494 } 495 // attach plane to hwc layer 496 hwcLayer->attachPlane(plane); 497 // set the layer type to overlay 498 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 499 mOverlayLayers.add(hwcLayer); 500 continue; 501 } else { 502 VTRACE("sprite plane is not available for layer %d", i); 503 } 504 } 505 506 // check whether the layer can be handled by overlay plane 507 if (checkSupported(DisplayPlane::PLANE_OVERLAY, hwcLayer)) { 508 VTRACE("overlay check passed for layer %d", i); 509 if (mDisplayIndex == IDisplayDevice::DEVICE_PRIMARY) { 510 // check if HWC is in video extended mode 511 if (DisplayQuery::isVideoFormat(hwcLayer->getFormat()) && 512 hwc.getDisplayAnalyzer()->checkVideoExtendedMode()) { 513 ITRACE("video is skipped in extended mode"); 514 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 515 mOverlayLayers.add(hwcLayer); 516 continue; 517 } 518 } 519 520 plane = mDisplayPlaneManager.getOverlayPlane(); 521 if (plane) { 522 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 523 hwcLayer->attachPlane(plane); 524 mOverlayLayers.add(hwcLayer); 525 continue; 526 } else if (hwcLayer->isProtected()) { 527 // TODO: we need to detach overlay from non-protected layers 528 WTRACE("protected layer is skipped"); 529 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 530 mOverlayLayers.add(hwcLayer); 531 continue; 532 } else { 533 // fall back to GPU rendering 534 hwcLayer->setType(HwcLayer::LAYER_FB); 535 ITRACE("overlay plane is not available for video layer %d", i); 536 } 537 } 538 539 // if still FB layer 540 if (hwcLayer->getType() == HwcLayer::LAYER_FB) { 541 mFBLayers.add(hwcLayer); 542 } 543 } // for (ssize_t i = index; i >= 0; i--) 544 545 // revisit the plane assignments 546 revisit(); 547} 548 549bool HwcLayerList::update(hwc_display_contents_1_t *list) 550{ 551 bool ret; 552 bool again = false; 553 554 CTRACE(); 555 556 // basic check to make sure the consistance 557 if (!list) { 558 ETRACE("null layer list"); 559 return false; 560 } 561 562 if (list->numHwLayers != mLayerCount) { 563 ETRACE("layer count doesn't match (%d, %d)", list->numHwLayers, mLayerCount); 564 return false; 565 } 566 567 // update list 568 mList = list; 569 570 do { 571 again = false; 572 // update all layers, call each layer's update() 573 for (size_t i = 0; i < mLayers.size(); i++) { 574 HwcLayer *hwcLayer = mLayers.itemAt(i); 575 if (!hwcLayer) { 576 ETRACE("no HWC layer for layer %d", i); 577 continue; 578 } 579 580 ret = hwcLayer->update(&list->hwLayers[i], mDisplayIndex); 581 if (ret == false) { 582 // layer update failed, fall back to ST and revisit all plane 583 // assignment 584 ITRACE("failed to update layer %d", i); 585 // set layer to FB layer 586 hwcLayer->setType(HwcLayer::LAYER_FB); 587 // remove layer from overlay layer list 588 mOverlayLayers.remove(hwcLayer); 589 // add layer to FB layer list 590 mFBLayers.add(hwcLayer); 591 // revisit the overlay assignment. 592 revisit(); 593 594 } else if (hwcLayer->getPlane() && 595 hwcLayer->getType() == HwcLayer::LAYER_FB) { 596 // layer update success, if the layer was assigned a plane 597 // switch back to overlay and revisit all plane assignment 598 ITRACE("updated layer %d, switch back to overlay", i); 599 // set layer to overlay layer 600 hwcLayer->setType(HwcLayer::LAYER_OVERLAY); 601 // remove layer from Fb layer list 602 mFBLayers.remove(hwcLayer); 603 // add layer to overlay layer list 604 mOverlayLayers.add(hwcLayer); 605 // revisit plane assignment 606 revisit(); 607 // need update again since we changed the plane assignment 608 again = true; 609 } 610 } 611 } while (again && mOverlayLayers.size()); 612 613 return true; 614} 615 616DisplayPlane* HwcLayerList::getPlane(uint32_t index) const 617{ 618 HwcLayer *hwcLayer; 619 620 if (index >= mLayers.size()) { 621 ETRACE("invalid layer index %d", index); 622 return 0; 623 } 624 625 hwcLayer = mLayers.itemAt(index); 626 if (!hwcLayer || (hwcLayer->getType() == HwcLayer::LAYER_FB)) 627 return 0; 628 629 return hwcLayer->getPlane(); 630} 631 632bool HwcLayerList::hasProtectedLayer() 633{ 634 for (size_t i = 0; i < mLayers.size(); i++) { 635 HwcLayer *hwcLayer = mLayers.itemAt(i); 636 if (hwcLayer && hwcLayer->isProtected()) { 637 ITRACE("protected layer found, layer index is %d", i); 638 return true; 639 } 640 } 641 return false; 642} 643 644bool HwcLayerList::hasVisibleLayer() 645{ 646 // excluding framebuffer target layer 647 int count = (int)mLayers.size() - 1; 648 if (count <= 0) { 649 ITRACE("number of layer is %d, visible layer is 0", mLayers.size()); 650 return false; 651 } 652 653 // the last layer is always frambuffer target layer? 654 for (size_t i = 0; i < mLayers.size() - 1; i++) { 655 HwcLayer *hwcLayer = mLayers.itemAt(i); 656 if (hwcLayer == NULL) { 657 // TODO: remove this redundant check 658 continue; 659 } 660 if (hwcLayer->getType() == HwcLayer::LAYER_OVERLAY && 661 hwcLayer->getPlane() == NULL) { 662 // layer is invisible 663 count--; 664 } 665 } 666 ITRACE("number of visible layers %d", count); 667 return count != 0; 668} 669 670void HwcLayerList::dump(Dump& d) 671{ 672 d.append("Layer list: (number of layers %d):\n", mLayers.size()); 673 d.append(" LAYER | TYPE | PLANE | INDEX \n"); 674 d.append("-------+------------------------+------------------ \n"); 675 for (size_t i = 0; i < mLayers.size(); i++) { 676 HwcLayer *hwcLayer = mLayers.itemAt(i); 677 DisplayPlane *plane; 678 int planeIndex = -1; 679 const char *type = "HWC_FB"; 680 const char *planeType = "N/A"; 681 682 if (hwcLayer) { 683 switch (hwcLayer->getType()) { 684 case HwcLayer::LAYER_FB: 685 type = "HWC_FB"; 686 break; 687 case HwcLayer::LAYER_OVERLAY: 688 type = "HWC_OVERLAY"; 689 break; 690 case HwcLayer::LAYER_FRAMEBUFFER_TARGET: 691 type = "HWC_FRAMEBUFFER_TARGET"; 692 break; 693 default: 694 type = "Unknown"; 695 } 696 697 plane = hwcLayer->getPlane(); 698 if (plane) { 699 planeIndex = plane->getIndex(); 700 701 switch (plane->getType()) { 702 case DisplayPlane::PLANE_OVERLAY: 703 planeType = "OVERLAY"; 704 break; 705 case DisplayPlane::PLANE_SPRITE: 706 planeType = "SPRITE"; 707 break; 708 case DisplayPlane::PLANE_PRIMARY: 709 planeType = "PRIMARY"; 710 break; 711 default: 712 planeType = "Unknown"; 713 } 714 } 715 716 d.append(" %2d | %22s | %8s | %3D \n", 717 i, type, planeType, planeIndex); 718 } 719 } 720} 721 722} // namespace intel 723} // namespace android 724