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

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

Issue 1251173002: Added GrGLFragmentProcessor::EmitArgs struct for use with emitCode() (Closed) Base URL: https://skia.googlesource.com/skia@composeshader_gpu
Patch Set: Created 5 years, 5 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
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 645 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 GrTextureAccess fBlurProfileAccess; 656 GrTextureAccess fBlurProfileAccess;
657 657
658 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 658 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
659 659
660 typedef GrFragmentProcessor INHERITED; 660 typedef GrFragmentProcessor INHERITED;
661 }; 661 };
662 662
663 class GrGLRectBlurEffect : public GrGLFragmentProcessor { 663 class GrGLRectBlurEffect : public GrGLFragmentProcessor {
664 public: 664 public:
665 GrGLRectBlurEffect(const GrProcessor&) {} 665 GrGLRectBlurEffect(const GrProcessor&) {}
666 virtual void emitCode(GrGLFPBuilder*, 666 virtual void emitCode(EmitArgs&) override;
667 const GrFragmentProcessor&,
668 const char* outputColor,
669 const char* inputColor,
670 const TransformedCoordsArray&,
671 const TextureSamplerArray&) override;
672 667
673 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; 668 void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
674 669
675 private: 670 private:
676 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 671 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
677 672
678 UniformHandle fProxyRectUniform; 673 UniformHandle fProxyRectUniform;
679 UniformHandle fProfileSizeUniform; 674 UniformHandle fProfileSizeUniform;
680 675
681 typedef GrGLFragmentProcessor INHERITED; 676 typedef GrGLFragmentProcessor INHERITED;
682 }; 677 };
683 678
684 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, 679 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder,
685 const GrGLShaderBuilder::TextureSampler& sample r, 680 const GrGLShaderBuilder::TextureSampler& sample r,
686 const char *output, 681 const char *output,
687 const char *profileSize, const char *loc, 682 const char *profileSize, const char *loc,
688 const char *blurred_width, 683 const char *blurred_width,
689 const char *sharp_width) { 684 const char *sharp_width) {
690 fsBuilder->codeAppendf("\tfloat %s;\n", output); 685 fsBuilder->codeAppendf("\tfloat %s;\n", output);
691 fsBuilder->codeAppendf("\t\t{\n"); 686 fsBuilder->codeAppendf("\t\t{\n");
692 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", 687 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n",
693 loc, blurred_width, sharp_width, profileSize); 688 loc, blurred_width, sharp_width, profileSize);
694 fsBuilder->codeAppendf("\t\t\t%s = ", output); 689 fsBuilder->codeAppendf("\t\t\t%s = ", output);
695 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); 690 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)");
696 fsBuilder->codeAppend(".a;\n"); 691 fsBuilder->codeAppend(".a;\n");
697 fsBuilder->codeAppendf("\t\t}\n"); 692 fsBuilder->codeAppendf("\t\t}\n");
698 } 693 }
699 694
700 void GrGLRectBlurEffect::emitCode(GrGLFPBuilder* builder, 695 void GrGLRectBlurEffect::emitCode(EmitArgs& args) {
701 const GrFragmentProcessor&,
702 const char* outputColor,
703 const char* inputColor,
704 const TransformedCoordsArray& coords,
705 const TextureSamplerArray& samplers) {
706 696
707 const char *rectName; 697 const char *rectName;
708 const char *profileSizeName; 698 const char *profileSizeName;
709 699
710 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 700 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
711 kVec4f_GrSLType, 701 kVec4f_GrSLType,
712 kDefault_GrSLPrecision, 702 kDefault_GrSLPrecision,
713 "proxyRect", 703 "proxyRect",
714 &rectName); 704 &rectName);
715 fProfileSizeUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visi bility, 705 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility,
716 kFloat_GrSLType, 706 kFloat_GrSLType,
717 kDefault_GrSLPrecision, 707 kDefault_GrSLPrecision,
718 "profileSize", 708 "profileSize",
719 &profileSizeName); 709 &profileSizeName);
720 710
721 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 711 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
722 const char *fragmentPos = fsBuilder->fragmentPosition(); 712 const char *fragmentPos = fsBuilder->fragmentPosition();
723 713
724 if (inputColor) { 714 if (args.fInputColor) {
725 fsBuilder->codeAppendf("\tvec4 src=%s;\n", inputColor); 715 fsBuilder->codeAppendf("\tvec4 src=%s;\n", args.fInputColor);
726 } else { 716 } else {
727 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;"); 717 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;");
728 } 718 }
729 719
730 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); 720 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName );
731 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; 721 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ;
732 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); 722 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName );
733 723
734 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); 724 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName);
735 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); 725 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName);
736 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); 726 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n");
737 727
738 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "horiz_lookup", profileS izeName, "translatedPos.x", "width", "wh.x"); 728 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, "translatedPos.x", "width", "wh.x");
joshualitt 2015/07/22 19:34:04 line wrap @100
739 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "vert_lookup", profileSi zeName, "translatedPos.y", "height", "wh.y"); 729 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, "translatedPos.y", "height", "wh.y");
joshualitt 2015/07/22 19:34:04 line wrap @100
740 730
741 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); 731 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n");
742 fsBuilder->codeAppendf("\t%s = src * final;\n", outputColor ); 732 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor );
743 } 733 }
744 734
745 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, 735 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman,
746 const GrProcessor& proc) { 736 const GrProcessor& proc) {
747 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); 737 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>();
748 SkRect rect = rbe.getRect(); 738 SkRect rect = rbe.getRect();
749 739
750 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); 740 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom);
751 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); 741 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma()));
752 } 742 }
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 1005 rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
1016 return GrRRectBlurEffect::Create(d->fContext, sigma, rrect); 1006 return GrRRectBlurEffect::Create(d->fContext, sigma, rrect);
1017 } 1007 }
1018 1008
1019 ////////////////////////////////////////////////////////////////////////////// 1009 //////////////////////////////////////////////////////////////////////////////
1020 1010
1021 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { 1011 class GrGLRRectBlurEffect : public GrGLFragmentProcessor {
1022 public: 1012 public:
1023 GrGLRRectBlurEffect(const GrProcessor&) {} 1013 GrGLRRectBlurEffect(const GrProcessor&) {}
1024 1014
1025 virtual void emitCode(GrGLFPBuilder*, 1015 virtual void emitCode(EmitArgs&) override;
1026 const GrFragmentProcessor&,
1027 const char* outputColor,
1028 const char* inputColor,
1029 const TransformedCoordsArray&,
1030 const TextureSamplerArray&) override;
1031 1016
1032 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; 1017 void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
1033 1018
1034 private: 1019 private:
1035 GrGLProgramDataManager::UniformHandle fProxyRectUniform; 1020 GrGLProgramDataManager::UniformHandle fProxyRectUniform;
1036 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; 1021 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform;
1037 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; 1022 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform;
1038 typedef GrGLFragmentProcessor INHERITED; 1023 typedef GrGLFragmentProcessor INHERITED;
1039 }; 1024 };
1040 1025
1041 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, 1026 void GrGLRRectBlurEffect::emitCode(EmitArgs& args) {
1042 const GrFragmentProcessor&,
1043 const char* outputColor,
1044 const char* inputColor,
1045 const TransformedCoordsArray&,
1046 const TextureSamplerArray& samplers) {
1047 const char *rectName; 1027 const char *rectName;
1048 const char *cornerRadiusName; 1028 const char *cornerRadiusName;
1049 const char *blurRadiusName; 1029 const char *blurRadiusName;
1050 1030
1051 // The proxy rect has left, top, right, and bottom edges correspond to 1031 // The proxy rect has left, top, right, and bottom edges correspond to
1052 // components x, y, z, and w, respectively. 1032 // components x, y, z, and w, respectively.
1053 1033
1054 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 1034 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
1055 kVec4f_GrSLType, 1035 kVec4f_GrSLType,
1056 kDefault_GrSLPrecision, 1036 kDefault_GrSLPrecision,
1057 "proxyRect", 1037 "proxyRect",
1058 &rectName); 1038 &rectName);
1059 fCornerRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, 1039 fCornerRadiusUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragme nt_Visibility,
1060 kFloat_GrSLType, 1040 kFloat_GrSLType,
1061 kDefault_GrSLPrecision, 1041 kDefault_GrSLPrecision,
1062 "cornerRadius", 1042 "cornerRadius",
1063 &cornerRadiusName); 1043 &cornerRadiusName);
1064 fBlurRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visib ility, 1044 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment _Visibility,
1065 kFloat_GrSLType, 1045 kFloat_GrSLType,
1066 kDefault_GrSLPrecision, 1046 kDefault_GrSLPrecision,
1067 "blurRadius", 1047 "blurRadius",
1068 &blurRadiusName); 1048 &blurRadiusName);
1069 1049
1070 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 1050 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
1071 const char* fragmentPos = fsBuilder->fragmentPosition(); 1051 const char* fragmentPos = fsBuilder->fragmentPosition();
1072 1052
1073 // warp the fragment position to the appropriate part of the 9patch blur tex ture 1053 // warp the fragment position to the appropriate part of the 9patch blur tex ture
1074 1054
1075 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); 1055 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName);
1076 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); 1056 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName);
1077 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); 1057 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName );
1078 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); 1058 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName );
1079 1059
1080 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); 1060 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" );
1081 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); 1061 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n");
1082 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); 1062 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n");
1083 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); 1063 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n");
1084 fsBuilder->codeAppendf("\t\t}\n"); 1064 fsBuilder->codeAppendf("\t\t}\n");
1085 1065
1086 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); 1066 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" );
1087 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); 1067 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n");
1088 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); 1068 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n");
1089 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); 1069 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n");
1090 fsBuilder->codeAppendf("\t\t}\n"); 1070 fsBuilder->codeAppendf("\t\t}\n");
1091 1071
1092 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); 1072 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n");
1093 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); 1073 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n ");
1094 1074
1095 fsBuilder->codeAppendf("\t%s = ", outputColor); 1075 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor);
1096 fsBuilder->appendTextureLookupAndModulate(inputColor, samplers[0], "texCoord "); 1076 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord");
1097 fsBuilder->codeAppend(";\n"); 1077 fsBuilder->codeAppend(";\n");
1098 } 1078 }
1099 1079
1100 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, 1080 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman,
1101 const GrProcessor& proc) { 1081 const GrProcessor& proc) {
1102 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); 1082 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>();
1103 SkRRect rrect = brre.getRRect(); 1083 SkRRect rrect = brre.getRRect();
1104 1084
1105 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); 1085 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f);
1106 pdman.set1f(fBlurRadiusUniform, blurRadius); 1086 pdman.set1f(fBlurRadiusUniform, blurRadius);
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 } else { 1266 } else {
1287 str->append("None"); 1267 str->append("None");
1288 } 1268 }
1289 str->append("))"); 1269 str->append("))");
1290 } 1270 }
1291 #endif 1271 #endif
1292 1272
1293 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
1294 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
1295 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1275 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698