Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Unified Diff: src/gpu/gl/GrGLXferProcessor.cpp

Issue 1164973002: Add mixed samples support to XPs (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_reenablebea
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698