am d4548dd0: am 514e30a9: am c3d1889e: Merge "surfaceflinger: skip composition for empty frames" into klp-modular-dev

* commit 'd4548dd0272f5a4edee1d7ff070458728848b35c':
  surfaceflinger: skip composition for empty frames
This commit is contained in:
Jesse Hall 2014-08-21 00:44:35 +00:00 committed by Android Git Automerger
commit 11cec5a0ef
3 changed files with 28 additions and 3 deletions

View File

@ -59,7 +59,8 @@ DisplayDevice::DisplayDevice(
const sp<DisplaySurface>& displaySurface, const sp<DisplaySurface>& displaySurface,
const sp<IGraphicBufferProducer>& producer, const sp<IGraphicBufferProducer>& producer,
EGLConfig config) EGLConfig config)
: mFlinger(flinger), : lastCompositionHadVisibleLayers(false),
mFlinger(flinger),
mType(type), mHwcDisplayId(hwcId), mType(type), mHwcDisplayId(hwcId),
mDisplayToken(displayToken), mDisplayToken(displayToken),
mDisplaySurface(displaySurface), mDisplaySurface(displaySurface),

View File

@ -53,6 +53,7 @@ public:
mutable Region swapRegion; mutable Region swapRegion;
// region in screen space // region in screen space
Region undefinedRegion; Region undefinedRegion;
bool lastCompositionHadVisibleLayers;
enum DisplayType { enum DisplayType {
DISPLAY_ID_INVALID = -1, DISPLAY_ID_INVALID = -1,

View File

@ -987,9 +987,32 @@ void SurfaceFlinger::rebuildLayerStacks() {
void SurfaceFlinger::setUpHWComposer() { void SurfaceFlinger::setUpHWComposer() {
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
bool mustRecompose = bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
!(mDisplays[dpy]->getDirtyRegion(false).isEmpty()); bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
// If nothing has changed (!dirty), don't recompose.
// If something changed, but we don't currently have any visible layers,
// and didn't when we last did a composition, then skip it this time.
// The second rule does two things:
// - When all layers are removed from a display, we'll emit one black
// frame, then nothing more until we get new layers.
// - When a display is created with a private layer stack, we won't
// emit any black frames until a layer is added to the layer stack.
bool mustRecompose = dirty && !(empty && wasEmpty);
ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
"dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
mustRecompose ? "doing" : "skipping",
dirty ? "+" : "-",
empty ? "+" : "-",
wasEmpty ? "+" : "-");
mDisplays[dpy]->beginFrame(mustRecompose); mDisplays[dpy]->beginFrame(mustRecompose);
if (mustRecompose) {
mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
}
} }
HWComposer& hwc(getHwComposer()); HWComposer& hwc(getHwComposer());