aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrOvalRenderer.cpp
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-09-06 19:46:48 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-09-06 19:46:48 +0000
commit96a7a9623f7b00bacf502adb99d485f2b376d328 (patch)
tree9a1ce361e8e8ca2aabb2c9bb5024684cee269a76 /src/gpu/GrOvalRenderer.cpp
parent6485b0be74f66587b51ca3c476b24b0e2674ca5b (diff)
Fix for aliasing in device-independent ovals on Nexus 10.
Switch to using two attributes so that dFdx and dFdy generate valid results. R=robertphillips@google.com Author: jvanverth@google.com Review URL: https://chromiumcodereview.appspot.com/23992005 git-svn-id: http://skia.googlecode.com/svn/trunk@11137 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/GrOvalRenderer.cpp')
-rw-r--r--src/gpu/GrOvalRenderer.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
index 07d4a09d52..70c6f11638 100644
--- a/src/gpu/GrOvalRenderer.cpp
+++ b/src/gpu/GrOvalRenderer.cpp
@@ -362,21 +362,27 @@ public:
SkAssertResult(builder->enableFeature(
GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
- const char *vsOffsetName, *fsOffsetName;
- vertexBuilder->addVarying(kVec4f_GrSLType, "EllipseOffsets",
- &vsOffsetName, &fsOffsetName);
+ const char *vsOffsetName0, *fsOffsetName0;
+ vertexBuilder->addVarying(kVec2f_GrSLType, "EllipseOffsets0",
+ &vsOffsetName0, &fsOffsetName0);
const SkString* attr0Name =
vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
- vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name->c_str());
+ vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName0, attr0Name->c_str());
+ const char *vsOffsetName1, *fsOffsetName1;
+ vertexBuilder->addVarying(kVec2f_GrSLType, "EllipseOffsets1",
+ &vsOffsetName1, &fsOffsetName1);
+ const SkString* attr1Name =
+ vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[1]);
+ vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName1, attr1Name->c_str());
// for outer curve
- builder->fsCodeAppendf("\tvec2 scaledOffset = %s.xy;\n", fsOffsetName);
+ builder->fsCodeAppendf("\tvec2 scaledOffset = %s.xy;\n", fsOffsetName0);
builder->fsCodeAppend("\tfloat test = dot(scaledOffset, scaledOffset) - 1.0;\n");
- builder->fsCodeAppendf("\tvec4 duvdx = dFdx(%s);\n", fsOffsetName);
- builder->fsCodeAppendf("\tvec4 duvdy = dFdy(%s);\n", fsOffsetName);
+ builder->fsCodeAppendf("\tvec2 duvdx = dFdx(%s);\n", fsOffsetName0);
+ builder->fsCodeAppendf("\tvec2 duvdy = dFdy(%s);\n", fsOffsetName0);
builder->fsCodeAppendf("\tvec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y*duvdx.y,\n"
"\t 2.0*%s.x*duvdy.x + 2.0*%s.y*duvdy.y);\n",
- fsOffsetName, fsOffsetName, fsOffsetName, fsOffsetName);
+ fsOffsetName0, fsOffsetName0, fsOffsetName0, fsOffsetName0);
builder->fsCodeAppend("\tfloat grad_dot = dot(grad, grad);\n");
// we need to clamp the length^2 of the gradiant vector to a non-zero value, because
@@ -394,11 +400,13 @@ public:
// for inner curve
if (kStroke == ellipseEffect.getMode()) {
- builder->fsCodeAppendf("\tscaledOffset = %s.zw;\n", fsOffsetName);
+ builder->fsCodeAppendf("\tscaledOffset = %s.xy;\n", fsOffsetName1);
builder->fsCodeAppend("\ttest = dot(scaledOffset, scaledOffset) - 1.0;\n");
- builder->fsCodeAppendf("\tgrad = vec2(2.0*%s.z*duvdx.z + 2.0*%s.w*duvdx.w,\n"
- "\t 2.0*%s.z*duvdy.z + 2.0*%s.w*duvdy.w);\n",
- fsOffsetName, fsOffsetName, fsOffsetName, fsOffsetName);
+ builder->fsCodeAppendf("\tduvdx = dFdx(%s);\n", fsOffsetName1);
+ builder->fsCodeAppendf("\tduvdy = dFdy(%s);\n", fsOffsetName1);
+ builder->fsCodeAppendf("\tgrad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y*duvdx.y,\n"
+ "\t 2.0*%s.x*duvdy.x + 2.0*%s.y*duvdy.y);\n",
+ fsOffsetName1, fsOffsetName1, fsOffsetName1, fsOffsetName1);
builder->fsCodeAppend("\tinvlen = inversesqrt(dot(grad, grad));\n");
builder->fsCodeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);\n");
}
@@ -423,7 +431,8 @@ public:
private:
DIEllipseEdgeEffect(Mode mode) : GrEffect() {
- this->addVertexAttrib(kVec4f_GrSLType);
+ this->addVertexAttrib(kVec2f_GrSLType);
+ this->addVertexAttrib(kVec2f_GrSLType);
fMode = mode;
}
@@ -589,7 +598,8 @@ extern const GrVertexAttrib gEllipseVertexAttribs[] = {
// position + offsets
extern const GrVertexAttrib gDIEllipseVertexAttribs[] = {
{kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
- {kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding},
+ {kVec2f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding},
+ {kVec2f_GrVertexAttribType, 2*sizeof(GrPoint), kEffect_GrVertexAttribBinding},
};
bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,