hwc: Fix PTOR for overlapping PTOR regions.
If two PTOR layers are overlapping, remove overlapping
region from bottom PTOR layer if possible to reduce total
overlapping layers in a region.
Change-Id: I695c097360ac5a8fa123e014f21380169519eb32
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index 24fd771..8164fd3 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -597,6 +597,21 @@
for(int j = 0; j < ptorInfo->count; j++) {
int ovlapIndex = ptorInfo->layerIndex[j];
hwc_rect_t overlap = list->hwLayers[ovlapIndex].displayFrame;
+ if(j) {
+ /**
+ * It's possible that 2 PTOR layers might have overlapping.
+ * In such case, remove the intersection(again if peripheral)
+ * from the lower PTOR layer to avoid overlapping.
+ * If intersection is not on peripheral then compromise
+ * by reducing number of PTOR layers.
+ **/
+ int prevOvlapIndex = ptorInfo->layerIndex[0];
+ hwc_rect_t prevOvlap = list->hwLayers[prevOvlapIndex].displayFrame;
+ hwc_rect_t commonRect = getIntersection(prevOvlap, overlap);
+ if(isValidRect(commonRect)) {
+ overlap = deductRect(overlap, commonRect);
+ }
+ }
// Draw overlapped content of layers on render buffer
for (int i = 0; i <= ovlapIndex; i++) {
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 6084d8d..26cf27d 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -874,28 +874,10 @@
}
}
- if(isValidRect(getIntersection(overlapRect[0], overlapRect[1]))) {
- ALOGD_IF(isDebug(), "%s: Ignore Rect2 its intersects with Rect1",
- __FUNCTION__);
- // reset second minLayerIndex[1];
- minLayerIndex[1] = -1;
- numPTORLayersFound--;
- }
-
// No overlap layers
if (!numPTORLayersFound)
return false;
- ctx->mPtorInfo.count = numPTORLayersFound;
- for(int i = 0; i < MAX_PTOR_LAYERS; i++) {
- ctx->mPtorInfo.layerIndex[i] = minLayerIndex[i];
- }
-
- if (!ctx->mCopyBit[mDpy]->prepareOverlap(ctx, list)) {
- // reset PTOR
- ctx->mPtorInfo.count = 0;
- return false;
- }
// Store the displayFrame and the sourceCrops of the layers
hwc_rect_t displayFrame[numAppLayers];
hwc_rect_t sourceCrop[numAppLayers];
@@ -905,6 +887,35 @@
sourceCrop[i] = integerizeSourceCrop(layer->sourceCropf);
}
+ /**
+ * It's possible that 2 PTOR layers might have overlapping.
+ * In such case, remove the intersection(again if peripheral)
+ * from the lower PTOR layer to avoid overlapping.
+ * If intersection is not on peripheral then compromise
+ * by reducing number of PTOR layers.
+ **/
+ hwc_rect_t commonRect = getIntersection(overlapRect[0], overlapRect[1]);
+ if(isValidRect(commonRect)) {
+ overlapRect[1] = deductRect(overlapRect[1], commonRect);
+ list->hwLayers[minLayerIndex[1]].displayFrame = overlapRect[1];
+ }
+
+ ctx->mPtorInfo.count = numPTORLayersFound;
+ for(int i = 0; i < MAX_PTOR_LAYERS; i++) {
+ ctx->mPtorInfo.layerIndex[i] = minLayerIndex[i];
+ }
+
+ if (!ctx->mCopyBit[mDpy]->prepareOverlap(ctx, list)) {
+ // reset PTOR
+ ctx->mPtorInfo.count = 0;
+ if(isValidRect(commonRect)) {
+ // If PTORs are intersecting restore displayframe of PTOR[1]
+ // before returning, as we have modified it above.
+ list->hwLayers[minLayerIndex[1]].displayFrame =
+ displayFrame[minLayerIndex[1]];
+ }
+ return false;
+ }
private_handle_t *renderBuf = ctx->mCopyBit[mDpy]->getCurrentRenderBuffer();
Whf layerWhf[numPTORLayersFound]; // To store w,h,f of PTOR layers