diff options
author | Chris Craik <ccraik@google.com> | 2014-07-24 23:33:37 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-07-24 23:33:37 +0000 |
commit | e6be6fada5ce8ae4a852b8f699efd11646804a42 (patch) | |
tree | d4300ff1cae8d89e8fe8aea16db9c3302b1474be /libs | |
parent | 388b642a74f555d200c3a01fa1ed93cbd66dc366 (diff) | |
parent | c767e9dbc3a7ee0c01b62477b7be96351db09938 (diff) | |
download | frameworks_base-e6be6fada5ce8ae4a852b8f699efd11646804a42.zip frameworks_base-e6be6fada5ce8ae4a852b8f699efd11646804a42.tar.gz frameworks_base-e6be6fada5ce8ae4a852b8f699efd11646804a42.tar.bz2 |
am 27222820: am 1a146fc8: Compute layer bounds over subset of VertexBuffer verts
* commit '2722282067f472e30e0642b8374034ac01bca314':
Compute layer bounds over subset of VertexBuffer verts
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/AmbientShadow.cpp | 17 | ||||
-rw-r--r-- | libs/hwui/SpotShadow.cpp | 5 | ||||
-rw-r--r-- | 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 b9d7b12..75cbfa1 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<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(¢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<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 @@ 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<AlphaVertex>(); } /** @@ -785,6 +783,9 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, const Vector2* penum 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 @@ public: 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 @@ public: * 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); |