From 9a89bc6524620c87c7a321433470c668e2b95d69 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Wed, 23 Jul 2014 17:21:25 -0700 Subject: [PATCH] Compute layer bounds over subset of VertexBuffer verts bug:15538815 Change-Id: I0dbb54f656a6ae99a87c5734761107e1c2351b65 --- libs/hwui/AmbientShadow.cpp | 17 ++++++++++------- libs/hwui/SpotShadow.cpp | 5 +++-- libs/hwui/VertexBuffer.h | 9 ++++++--- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/libs/hwui/AmbientShadow.cpp b/libs/hwui/AmbientShadow.cpp index b9d7b12c115d..75cbfa14fb70 100644 --- a/libs/hwui/AmbientShadow.cpp +++ b/libs/hwui/AmbientShadow.cpp @@ -48,7 +48,6 @@ void AmbientShadow::createAmbientShadow(bool isCasterOpaque, 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 @@ void AmbientShadow::createAmbientShadow(bool isCasterOpaque, 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(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(¢roidXYA, centroid2d.x, centroid2d.y, centroidAlpha); for (int rayIndex = 0; rayIndex < rays; rayIndex++) { shadowVertices[2 * rays + rayIndex] = centroidXYA; } + // calc bounds over entire buffer + shadowVertexBuffer.computeBounds(); + shadowVertexBuffer.setMode(VertexBuffer::kTwoPolyRingShadow); } - shadowVertexBuffer.setMode(mode); - shadowVertexBuffer.computeBounds(); #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 82dbe7a1485a..8a5e722ef4c7 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -507,8 +507,6 @@ void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3* poly, computeLightPolygon(lightVertexCount, lightCenter, lightSize, light); computeSpotShadow(isCasterOpaque, light, lightVertexCount, lightCenter, poly, polyLength, retStrips); - retStrips.setMode(VertexBuffer::kTwoPolyRingShadow); - retStrips.computeBounds(); } /** @@ -785,6 +783,9 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, const Vector2* penum shadowVertices[2 * rays + rayIndex] = centroidXYA; } } + + shadowTriangleStrip.setMode(VertexBuffer::kTwoPolyRingShadow); + shadowTriangleStrip.computeBounds(); } /** diff --git a/libs/hwui/VertexBuffer.h b/libs/hwui/VertexBuffer.h index 5875f25aa514..3837f88e0153 100644 --- a/libs/hwui/VertexBuffer.h +++ b/libs/hwui/VertexBuffer.h @@ -62,7 +62,6 @@ public: mVertexCount = vertexCount; mByteCount = mVertexCount * sizeof(TYPE); mReallocBuffer = mBuffer = (void*)new TYPE[vertexCount]; - memset(mBuffer, 0, sizeof(TYPE) * vertexCount); mCleanupMethod = &(cleanup); @@ -86,13 +85,17 @@ public: * vertex buffer can't determine bounds more simply/efficiently */ template - 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); -- 2.11.0