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 |