| 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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 varyingType); | 282 varyingType); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void GrGLShaderBuilder::fsAppendTextureLookup(const GrGLShaderBuilder::TextureSa
mpler& sampler, | 285 void GrGLShaderBuilder::fsAppendTextureLookup(const GrGLShaderBuilder::TextureSa
mpler& sampler, |
| 286 const char* coordName, | 286 const char* coordName, |
| 287 GrSLType varyingType) { | 287 GrSLType varyingType) { |
| 288 this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType); | 288 this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType); |
| 289 } | 289 } |
| 290 | 290 |
| 291 void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( | 291 void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( |
| 292 const char* modulation, | 292 const GrGLSLExpr4& modulation, |
| 293 const GrGLShaderBuilder::TextureSamp
ler& sampler, | 293 const GrGLShaderBuilder::TextureSamp
ler& sampler, |
| 294 const char* coordName, | 294 const char* coordName, |
| 295 GrSLType varyingType) { | 295 GrSLType varyingType) { |
| 296 SkString lookup; | 296 SkString lookup; |
| 297 this->appendTextureLookup(&lookup, sampler, coordName, varyingType); | 297 this->appendTextureLookup(&lookup, sampler, coordName, varyingType); |
| 298 fFSCode.append((GrGLSLExpr4(modulation) * GrGLSLExpr4(lookup)).c_str()); | 298 fFSCode.append((modulation * GrGLSLExpr4(lookup)).c_str()); |
| 299 } | 299 } |
| 300 | 300 |
| 301 GrGLShaderBuilder::DstReadKey GrGLShaderBuilder::KeyForDstRead(const GrTexture*
dstCopy, | 301 GrGLShaderBuilder::DstReadKey GrGLShaderBuilder::KeyForDstRead(const GrTexture*
dstCopy, |
| 302 const GrGLCaps& c
aps) { | 302 const GrGLCaps& c
aps) { |
| 303 uint32_t key = kYesDstRead_DstReadKeyBit; | 303 uint32_t key = kYesDstRead_DstReadKeyBit; |
| 304 if (GrGLCaps::kNone_FBFetchType != caps.fbFetchType()) { | 304 if (GrGLCaps::kNone_FBFetchType != caps.fbFetchType()) { |
| 305 return key; | 305 return key; |
| 306 } | 306 } |
| 307 SkASSERT(NULL != dstCopy); | 307 SkASSERT(NULL != dstCopy); |
| 308 if (!caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(dstCopy->confi
g())) { | 308 if (!caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(dstCopy->confi
g())) { |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 out->append(";\n"); | 509 out->append(";\n"); |
| 510 } | 510 } |
| 511 } | 511 } |
| 512 } | 512 } |
| 513 | 513 |
| 514 void GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programE
ffectsBuilder, | 514 void GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programE
ffectsBuilder, |
| 515 const GrEffectStage* effectStages[]
, | 515 const GrEffectStage* effectStages[]
, |
| 516 const EffectKey effectKeys[], | 516 const EffectKey effectKeys[], |
| 517 int effectCnt, | 517 int effectCnt, |
| 518 GrGLSLExpr4* fsInOutColor) { | 518 GrGLSLExpr4* fsInOutColor) { |
| 519 bool effectEmitted = false; | |
| 520 | |
| 521 GrGLSLExpr4 inColor = *fsInOutColor; | |
| 522 GrGLSLExpr4 outColor; | |
| 523 | |
| 524 for (int e = 0; e < effectCnt; ++e) { | 519 for (int e = 0; e < effectCnt; ++e) { |
| 525 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); | 520 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); |
| 526 const GrEffectStage& stage = *effectStages[e]; | 521 const GrEffectStage& stage = *effectStages[e]; |
| 527 | 522 |
| 528 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); | 523 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); |
| 529 | 524 |
| 530 if (inColor.isZeros()) { | |
| 531 SkString inColorName; | |
| 532 | |
| 533 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. | |
| 534 this->nameVariable(&inColorName, '\0', "input"); | |
| 535 this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColo
r.c_str()); | |
| 536 inColor = inColorName; | |
| 537 } | |
| 538 | |
| 539 // create var to hold stage result | 525 // create var to hold stage result |
| 540 SkString outColorName; | 526 SkString outColorName; |
| 541 this->nameVariable(&outColorName, '\0', "output"); | 527 this->nameVariable(&outColorName, '\0', "output"); |
| 542 this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); | 528 this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); |
| 543 outColor = outColorName; | |
| 544 | |
| 545 | 529 |
| 546 programEffectsBuilder->emitEffect(stage, | 530 programEffectsBuilder->emitEffect(stage, |
| 547 effectKeys[e], | 531 effectKeys[e], |
| 548 outColor.c_str(), | 532 outColorName.c_str(), |
| 549 inColor.isOnes() ? NULL : inColor.c_st
r(), | 533 *fsInOutColor, |
| 550 fCodeStage.stageIndex()); | 534 fCodeStage.stageIndex()); |
| 551 | 535 |
| 552 inColor = outColor; | 536 *fsInOutColor = GrGLSLExpr4(outColorName); |
| 553 effectEmitted = true; | |
| 554 } | |
| 555 | |
| 556 if (effectEmitted) { | |
| 557 *fsInOutColor = outColor; | |
| 558 } | 537 } |
| 559 } | 538 } |
| 560 | 539 |
| 561 const char* GrGLShaderBuilder::getColorOutputName() const { | 540 const char* GrGLShaderBuilder::getColorOutputName() const { |
| 562 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; | 541 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; |
| 563 } | 542 } |
| 564 | 543 |
| 565 const char* GrGLShaderBuilder::enableSecondaryOutput() { | 544 const char* GrGLShaderBuilder::enableSecondaryOutput() { |
| 566 if (!fHasSecondaryOutput) { | 545 if (!fHasSecondaryOutput) { |
| 567 fFSOutputs.push_back().set(kVec4f_GrSLType, | 546 fFSOutputs.push_back().set(kVec4f_GrSLType, |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 #endif | 719 #endif |
| 741 ) { | 720 ) { |
| 742 this->vsCodeAppend("\tgl_PointSize = 1.0;\n"); | 721 this->vsCodeAppend("\tgl_PointSize = 1.0;\n"); |
| 743 } | 722 } |
| 744 | 723 |
| 745 if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) { | 724 if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) { |
| 746 this->addAttribute(kVec4f_GrSLType, color_attribute_name()); | 725 this->addAttribute(kVec4f_GrSLType, color_attribute_name()); |
| 747 const char *vsName, *fsName; | 726 const char *vsName, *fsName; |
| 748 this->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); | 727 this->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); |
| 749 this->vsCodeAppendf("\t%s = %s;\n", vsName, color_attribute_name()); | 728 this->vsCodeAppendf("\t%s = %s;\n", vsName, color_attribute_name()); |
| 750 this->setInputColor(fsName); | 729 this->setInputColor(GrGLSLExpr4(fsName)); |
| 751 } | 730 } |
| 752 | 731 |
| 753 if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) { | 732 if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) { |
| 754 this->addAttribute(kVec4f_GrSLType, coverage_attribute_name()); | 733 this->addAttribute(kVec4f_GrSLType, coverage_attribute_name()); |
| 755 const char *vsName, *fsName; | 734 const char *vsName, *fsName; |
| 756 this->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName); | 735 this->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName); |
| 757 this->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attribute_name()); | 736 this->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attribute_name()); |
| 758 this->setInputCoverage(fsName); | 737 this->setInputCoverage(GrGLSLExpr4(fsName)); |
| 759 } | 738 } |
| 760 } | 739 } |
| 761 | 740 |
| 762 bool GrGLFullShaderBuilder::addAttribute(GrSLType type, const char* name) { | 741 bool GrGLFullShaderBuilder::addAttribute(GrSLType type, const char* name) { |
| 763 for (int i = 0; i < fVSAttrs.count(); ++i) { | 742 for (int i = 0; i < fVSAttrs.count(); ++i) { |
| 764 const GrGLShaderVar& attr = fVSAttrs[i]; | 743 const GrGLShaderVar& attr = fVSAttrs[i]; |
| 765 // if attribute already added, don't add it again | 744 // if attribute already added, don't add it again |
| 766 if (attr.getName().equals(name)) { | 745 if (attr.getName().equals(name)) { |
| 767 SkASSERT(attr.getType() == type); | 746 SkASSERT(attr.getType() == type); |
| 768 return false; | 747 return false; |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 GrGLSLExpr4* inOutFSColor) { | 929 GrGLSLExpr4* inOutFSColor) { |
| 951 | 930 |
| 952 GrGLTexGenProgramEffectsBuilder texGenEffectsBuilder(this, effectCnt); | 931 GrGLTexGenProgramEffectsBuilder texGenEffectsBuilder(this, effectCnt); |
| 953 this->INHERITED::createAndEmitEffects(&texGenEffectsBuilder, | 932 this->INHERITED::createAndEmitEffects(&texGenEffectsBuilder, |
| 954 effectStages, | 933 effectStages, |
| 955 effectKeys, | 934 effectKeys, |
| 956 effectCnt, | 935 effectCnt, |
| 957 inOutFSColor); | 936 inOutFSColor); |
| 958 return texGenEffectsBuilder.finish(); | 937 return texGenEffectsBuilder.finish(); |
| 959 } | 938 } |
| OLD | NEW |