am 11cec5a0
: am d4548dd0
: am 514e30a9
: am c3d1889e
: Merge "surfaceflinger: skip composition for empty frames" into klp-modular-dev
* commit '11cec5a0ef2bc2934928ea476c7c7fad1414a8b2': surfaceflinger: skip composition for empty frames
This commit is contained in:
commit
42e9434e95
@ -59,7 +59,8 @@ DisplayDevice::DisplayDevice(
|
||||
const sp<DisplaySurface>& displaySurface,
|
||||
const sp<IGraphicBufferProducer>& producer,
|
||||
EGLConfig config)
|
||||
: mFlinger(flinger),
|
||||
: lastCompositionHadVisibleLayers(false),
|
||||
mFlinger(flinger),
|
||||
mType(type), mHwcDisplayId(hwcId),
|
||||
mDisplayToken(displayToken),
|
||||
mDisplaySurface(displaySurface),
|
||||
|
@ -53,6 +53,7 @@ public:
|
||||
mutable Region swapRegion;
|
||||
// region in screen space
|
||||
Region undefinedRegion;
|
||||
bool lastCompositionHadVisibleLayers;
|
||||
|
||||
enum DisplayType {
|
||||
DISPLAY_ID_INVALID = -1,
|
||||
|
@ -987,9 +987,32 @@ void SurfaceFlinger::rebuildLayerStacks() {
|
||||
|
||||
void SurfaceFlinger::setUpHWComposer() {
|
||||
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
||||
bool mustRecompose =
|
||||
!(mDisplays[dpy]->getDirtyRegion(false).isEmpty());
|
||||
bool dirty = !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);
|
||||
|
||||
if (mustRecompose) {
|
||||
mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
|
||||
}
|
||||
}
|
||||
|
||||
HWComposer& hwc(getHwComposer());
|
||||
|
Loading…
Reference in New Issue
Block a user