From 043e0f60f4890d523845b487d8373e1363a01812 Mon Sep 17 00:00:00 2001 From: joshualitt Date: Tue, 10 Feb 2015 10:06:15 -0800 Subject: [PATCH] discard when coverage is <= 0 in XP dst copy. Darken was 5-20% slower with this CL, though it might improve things a bit to only look at one component of the vector. BUG=skia: Review URL: https://codereview.chromium.org/915633002 --- src/gpu/gl/GrGLXferProcessor.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gpu/gl/GrGLXferProcessor.cpp b/src/gpu/gl/GrGLXferProcessor.cpp index 4aac11d335..b7bf3019b5 100644 --- a/src/gpu/gl/GrGLXferProcessor.cpp +++ b/src/gpu/gl/GrGLXferProcessor.cpp @@ -16,6 +16,12 @@ void GrGLXferProcessor::emitCode(const EmitArgs& args) { bool topDown = kTopLeft_GrSurfaceOrigin == args.fXP.getDstCopyTexture()->origin(); GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); + + // We don't think any shaders actually output negative coverage, but just as a safety check + // for floating point precision errors we compare with <= here + fsBuilder->codeAppendf("if (all(lessThanEqual(%s, vec4(0)))) {" + " discard;" + "}", args.fInputCoverage); const char* dstColor = fsBuilder->dstColor(); const char* dstCopyTopLeftName;