Optimize tiling management
Bug #7186819

Change-Id: Iebc42a6e9c96ad5605fbbe1539aa887695d2e829
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index b149bb9..068eb9e 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -429,7 +429,7 @@
 
 void Caches::startTiling(GLuint x, GLuint y, GLuint width, GLuint height, bool opaque) {
     if (extensions.hasTiledRendering()) {
-        glStartTilingQCOM(x, y, width, height, GL_COLOR_BUFFER_BIT0_QCOM);
+        glStartTilingQCOM(x, y, width, height, opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM);
     }
 }
 
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 9b9ca12..da0900a 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -175,7 +175,7 @@
     mSaveCount = 1;
 
     mSnapshot->setClip(left, top, right, bottom);
-    mDirtyClip = mOpaqueFrame = opaque;
+    mDirtyClip = opaque;
 
     // If we know that we are going to redraw the entire framebuffer,
     // perform a discard to let the driver know we don't need to preserve
@@ -189,7 +189,7 @@
     syncState();
 
     mTilingSnapshot = mSnapshot;
-    startTiling();
+    startTiling(mTilingSnapshot, true);
 
     if (!opaque) {
         mCaches.enableScissor();
@@ -213,16 +213,9 @@
     }
 }
 
-void OpenGLRenderer::startTiling() {
-    startTiling(mTilingSnapshot);
-}
-
-void OpenGLRenderer::startTiling(const sp<Snapshot>& s) {
-    bool opaque = mOpaqueFrame;
+void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) {
     Rect* clip = mTilingSnapshot->clipRect;
-
     if (s->flags & Snapshot::kFlagIsFboLayer) {
-        opaque = !s->layer->isBlend();
         clip = s->clipRect;
     }
 
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 10ba86e..4bbdde1 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -351,8 +351,7 @@
      * This method needs to be invoked every time getTargetFbo() is
      * bound again.
      */
-    void startTiling();
-    void startTiling(const sp<Snapshot>& snapshot);
+    void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
 
     /**
      * Tells the GPU that we are done drawing the frame or that we
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java
index 0127396..eb8a0a9 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java
@@ -45,10 +45,10 @@
 
         row1.addView(new LayerView(this, 0xffff0000), new LinearLayout.LayoutParams(
                 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
-        row1.addView(new LayerView(this, 0xff00ff00), new LinearLayout.LayoutParams(
+        row1.addView(new LayerView(this, 0x0f00ff00), new LinearLayout.LayoutParams(
                 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
 
-        row2.addView(new LayerView(this, 0xff0000ff), new LinearLayout.LayoutParams(
+        row2.addView(new LayerView(this, 0x0f0000ff), new LinearLayout.LayoutParams(
                 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
         row2.addView(new LayerView(this, 0xffffff00), new LinearLayout.LayoutParams(
                 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));