summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/surfaceflinger/Layer.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 593f178..4062340 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -469,18 +469,31 @@ uint32_t Layer::doTransaction(uint32_t flags)
front.requested.crop.getWidth(),
front.requested.crop.getHeight());
- if (!isFixedSize()) {
- // this will make sure LayerBase::doTransaction doesn't update
- // the drawing state's geometry
- flags |= eDontUpdateGeometryState;
- }
-
// record the new size, form this point on, when the client request
// a buffer, it'll get the new size.
mSurfaceTexture->setDefaultBufferSize(
temp.requested.w, temp.requested.h);
}
+ if (!isFixedSize()) {
+
+ const bool resizePending = (temp.requested.w != temp.active.w) ||
+ (temp.requested.h != temp.active.h);
+
+ if (resizePending) {
+ // don't let LayerBase::doTransaction update the drawing state
+ // if we have a pending resize, unless we are in fixed-size mode.
+ // the drawing state will be updated only once we receive a buffer
+ // with the correct size.
+ //
+ // in particular, we want to make sure the clip (which is part
+ // of the geometry state) is latched together with the size but is
+ // latched immediately when no resizing is involved.
+
+ flags |= eDontUpdateGeometryState;
+ }
+ }
+
return LayerBase::doTransaction(flags);
}