hwc: 8x26: Composition policy when WFD connected
When WFD is connected to 8x26
1) On Video transition, have 1 padding round if external connected.
Required to shift pipes across mixers.
2) Request DMA pipe always for FB on WFD.
Necessary for rotation + writeback
3) Disable non-worm-hole calcs on external (because of 2)
4) Disable action-safe calcs on external (because of 2)
Change-Id: I63b50b2477db443f9ea1d3fa610b59295c9359b7
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index e812c01..d7375f8 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -88,7 +88,6 @@
//Helper
static void reset(hwc_context_t *ctx, int numDisplays,
hwc_display_contents_1_t** displays) {
- memset(ctx->listStats, 0, sizeof(ctx->listStats));
for(int i = 0; i < MAX_DISPLAYS; i++) {
hwc_display_contents_1_t *list = displays[i];
// XXX:SurfaceFlinger no longer guarantees that this
@@ -497,6 +496,7 @@
// frames to the display.
CALC_FPS();
MDPComp::resetIdleFallBack();
+ ctx->mVideoTransFlag = false;
return ret;
}
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index aa6bb7f..7ed0577 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -82,8 +82,13 @@
ovutils::Whf info(hnd->width, hnd->height,
ovutils::getMdpFormat(hnd->format), hnd->size);
- //Request an RGB pipe
- ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy);
+ //Request a pipe
+ ovutils::eMdpPipeType type = ovutils::OV_MDP_PIPE_ANY;
+ if(qdutils::MDPVersion::getInstance().is8x26() && mDpy) {
+ //For 8x26 external always use DMA pipe
+ type = ovutils::OV_MDP_PIPE_DMA;
+ }
+ ovutils::eDest dest = ov.nextPipe(type, mDpy);
if(dest == ovutils::OV_INVALID) { //None available
ALOGE("%s: No pipes available to configure fb for dpy %d",
__FUNCTION__, mDpy);
@@ -119,15 +124,17 @@
displayFrame = sourceCrop;
} else if((!mDpy || (mDpy && !ctx->mExtOrientation))
&& extOnlyLayerIndex == -1) {
- getNonWormholeRegion(list, sourceCrop);
- displayFrame = sourceCrop;
+ if(!qdutils::MDPVersion::getInstance().is8x26()) {
+ getNonWormholeRegion(list, sourceCrop);
+ displayFrame = sourceCrop;
+ }
}
ovutils::Dim dpos(displayFrame.left,
displayFrame.top,
displayFrame.right - displayFrame.left,
displayFrame.bottom - displayFrame.top);
- if(mDpy) {
+ if(mDpy && !qdutils::MDPVersion::getInstance().is8x26()) {
// Get Aspect Ratio for external
getAspectRatioPosition(ctx, mDpy, ctx->mExtOrientation, dpos.x,
dpos.y, dpos.w, dpos.h);
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 77234d1..8648ec7 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -366,6 +366,13 @@
if(!isEnabled()) {
ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
ret = false;
+ } else if(qdutils::MDPVersion::getInstance().is8x26() &&
+ ctx->mVideoTransFlag &&
+ ctx->mExtDisplay->isExternalConnected()) {
+ //1 Padding round to shift pipes across mixers
+ ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
+ __FUNCTION__);
+ ret = false;
} else if(ctx->mExtDispConfiguring) {
ALOGD_IF( isDebug(),"%s: External Display connection is pending",
__FUNCTION__);
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index e8641ff..4737b25 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -368,7 +368,8 @@
void setListStats(hwc_context_t *ctx,
const hwc_display_contents_1_t *list, int dpy) {
-
+ const int prevYuvCount = ctx->listStats[dpy].yuvCount;
+ memset(&ctx->listStats[dpy], 0, sizeof(ListStats));
ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1;
ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1;
ctx->listStats[dpy].skipCount = 0;
@@ -457,6 +458,12 @@
Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
}
}
+
+ //The marking of video begin/end is useful on some targets where we need
+ //to have a padding round to be able to shift pipes across mixers.
+ if(prevYuvCount != ctx->listStats[dpy].yuvCount) {
+ ctx->mVideoTransFlag = true;
+ }
}
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 54a118c..916a59d 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -316,6 +316,8 @@
bool isPaddingRound;
// External Orientation
int mExtOrientation;
+ //Flags the transition of a video session
+ bool mVideoTransFlag;
};
namespace qhwc {