| 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 GrGLUniformManager& uniformManager, | 109 GrGLUniformManager& uniformManager, |
| 110 const GrGLProgramDesc& desc, | 110 const GrGLProgramDesc& desc, |
| 111 bool needsVertexShader) | 111 bool needsVertexShader) |
| 112 : fUniforms(kVarsPerBlock) | 112 : fUniforms(kVarsPerBlock) |
| 113 , fGpu(gpu) | 113 , fGpu(gpu) |
| 114 , fUniformManager(uniformManager) | 114 , fUniformManager(uniformManager) |
| 115 , fFSFeaturesAddedMask(0) | 115 , fFSFeaturesAddedMask(0) |
| 116 , fFSInputs(kVarsPerBlock) | 116 , fFSInputs(kVarsPerBlock) |
| 117 , fFSOutputs(kMaxFSOutputs) | 117 , fFSOutputs(kMaxFSOutputs) |
| 118 , fSetupFragPosition(false) | 118 , fSetupFragPosition(false) |
| 119 , fKnownColorValue(kNone_GrSLConstantVec) | |
| 120 , fKnownCoverageValue(kNone_GrSLConstantVec) | |
| 121 , fHasCustomColorOutput(false) | 119 , fHasCustomColorOutput(false) |
| 122 , fHasSecondaryOutput(false) | 120 , fHasSecondaryOutput(false) |
| 123 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) { | 121 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) { |
| 124 | 122 |
| 125 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); | 123 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); |
| 126 | 124 |
| 127 if (needsVertexShader) { | 125 if (needsVertexShader) { |
| 128 fVertexBuilder.reset(SkNEW_ARGS(VertexBuilder, (this, fGpu, desc))); | 126 fVertexBuilder.reset(SkNEW_ARGS(VertexBuilder, (this, fGpu, desc))); |
| 129 } | 127 } |
| 130 | 128 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 break; | 171 break; |
| 174 } | 172 } |
| 175 case GrGLProgramDesc::kUniform_ColorInput: { | 173 case GrGLProgramDesc::kUniform_ColorInput: { |
| 176 const char* name; | 174 const char* name; |
| 177 fColorUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, | 175 fColorUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, |
| 178 kVec4f_GrSLType, "Color", &name); | 176 kVec4f_GrSLType, "Color", &name); |
| 179 fInputColor = name; | 177 fInputColor = name; |
| 180 break; | 178 break; |
| 181 } | 179 } |
| 182 case GrGLProgramDesc::kTransBlack_ColorInput: | 180 case GrGLProgramDesc::kTransBlack_ColorInput: |
| 183 fKnownColorValue = kZeros_GrSLConstantVec; | 181 fInputColor = GrGLSLExpr<4>(0); |
| 184 break; | 182 break; |
| 185 case GrGLProgramDesc::kSolidWhite_ColorInput: | 183 case GrGLProgramDesc::kSolidWhite_ColorInput: |
| 186 fKnownColorValue = kOnes_GrSLConstantVec; | 184 fInputColor = GrGLSLExpr<4>(1); |
| 187 break; | 185 break; |
| 188 default: | 186 default: |
| 189 GrCrash("Unknown color type."); | 187 GrCrash("Unknown color type."); |
| 190 } | 188 } |
| 191 | 189 |
| 192 switch (header.fCoverageInput) { | 190 switch (header.fCoverageInput) { |
| 193 case GrGLProgramDesc::kAttribute_ColorInput: { | 191 case GrGLProgramDesc::kAttribute_ColorInput: { |
| 194 SkASSERT(NULL != fVertexBuilder.get()); | 192 SkASSERT(NULL != fVertexBuilder.get()); |
| 195 fVertexBuilder->addAttribute(kVec4f_GrSLType, coverage_attribute_nam
e()); | 193 fVertexBuilder->addAttribute(kVec4f_GrSLType, coverage_attribute_nam
e()); |
| 196 const char *vsName, *fsName; | 194 const char *vsName, *fsName; |
| 197 fVertexBuilder->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fs
Name); | 195 fVertexBuilder->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fs
Name); |
| 198 fVertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attri
bute_name()); | 196 fVertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attri
bute_name()); |
| 199 fInputCoverage = fsName; | 197 fInputCoverage = fsName; |
| 200 break; | 198 break; |
| 201 } | 199 } |
| 202 case GrGLProgramDesc::kUniform_ColorInput: { | 200 case GrGLProgramDesc::kUniform_ColorInput: { |
| 203 const char* name; | 201 const char* name; |
| 204 fCoverageUniform = this->addUniform(GrGLShaderBuilder::kFragment_Vis
ibility, | 202 fCoverageUniform = this->addUniform(GrGLShaderBuilder::kFragment_Vis
ibility, |
| 205 kVec4f_GrSLType, "Coverage", &na
me); | 203 kVec4f_GrSLType, "Coverage", &na
me); |
| 206 fInputCoverage = name; | 204 fInputCoverage = name; |
| 207 break; | 205 break; |
| 208 } | 206 } |
| 209 case GrGLProgramDesc::kTransBlack_ColorInput: | 207 case GrGLProgramDesc::kTransBlack_ColorInput: |
| 210 fKnownCoverageValue = kZeros_GrSLConstantVec; | 208 fInputCoverage = GrGLSLExpr<4>(0); |
| 211 break; | 209 break; |
| 212 case GrGLProgramDesc::kSolidWhite_ColorInput: | 210 case GrGLProgramDesc::kSolidWhite_ColorInput: |
| 213 fKnownCoverageValue = kOnes_GrSLConstantVec; | 211 fInputCoverage = GrGLSLExpr<4>(1); |
| 214 break; | 212 break; |
| 215 default: | 213 default: |
| 216 GrCrash("Unknown coverage type."); | 214 GrCrash("Unknown coverage type."); |
| 217 } | 215 } |
| 218 | 216 |
| 219 if (k110_GrGLSLGeneration != fGpu->glslGeneration()) { | 217 if (k110_GrGLSLGeneration != fGpu->glslGeneration()) { |
| 220 fFSOutputs.push_back().set(kVec4f_GrSLType, | 218 fFSOutputs.push_back().set(kVec4f_GrSLType, |
| 221 GrGLShaderVar::kOut_TypeModifier, | 219 GrGLShaderVar::kOut_TypeModifier, |
| 222 declared_color_output_name()); | 220 declared_color_output_name()); |
| 223 fHasCustomColorOutput = true; | 221 fHasCustomColorOutput = true; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType); | 335 this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType); |
| 338 } | 336 } |
| 339 | 337 |
| 340 void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( | 338 void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( |
| 341 const char* modulation, | 339 const char* modulation, |
| 342 const GrGLShaderBuilder::TextureSamp
ler& sampler, | 340 const GrGLShaderBuilder::TextureSamp
ler& sampler, |
| 343 const char* coordName, | 341 const char* coordName, |
| 344 GrSLType varyingType) { | 342 GrSLType varyingType) { |
| 345 SkString lookup; | 343 SkString lookup; |
| 346 this->appendTextureLookup(&lookup, sampler, coordName, varyingType); | 344 this->appendTextureLookup(&lookup, sampler, coordName, varyingType); |
| 347 GrGLSLModulatef<4>(&fFSCode, modulation, lookup.c_str()); | 345 fFSCode.append((GrGLSLExpr<4>(modulation) * GrGLSLExpr<4>(lookup)).c_str()); |
| 348 } | 346 } |
| 349 | 347 |
| 350 GrBackendEffectFactory::EffectKey GrGLShaderBuilder::KeyForTextureAccess( | 348 GrBackendEffectFactory::EffectKey GrGLShaderBuilder::KeyForTextureAccess( |
| 351 const GrTextureAcces
s& access, | 349 const GrTextureAcces
s& access, |
| 352 const GrGLCaps& caps
) { | 350 const GrGLCaps& caps
) { |
| 353 uint32_t configComponentMask = GrPixelConfigComponentMask(access.getTexture(
)->config()); | 351 uint32_t configComponentMask = GrPixelConfigComponentMask(access.getTexture(
)->config()); |
| 354 if (swizzle_requires_alpha_remapping(caps, configComponentMask, access.swizz
leMask())) { | 352 if (swizzle_requires_alpha_remapping(caps, configComponentMask, access.swizz
leMask())) { |
| 355 return 1; | 353 return 1; |
| 356 } else { | 354 } else { |
| 357 return 0; | 355 return 0; |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); | 552 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); |
| 555 out->append(";\n"); | 553 out->append(";\n"); |
| 556 } | 554 } |
| 557 } | 555 } |
| 558 } | 556 } |
| 559 | 557 |
| 560 void GrGLShaderBuilder::emitEffects( | 558 void GrGLShaderBuilder::emitEffects( |
| 561 const GrEffectStage* effectStages[], | 559 const GrEffectStage* effectStages[], |
| 562 const GrBackendEffectFactory::EffectKey effectKeys[], | 560 const GrBackendEffectFactory::EffectKey effectKeys[], |
| 563 int effectCnt, | 561 int effectCnt, |
| 564 SkString* fsInOutColor, | 562 GrGLSLExpr<4>* fsInOutColor, |
| 565 GrSLConstantVec* fsInOutColorKnownValue, | |
| 566 SkTArray<GrGLUniformManager::UniformHandle, true>* effec
tSamplerHandles[], | 563 SkTArray<GrGLUniformManager::UniformHandle, true>* effec
tSamplerHandles[], |
| 567 GrGLEffect* glEffects[]) { | 564 GrGLEffect* glEffects[]) { |
| 568 bool effectEmitted = false; | 565 bool effectEmitted = false; |
| 569 | 566 |
| 570 SkString inColor = *fsInOutColor; | 567 GrGLSLExpr<4> inColor = *fsInOutColor; |
| 571 SkString outColor; | 568 GrGLSLExpr<4> outColor; |
| 572 | 569 |
| 573 for (int e = 0; e < effectCnt; ++e) { | 570 for (int e = 0; e < effectCnt; ++e) { |
| 574 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); | 571 SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()
); |
| 575 const GrEffectStage& stage = *effectStages[e]; | 572 const GrEffectStage& stage = *effectStages[e]; |
| 576 const GrEffectRef& effect = *stage.getEffect(); | 573 const GrEffectRef& effect = *stage.getEffect(); |
| 577 | 574 |
| 578 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); | 575 CodeStage::AutoStageRestore csar(&fCodeStage, &stage); |
| 579 | 576 |
| 580 int numTextures = effect->numTextures(); | 577 int numTextures = effect->numTextures(); |
| 581 SkSTArray<8, GrGLShaderBuilder::TextureSampler> textureSamplers; | 578 SkSTArray<8, GrGLShaderBuilder::TextureSampler> textureSamplers; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 595 SkASSERT(NULL != fVertexBuilder.get()); | 592 SkASSERT(NULL != fVertexBuilder.get()); |
| 596 SkString attributeName("aAttr"); | 593 SkString attributeName("aAttr"); |
| 597 attributeName.appendS32(attributeIndices[a]); | 594 attributeName.appendS32(attributeIndices[a]); |
| 598 fVertexBuilder->addEffectAttribute(attributeIndices[a], | 595 fVertexBuilder->addEffectAttribute(attributeIndices[a], |
| 599 effect->vertexAttribType(a), | 596 effect->vertexAttribType(a), |
| 600 attributeName); | 597 attributeName); |
| 601 } | 598 } |
| 602 | 599 |
| 603 glEffects[e] = effect->getFactory().createGLInstance(drawEffect); | 600 glEffects[e] = effect->getFactory().createGLInstance(drawEffect); |
| 604 | 601 |
| 605 if (kZeros_GrSLConstantVec == *fsInOutColorKnownValue) { | 602 if (inColor.isZeros()) { |
| 603 SkString inColorName; |
| 606 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. | 604 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. |
| 607 this->nameVariable(&inColor, '\0', "input"); | 605 this->nameVariable(&inColorName, '\0', "input"); |
| 608 this->fsCodeAppendf("\tvec4 %s = %s;\n", inColor.c_str(), GrGLSLZero
sVecf(4)); | 606 this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColo
r.c_str()); |
| 607 inColor = inColorName; |
| 609 } | 608 } |
| 610 | 609 |
| 611 // create var to hold stage result | 610 // create var to hold stage result |
| 612 this->nameVariable(&outColor, '\0', "output"); | 611 SkString outColorName; |
| 613 this->fsCodeAppendf("\tvec4 %s;\n", outColor.c_str()); | 612 this->nameVariable(&outColorName, '\0', "output"); |
| 613 this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); |
| 614 outColor = outColorName; |
| 614 | 615 |
| 615 // Enclose custom code in a block to avoid namespace conflicts | 616 // Enclose custom code in a block to avoid namespace conflicts |
| 616 SkString openBrace; | 617 SkString openBrace; |
| 617 openBrace.printf("\t{ // Stage %d: %s\n", fCodeStage.stageIndex(), glEff
ects[e]->name()); | 618 openBrace.printf("\t{ // Stage %d: %s\n", fCodeStage.stageIndex(), glEff
ects[e]->name()); |
| 618 if (NULL != fVertexBuilder.get()) { | 619 if (NULL != fVertexBuilder.get()) { |
| 619 fVertexBuilder->vsCodeAppend(openBrace.c_str()); | 620 fVertexBuilder->vsCodeAppend(openBrace.c_str()); |
| 620 } | 621 } |
| 621 this->fsCodeAppend(openBrace.c_str()); | 622 this->fsCodeAppend(openBrace.c_str()); |
| 622 | 623 |
| 623 glEffects[e]->emitCode(this, | 624 glEffects[e]->emitCode(this, |
| 624 drawEffect, | 625 drawEffect, |
| 625 effectKeys[e], | 626 effectKeys[e], |
| 626 outColor.c_str(), | 627 outColor.c_str(), |
| 627 inColor.isEmpty() ? NULL : inColor.c_str(), | 628 inColor.isOnes() ? NULL : inColor.c_str(), |
| 628 textureSamplers); | 629 textureSamplers); |
| 629 | 630 |
| 630 if (NULL != fVertexBuilder.get()) { | 631 if (NULL != fVertexBuilder.get()) { |
| 631 fVertexBuilder->vsCodeAppend("\t}\n"); | 632 fVertexBuilder->vsCodeAppend("\t}\n"); |
| 632 } | 633 } |
| 633 this->fsCodeAppend("\t}\n"); | 634 this->fsCodeAppend("\t}\n"); |
| 634 | 635 |
| 635 inColor = outColor; | 636 inColor = outColor; |
| 636 *fsInOutColorKnownValue = kNone_GrSLConstantVec; | |
| 637 effectEmitted = true; | 637 effectEmitted = true; |
| 638 } | 638 } |
| 639 | 639 |
| 640 if (effectEmitted) { | 640 if (effectEmitted) { |
| 641 *fsInOutColor = outColor; | 641 *fsInOutColor = outColor; |
| 642 } | 642 } |
| 643 } | 643 } |
| 644 | 644 |
| 645 const char* GrGLShaderBuilder::getColorOutputName() const { | 645 const char* GrGLShaderBuilder::getColorOutputName() const { |
| 646 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; | 646 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 982 GL_CALL(BindAttribLocation(programId, | 982 GL_CALL(BindAttribLocation(programId, |
| 983 header.fCoverageAttributeIndex, | 983 header.fCoverageAttributeIndex, |
| 984 coverage_attribute_name())); | 984 coverage_attribute_name())); |
| 985 } | 985 } |
| 986 | 986 |
| 987 const AttributePair* attribEnd = fEffectAttributes.end(); | 987 const AttributePair* attribEnd = fEffectAttributes.end(); |
| 988 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { | 988 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { |
| 989 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); | 989 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); |
| 990 } | 990 } |
| 991 } | 991 } |
| OLD | NEW |