Merge "hwc: Configure framebuffer before other layers."
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 1f97db4..2158611 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -140,12 +140,12 @@
hwc_layer_1_t *fbLayer = &list->hwLayers[last];
if(fbLayer->handle) {
setListStats(ctx, list, dpy);
- int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
- if(fbZOrder >= 0)
- ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
-
+ if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
+ const int fbZ = 0;
+ ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
+ }
if (ctx->mMDP.version < qdutils::MDP_V4_0) {
- if((fbZOrder >= 0) && ctx->mCopyBit[dpy])
+ if(ctx->mCopyBit[dpy])
ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
}
}
@@ -168,9 +168,10 @@
if(fbLayer->handle) {
ctx->mExtDispConfiguring = false;
setListStats(ctx, list, dpy);
- int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
- if(fbZOrder >= 0)
- ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
+ if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
+ const int fbZ = 0;
+ ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
+ }
/* Temporarily commenting out C2D until we support partial
copybit composition for mixed mode MDP
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 2ab9491..0f34cd4 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -22,6 +22,7 @@
#include "external.h"
#include "qdMetaData.h"
#include "mdp_version.h"
+#include "hwc_fbupdate.h"
#include <overlayRotator.h>
using namespace overlay;
@@ -137,6 +138,12 @@
return true;
}
+void MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
+ mCurrentFrame.reset(numLayers);
+ mCachedFrame.cacheAll(list);
+ mCachedFrame.updateCounts(mCurrentFrame);
+}
+
void MDPComp::timeout_handler(void *udata) {
struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
@@ -748,7 +755,6 @@
}
int MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
-
const int numLayers = ctx->listStats[mDpy].numAppLayers;
{ //LOCK SCOPE BEGIN
@@ -763,26 +769,33 @@
mCachedFrame.updateCounts(mCurrentFrame);
ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
__FUNCTION__);
- return 0;
+ return -1;
}
//Hard conditions, if not met, cannot do MDP comp
if(!isFrameDoable(ctx)) {
ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
__FUNCTION__);
- mCurrentFrame.reset(numLayers);
- mCachedFrame.cacheAll(list);
- mCachedFrame.updateCounts(mCurrentFrame);
- return 0;
+ reset(numLayers, list);
+ return -1;
}
//Check whether layers marked for MDP Composition is actually doable.
if(isFullFrameDoable(ctx, list)){
mCurrentFrame.map();
+ //Configure framebuffer first if applicable
+ if(mCurrentFrame.fbZ >= 0) {
+ if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
+ mCurrentFrame.fbZ)) {
+ ALOGE("%s configure framebuffer failed", __func__);
+ reset(numLayers, list);
+ return -1;
+ }
+ }
//Acquire and Program MDP pipes
if(!programMDP(ctx, list)) {
- mCurrentFrame.reset(numLayers);
- mCachedFrame.cacheAll(list);
+ reset(numLayers, list);
+ return -1;
} else { //Success
//Any change in composition types needs an FB refresh
mCurrentFrame.needsRedraw = false;
@@ -807,13 +820,22 @@
mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
mCurrentFrame.map();
+
+ //Configure framebuffer first if applicable
+ if(mCurrentFrame.fbZ >= 0) {
+ if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
+ ALOGE("%s configure framebuffer failed", __func__);
+ reset(numLayers, list);
+ return -1;
+ }
+ }
if(!programYUV(ctx, list)) {
- mCurrentFrame.reset(numLayers);
- mCachedFrame.cacheAll(list);
+ reset(numLayers, list);
+ return -1;
}
} else {
- mCurrentFrame.reset(numLayers);
- mCachedFrame.cacheAll(list);
+ reset(numLayers, list);
+ return -1;
}
//UpdateLayerFlags
@@ -829,7 +851,7 @@
ALOGE("%s",sDump.string());
}
- return mCurrentFrame.fbZ;
+ return 0;
}
//=============MDPCompLowRes===================================================
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index ea7c7b1..cc4b76a 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -164,6 +164,7 @@
void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list);
bool programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list);
bool programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list);
+ void reset(const int& numAppLayers, hwc_display_contents_1_t* list);
int mDpy;
static bool sEnabled;
@@ -227,5 +228,6 @@
virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
};
+
}; //namespace
#endif