OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "gl/GrGLShaderBuilder.h" | 8 #include "gl/GrGLShaderBuilder.h" |
9 #include "gl/GrGLProgram.h" | 9 #include "gl/GrGLProgram.h" |
10 #include "gl/GrGLUniformHandle.h" | 10 #include "gl/GrGLUniformHandle.h" |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 GrGLShaderVar::kOut_TypeModifier, | 187 GrGLShaderVar::kOut_TypeModifier, |
188 declared_color_output_name()); | 188 declared_color_output_name()); |
189 fHasCustomColorOutput = true; | 189 fHasCustomColorOutput = true; |
190 } | 190 } |
191 | 191 |
192 this->emitCodeBeforeEffects(&inputColor, &inputCoverage); | 192 this->emitCodeBeforeEffects(&inputColor, &inputCoverage); |
193 | 193 |
194 /////////////////////////////////////////////////////////////////////////// | 194 /////////////////////////////////////////////////////////////////////////// |
195 // emit the per-effect code for both color and coverage effects | 195 // emit the per-effect code for both color and coverage effects |
196 | 196 |
| 197 GrGLProgramDesc::EffectKeyProvider colorKeyProvider( |
| 198 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType); |
197 fOutput.fColorEffects.reset(this->createAndEmitEffects(colorStages, | 199 fOutput.fColorEffects.reset(this->createAndEmitEffects(colorStages, |
198 this->desc().getEffec
tKeys(), | |
199 this->desc().numColor
Effects(), | 200 this->desc().numColor
Effects(), |
| 201 colorKeyProvider, |
200 &inputColor)); | 202 &inputColor)); |
201 | 203 |
| 204 GrGLProgramDesc::EffectKeyProvider coverageKeyProvider( |
| 205 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kCoverage_EffectType)
; |
202 fOutput.fCoverageEffects.reset(this->createAndEmitEffects(coverageStages, | 206 fOutput.fCoverageEffects.reset(this->createAndEmitEffects(coverageStages, |
203 this->desc().getEffectKeys() + this->desc().
numColorEffects(), | 207 this->desc().numCoverageEffects(), |
204 this->desc().numCoverageEffects(), | 208 coverageKeyProvider, |
205 &inputCoverage)); | 209 &inputCoverage)); |
206 | 210 |
207 this->emitCodeAfterEffects(); | 211 this->emitCodeAfterEffects(); |
208 | 212 |
209 /////////////////////////////////////////////////////////////////////////// | 213 /////////////////////////////////////////////////////////////////////////// |
210 // write the secondary color output if necessary | 214 // write the secondary color output if necessary |
211 if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutpu
t)) { | 215 if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutpu
t)) { |
212 const char* secondaryOutputName = this->enableSecondaryOutput(); | 216 const char* secondaryOutputName = this->enableSecondaryOutput(); |
213 | 217 |
214 // default coeff to ones for kCoverage_DualSrcOutput | 218 // default coeff to ones for kCoverage_DualSrcOutput |
215 GrGLSLExpr4 coeff(1); | 219 GrGLSLExpr4 coeff(1); |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 for (int i = 0; i < fUniforms.count(); ++i) { | 598 for (int i = 0; i < fUniforms.count(); ++i) { |
595 if (fUniforms[i].fVisibility & visibility) { | 599 if (fUniforms[i].fVisibility & visibility) { |
596 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); | 600 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); |
597 out->append(";\n"); | 601 out->append(";\n"); |
598 } | 602 } |
599 } | 603 } |
600 } | 604 } |
601 | 605 |
602 void GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programE
ffectsBuilder, | 606 void GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programE
ffectsBuilder, |
603 const GrEffectStage* effectStages[]
, | 607 const GrEffectStage* effectStages[]
, |
604 const EffectKey effectKeys[], | |
605 int effectCnt, | 608 int effectCnt, |
| 609 const GrGLProgramDesc::EffectKeyPro
vider& keyProvider, |
606 GrGLSLExpr4* fsInOutColor) { | 610 GrGLSLExpr4* fsInOutColor) { |
607 bool effectEmitted = false; | 611 bool effectEmitted = false; |
608 | 612 |
609 GrGLSLExpr4 inColor = *fsInOutColor; | 613 GrGLSLExpr4 inColor = *fsInOutColor; |
610 GrGLSLExpr4 outColor; | 614 GrGLSLExpr4 outColor; |
611 | 615 |
612 for (int e = 0; e < effectCnt; ++e) { | 616 for (int e = 0; e < effectCnt; ++e) { |
613 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); | 617 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); |
614 const GrEffectStage& stage = *effectStages[e]; | 618 const GrEffectStage& stage = *effectStages[e]; |
615 | 619 |
616 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); | 620 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); |
617 | 621 |
618 if (inColor.isZeros()) { | 622 if (inColor.isZeros()) { |
619 SkString inColorName; | 623 SkString inColorName; |
620 | 624 |
621 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. | 625 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. |
622 this->nameVariable(&inColorName, '\0', "input"); | 626 this->nameVariable(&inColorName, '\0', "input"); |
623 this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColo
r.c_str()); | 627 this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColo
r.c_str()); |
624 inColor = inColorName; | 628 inColor = inColorName; |
625 } | 629 } |
626 | 630 |
627 // create var to hold stage result | 631 // create var to hold stage result |
628 SkString outColorName; | 632 SkString outColorName; |
629 this->nameVariable(&outColorName, '\0', "output"); | 633 this->nameVariable(&outColorName, '\0', "output"); |
630 this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); | 634 this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); |
631 outColor = outColorName; | 635 outColor = outColorName; |
632 | 636 |
633 | 637 |
634 programEffectsBuilder->emitEffect(stage, | 638 programEffectsBuilder->emitEffect(stage, |
635 effectKeys[e], | 639 keyProvider.get(e), |
636 outColor.c_str(), | 640 outColor.c_str(), |
637 inColor.isOnes() ? NULL : inColor.c_st
r(), | 641 inColor.isOnes() ? NULL : inColor.c_st
r(), |
638 fCodeStage.stageIndex()); | 642 fCodeStage.stageIndex()); |
639 | 643 |
640 inColor = outColor; | 644 inColor = outColor; |
641 effectEmitted = true; | 645 effectEmitted = true; |
642 } | 646 } |
643 | 647 |
644 if (effectEmitted) { | 648 if (effectEmitted) { |
645 *fsInOutColor = outColor; | 649 *fsInOutColor = outColor; |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 if (attrib->fIndex == attributeIndex) { | 973 if (attrib->fIndex == attributeIndex) { |
970 return &attrib->fName; | 974 return &attrib->fName; |
971 } | 975 } |
972 } | 976 } |
973 | 977 |
974 return NULL; | 978 return NULL; |
975 } | 979 } |
976 | 980 |
977 GrGLProgramEffects* GrGLFullShaderBuilder::createAndEmitEffects( | 981 GrGLProgramEffects* GrGLFullShaderBuilder::createAndEmitEffects( |
978 const GrEffectStage* effectStages[], | 982 const GrEffectStage* effectStages[], |
979 const EffectKey effectKeys[], | |
980 int effectCnt, | 983 int effectCnt, |
| 984 const GrGLProgramDesc::EffectKeyProvider& keyProvider, |
981 GrGLSLExpr4* inOutFSColor) { | 985 GrGLSLExpr4* inOutFSColor) { |
982 | 986 |
983 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); | 987 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); |
984 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, | 988 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, |
985 effectStages, | 989 effectStages, |
986 effectKeys, | |
987 effectCnt, | 990 effectCnt, |
| 991 keyProvider, |
988 inOutFSColor); | 992 inOutFSColor); |
989 return programEffectsBuilder.finish(); | 993 return programEffectsBuilder.finish(); |
990 } | 994 } |
991 | 995 |
992 bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId, | 996 bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId, |
993 SkTDArray<GrGLuint>* shaderI
ds) const { | 997 SkTDArray<GrGLuint>* shaderI
ds) const { |
994 const GrGLContext& glCtx = this->gpu()->glContext(); | 998 const GrGLContext& glCtx = this->gpu()->glContext(); |
995 SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); | 999 SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); |
996 this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc); | 1000 this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc); |
997 this->appendDecls(fVSAttrs, &vertShaderSrc); | 1001 this->appendDecls(fVSAttrs, &vertShaderSrc); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 | 1090 |
1087 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { | 1091 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { |
1088 int firstFreeCoordSet = fOutput.fTexCoordSetCnt; | 1092 int firstFreeCoordSet = fOutput.fTexCoordSetCnt; |
1089 fOutput.fTexCoordSetCnt += count; | 1093 fOutput.fTexCoordSetCnt += count; |
1090 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fOutput.fTexCoor
dSetCnt); | 1094 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fOutput.fTexCoor
dSetCnt); |
1091 return firstFreeCoordSet; | 1095 return firstFreeCoordSet; |
1092 } | 1096 } |
1093 | 1097 |
1094 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( | 1098 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( |
1095 const GrEffectStage* effectStages[], | 1099 const GrEffectStage* effectStages[], |
1096 const EffectKey effectKeys[], | |
1097 int effectCnt, | 1100 int effectCnt, |
| 1101 const GrGLProgramDesc::EffectKeyProvider& keyProvider, |
1098 GrGLSLExpr4* inOutFSColor) { | 1102 GrGLSLExpr4* inOutFSColor) { |
1099 | 1103 |
1100 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, | 1104 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |
1101 effectCnt); | 1105 effectCnt); |
1102 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, | 1106 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |
1103 effectStages, | 1107 effectStages, |
1104 effectKeys, | |
1105 effectCnt, | 1108 effectCnt, |
| 1109 keyProvider, |
1106 inOutFSColor); | 1110 inOutFSColor); |
1107 return pathTexGenEffectsBuilder.finish(); | 1111 return pathTexGenEffectsBuilder.finish(); |
1108 } | 1112 } |
OLD | NEW |