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

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

Issue 26190003: Potentially optimize some GrGLEffects for known input color values (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: 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
« no previous file with comments | « src/gpu/gl/GrGLShaderBuilder.h ('k') | src/gpu/gl/GrGLVertexEffect.h » ('j') | 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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLShaderBuilder.h ('k') | src/gpu/gl/GrGLVertexEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698