diff options
author | 2012-01-21 14:48:36 +0000 | |
---|---|---|
committer | 2012-01-21 14:48:36 +0000 | |
commit | 495e210eb1b66d8a8fc3f46ca1def3c78c724a38 (patch) | |
tree | b9698f511e138b65157eff24d51aa76ce3b22319 /src/gpu/GrGLProgram.cpp | |
parent | 13a847a82c8c72555c03c610fa6f4d2761cba428 (diff) |
fix interior issues in convex path renderer
git-svn-id: http://skia.googlecode.com/svn/trunk@3078 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/GrGLProgram.cpp')
-rw-r--r-- | src/gpu/GrGLProgram.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/gpu/GrGLProgram.cpp b/src/gpu/GrGLProgram.cpp index ce5a284710..610446d615 100644 --- a/src/gpu/GrGLProgram.cpp +++ b/src/gpu/GrGLProgram.cpp @@ -528,23 +528,34 @@ void GrGLProgram::genEdgeCoverage(const GrGLInterface* gl, if (GrDrawState::kHairLine_EdgeType == fProgramDesc.fVertexEdgeType) { segments->fFSCode.appendf("\tfloat edgeAlpha = abs(dot(vec3(gl_FragCoord.xy,1), %s.xyz));\n", fsName); segments->fFSCode.append("\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); + } else if (GrDrawState::kQuad_EdgeType == fProgramDesc.fVertexEdgeType) { + segments->fFSCode.appendf("\tfloat edgeAlpha;\n"); + // keep the derivative instructions outside the conditional + segments->fFSCode.appendf("\tvec2 duvdx = dFdx(%s.xy);\n", fsName); + segments->fFSCode.appendf("\tvec2 duvdy = dFdy(%s.xy);\n", fsName); + segments->fFSCode.appendf("\tif (%s.z > 0.0 && %s.w > 0.0) {\n", fsName, fsName); + // today we know z and w are in device space. We could use derivatives + segments->fFSCode.appendf("\t\tedgeAlpha = min(min(%s.z, %s.w) + 0.5, 1.0);\n", fsName, fsName); + segments->fFSCode.append ("\t} else {\n"); + segments->fFSCode.appendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n" + "\t\t 2.0*%s.x*duvdy.x - duvdy.y);\n", + fsName, fsName); + segments->fFSCode.appendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName, fsName); + segments->fFSCode.appendf("\t\tedgeAlpha = clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);\n" + "\t}\n"); + if (gl->supportsES2()) { + segments->fHeader.printf("#extension GL_OES_standard_derivatives: enable\n"); + } } else { - GrAssert(GrDrawState::kHairQuad_EdgeType == fProgramDesc.fVertexEdgeType || - GrDrawState::kQuad_EdgeType == fProgramDesc.fVertexEdgeType); - // for now we know we're not in perspective, so we could compute this - // per-quadratic rather than per pixel + GrAssert(GrDrawState::kHairQuad_EdgeType == fProgramDesc.fVertexEdgeType); segments->fFSCode.appendf("\tvec2 duvdx = dFdx(%s.xy);\n", fsName); segments->fFSCode.appendf("\tvec2 duvdy = dFdy(%s.xy);\n", fsName); segments->fFSCode.appendf("\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n" "\t 2.0*%s.x*duvdy.x - duvdy.y);\n", fsName, fsName); segments->fFSCode.appendf("\tfloat edgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName, fsName); - if (GrDrawState::kQuad_EdgeType == fProgramDesc.fVertexEdgeType) { - segments->fFSCode.append("\tedgeAlpha = clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);\n"); - } else { - segments->fFSCode.append("\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n"); - segments->fFSCode.append("\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); - } + segments->fFSCode.append("\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n"); + segments->fFSCode.append("\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); if (gl->supportsES2()) { segments->fHeader.printf("#extension GL_OES_standard_derivatives: enable\n"); } |