Chromium Code Reviews| 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); |
| + |
|
robertphillips
2014/08/29 15:04:53
NULL != ?
joshua.litt
2014/09/02 16:06:21
Acknowledged.
|
| + 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"); |
|
robertphillips
2014/08/29 15:04:53
I thought we were doing away with the manual '\t'
joshua.litt
2014/09/02 16:06:21
Acknowledged.
|
| + 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) |