Fix precision in AARectEffect
The rect should be 4 floats, not halfs. Also simplifies the non-aa FP. Bug: skia:7190 Change-Id: If0993a7a26b84bd9a4e644b8e8a37bf8ce86916a Reviewed-on: https://skia-review.googlesource.com/69800 Reviewed-by: Ethan Nicholas <ethannicholas@google.com> Commit-Queue: Chris Dalton <csmartdalton@google.com>
This commit is contained in:
parent
deb53cceea
commit
8f7d4c3d86
@ -102,47 +102,41 @@ void GLAARectEffect::emitCode(EmitArgs& args) {
|
||||
// The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bottom - 0.5),
|
||||
// respectively.
|
||||
fRectUniform = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
|
||||
kHalf4_GrSLType,
|
||||
kFloat4_GrSLType,
|
||||
"rect",
|
||||
&rectName);
|
||||
|
||||
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
|
||||
GrGLSLFPFragmentBuilder* f = args.fFragBuilder;
|
||||
if (GrProcessorEdgeTypeIsAA(aare.getEdgeType())) {
|
||||
// The amount of coverage removed in x and y by the edges is computed as a pair of negative
|
||||
// numbers, xSub and ySub.
|
||||
fragBuilder->codeAppend("\t\thalf xSub, ySub;\n");
|
||||
fragBuilder->codeAppendf("\t\txSub = min(sk_FragCoord.x - %s.x, 0.0);\n", rectName);
|
||||
fragBuilder->codeAppendf("\t\txSub += min(%s.z - sk_FragCoord.x, 0.0);\n", rectName);
|
||||
fragBuilder->codeAppendf("\t\tySub = min(sk_FragCoord.y - %s.y, 0.0);\n", rectName);
|
||||
fragBuilder->codeAppendf("\t\tySub += min(%s.w - sk_FragCoord.y, 0.0);\n", rectName);
|
||||
f->codeAppend("half xSub, ySub;\n");
|
||||
f->codeAppendf("xSub = min(sk_FragCoord.x - %s.x, 0.0);\n", rectName);
|
||||
f->codeAppendf("xSub += min(%s.z - sk_FragCoord.x, 0.0);\n", rectName);
|
||||
f->codeAppendf("ySub = min(sk_FragCoord.y - %s.y, 0.0);\n", rectName);
|
||||
f->codeAppendf("ySub += min(%s.w - sk_FragCoord.y, 0.0);\n", rectName);
|
||||
// Now compute coverage in x and y and multiply them to get the fraction of the pixel
|
||||
// covered.
|
||||
fragBuilder->codeAppendf("\t\thalf alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n");
|
||||
f->codeAppendf("half alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n");
|
||||
} else {
|
||||
fragBuilder->codeAppendf("\t\thalf alpha = 1.0;\n");
|
||||
fragBuilder->codeAppendf("\t\talpha *= (sk_FragCoord.x - %s.x) > -0.5 ? 1.0 : 0.0;\n",
|
||||
rectName);
|
||||
fragBuilder->codeAppendf("\t\talpha *= (%s.z - sk_FragCoord.x) > -0.5 ? 1.0 : 0.0;\n",
|
||||
rectName);
|
||||
fragBuilder->codeAppendf("\t\talpha *= (sk_FragCoord.y - %s.y) > -0.5 ? 1.0 : 0.0;\n",
|
||||
rectName);
|
||||
fragBuilder->codeAppendf("\t\talpha *= (%s.w - sk_FragCoord.y) > -0.5 ? 1.0 : 0.0;\n",
|
||||
rectName);
|
||||
f->codeAppendf("half alpha = all(greaterThan(float4(sk_FragCoord.xy, %s.zw), "
|
||||
"float4(%s.xy, sk_FragCoord.xy))) ? 1 : 0;",
|
||||
rectName, rectName);
|
||||
}
|
||||
|
||||
if (GrProcessorEdgeTypeIsInverseFill(aare.getEdgeType())) {
|
||||
fragBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n");
|
||||
f->codeAppend("alpha = 1.0 - alpha;\n");
|
||||
}
|
||||
fragBuilder->codeAppendf("\t\t%s = %s * alpha;\n", args.fOutputColor, args.fInputColor);
|
||||
f->codeAppendf("%s = %s * alpha;\n", args.fOutputColor, args.fInputColor);
|
||||
}
|
||||
|
||||
void GLAARectEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
||||
const GrFragmentProcessor& processor) {
|
||||
const AARectEffect& aare = processor.cast<AARectEffect>();
|
||||
const SkRect& rect = aare.getRect();
|
||||
const SkRect& rect = GrProcessorEdgeTypeIsAA(aare.getEdgeType()) ?
|
||||
aare.getRect().makeInset(.5f, .5f) : aare.getRect();
|
||||
if (rect != fPrevRect) {
|
||||
pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f,
|
||||
rect.fRight - 0.5f, rect.fBottom - 0.5f);
|
||||
pdman.set4f(fRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
|
||||
fPrevRect = rect;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user