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