diff options
author | Chris Craik <ccraik@google.com> | 2012-08-27 17:03:13 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2012-08-29 11:14:52 -0700 |
commit | a798b95a9ef328720febec72d01462cd97e3d4c7 (patch) | |
tree | 39c500bbbac11cb34f8c81a934b6573baef8a5fd /libs | |
parent | 65e08d25faced6059b873c9b175b683ee305dc8b (diff) | |
download | frameworks_base-a798b95a9ef328720febec72d01462cd97e3d4c7.zip frameworks_base-a798b95a9ef328720febec72d01462cd97e3d4c7.tar.gz frameworks_base-a798b95a9ef328720febec72d01462cd97e3d4c7.tar.bz2 |
Use smoothstep to eliminate branches in AA shader
Change-Id: If4ecb1a9446f29b2f8444f5cee551f863c1993e8
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 18 | ||||
-rw-r--r-- | libs/hwui/ProgramCache.cpp | 17 |
2 files changed, 6 insertions, 29 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 849c556..09dbf78 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1403,10 +1403,6 @@ void OpenGLRenderer::setupDrawAALine(GLvoid* vertices, GLvoid* widthCoords, int boundaryWidthSlot = mCaches.currentProgram->getUniform("boundaryWidth"); glUniform1f(boundaryWidthSlot, boundaryWidthProportion); - - // Setting the inverse value saves computations per-fragment in the shader - int inverseBoundaryWidthSlot = mCaches.currentProgram->getUniform("inverseBoundaryWidth"); - glUniform1f(inverseBoundaryWidthSlot, 1.0f / boundaryWidthProportion); } void OpenGLRenderer::finishDrawAALine(const int widthSlot, const int lengthSlot) { @@ -1810,15 +1806,13 @@ void OpenGLRenderer::drawAARect(float left, float top, float right, float bottom float width = right - left; float height = bottom - top; - float boundaryWidthProportion = (width != 0) ? (2 * boundarySizeX) / width : 0; - float boundaryHeightProportion = (height != 0) ? (2 * boundarySizeY) / height : 0; + float boundaryWidthProportion = .5 - ((width != 0) ? (2 * boundarySizeX) / width : 0); + float boundaryHeightProportion = .5 - ((height != 0) ? (2 * boundarySizeY) / height : 0); setupDrawAALine((void*) aaVertices, widthCoords, lengthCoords, boundaryWidthProportion, widthSlot, lengthSlot); int boundaryLengthSlot = mCaches.currentProgram->getUniform("boundaryLength"); - int inverseBoundaryLengthSlot = mCaches.currentProgram->getUniform("inverseBoundaryLength"); glUniform1f(boundaryLengthSlot, boundaryHeightProportion); - glUniform1f(inverseBoundaryLengthSlot, (1.0f / boundaryHeightProportion)); AAVertex::set(aaVertices++, left, bottom, 1, 1); AAVertex::set(aaVertices++, left, top, 1, 0); @@ -1955,9 +1949,7 @@ status_t OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { Vertex* prevVertex = NULL; int boundaryLengthSlot = -1; - int inverseBoundaryLengthSlot = -1; int boundaryWidthSlot = -1; - int inverseBoundaryWidthSlot = -1; for (int i = 0; i < count; i += 4) { // a = start point, b = end point @@ -2060,22 +2052,16 @@ status_t OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { if (boundaryWidthSlot < 0) { boundaryWidthSlot = mCaches.currentProgram->getUniform("boundaryWidth"); - inverseBoundaryWidthSlot = - mCaches.currentProgram->getUniform("inverseBoundaryWidth"); } glUniform1f(boundaryWidthSlot, boundaryWidthProportion); - glUniform1f(inverseBoundaryWidthSlot, (1 / boundaryWidthProportion)); } if (boundaryLengthSlot < 0) { boundaryLengthSlot = mCaches.currentProgram->getUniform("boundaryLength"); - inverseBoundaryLengthSlot = - mCaches.currentProgram->getUniform("inverseBoundaryLength"); } glUniform1f(boundaryLengthSlot, boundaryLengthProportion); - glUniform1f(inverseBoundaryLengthSlot, (1 / boundaryLengthProportion)); if (prevAAVertex != NULL) { // Issue two repeat vertices to create degenerate triangles to bridge diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index d67bfbe..8a9a2ac 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -129,9 +129,7 @@ const char* gFS_Uniforms_Color = "uniform vec4 color;\n"; const char* gFS_Uniforms_AA = "uniform float boundaryWidth;\n" - "uniform float inverseBoundaryWidth;\n" - "uniform float boundaryLength;\n" - "uniform float inverseBoundaryLength;\n"; + "uniform float boundaryLength;\n"; const char* gFS_Header_Uniforms_PointHasBitmap = "uniform vec2 textureDimension;\n" "uniform float pointSize;\n"; @@ -242,16 +240,9 @@ const char* gFS_Main_ModulateColor = const char* gFS_Main_ModulateColor_ApplyGamma = " fragColor *= pow(color.a, gamma);\n"; const char* gFS_Main_AccountForAA = - " if (widthProportion < boundaryWidth) {\n" - " fragColor *= (widthProportion * inverseBoundaryWidth);\n" - " } else if (widthProportion > (1.0 - boundaryWidth)) {\n" - " fragColor *= ((1.0 - widthProportion) * inverseBoundaryWidth);\n" - " }\n" - " if (lengthProportion < boundaryLength) {\n" - " fragColor *= (lengthProportion * inverseBoundaryLength);\n" - " } else if (lengthProportion > (1.0 - boundaryLength)) {\n" - " fragColor *= ((1.0 - lengthProportion) * inverseBoundaryLength);\n" - " }\n"; + " fragColor *= (1.0 - smoothstep(boundaryWidth, 0.5, abs(0.5 - widthProportion)))\n" + " * (1.0 - smoothstep(boundaryLength, 0.5, abs(0.5 - lengthProportion)));\n"; + const char* gFS_Main_FetchTexture[2] = { // Don't modulate " fragColor = texture2D(sampler, outTexCoords);\n", |