hwc: Avoid redoing GPU comp under certain conditions
* When the ambient light changes, pp-daemon will invoke multiple
screen-refresh cycles for LUT convergence needed for
PP algorithms.
* When this happens during static screen usecase, there would
be frequent switches from gpu-comp(due to idlescreen-fallback)
to mdpcomp and back. This results in increase in power numbers
due to increased composition cycles.
* To resolve this, do the following:
a) If frame 'n' is composed using GPU and frame 'n+1' is same
as frame 'n' in terms of input layers contents, avoid any
composition needed for frame 'n+1'. Mark the composition type
for all the layers as HWC_OVERLAY and push the GPU composed
content of frame 'n' for 'n+1' too.
b) Donot do (a) if the any of the incoming layers is marked as
skip or HWC_GEOMETRY_CHANGED flag is set in layer list.
c) Limit (a) to only primary and when secondary is not connected
so that display output expectations during secondary pause-resume
can be met.
* This saves ~10ma during static screen usecase when ambient
light is frequently changing.
Change-Id: I6ca4ab3bf194ffe71191cc661086a14d3e2c26b3
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 7752384..676bf24 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -45,6 +45,7 @@
/* dumpsys */
void dump(android::String8& buf, hwc_context_t *ctx);
bool isGLESOnlyComp() { return (mCurrentFrame.mdpCount == 0); }
+ bool isMDPComp() { return mModeOn; }
int drawOverlap(hwc_context_t *ctx, hwc_display_contents_1_t* list);
static MDPComp* getObject(hwc_context_t *ctx, const int& dpy);
/* Handler to invoke frame redraw on Idle Timer expiry */
@@ -141,6 +142,8 @@
void updateCounts(const FrameInfo&);
bool isSameFrame(const FrameInfo& curFrame,
hwc_display_contents_1_t* list);
+ bool isSameFrame(hwc_context_t *ctx, int dpy,
+ hwc_display_contents_1_t* list);
};
/* allocates pipe from pipe book */
@@ -260,8 +263,6 @@
static int sSimulationFlags;
static bool sDebugLogs;
static bool sIdleFallBack;
- /* Handles the timeout event from kernel, if the value is set to true */
- static bool sHandleTimeout;
static int sMaxPipesPerMixer;
static bool sSrcSplitEnabled;
static IdleInvalidator *sIdleInvalidator;
@@ -273,6 +274,7 @@
static bool sEnableYUVsplit;
bool mModeOn; // if prepare happened
bool allocSplitVGPipes(hwc_context_t *ctx, int index);
+ bool mPrevModeOn; //if previous prepare happened
//Enable Partial Update for MDP3 targets
static bool enablePartialUpdateForMDP3;
static void *sLibPerfHint;