Index: src/gpu/gl/GrGLXferProcessor.cpp |
diff --git a/src/gpu/gl/GrGLXferProcessor.cpp b/src/gpu/gl/GrGLXferProcessor.cpp |
index b707a3f632047d4892518d42f55f1b2454bcc83f..acce085790fce59bfe73871090a28be50a5645f0 100644 |
--- a/src/gpu/gl/GrGLXferProcessor.cpp |
+++ b/src/gpu/gl/GrGLXferProcessor.cpp |
@@ -12,47 +12,54 @@ |
#include "gl/builders/GrGLProgramBuilder.h" |
void GrGLXferProcessor::emitCode(const EmitArgs& args) { |
- if (args.fXP.getDstTexture()) { |
- bool topDown = kTopLeft_GrSurfaceOrigin == args.fXP.getDstTexture()->origin(); |
- |
+ if (args.fXP.willReadDstColor()) { |
GrGLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
- if (args.fXP.readsCoverage()) { |
- // 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); |
- } |
+ if (args.fXP.getDstTexture()) { |
+ bool topDown = kTopLeft_GrSurfaceOrigin == args.fXP.getDstTexture()->origin(); |
+ |
+ if (args.fXP.readsCoverage()) { |
+ // 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* dstColor = fsBuilder->dstColor(); |
- const char* dstTopLeftName; |
- const char* dstCoordScaleName; |
+ const char* dstTopLeftName; |
+ const char* dstCoordScaleName; |
- fDstTopLeftUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
- kVec2f_GrSLType, |
- kDefault_GrSLPrecision, |
- "DstTextureUpperLeft", |
- &dstTopLeftName); |
- fDstScaleUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
- kVec2f_GrSLType, |
- kDefault_GrSLPrecision, |
- "DstTextureCoordScale", |
- &dstCoordScaleName); |
- const char* fragPos = fsBuilder->fragmentPosition(); |
+ fDstTopLeftUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ kVec2f_GrSLType, |
+ kDefault_GrSLPrecision, |
+ "DstTextureUpperLeft", |
+ &dstTopLeftName); |
+ fDstScaleUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ kVec2f_GrSLType, |
+ kDefault_GrSLPrecision, |
+ "DstTextureCoordScale", |
+ &dstCoordScaleName); |
+ const char* fragPos = fsBuilder->fragmentPosition(); |
- fsBuilder->codeAppend("// Read color from copy of the destination.\n"); |
- fsBuilder->codeAppendf("vec2 _dstTexCoord = (%s.xy - %s) * %s;", |
- fragPos, dstTopLeftName, dstCoordScaleName); |
+ fsBuilder->codeAppend("// Read color from copy of the destination.\n"); |
+ fsBuilder->codeAppendf("vec2 _dstTexCoord = (%s.xy - %s) * %s;", |
+ fragPos, dstTopLeftName, dstCoordScaleName); |
- if (!topDown) { |
- fsBuilder->codeAppend("_dstTexCoord.y = 1.0 - _dstTexCoord.y;"); |
+ if (!topDown) { |
+ fsBuilder->codeAppend("_dstTexCoord.y = 1.0 - _dstTexCoord.y;"); |
+ } |
+ |
+ fsBuilder->codeAppendf("vec4 %s = ", dstColor); |
+ fsBuilder->appendTextureLookup(args.fSamplers[0], "_dstTexCoord", kVec2f_GrSLType); |
+ fsBuilder->codeAppend(";"); |
} |
- fsBuilder->codeAppendf("vec4 %s = ", dstColor); |
- fsBuilder->appendTextureLookup(args.fSamplers[0], "_dstTexCoord", kVec2f_GrSLType); |
- fsBuilder->codeAppend(";"); |
+ if (args.fXP.dstReadUsesMixedSamples()) { |
+ // Output 1.0, which the hardware will modulate by sample-based coverage before blend. |
+ fsBuilder->codeAppendf("%s = vec4(1.0);", args.fOutputSecondary); |
+ } |
} |
this->onEmitCode(args); |