improve resize transactions

use a flag instead of pre-committing the "requested" state
to prevent propagation or "requested" to "active", which makes
things a lot clearer when reading the code.

also avoid going through the "resized" code-path when requested
size is equal to "active" size.

Bug: 6498869
Change-Id: I24f893ba0ec5ca06aac5b8da9818989ae7ce4005
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index fc7c767..722813d 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -428,8 +428,8 @@
     const Layer::State& front(drawingState());
     const Layer::State& temp(currentState());
 
-    const bool sizeChanged = (front.requested.w != temp.requested.w) ||
-            (front.requested.h != temp.requested.h);
+    const bool sizeChanged = (temp.requested.w != front.active.w) ||
+                             (temp.requested.h != front.active.h);
 
     if (sizeChanged) {
         // the size changed, we need to ask our client to request a new buffer
@@ -472,8 +472,7 @@
         if (!isFixedSize()) {
             // this will make sure LayerBase::doTransaction doesn't update
             // the drawing state's geometry
-            Layer::State& editDraw(mDrawingState);
-            editDraw.requested = temp.requested;
+            flags |= eDontUpdateGeometryState;
         }
 
         // record the new size, form this point on, when the client request
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index 7c6a28a..16bac8f 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -201,12 +201,14 @@
     const Layer::State& front(drawingState());
     const Layer::State& temp(currentState());
 
-    if (front.requested != temp.requested)  {
-        // geometry of the layer has changed, set the active geometry
-        // to the requested geometry.
+    // always set active to requested, unless we're asked not to
+    // this is used by Layer, which special cases resizes.
+    if (flags & eDontUpdateGeometryState)  {
+    } else {
         Layer::State& editTemp(currentState());
         editTemp.active = temp.requested;
     }
+
     if (front.active != temp.active) {
         // invalidate and recompute the visible regions if needed
         flags |= Layer::eVisibleRegion;
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index 9542424..c547a40 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -227,7 +227,8 @@
 
 
     enum { // flags for doTransaction()
-        eVisibleRegion      = 0x00000002,
+        eDontUpdateGeometryState = 0x00000001,
+        eVisibleRegion           = 0x00000002,
     };