Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/gpu/gl/GrGLShaderBuilder.cpp

Issue 25048002: Express (GLSL expression, possibly known value) pairs as a class (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/gpu/gl/GrGLSL_impl.h ('K') | « src/gpu/gl/GrGLShaderBuilder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW
« src/gpu/gl/GrGLSL_impl.h ('K') | « src/gpu/gl/GrGLShaderBuilder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698