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