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;