Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
index 41b84d806ab3a1b075e675acfd853f27eb2e3a2a..b3a281da3952ac7f5bcea2950063971fd9692f0b 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp |
@@ -31,7 +31,8 @@ static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar: |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
-bool GrGLProgramBuilder::genProgram(const GrEffectStage* colorStages[], |
+bool GrGLProgramBuilder::genProgram(const GrEffectStage* geometryProcessor, |
+ const GrEffectStage* colorStages[], |
const GrEffectStage* coverageStages[]) { |
const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
@@ -65,7 +66,7 @@ bool GrGLProgramBuilder::genProgram(const GrEffectStage* colorStages[], |
inputCoverage = GrGLSLExpr4(1); |
} |
- this->emitCodeBeforeEffects(&inputColor, &inputCoverage); |
+ this->emitCodeBeforeEffects(geometryProcessor, &inputColor, &inputCoverage); |
/////////////////////////////////////////////////////////////////////////// |
// emit the per-effect code for both color and coverage effects |
@@ -332,8 +333,21 @@ GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, |
, fVS(this) { |
} |
-void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) { |
+void GrGLFullProgramBuilder::emitCodeBeforeEffects(const GrEffectStage* geometryProcessor, |
+ GrGLSLExpr4* color, |
+ GrGLSLExpr4* coverage) { |
+ const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
+ |
fVS.emitCodeBeforeEffects(color, coverage); |
+ |
+ if (geometryProcessor) { |
+ GrGLProgramDesc::EffectKeyProvider geometryProcessorKeyProvider( |
+ &this->desc(), GrGLProgramDesc::EffectKeyProvider::kGeometryProcessor_EffectType); |
+ fGeometryProcessor.reset(this->createAndEmitEffect( |
+ geometryProcessor, |
+ geometryProcessorKeyProvider, |
+ header.fSeparateCoverageFromColor ? coverage : color)); |
+ } |
} |
void GrGLFullProgramBuilder::emitCodeAfterEffects() { |
@@ -385,6 +399,53 @@ GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffects( |
return programEffectsBuilder.finish(); |
} |
+void GrGLFullProgramBuilder::createAndEmitEffect(GrGLProgramEffectsBuilder* programEffectsBuilder, |
+ const GrEffectStage* effectStages, |
+ const GrGLProgramDesc::EffectKeyProvider& keyProvider, |
+ GrGLSLExpr4* fsInOutColor) { |
+ GrGLSLExpr4 inColor = *fsInOutColor; |
+ GrGLSLExpr4 outColor; |
+ |
+ SkASSERT(NULL != effectStages && NULL != effectStages->getEffect()); |
+ const GrEffectStage& stage = *effectStages; |
+ |
+ CodeStage::AutoStageRestore csar(&fCodeStage, &stage); |
+ |
+ if (inColor.isZeros()) { |
+ SkString inColorName; |
+ |
+ // Effects have no way to communicate zeros, they treat an empty string as ones. |
+ this->nameVariable(&inColorName, '\0', "input"); |
+ fFS.codeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColor.c_str()); |
+ inColor = inColorName; |
+ } |
+ |
+ // create var to hold stage result |
+ SkString outColorName; |
+ this->nameVariable(&outColorName, '\0', "output"); |
+ fFS.codeAppendf("\tvec4 %s;\n", outColorName.c_str()); |
+ outColor = outColorName; |
+ |
+ |
+ programEffectsBuilder->emitEffect(stage, |
+ keyProvider.get(0), |
+ outColor.c_str(), |
+ inColor.isOnes() ? NULL : inColor.c_str(), |
+ fCodeStage.stageIndex()); |
+ |
+ *fsInOutColor = outColor; |
+} |
+ |
+GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffect( |
+ const GrEffectStage* geometryProcessor, |
+ const GrGLProgramDesc::EffectKeyProvider& keyProvider, |
+ GrGLSLExpr4* inOutFSColor) { |
+ |
+ GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, 1); |
+ this->createAndEmitEffect(&programEffectsBuilder, geometryProcessor, keyProvider, inOutFSColor); |
+ return programEffectsBuilder.finish(); |
+} |
+ |
bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, |
SkTDArray<GrGLuint>* shaderIds) const { |
return INHERITED::compileAndAttachShaders(programId, shaderIds) |