diff --git a/libs/hwui/Debug.h b/libs/hwui/Debug.h
index d6dc6ad..5808aac 100644
--- a/libs/hwui/Debug.h
+++ b/libs/hwui/Debug.h
@@ -82,6 +82,9 @@
 // Turn on to insert an event marker for each display list op
 #define DEBUG_DISPLAY_LIST_OPS_AS_EVENTS 0
 
+// Turn on to insert detailed event markers
+#define DEBUG_DETAILED_EVENTS 0
+
 // Turn on to highlight drawing batches and merged batches with different colors
 #define DEBUG_MERGE_BEHAVIOR 0
 
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 41f89c2..de777f0 100755
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -45,6 +45,12 @@
 #include "Vector.h"
 #include "VertexBuffer.h"
 
+#if DEBUG_DETAILED_EVENTS
+    #define EVENT_LOGD(...) eventMarkDEBUG(__VA_ARGS__)
+#else
+    #define EVENT_LOGD(...)
+#endif
+
 namespace android {
 namespace uirenderer {
 
@@ -389,6 +395,21 @@
 // Debug
 ///////////////////////////////////////////////////////////////////////////////
 
+void OpenGLRenderer::eventMarkDEBUG(const char* fmt, ...) const {
+#if DEBUG_DETAILED_EVENTS
+    const int BUFFER_SIZE = 256;
+    va_list ap;
+    char buf[BUFFER_SIZE];
+
+    va_start(ap, fmt);
+    vsnprintf(buf, BUFFER_SIZE, fmt, ap);
+    va_end(ap);
+
+    eventMark(buf);
+#endif
+}
+
+
 void OpenGLRenderer::eventMark(const char* name) const {
     mCaches.eventMark(0, name);
 }
@@ -977,7 +998,13 @@
 }
 
 void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) {
-    if (!layer->isTextureLayer()) {
+    if (layer->isTextureLayer()) {
+        EVENT_LOGD("composeTextureLayerRect");
+        resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f);
+        drawTextureLayer(layer, rect);
+        resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
+    } else {
+        EVENT_LOGD("composeHardwareLayerRect");
         const Rect& texCoords = layer->texCoords;
         resetDrawTextureTexCoords(texCoords.left, texCoords.top,
                 texCoords.right, texCoords.bottom);
@@ -1012,10 +1039,6 @@
                 GL_TRIANGLE_STRIP, gMeshCount, swap, swap || simpleTransform);
 
         resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
-    } else {
-        resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f);
-        drawTextureLayer(layer, rect);
-        resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
     }
 }
 
@@ -1115,6 +1138,7 @@
         return;
     }
 
+    EVENT_LOGD("composeLayerRegion");
     // standard Region based draw
     size_t count;
     const android::Rect* rects;
@@ -1288,6 +1312,7 @@
     if (count == 0) return;
 
     if (!currentSnapshot()->isIgnored()) {
+        EVENT_LOGD("clearLayerRegions");
         // Doing several glScissor/glClear here can negatively impact
         // GPUs with a tiler architecture, instead we draw quads with
         // the Clear blending mode
@@ -1465,6 +1490,8 @@
 void OpenGLRenderer::setStencilFromClip() {
     if (!mCaches.debugOverdraw) {
         if (!currentSnapshot()->clipRegion->isEmpty()) {
+            EVENT_LOGD("setStencilFromClip - enabling");
+
             // NOTE: The order here is important, we must set dirtyClip to false
             //       before any draw call to avoid calling back into this method
             mDirtyClip = false;
@@ -1510,6 +1537,7 @@
                 drawRegionRects(*(currentSnapshot()->clipRegion), paint);
             }
         } else {
+            EVENT_LOGD("setStencilFromClip - disabling");
             mCaches.stencil.disable();
         }
     }
@@ -1561,17 +1589,24 @@
 // Drawing commands
 ///////////////////////////////////////////////////////////////////////////////
 
-void OpenGLRenderer::setupDraw(bool clear) {
+void OpenGLRenderer::setupDraw(bool clearLayer) {
     // TODO: It would be best if we could do this before quickRejectSetupScissor()
     //       changes the scissor test state
-    if (clear) clearLayerRegions();
+    if (clearLayer) clearLayerRegions();
     // Make sure setScissor & setStencil happen at the beginning of
     // this method
     if (mDirtyClip) {
         if (mCaches.scissorEnabled) {
             setScissorFromClip();
         }
-        setStencilFromClip();
+
+        if (clearLayer) {
+            setStencilFromClip();
+        } else {
+            // While clearing layer, force disable stencil buffer, since
+            // it's invalid to stencil-clip *during* the layer clear
+            mCaches.stencil.disable();
+        }
     }
 
     mDescription.reset();
@@ -2964,6 +2999,9 @@
         return DrawGlInfo::kStatusDone;
     }
 
+    EVENT_LOGD("drawLayer," RECT_STRING ", clipRequired %d", x, y,
+            x + layer->layer.getWidth(), y + layer->layer.getHeight(), clipRequired);
+
     updateLayer(layer, true);
 
     mCaches.setScissorEnabled(mScissorOptimizationDisabled || clipRequired);
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index f698b45..3bc591f 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -256,6 +256,11 @@
     void eventMark(const char* name) const;
 
     /**
+     * Inserts a formatted event marker in the stream of GL commands.
+     */
+    void eventMarkDEBUG(const char *fmt, ...) const;
+
+    /**
      * Inserts a named group marker in the stream of GL commands. This marker
      * can be used by tools to group commands into logical groups. A call to
      * this method must always be followed later on by a call to endMark().
diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h
index 9311f99..13265a9 100644
--- a/libs/hwui/Rect.h
+++ b/libs/hwui/Rect.h
@@ -27,7 +27,7 @@
 namespace android {
 namespace uirenderer {
 
-#define RECT_STRING "%7.2f %7.2f %7.2f %7.2f"
+#define RECT_STRING "%5.2f %5.2f %5.2f %5.2f"
 #define RECT_ARGS(r) \
     (r).left, (r).top, (r).right, (r).bottom
 #define SK_RECT_ARGS(r) \
diff --git a/libs/hwui/StatefulBaseRenderer.cpp b/libs/hwui/StatefulBaseRenderer.cpp
index 140c6e8..473005c 100644
--- a/libs/hwui/StatefulBaseRenderer.cpp
+++ b/libs/hwui/StatefulBaseRenderer.cpp
@@ -178,6 +178,7 @@
     SkRegion region;
     region.setPath(transformed, clip);
 
+    // region is the transformed input path, masked by the previous clip
     mDirtyClip |= mSnapshot->clipRegionTransformed(region, op);
     return !mSnapshot->clipRect->isEmpty();
 }
