hwc: Avoid MDP draw if prepare is not successful.
If #AppLayers are 0 or exceed MAX_NUM_APP_LAYERS
return early from MDP draw.
Change-Id: I834c7b04a295fbd9b98374cade880992d995ad1f
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index d2eae88..1a1bd9e 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -183,6 +183,11 @@
ctx->mLayerRotMap[mDpy]->clear();
}
+void MDPComp::reset() {
+ sHandleTimeout = false;
+ mModeOn = false;
+}
+
void MDPComp::timeout_handler(void *udata) {
struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
@@ -1541,9 +1546,16 @@
int MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
int ret = 0;
- const int numLayers = ctx->listStats[mDpy].numAppLayers;
char property[PROPERTY_VALUE_MAX];
+ if(!ctx || !list) {
+ ALOGE("%s: Invalid context or list",__FUNCTION__);
+ mCachedFrame.reset();
+ return -1;
+ }
+
+ const int numLayers = ctx->listStats[mDpy].numAppLayers;
+
if(property_get("debug.hwc.simulate", property, NULL) > 0) {
int currentFlags = atoi(property);
if(currentFlags != sSimulationFlags) {
@@ -1587,7 +1599,8 @@
if(isFrameDoable(ctx)) {
generateROI(ctx, list);
- if(tryFullFrame(ctx, list) || tryVideoOnly(ctx, list)) {
+ mModeOn = tryFullFrame(ctx, list) || tryVideoOnly(ctx, list);
+ if(mModeOn) {
setMDPCompLayerFlags(ctx, list);
} else {
resetROI(ctx, mDpy);
@@ -1758,18 +1771,8 @@
bool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
- if(!isEnabled()) {
- ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
- return true;
- }
-
- if(!ctx || !list) {
- ALOGE("%s: invalid contxt or list",__FUNCTION__);
- return false;
- }
-
- if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
- ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
+ if(!isEnabled() or !mModeOn) {
+ ALOGD_IF(isDebug(),"%s: MDP Comp not enabled/configured", __FUNCTION__);
return true;
}
@@ -2013,18 +2016,8 @@
bool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
- if(!isEnabled()) {
- ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
- return true;
- }
-
- if(!ctx || !list) {
- ALOGE("%s: invalid contxt or list",__FUNCTION__);
- return false;
- }
-
- if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
- ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
+ if(!isEnabled() or !mModeOn) {
+ ALOGD_IF(isDebug(),"%s: MDP Comp not enabled/configured", __FUNCTION__);
return true;
}