Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
index 97fcce59b777313d690bc1d7d700529b67305e9f..4360f7858d2129171fb19382dfb02bb0e1e64d34 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
@@ -10,6 +10,7 @@ |
#include "GrAutoLocaleSetter.h" |
#include "GrCoordTransform.h" |
#include "GrGLProgramBuilder.h" |
+#include "GrSwizzle.h" |
#include "GrTexture.h" |
#include "SkRTConf.h" |
#include "SkTraceEvent.h" |
@@ -95,6 +96,7 @@ bool GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr |
inputCoverage); |
this->emitAndInstallXferProc(this->pipeline().getXferProcessor(), *inputColor, *inputCoverage, |
this->pipeline().ignoresCoverage()); |
+ this->emitFSOutputSwizzle(this->pipeline().getXferProcessor().hasSecondaryOutput()); |
return true; |
} |
@@ -262,6 +264,22 @@ void GrGLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, |
fFS.codeAppend("}"); |
} |
+void GrGLProgramBuilder::emitFSOutputSwizzle(bool hasSecondaryOutput) { |
+ // Swizzle the fragment shader outputs if necessary. |
+ GrSwizzle swizzle; |
+ swizzle.setFromKey(this->desc().header().fOutputSwizzle); |
+ if (swizzle != GrSwizzle::RGBA()) { |
+ fFS.codeAppendf("%s = %s.%s;", fFS.getPrimaryColorOutputName(), |
+ fFS.getPrimaryColorOutputName(), |
+ swizzle.c_str()); |
+ if (hasSecondaryOutput) { |
+ fFS.codeAppendf("%s = %s.%s;", fFS.getSecondaryColorOutputName(), |
+ fFS.getSecondaryColorOutputName(), |
+ swizzle.c_str()); |
+ } |
+ } |
+} |
+ |
void GrGLProgramBuilder::verify(const GrPrimitiveProcessor& gp) { |
SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition()); |
} |