Merge "hwc: Listen fb0 event for panel status"
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index e9f2b31..fb23470 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -140,7 +140,9 @@
static void handleGeomChange(hwc_context_t *ctx, int dpy,
hwc_display_contents_1_t *list) {
- if(list->flags & HWC_GEOMETRY_CHANGED) {
+ /* No point to calling overlay_set on MDP3 */
+ if(list->flags & HWC_GEOMETRY_CHANGED &&
+ ctx->mMDP.version >= qdutils::MDP_V4_0) {
ctx->mOverlay->forceSet(dpy);
}
}
@@ -279,8 +281,6 @@
ctx->mRotMgr->configBegin();
overlay::Writeback::configBegin();
- Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
-
for (int32_t i = numDisplays; i >= 0; i--) {
hwc_display_contents_1_t *list = displays[i];
int dpy = getDpyforExternalDisplay(ctx, i);
@@ -699,6 +699,8 @@
CALC_FPS();
MDPComp::resetIdleFallBack();
ctx->mVideoTransFlag = false;
+ if(ctx->mRotMgr->getNumActiveSessions() == 0)
+ Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
//Was locked at the beginning of prepare
ctx->mDrawLock.unlock();
return ret;
@@ -805,6 +807,11 @@
ovDump[0] = '\0';
ctx->mRotMgr->getDump(ovDump, 1024);
dumpsys_log(aBuf, ovDump);
+ ovDump[0] = '\0';
+ if(Writeback::getDump(ovDump, 1024)) {
+ dumpsys_log(aBuf, ovDump);
+ ovDump[0] = '\0';
+ }
strlcpy(buff, aBuf.string(), buff_len);
}
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index 912da27..d54a5f2 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -182,16 +182,10 @@
// Following are MDP3 limitations for which we
// need to fallback to GPU composition:
- // 1. HW issues with mdp3 and rotation.
- // 2. Plane alpha is not supported by MDP3.
+ // 1. Plane alpha is not supported by MDP3.
if (qdutils::MDPVersion::getInstance().getMDPVersion() < 400) {
for (int i = ctx->listStats[dpy].numAppLayers-1; i >= 0 ; i--) {
hwc_layer_1_t *layer = (hwc_layer_1_t *) &list->hwLayers[i];
- if ((layer->transform & (HAL_TRANSFORM_FLIP_H |
- HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90)) &&
- ((layer->displayFrame.bottom - layer->displayFrame.top) % 16 ||
- (layer->displayFrame.right - layer->displayFrame.left) % 16))
- return true;
if (layer->planeAlpha != 0xFF)
return true;
}
@@ -274,19 +268,24 @@
return false;
}
- //Wait for the previous frame to complete before rendering onto it
- if(mRelFd[0] >=0) {
- sync_wait(mRelFd[0], 1000);
- close(mRelFd[0]);
- mRelFd[0] = -1;
- }
-
if (ctx->mMDP.version >= qdutils::MDP_V4_0) {
+ //Wait for the previous frame to complete before rendering onto it
+ if(mRelFd[0] >=0) {
+ sync_wait(mRelFd[0], 1000);
+ close(mRelFd[0]);
+ mRelFd[0] = -1;
+ }
+
//Clear the visible region on the render buffer
//XXX: Do this only when needed.
hwc_rect_t clearRegion;
getNonWormholeRegion(list, clearRegion);
clear(renderBuffer, clearRegion);
+ } else {
+ if(mRelFd[0] >=0) {
+ copybit_device_t *copybit = getCopyBitDevice();
+ copybit->set_sync(copybit, mRelFd[0]);
+ }
}
// numAppLayers-1, as we iterate from 0th layer index with HWC_COPYBIT flag
for (int i = 0; i <= (ctx->listStats[dpy].numAppLayers-1); i++) {
@@ -319,6 +318,10 @@
copybit_device_t *copybit = getCopyBitDevice();
// Async mode
copybit->flush_get_fence(copybit, fd);
+ if(mRelFd[0] >=0 && ctx->mMDP.version == qdutils::MDP_V3_0_4) {
+ close(mRelFd[0]);
+ mRelFd[0] = -1;
+ }
}
return true;
}
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index 12177b3..391b150 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -58,6 +58,7 @@
}
bool FBUpdateNonSplit::preRotateExtDisplay(hwc_context_t *ctx,
+ hwc_layer_1_t *layer,
ovutils::Whf &info,
hwc_rect_t& sourceCrop,
ovutils::eMdpFlags& mdpFlags,
@@ -74,6 +75,7 @@
mRot = NULL;
return false;
}
+ ctx->mLayerRotMap[mDpy]->add(layer, mRot);
info.format = (mRot)->getDstFormat();
updateSource(orient, info, sourceCrop);
rotFlags |= ovutils::ROT_PREROTATED;
@@ -162,7 +164,8 @@
transform, orient);
setMdpFlags(layer, mdpFlags, 0, transform);
// For External use rotator if there is a rotation value set
- ret = preRotateExtDisplay(ctx, info, sourceCrop, mdpFlags, rotFlags);
+ ret = preRotateExtDisplay(ctx, layer, info,
+ sourceCrop, mdpFlags, rotFlags);
if(!ret) {
ALOGE("%s: preRotate for external Failed!", __FUNCTION__);
return false;
diff --git a/libhwcomposer/hwc_fbupdate.h b/libhwcomposer/hwc_fbupdate.h
index 0e3f29e..ce6af63 100644
--- a/libhwcomposer/hwc_fbupdate.h
+++ b/libhwcomposer/hwc_fbupdate.h
@@ -66,6 +66,7 @@
bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
int fbZorder);
bool preRotateExtDisplay(hwc_context_t *ctx,
+ hwc_layer_1_t *layer,
ovutils::Whf &info,
hwc_rect_t& sourceCrop,
ovutils::eMdpFlags& mdpFlags,
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index e65d5e7..bb52728 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -242,10 +242,9 @@
void MDPComp::LayerCache::reset() {
memset(&hnd, 0, sizeof(hnd));
- mdpCount = 0;
- fbCount = 0;
+ memset(&isFBComposed, true, sizeof(isFBComposed));
+ memset(&drop, false, sizeof(drop));
layerCount = 0;
- fbZ = -1;
}
void MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
@@ -256,10 +255,21 @@
}
void MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
- mdpCount = curFrame.mdpCount;
- fbCount = curFrame.fbCount;
layerCount = curFrame.layerCount;
- fbZ = curFrame.fbZ;
+ memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed));
+ memcpy(&drop, &curFrame.drop, sizeof(drop));
+}
+
+bool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame) {
+ if(layerCount != curFrame.layerCount)
+ return false;
+ for(int i = 0; i < curFrame.layerCount; i++) {
+ if((curFrame.isFBComposed[i] != isFBComposed[i]) ||
+ (curFrame.drop[i] != drop[i])) {
+ return false;
+ }
+ }
+ return true;
}
bool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) {
@@ -1167,13 +1177,9 @@
} else { //Success
//Any change in composition types needs an FB refresh
mCurrentFrame.needsRedraw = false;
- if(mCurrentFrame.fbCount &&
- ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
- (mCurrentFrame.fbCount != mCachedFrame.fbCount) ||
- (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
- (!mCurrentFrame.mdpCount) ||
+ if(!mCachedFrame.isSameFrame(mCurrentFrame) ||
(list->flags & HWC_GEOMETRY_CHANGED) ||
- isSkipPresent(ctx, mDpy))) {
+ isSkipPresent(ctx, mDpy)) {
mCurrentFrame.needsRedraw = true;
}
}
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 3882bee..1d5d715 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -108,10 +108,9 @@
/* cached data */
struct LayerCache {
int layerCount;
- int mdpCount;
- int fbCount;
- int fbZ;
buffer_handle_t hnd[MAX_NUM_APP_LAYERS];
+ bool isFBComposed[MAX_NUM_APP_LAYERS];
+ bool drop[MAX_NUM_APP_LAYERS];
/* c'tor */
LayerCache();
@@ -119,6 +118,7 @@
void reset();
void cacheAll(hwc_display_contents_1_t* list);
void updateCounts(const FrameInfo&);
+ bool isSameFrame(const FrameInfo& curFrame);
};
/* allocates pipe from pipe book */
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 06d387d..e6c235e 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -312,6 +312,12 @@
float fbWidth = ctx->dpyAttr[dpy].xres;
float fbHeight = ctx->dpyAttr[dpy].yres;
+ if(ctx->dpyAttr[dpy].mDownScaleMode) {
+ // if downscale Mode is enabled for external, need to query
+ // the actual width and height, as that is the physical w & h
+ ctx->mExtDisplay->getAttributes((int&)fbWidth, (int&)fbHeight);
+ }
+
// Since external is rotated 90, need to swap width/height
int extOrient = getExtOrientation(ctx);
diff --git a/liboverlay/overlayRotator.cpp b/liboverlay/overlayRotator.cpp
index 84a9818..7b3dda1 100644
--- a/liboverlay/overlayRotator.cpp
+++ b/liboverlay/overlayRotator.cpp
@@ -168,8 +168,8 @@
mRot[i]->getDump(buf, len);
}
}
- char str[32] = {'\0'};
- snprintf(str, 32, "\n================\n");
+ char str[4] = {'\0'};
+ snprintf(str, 4, "\n");
strncat(buf, str, strlen(str));
}
diff --git a/liboverlay/overlayRotator.h b/liboverlay/overlayRotator.h
index f551f1d..7c1095f 100644
--- a/liboverlay/overlayRotator.h
+++ b/liboverlay/overlayRotator.h
@@ -238,6 +238,7 @@
*/
void getDump(char *buf, size_t len);
int getRotDevFd();
+ int getNumActiveSessions() { return mUseCount; }
private:
overlay::Rotator *mRot[MAX_ROT_SESS];
int mUseCount;
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index fd8bfe2..1377182 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -427,9 +427,8 @@
const msmfb_data& ov) {
char str_data[256] = {'\0'};
snprintf(str_data, 256,
- "%s offset=%d memid=%d id=%d flags=0x%x priv=%d\n",
- prefix, ov.offset, ov.memory_id, ov.id, ov.flags,
- ov.priv);
+ "%s offset=%d memid=%d id=%d flags=0x%x\n",
+ prefix, ov.offset, ov.memory_id, ov.id, ov.flags);
strncat(buf, str_data, strlen(str_data));
}
diff --git a/liboverlay/overlayWriteback.cpp b/liboverlay/overlayWriteback.cpp
index 5c6d773..50aa337 100644
--- a/liboverlay/overlayWriteback.cpp
+++ b/liboverlay/overlayWriteback.cpp
@@ -240,6 +240,17 @@
}
}
+bool Writeback::getDump(char *buf, size_t len) {
+ if(sWb) {
+ utils::getDump(buf, len, "WBData", sWb->mFbData);
+ char str[4] = {'\0'};
+ snprintf(str, 4, "\n");
+ strncat(buf, str, strlen(str));
+ return true;
+ }
+ return false;
+}
+
Writeback *Writeback::sWb = 0;
bool Writeback::sUsed = false;
diff --git a/liboverlay/overlayWriteback.h b/liboverlay/overlayWriteback.h
index 8c0c52a..9785b64 100644
--- a/liboverlay/overlayWriteback.h
+++ b/liboverlay/overlayWriteback.h
@@ -92,6 +92,9 @@
static void configBegin() { sUsed = false; }
static void configDone();
static void clear();
+ //Will take a dump of data structure only if there is an instance existing
+ //Returns true if dump is added to the input buffer, false otherwise
+ static bool getDump(char *buf, size_t len);
private:
explicit Writeback();