• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 // Copyright (c) 2014 Intel Corporation 
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #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 
HwcLayerList(hwc_display_contents_1_t * list,int disp)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 
~HwcLayerList()43 HwcLayerList::~HwcLayerList()
44 {
45     deinitialize();
46 }
47 
checkSupported(int planeType,HwcLayer * hwcLayer)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 
checkRgbOverlaySupported(HwcLayer * hwcLayer)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 
checkCursorSupported(HwcLayer * hwcLayer)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 
initialize()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 
deinitialize()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 
allocatePlanes()381 bool HwcLayerList::allocatePlanes()
382 {
383     return assignCursorPlanes();
384 }
385 
assignCursorPlanes()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 
assignCursorPlanes(int index,int planeNumber)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 
assignOverlayPlanes()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 
assignOverlayPlanes(int index,int planeNumber)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 
assignSpritePlanes()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 
assignSpritePlanes(int index,int planeNumber)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 
assignPrimaryPlane()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 
assignPrimaryPlaneHelper(HwcLayer * hwcLayer,int zorder)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 
attachPlanes()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 
useAsFrameBufferTarget(HwcLayer * target)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 
hasIntersection(HwcLayer * la,HwcLayer * lb)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 
addZOrderLayer(int type,HwcLayer * hwcLayer,int zorder)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 
removeZOrderLayer(ZOrderLayer * layer)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 
setupSmartComposition()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 
update(hwc_display_contents_1_t * list)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 
update(hwc_display_contents_1_t * list)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 
getPlane(uint32_t index) const902 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 
postFlip()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 
dump(Dump & d)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 
dump()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