Merge "hwc: Change log message for AD feature"
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index a395ee0..dbb4413 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -223,24 +223,18 @@
if (!useCopybitForYUV && ctx->listStats[dpy].yuvCount)
return true;
- // numAppLayers-1, as we iterate till 0th layer index
- for (int i = ctx->listStats[dpy].numAppLayers-1; i >= 0 ; i--) {
- private_handle_t *hnd = (private_handle_t *)list->hwLayers[i].handle;
-
- if ((hnd->bufferType == BUFFER_TYPE_VIDEO && useCopybitForYUV) ||
- (hnd->bufferType == BUFFER_TYPE_UI && useCopybitForRGB)) {
+ mCopyBitDraw = false;
+ if (useCopybitForRGB &&
+ (useCopybitForYUV || !ctx->listStats[dpy].yuvCount)) {
+ mCopyBitDraw = true;
+ // numAppLayers-1, as we iterate till 0th layer index
+ // Mark all layers to be drawn by copybit
+ for (int i = ctx->listStats[dpy].numAppLayers-1; i >= 0 ; i--) {
layerProp[i].mFlags |= HWC_COPYBIT;
list->hwLayers[i].compositionType = HWC_OVERLAY;
- mCopyBitDraw = true;
- } else {
- // We currently cannot mix copybit layers with layers marked to
- // be drawn on the framebuffer or that are on the layer cache.
- mCopyBitDraw = false;
- //There is no need to reset layer properties here as we return in
- //draw if mCopyBitDraw is false
- break;
}
}
+
return true;
}
@@ -364,6 +358,27 @@
// if needed in the future
src.vert_padding = 0;
+ int layerTransform = layer->transform ;
+ // When flip and rotation(90) are present alter the flip,
+ // as GPU is doing the flip and rotation in opposite order
+ // to that of MDP3.0
+ // For 270 degrees, we get 90 + (H+V) which is same as doing
+ // flip first and then rotation (H+V) + 90
+ if (qdutils::MDPVersion::getInstance().getMDPVersion() < 400) {
+ if (((layer->transform& HAL_TRANSFORM_FLIP_H) ||
+ (layer->transform & HAL_TRANSFORM_FLIP_V)) &&
+ (layer->transform & HAL_TRANSFORM_ROT_90) &&
+ !(layer->transform == HAL_TRANSFORM_ROT_270)){
+ if(layer->transform & HAL_TRANSFORM_FLIP_H){
+ layerTransform ^= HAL_TRANSFORM_FLIP_H;
+ layerTransform |= HAL_TRANSFORM_FLIP_V;
+ }
+ if(layer->transform & HAL_TRANSFORM_FLIP_V){
+ layerTransform ^= HAL_TRANSFORM_FLIP_V;
+ layerTransform |= HAL_TRANSFORM_FLIP_H;
+ }
+ }
+ }
// Copybit source rect
hwc_rect_t sourceCrop = layer->sourceCrop;
copybit_rect_t srcRect = {sourceCrop.left, sourceCrop.top,
@@ -519,7 +534,7 @@
copybit->set_parameter(copybit, COPYBIT_FRAMEBUFFER_HEIGHT,
renderBuffer->height);
copybit->set_parameter(copybit, COPYBIT_TRANSFORM,
- layer->transform);
+ layerTransform);
//TODO: once, we are able to read layer alpha, update this
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
copybit->set_parameter(copybit, COPYBIT_BLEND_MODE,
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index ab3561f..2337b2a 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -58,6 +58,30 @@
mDest = ovutils::OV_INVALID;
}
+bool FBUpdateLowRes::preRotateExtDisplay(hwc_context_t *ctx,
+ ovutils::Whf &info,
+ hwc_rect_t& sourceCrop,
+ ovutils::eMdpFlags& mdpFlags,
+ int& rotFlags)
+{
+ int extOrient = getExtOrientation(ctx);
+ ovutils::eTransform orient = static_cast<ovutils::eTransform >(extOrient);
+ if(mDpy && (extOrient & HWC_TRANSFORM_ROT_90)) {
+ mRot = ctx->mRotMgr->getNext();
+ if(mRot == NULL) return false;
+ //Configure rotator for pre-rotation
+ if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0) < 0) {
+ ALOGE("%s: configRotator Failed!", __FUNCTION__);
+ mRot = NULL;
+ return false;
+ }
+ info.format = (mRot)->getDstFormat();
+ updateSource(orient, info, sourceCrop);
+ rotFlags |= ovutils::ROT_PREROTATED;
+ }
+ return true;
+}
+
bool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
int fbZorder) {
if(!ctx->mMDP.hasOverlay) {
@@ -117,9 +141,7 @@
ovutils::eTransform orient =
static_cast<ovutils::eTransform>(transform);
// use ext orientation if any
- int extOrient = ctx->mExtOrientation;
- if(ctx->mBufferMirrorMode)
- extOrient = getMirrorModeOrientation(ctx);
+ int extOrient = getExtOrientation(ctx);
// Do not use getNonWormholeRegion() function to calculate the
// sourceCrop during animation on external display and
@@ -137,32 +159,14 @@
displayFrame = sourceCrop;
}
}
- if(mDpy && !qdutils::MDPVersion::getInstance().is8x26()) {
- if(extOrient || ctx->dpyAttr[mDpy].mDownScaleMode) {
- calcExtDisplayPosition(ctx, mDpy, sourceCrop, displayFrame);
- // If there is a external orientation set, use that
- if(extOrient) {
- transform = extOrient;
- orient = static_cast<ovutils::eTransform >(extOrient);
- }
- }
- // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
- getActionSafePosition(ctx, mDpy, displayFrame);
- }
+ calcExtDisplayPosition(ctx, hnd, mDpy, sourceCrop, displayFrame,
+ transform, orient);
setMdpFlags(layer, mdpFlags, 0, transform);
// For External use rotator if there is a rotation value set
- if(mDpy && (extOrient & HWC_TRANSFORM_ROT_90)) {
- mRot = ctx->mRotMgr->getNext();
- if(mRot == NULL) return -1;
- //Configure rotator for pre-rotation
- if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0) < 0) {
- ALOGE("%s: configRotator Failed!", __FUNCTION__);
- mRot = NULL;
- return -1;
- }
- info.format = (mRot)->getDstFormat();
- updateSource(orient, info, sourceCrop);
- rotFlags |= ovutils::ROT_PREROTATED;
+ ret = preRotateExtDisplay(ctx, info, sourceCrop, mdpFlags, rotFlags);
+ if(!ret) {
+ ALOGE("%s: preRotate for external Failed!", __FUNCTION__);
+ return false;
}
//For the mdp, since either we are pre-rotating or MDP does flips
orient = ovutils::OVERLAY_TRANSFORM_0;
diff --git a/libhwcomposer/hwc_fbupdate.h b/libhwcomposer/hwc_fbupdate.h
index 55cd655..3c76efe 100644
--- a/libhwcomposer/hwc_fbupdate.h
+++ b/libhwcomposer/hwc_fbupdate.h
@@ -66,6 +66,11 @@
private:
bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
int fbZorder);
+ bool preRotateExtDisplay(hwc_context_t *ctx,
+ ovutils::Whf &info,
+ hwc_rect_t& sourceCrop,
+ ovutils::eMdpFlags& mdpFlags,
+ int& rotFlags);
ovutils::eDest mDest; //pipe to draw on
};
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index f2217b9..85450d2 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -785,12 +785,14 @@
mCurrentFrame.fbZ)) {
ALOGE("%s configure framebuffer failed", __func__);
reset(numLayers, list);
+ ctx->mOverlay->clear(mDpy);
return -1;
}
}
//Acquire and Program MDP pipes
if(!programMDP(ctx, list)) {
reset(numLayers, list);
+ ctx->mOverlay->clear(mDpy);
return -1;
} else { //Success
//Any change in composition types needs an FB refresh
@@ -822,11 +824,13 @@
if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
ALOGE("%s configure framebuffer failed", __func__);
reset(numLayers, list);
+ ctx->mOverlay->clear(mDpy);
return -1;
}
}
if(!programYUV(ctx, list)) {
reset(numLayers, list);
+ ctx->mOverlay->clear(mDpy);
return -1;
}
} else {
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index d0909a6..ffaa9cb 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -266,6 +266,13 @@
va_end(varargs);
}
+int getExtOrientation(hwc_context_t* ctx) {
+ int extOrient = ctx->mExtOrientation;
+ if(ctx->mBufferMirrorMode)
+ extOrient = getMirrorModeOrientation(ctx);
+ return extOrient;
+}
+
/* Calculates the destination position based on the action safe rectangle */
void getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& rect) {
// Position
@@ -299,9 +306,7 @@
float fbHeight = ctx->dpyAttr[dpy].yres;
// Since external is rotated 90, need to swap width/height
- int extOrient = ctx->mExtOrientation;
- if(ctx->mBufferMirrorMode)
- extOrient = getMirrorModeOrientation(ctx);
+ int extOrient = getExtOrientation(ctx);
if(extOrient & HWC_TRANSFORM_ROT_90)
swap(fbWidth, fbHeight);
@@ -498,54 +503,72 @@
return (ctx->deviceOrientation & 0x1);
}
-void calcExtDisplayPosition(hwc_context_t *ctx, int dpy,
+void calcExtDisplayPosition(hwc_context_t *ctx,
+ private_handle_t *hnd,
+ int dpy,
hwc_rect_t& sourceCrop,
- hwc_rect_t& displayFrame) {
+ hwc_rect_t& displayFrame,
+ int& transform,
+ ovutils::eTransform& orient) {
// Swap width and height when there is a 90deg transform
- int extOrient = ctx->mExtOrientation;
- if(ctx->mBufferMirrorMode)
- extOrient = getMirrorModeOrientation(ctx);
- if(extOrient & HWC_TRANSFORM_ROT_90) {
- int dstWidth = ctx->dpyAttr[dpy].xres;
- int dstHeight = ctx->dpyAttr[dpy].yres;;
- int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
- int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
- if(!isPrimaryPortrait(ctx)) {
- swap(srcWidth, srcHeight);
- } // Get Aspect Ratio for external
- getAspectRatioPosition(dstWidth, dstHeight, srcWidth,
- srcHeight, displayFrame);
- // Crop - this is needed, because for sidesync, the dest fb will
- // be in portrait orientation, so update the crop to not show the
- // black side bands.
- if (isOrientationPortrait(ctx)) {
- sourceCrop = displayFrame;
- displayFrame.left = 0;
- displayFrame.top = 0;
- displayFrame.right = dstWidth;
- displayFrame.bottom = dstHeight;
- }
- }
- if(ctx->dpyAttr[dpy].mDownScaleMode) {
- int extW, extH;
- // if downscale is enabled, map the co-ordinates to new
- // domain(downscaled)
- float fbWidth = ctx->dpyAttr[dpy].xres;
- float fbHeight = ctx->dpyAttr[dpy].yres;
- // query MDP configured attributes
- if(dpy == HWC_DISPLAY_EXTERNAL)
- ctx->mExtDisplay->getAttributes(extW, extH);
- else
- ctx->mVirtualDisplay->getAttributes(extW, extH);
- //Calculate the ratio...
- float wRatio = ((float)extW)/fbWidth;
- float hRatio = ((float)extH)/fbHeight;
+ int extOrient = getExtOrientation(ctx);
+ if(dpy && !qdutils::MDPVersion::getInstance().is8x26()) {
+ if(!isYuvBuffer(hnd)) {
+ if(extOrient & HWC_TRANSFORM_ROT_90) {
+ int dstWidth = ctx->dpyAttr[dpy].xres;
+ int dstHeight = ctx->dpyAttr[dpy].yres;;
+ int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
+ int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
+ if(!isPrimaryPortrait(ctx)) {
+ swap(srcWidth, srcHeight);
+ } // Get Aspect Ratio for external
+ getAspectRatioPosition(dstWidth, dstHeight, srcWidth,
+ srcHeight, displayFrame);
+ // Crop - this is needed, because for sidesync, the dest fb will
+ // be in portrait orientation, so update the crop to not show the
+ // black side bands.
+ if (isOrientationPortrait(ctx)) {
+ sourceCrop = displayFrame;
+ displayFrame.left = 0;
+ displayFrame.top = 0;
+ displayFrame.right = dstWidth;
+ displayFrame.bottom = dstHeight;
+ }
+ }
+ if(ctx->dpyAttr[dpy].mDownScaleMode) {
+ int extW, extH;
+ // if downscale is enabled, map the co-ordinates to new
+ // domain(downscaled)
+ float fbWidth = ctx->dpyAttr[dpy].xres;
+ float fbHeight = ctx->dpyAttr[dpy].yres;
+ // query MDP configured attributes
+ if(dpy == HWC_DISPLAY_EXTERNAL)
+ ctx->mExtDisplay->getAttributes(extW, extH);
+ else
+ ctx->mVirtualDisplay->getAttributes(extW, extH);
+ //Calculate the ratio...
+ float wRatio = ((float)extW)/fbWidth;
+ float hRatio = ((float)extH)/fbHeight;
- //convert Dim to hwc_rect_t
- displayFrame.left *= wRatio;
- displayFrame.top *= hRatio;
- displayFrame.right *= wRatio;
- displayFrame.bottom *= hRatio;
+ //convert Dim to hwc_rect_t
+ displayFrame.left *= wRatio;
+ displayFrame.top *= hRatio;
+ displayFrame.right *= wRatio;
+ displayFrame.bottom *= hRatio;
+ }
+ }else {
+ if(extOrient || ctx->dpyAttr[dpy].mDownScaleMode) {
+ getAspectRatioPosition(ctx, dpy, extOrient,
+ displayFrame, displayFrame);
+ }
+ }
+ // If there is a external orientation set, use that
+ if(extOrient) {
+ transform = extOrient;
+ orient = static_cast<ovutils::eTransform >(extOrient);
+ }
+ // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
+ getActionSafePosition(ctx, dpy, displayFrame);
}
}
@@ -1211,22 +1234,8 @@
z = ZORDER_1;
}
}
- }
- if(dpy) {
- int extOrient = ctx->mExtOrientation;
- if(ctx->mBufferMirrorMode)
- extOrient = getMirrorModeOrientation(ctx);
- // Just need to set the position to portrait as the transformation
- // will already be set to required orientation on TV
- if(extOrient || ctx->dpyAttr[dpy].mDownScaleMode) {
- getAspectRatioPosition(ctx, dpy, extOrient, dst, dst);
- if(extOrient) {
- transform = extOrient;
- orient = static_cast<eTransform>(transform);
- }
- }
- // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
- getActionSafePosition(ctx, dpy, dst);
+ calcExtDisplayPosition(ctx, hnd, dpy, crop, dst,
+ transform, orient);
}
if(isYuvBuffer(hnd) && ctx->mMDP.version >= qdutils::MDP_V4_2 &&
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 1c54942..5695f28 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -177,6 +177,8 @@
//Helper function to dump logs
void dumpsys_log(android::String8& buf, const char* fmt, ...);
+int getExtOrientation(hwc_context_t* ctx);
+
/* Calculates the destination position based on the action safe rectangle */
void getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& dst);
@@ -191,9 +193,13 @@
bool isOrientationPortrait(hwc_context_t *ctx);
void calcExtDisplayPosition(hwc_context_t *ctx,
+ private_handle_t *hnd,
int dpy,
hwc_rect_t& sourceCrop,
- hwc_rect_t& displayFrame);
+ hwc_rect_t& displayFrame,
+ int& transform,
+ ovutils::eTransform& orient);
+
// Returns the orientation that needs to be set on external for
// BufferMirrirMode(Sidesync)
int getMirrorModeOrientation(hwc_context_t *ctx);