Merge "hwcomposer: Fix a crash with MDP composition."
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 2103cb4..22d86a6 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -750,19 +750,20 @@
const int numLayers = ctx->listStats[mDpy].numAppLayers;
- //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
- //do not cache the information for next draw cycle.
- if(numLayers > MAX_NUM_APP_LAYERS) {
- ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
- __FUNCTION__);
- return 0;
- }
-
Locker::Autolock _l(mMdpCompLock);
//reset old data
mCurrentFrame.reset(numLayers);
+ //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
+ //do not cache the information for next draw cycle.
+ if(numLayers > MAX_NUM_APP_LAYERS) {
+ mCachedFrame.updateCounts(mCurrentFrame);
+ ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
+ __FUNCTION__);
+ return 0;
+ }
+
//Hard conditions, if not met, cannot do MDP comp
if(!isFrameDoable(ctx)) {
ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
@@ -898,6 +899,11 @@
return false;
}
+ if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
+ ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
+ return true;
+ }
+
Locker::Autolock _l(mMdpCompLock);
/* reset Invalidator */
@@ -948,7 +954,7 @@
}
if (!ov.queueBuffer(fd, offset, dest)) {
- ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
+ ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy);
return false;
}
@@ -1083,6 +1089,11 @@
return false;
}
+ if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
+ ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
+ return true;
+ }
+
Locker::Autolock _l(mMdpCompLock);
/* reset Invalidator */