am 0cd545f1: sometimes we would incorrectly scale the content of a surface

* commit '0cd545f14261d829513e0d6e8fa5e4e4f3372b3d':
  sometimes we would incorrectly scale the content of a surface
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 @@
                 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);
 }