summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2014-07-24 23:33:37 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-07-24 23:33:37 +0000
commite6be6fada5ce8ae4a852b8f699efd11646804a42 (patch)
treed4300ff1cae8d89e8fe8aea16db9c3302b1474be /libs
parent388b642a74f555d200c3a01fa1ed93cbd66dc366 (diff)
parentc767e9dbc3a7ee0c01b62477b7be96351db09938 (diff)
downloadframeworks_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.cpp17
-rw-r--r--libs/hwui/SpotShadow.cpp5
-rw-r--r--libs/hwui/VertexBuffer.h9
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(&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 @@ 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);