hwc: In PTOR, offset depends on stride calculated by gralloc
1. In PTOR feature, offset for the second overlap layer on render
buffer, depends on stride calculated by gralloc for RGBA (4 bpp).
2. If mCopyBit object exists for external, we need setReleaseFd()
Change-Id: I74e365def2a6e540b2f2ba2b294b6b1e00e0ea96
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index a5ecb3a..33d460b 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -234,9 +234,6 @@
finalW = max(finalW, ALIGN((overlap.right - overlap.left), 32));
finalH += ALIGN((overlap.bottom - overlap.top), 32);
if(finalH > ALIGN((overlap.bottom - overlap.top), 32)) {
- // Calculate the offset for RGBA(4BPP)
- ptorInfo->mRenderBuffOffset[i] = finalW *
- (finalH - ALIGN((overlap.bottom - overlap.top), 32)) * 4;
// Calculate the dest top, left will always be zero
ptorInfo->displayFrame[i].top = (finalH -
(ALIGN((overlap.bottom - overlap.top), 32)));
@@ -251,6 +248,14 @@
getBufferSizeAndDimensions(finalW, finalH, HAL_PIXEL_FORMAT_RGBA_8888,
alignW, alignH);
+ int heightFromTop = 0;
+ for (int i = 0; i < ptorInfo->count; i++) {
+ // Offset depends on stride calculated by gralloc for RGBA (4 bpp)
+ ptorInfo->mRenderBuffOffset[i] = alignW * heightFromTop * 4;
+ heightFromTop += ALIGN((ptorInfo->displayFrame[i].bottom -
+ ptorInfo->displayFrame[i].top), 32);
+ }
+
if ((mAlignedWidth != alignW) || (mAlignedHeight != alignH)) {
// Overlap rect has changed, so free render buffers
freeRenderBuffers();