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

Side by Side Diff: src/effects/SkBlurMaskFilter.cpp

Issue 1457543003: Add ShaderBuilders to EmitArgs and remove gettings from ProgBuilder. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « src/effects/SkArithmeticMode_gpu.cpp ('k') | src/effects/SkColorCubeFilter.cpp » ('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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkBlurMaskFilter.h" 9 #include "SkBlurMaskFilter.h"
10 #include "SkBlurMask.h" 10 #include "SkBlurMask.h"
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 private: 690 private:
691 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; 691 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
692 692
693 UniformHandle fProxyRectUniform; 693 UniformHandle fProxyRectUniform;
694 UniformHandle fProfileSizeUniform; 694 UniformHandle fProfileSizeUniform;
695 GrSLPrecision fPrecision; 695 GrSLPrecision fPrecision;
696 696
697 typedef GrGLSLFragmentProcessor INHERITED; 697 typedef GrGLSLFragmentProcessor INHERITED;
698 }; 698 };
699 699
700 void OutputRectBlurProfileLookup(GrGLSLFragmentBuilder* fsBuilder, 700 void OutputRectBlurProfileLookup(GrGLSLFragmentBuilder* fragBuilder,
701 const GrGLSLTextureSampler& sampler, 701 const GrGLSLTextureSampler& sampler,
702 const char *output, 702 const char *output,
703 const char *profileSize, const char *loc, 703 const char *profileSize, const char *loc,
704 const char *blurred_width, 704 const char *blurred_width,
705 const char *sharp_width) { 705 const char *sharp_width) {
706 fsBuilder->codeAppendf("float %s;", output); 706 fragBuilder->codeAppendf("float %s;", output);
707 fsBuilder->codeAppendf("{"); 707 fragBuilder->codeAppendf("{");
708 fsBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) / %s ;", 708 fragBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) / %s;",
709 loc, blurred_width, sharp_width, profileSize); 709 loc, blurred_width, sharp_width, profileSize);
710 fsBuilder->codeAppendf("%s = ", output); 710 fragBuilder->codeAppendf("%s = ", output);
711 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); 711 fragBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)");
712 fsBuilder->codeAppend(".a;"); 712 fragBuilder->codeAppend(".a;");
713 fsBuilder->codeAppendf("}"); 713 fragBuilder->codeAppendf("}");
714 } 714 }
715 715
716 716
717 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b) { 717 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b) {
718 b->add32(precision); 718 b->add32(precision);
719 } 719 }
720 720
721 721
722 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { 722 void GrGLRectBlurEffect::emitCode(EmitArgs& args) {
723 723
724 const char *rectName; 724 const char *rectName;
725 const char *profileSizeName; 725 const char *profileSizeName;
726 726
727 const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fBuilder ->glslCaps(), 727 const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fBuilder ->glslCaps(),
728 fPrecision); 728 fPrecision);
729 fProxyRectUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen t_Visibility, 729 fProxyRectUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen t_Visibility,
730 kVec4f_GrSLType, 730 kVec4f_GrSLType,
731 fPrecision, 731 fPrecision,
732 "proxyRect", 732 "proxyRect",
733 &rectName); 733 &rectName);
734 fProfileSizeUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragm ent_Visibility, 734 fProfileSizeUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragm ent_Visibility,
735 kFloat_GrSLType, 735 kFloat_GrSLType,
736 kDefault_GrSLPrecision, 736 kDefault_GrSLPrecision,
737 "profileSize", 737 "profileSize",
738 &profileSizeName); 738 &profileSizeName);
739 739
740 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder() ; 740 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
741 const char *fragmentPos = fsBuilder->fragmentPosition(); 741 const char *fragmentPos = fragBuilder->fragmentPosition();
742 742
743 if (args.fInputColor) { 743 if (args.fInputColor) {
744 fsBuilder->codeAppendf("vec4 src=%s;", args.fInputColor); 744 fragBuilder->codeAppendf("vec4 src=%s;", args.fInputColor);
745 } else { 745 } else {
746 fsBuilder->codeAppendf("vec4 src=vec4(1);"); 746 fragBuilder->codeAppendf("vec4 src=vec4(1);");
747 } 747 }
748 748
749 fsBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionSt ring, fragmentPos, 749 fragBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precision String, fragmentPos,
750 rectName); 750 rectName);
751 fsBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, rec tName, rectName); 751 fragBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, r ectName, rectName);
752 fsBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, re ctName, rectName); 752 fragBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, rectName, rectName);
753 753
754 fsBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);", precisionString, 754 fragBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s); ", precisionString,
755 profileSizeName, profileSizeName); 755 profileSizeName, profileSizeName);
756 fsBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;", precisionString, 756 fragBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0; ", precisionString,
757 profileSizeName); 757 profileSizeName);
758 fsBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", prec isionString); 758 fragBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", pr ecisionString);
759 759
760 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, 760 OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "horiz_lookup", profileSizeName,
761 "translatedPos.x", "width", "wh.x"); 761 "translatedPos.x", "width", "wh.x");
762 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, 762 OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "vert_lookup", p rofileSizeName,
763 "translatedPos.y", "height", "wh.y"); 763 "translatedPos.y", "height", "wh.y");
764 764
765 fsBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;"); 765 fragBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;");
766 fsBuilder->codeAppendf("%s = src * final;", args.fOutputColor); 766 fragBuilder->codeAppendf("%s = src * final;", args.fOutputColor);
767 } 767 }
768 768
769 void GrGLRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, 769 void GrGLRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman,
770 const GrProcessor& proc) { 770 const GrProcessor& proc) {
771 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); 771 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>();
772 SkRect rect = rbe.getRect(); 772 SkRect rect = rbe.getRect();
773 773
774 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); 774 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom);
775 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); 775 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma()));
776 } 776 }
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 kFloat_GrSLType, 1076 kFloat_GrSLType,
1077 kDefault_GrSLPrecision, 1077 kDefault_GrSLPrecision,
1078 "cornerRadius", 1078 "cornerRadius",
1079 &cornerRadiusName); 1079 &cornerRadiusName);
1080 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme nt_Visibility, 1080 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme nt_Visibility,
1081 kFloat_GrSLType, 1081 kFloat_GrSLType,
1082 kDefault_GrSLPrecision, 1082 kDefault_GrSLPrecision,
1083 "blurRadius", 1083 "blurRadius",
1084 &blurRadiusName); 1084 &blurRadiusName);
1085 1085
1086 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder() ; 1086 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
1087 const char* fragmentPos = fsBuilder->fragmentPosition(); 1087 const char* fragmentPos = fragBuilder->fragmentPosition();
1088 1088
1089 // warp the fragment position to the appropriate part of the 9patch blur tex ture 1089 // warp the fragment position to the appropriate part of the 9patch blur tex ture
1090 1090
1091 fsBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName, r ectName); 1091 fragBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName, rectName);
1092 fsBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragmentPo s, rectName); 1092 fragBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragment Pos, rectName);
1093 fsBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName, b lurRadiusName); 1093 fragBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName, blurRadiusName);
1094 fsBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rectN ame, rectName); 1094 fragBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rec tName, rectName);
1095 1095
1096 fsBuilder->codeAppendf("if (translatedFragPos.x >= threshold && translatedFr agPos.x < (middle.x+threshold)) {"); 1096 fragBuilder->codeAppendf(
1097 fsBuilder->codeAppendf("translatedFragPos.x = threshold;\n"); 1097 "if (translatedFragPos.x >= threshold && translatedFragPos.x < (middl e.x+threshold)) {");
1098 fsBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thresh old)) {"); 1098 fragBuilder->codeAppendf("translatedFragPos.x = threshold;\n");
1099 fsBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;"); 1099 fragBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thre shold)) {");
1100 fsBuilder->codeAppendf("}"); 1100 fragBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;");
1101 fragBuilder->codeAppendf("}");
1101 1102
1102 fsBuilder->codeAppendf("if (translatedFragPos.y > threshold && translatedFra gPos.y < (middle.y+threshold)) {"); 1103 fragBuilder->codeAppendf(
1103 fsBuilder->codeAppendf("translatedFragPos.y = threshold;"); 1104 "if (translatedFragPos.y > threshold && translatedFragPos.y < (middl e.y+threshold)) {");
1104 fsBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thresh old)) {"); 1105 fragBuilder->codeAppendf("translatedFragPos.y = threshold;");
1105 fsBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;"); 1106 fragBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thre shold)) {");
1106 fsBuilder->codeAppendf("}"); 1107 fragBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;");
1108 fragBuilder->codeAppendf("}");
1107 1109
1108 fsBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);"); 1110 fragBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);");
1109 fsBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;"); 1111 fragBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;");
1110 1112
1111 fsBuilder->codeAppendf("%s = ", args.fOutputColor); 1113 fragBuilder->codeAppendf("%s = ", args.fOutputColor);
1112 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord"); 1114 fragBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers [0], "texCoord");
1113 fsBuilder->codeAppend(";"); 1115 fragBuilder->codeAppend(";");
1114 } 1116 }
1115 1117
1116 void GrGLRRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, 1118 void GrGLRRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman,
1117 const GrProcessor& proc) { 1119 const GrProcessor& proc) {
1118 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); 1120 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>();
1119 SkRRect rrect = brre.getRRect(); 1121 SkRRect rrect = brre.getRRect();
1120 1122
1121 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); 1123 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f);
1122 pdman.set1f(fBlurRadiusUniform, blurRadius); 1124 pdman.set1f(fBlurRadiusUniform, blurRadius);
1123 1125
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 } else { 1304 } else {
1303 str->append("None"); 1305 str->append("None");
1304 } 1306 }
1305 str->append("))"); 1307 str->append("))");
1306 } 1308 }
1307 #endif 1309 #endif
1308 1310
1309 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 1311 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
1310 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 1312 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
1311 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1313 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/effects/SkArithmeticMode_gpu.cpp ('k') | src/effects/SkColorCubeFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698