diff options
author | robertphillips <robertphillips@google.com> | 2015-01-28 14:41:57 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-28 14:41:57 -0800 |
commit | 2d55d07501c56310f97d2092d789a2bc9fa01b78 (patch) | |
tree | f243ba3608e399d6cee50ccbb287132df65505bb /src | |
parent | 45453c2acfa39755081616fd9c02e567b3369d40 (diff) |
Add device space "nudge" to gpu draws
This CL nudges all the GPU draws and clips slightly to match raster's round behavior for BW draws. We assume the effect will be negligible and do it for AA draws too.
BUG=423834
Review URL: https://codereview.chromium.org/877473005
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkClipStack.cpp | 13 | ||||
-rw-r--r-- | src/gpu/effects/GrConvexPolyEffect.cpp | 23 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 10 |
3 files changed, 22 insertions, 24 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp index 515596a969..863dc9a387 100644 --- a/src/core/SkClipStack.cpp +++ b/src/core/SkClipStack.cpp @@ -418,19 +418,6 @@ void SkClipStack::Element::updateBoundAndGenID(const Element* prior) { break; } - if (!fDoAA) { - // Here we mimic a non-anti-aliased scanline system. If there is - // no anti-aliasing we can integerize the bounding box to exclude - // fractional parts that won't be rendered. - // Note: the left edge is handled slightly differently below. We - // are a bit more generous in the rounding since we don't want to - // risk missing the left pixels when fLeft is very close to .5 - fFiniteBound.set(SkScalarFloorToScalar(fFiniteBound.fLeft+0.45f), - SkScalarRoundToScalar(fFiniteBound.fTop), - SkScalarRoundToScalar(fFiniteBound.fRight), - SkScalarRoundToScalar(fFiniteBound.fBottom)); - } - // Now determine the previous Element's bound information taking into // account that there may be no previous clip SkRect prevFinite; diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp index 7035094fa6..9d9792e2b9 100644 --- a/src/gpu/effects/GrConvexPolyEffect.cpp +++ b/src/gpu/effects/GrConvexPolyEffect.cpp @@ -137,10 +137,14 @@ void GLAARectEffect::emitCode(GrGLFPBuilder* builder, fsBuilder->codeAppendf("\t\tfloat alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n"); } else { fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); - fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName); - fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos); - fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName); - fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos); + fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", + fragmentPos, rectName); + fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n", + rectName, fragmentPos); + fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n", + fragmentPos, rectName); + fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n", + rectName, fragmentPos); } if (GrProcessorEdgeTypeIsInverseFill(aare.getEdgeType())) { @@ -154,8 +158,10 @@ void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProces const AARectEffect& aare = processor.cast<AARectEffect>(); const SkRect& rect = aare.getRect(); if (rect != fPrevRect) { - pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, - rect.fRight - 0.5f, rect.fBottom - 0.5f); + // Add a device space "nudge" of 0.05f, 0.05f to match raster's rounding behavior for + // BW clipping/drawing + pdman.set4f(fRectUniform, rect.fLeft + 0.55f, rect.fTop + 0.55f, + rect.fRight - 0.45f, rect.fBottom - 0.45f); fPrevRect = rect; } } @@ -221,7 +227,10 @@ void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder, fsBuilder->codeAppend("\t\tfloat edge;\n"); const char* fragmentPos = fsBuilder->fragmentPosition(); for (int i = 0; i < cpe.getEdgeCount(); ++i) { - fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n", + // Add a device space "nudge" of 0.05f, 0.05f to match raster's rounding behavior for + // BW clipping/drawing. Since we are "nudging" fragment positions we have to go in + // the opposite direction. + fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x - 0.05f, %s.y - 0.05f, 1));\n", edgeArrayName, i, fragmentPos, fragmentPos); if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) { fsBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n"); diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp index f17e741169..f0b645ee42 100644 --- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp @@ -47,13 +47,15 @@ void GrGLVertexBuilder::transformToNormalizedDeviceSpace(const GrShaderVar& posV // Transform from Skia's device coords to GL's normalized device coords. Note that // because we want to "nudge" the device space positions we are converting to // non-homogeneous NDC. + // The "0.05" nudge serves to match the raster path's rounding for bw draws. + // For aa draws we just assume the impact will be minimal - so we always perform the nudge. if (kVec3f_GrSLType == posVar.getType()) { - this->codeAppendf("gl_Position = vec4(dot(%s.xz, %s.xy)/%s.z, dot(%s.yz, %s.zw)/%s.z, 0, 1);", - posVar.c_str(), fRtAdjustName, posVar.c_str(), - posVar.c_str(), fRtAdjustName, posVar.c_str()); + this->codeAppendf("gl_Position = vec4((dot(%s.xz, %s.xy)/%s.z) + 0.05 * %s.x, (dot(%s.yz, %s.zw)/%s.z) + 0.05 * %s.z, 0, 1);", + posVar.c_str(), fRtAdjustName, posVar.c_str(), fRtAdjustName, + posVar.c_str(), fRtAdjustName, posVar.c_str(), fRtAdjustName); } else { SkASSERT(kVec2f_GrSLType == posVar.getType()); - this->codeAppendf("gl_Position = vec4(%s.x * %s.x + %s.y, %s.y * %s.z + %s.w, 0, 1);", + this->codeAppendf("gl_Position = vec4((%s.x + 0.05) * %s.x + %s.y, (%s.y + 0.05) * %s.z + %s.w, 0, 1);", posVar.c_str(), fRtAdjustName, fRtAdjustName, posVar.c_str(), fRtAdjustName, fRtAdjustName); } |