Fix hw layer overdraw/update visualization

Fixes: 28748255

Change-Id: I83b531cdf5e4407fd17edd72d96e6189924926fa
diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp
index 2ec7b75..59c1065 100644
--- a/libs/hwui/BakedOpDispatcher.cpp
+++ b/libs/hwui/BakedOpDispatcher.cpp
@@ -791,6 +791,16 @@
     renderer.renderGlop(state, glop);
 }
 
+void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state,
+        int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) {
+    SkPaint paint;
+    paint.setColor(color);
+    paint.setXfermodeMode(mode);
+    paint.setColorFilter(colorFilter);
+    RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
+    BakedOpDispatcher::onRectOp(renderer, rectOp, state);
+}
+
 void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) {
     // Note that we don't use op->paint in this function - it's never set on a LayerOp
     OffscreenBuffer* buffer = *op.layerHandle;
@@ -798,12 +808,9 @@
     if (CC_UNLIKELY(!buffer)) {
         // Layer was not allocated, which can occur if there were no draw ops inside. We draw the
         // equivalent by drawing a rect with the same layer properties (alpha/xfer/filter).
-        SkPaint paint;
-        paint.setAlpha(op.alpha * 255);
-        paint.setXfermodeMode(op.mode);
-        paint.setColorFilter(op.colorFilter);
-        RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
-        BakedOpDispatcher::onRectOp(renderer, rectOp, state);
+        int color = SkColorSetA(SK_ColorTRANSPARENT, op.alpha * 255);
+        renderRectForLayer(renderer, op, state,
+                color, op.mode, op.colorFilter);
     } else {
         float layerAlpha = op.alpha * state.alpha;
         Glop glop;
@@ -817,6 +824,19 @@
                 .build();
         renderer.renderGlop(state, glop);
     }
+
+    if (buffer && !buffer->hasRenderedSinceRepaint) {
+        buffer->hasRenderedSinceRepaint = true;
+        if (CC_UNLIKELY(Properties::debugLayersUpdates)) {
+            // render debug layer highlight
+            renderRectForLayer(renderer, op, state,
+                    0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr);
+        } else if (CC_UNLIKELY(Properties::debugOverdraw)) {
+            // render transparent to increment overdraw for repaint area
+            renderRectForLayer(renderer, op, state,
+                    SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr);
+        }
+    }
 }
 
 void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) {