Compute layer bounds over subset of VertexBuffer verts

bug:15538815
Change-Id: I0dbb54f656a6ae99a87c5734761107e1c2351b65
diff --git a/libs/hwui/AmbientShadow.cpp b/libs/hwui/AmbientShadow.cpp
index b9d7b12..75cbfa1 100644
--- a/libs/hwui/AmbientShadow.cpp
+++ b/libs/hwui/AmbientShadow.cpp
@@ -48,7 +48,6 @@
         const Vector3* vertices, int vertexCount, const Vector3& centroid3d,
         float heightFactor, float geomFactor, VertexBuffer& shadowVertexBuffer) {
     const int rays = SHADOW_RAY_COUNT;
-    VertexBuffer::Mode mode = VertexBuffer::kOnePolyRingShadow;
     // Validate the inputs.
     if (vertexCount < 3 || heightFactor <= 0 || rays <= 0
         || geomFactor <= 0) {
@@ -124,19 +123,23 @@
                 opacity);
     }
 
-    // If caster isn't opaque, we need to to fill the umbra by storing the umbra's
-    // centroid in the innermost ring of vertices.
-    if (!isCasterOpaque) {
-        mode = VertexBuffer::kTwoPolyRingShadow;
+    if (isCasterOpaque) {
+        // skip inner ring, calc bounds over filled portion of buffer
+        shadowVertexBuffer.computeBounds<AlphaVertex>(2 * rays);
+        shadowVertexBuffer.setMode(VertexBuffer::kOnePolyRingShadow);
+    } else {
+        // If caster isn't opaque, we need to to fill the umbra by storing the umbra's
+        // centroid in the innermost ring of vertices.
         float centroidAlpha = 1.0 / (1 + centroid3d.z * heightFactor);
         AlphaVertex centroidXYA;
         AlphaVertex::set(&centroidXYA, centroid2d.x, centroid2d.y, centroidAlpha);
         for (int rayIndex = 0; rayIndex < rays; rayIndex++) {
             shadowVertices[2 * rays + rayIndex] = centroidXYA;
         }
+        // calc bounds over entire buffer
+        shadowVertexBuffer.computeBounds<AlphaVertex>();
+        shadowVertexBuffer.setMode(VertexBuffer::kTwoPolyRingShadow);
     }
-    shadowVertexBuffer.setMode(mode);
-    shadowVertexBuffer.computeBounds<AlphaVertex>();
 
 #if DEBUG_SHADOW
     for (int i = 0; i < SHADOW_VERTEX_COUNT; i++) {
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp
index 82dbe7a..8a5e722 100644
--- a/libs/hwui/SpotShadow.cpp
+++ b/libs/hwui/SpotShadow.cpp
@@ -507,8 +507,6 @@
     computeLightPolygon(lightVertexCount, lightCenter, lightSize, light);
     computeSpotShadow(isCasterOpaque, light, lightVertexCount, lightCenter, poly,
             polyLength, retStrips);
-    retStrips.setMode(VertexBuffer::kTwoPolyRingShadow);
-    retStrips.computeBounds<AlphaVertex>();
 }
 
 /**
@@ -785,6 +783,9 @@
             shadowVertices[2 * rays + rayIndex] = centroidXYA;
         }
     }
+
+    shadowTriangleStrip.setMode(VertexBuffer::kTwoPolyRingShadow);
+    shadowTriangleStrip.computeBounds<AlphaVertex>();
 }
 
 /**
diff --git a/libs/hwui/VertexBuffer.h b/libs/hwui/VertexBuffer.h
index 5875f25..3837f88 100644
--- a/libs/hwui/VertexBuffer.h
+++ b/libs/hwui/VertexBuffer.h
@@ -62,7 +62,6 @@
         mVertexCount = vertexCount;
         mByteCount = mVertexCount * sizeof(TYPE);
         mReallocBuffer = mBuffer = (void*)new TYPE[vertexCount];
-        memset(mBuffer, 0, sizeof(TYPE) * vertexCount);
 
         mCleanupMethod = &(cleanup<TYPE>);
 
@@ -86,13 +85,17 @@
      * vertex buffer can't determine bounds more simply/efficiently
      */
     template <class TYPE>
-    void computeBounds() {
+    void computeBounds(int vertexCount = 0) {
         if (!mVertexCount) {
             mBounds.setEmpty();
             return;
         }
+
+        // default: compute over every vertex
+        if (vertexCount == 0) vertexCount = mVertexCount;
+
         TYPE* current = (TYPE*)mBuffer;
-        TYPE* end = current + mVertexCount;
+        TYPE* end = current + vertexCount;
         mBounds.set(current->x, current->y, current->x, current->y);
         for (; current < end; current++) {
             mBounds.expandToCoverVertex(current->x, current->y);