Use smoothstep to eliminate branches in AA shader
Change-Id: If4ecb1a9446f29b2f8444f5cee551f863c1993e8
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user