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

Side by Side Diff: src/effects/gradients/SkGradientShader.cpp

Issue 1490283004: Create GLSLUniformHandler class for gpu backend (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up public api of uniformhandler Created 5 years 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/SkTableColorFilter.cpp ('k') | src/effects/gradients/SkGradientShaderPriv.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 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 "SkGradientShaderPriv.h" 8 #include "SkGradientShaderPriv.h"
9 #include "SkLinearGradient.h" 9 #include "SkLinearGradient.h"
10 #include "SkRadialGradient.h" 10 #include "SkRadialGradient.h"
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 903 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
904 904
905 /////////////////////////////////////////////////////////////////////////////// 905 ///////////////////////////////////////////////////////////////////////////////
906 906
907 #if SK_SUPPORT_GPU 907 #if SK_SUPPORT_GPU
908 908
909 #include "effects/GrTextureStripAtlas.h" 909 #include "effects/GrTextureStripAtlas.h"
910 #include "GrInvariantOutput.h" 910 #include "GrInvariantOutput.h"
911 #include "gl/GrGLContext.h" 911 #include "gl/GrGLContext.h"
912 #include "glsl/GrGLSLFragmentShaderBuilder.h" 912 #include "glsl/GrGLSLFragmentShaderBuilder.h"
913 #include "glsl/GrGLSLProgramBuilder.h"
914 #include "glsl/GrGLSLProgramDataManager.h" 913 #include "glsl/GrGLSLProgramDataManager.h"
914 #include "glsl/GrGLSLUniformHandler.h"
915 #include "SkGr.h" 915 #include "SkGr.h"
916 916
917 GrGLGradientEffect::GrGLGradientEffect() 917 GrGLGradientEffect::GrGLGradientEffect()
918 : fCachedYCoord(SK_ScalarMax) { 918 : fCachedYCoord(SK_ScalarMax) {
919 } 919 }
920 920
921 GrGLGradientEffect::~GrGLGradientEffect() { } 921 GrGLGradientEffect::~GrGLGradientEffect() { }
922 922
923 void GrGLGradientEffect::emitUniforms(GrGLSLFPBuilder* builder, const GrGradient Effect& ge) { 923 void GrGLGradientEffect::emitUniforms(GrGLSLUniformHandler* uniformHandler,
924 const GrGradientEffect& ge) {
924 925
925 if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()) { // 2 Col or case 926 if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()) { // 2 Col or case
926 fColorStartUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Vis ibility, 927 fColorStartUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragm ent_Visibility,
927 kVec4f_GrSLType, kDefault_GrSLPreci sion, 928 kVec4f_GrSLType, kDefault_Gr SLPrecision,
928 "GradientStartColor"); 929 "GradientStartColor");
929 fColorEndUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visib ility, 930 fColorEndUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragmen t_Visibility,
930 kVec4f_GrSLType, kDefault_GrSLPrecisi on, 931 kVec4f_GrSLType, kDefault_GrSL Precision,
931 "GradientEndColor"); 932 "GradientEndColor");
932 933
933 } else if (SkGradientShaderBase::kThree_GpuColorType == ge.getColorType()) { // 3 Color Case 934 } else if (SkGradientShaderBase::kThree_GpuColorType == ge.getColorType()) { // 3 Color Case
934 fColorStartUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Vis ibility, 935 fColorStartUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragm ent_Visibility,
935 kVec4f_GrSLType, kDefault_GrSLPrec ision, 936 kVec4f_GrSLType, kDefault_G rSLPrecision,
936 "GradientStartColor"); 937 "GradientStartColor");
937 fColorMidUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visib ility, 938 fColorMidUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragmen t_Visibility,
938 kVec4f_GrSLType, kDefault_GrSLPrecisi on, 939 kVec4f_GrSLType, kDefault_GrSL Precision,
939 "GradientMidColor"); 940 "GradientMidColor");
940 fColorEndUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visib ility, 941 fColorEndUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragmen t_Visibility,
941 kVec4f_GrSLType, kDefault_GrSLPrecisi on, 942 kVec4f_GrSLType, kDefault_GrSL Precision,
942 "GradientEndColor"); 943 "GradientEndColor");
943 944
944 } else { // if not a fast case 945 } else { // if not a fast case
945 fFSYUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility , 946 fFSYUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Vis ibility,
946 kFloat_GrSLType, kDefault_GrSLPrecision, 947 kFloat_GrSLType, kDefault_GrSLPreci sion,
947 "GradientYCoordFS"); 948 "GradientYCoordFS");
948 } 949 }
949 } 950 }
950 951
951 static inline void set_color_uni(const GrGLSLProgramDataManager& pdman, 952 static inline void set_color_uni(const GrGLSLProgramDataManager& pdman,
952 const GrGLSLProgramDataManager::UniformHandle u ni, 953 const GrGLSLProgramDataManager::UniformHandle u ni,
953 const SkColor* color) { 954 const SkColor* color) {
954 pdman.set4f(uni, 955 pdman.set4f(uni,
955 SkColorGetR(*color) / 255.f, 956 SkColorGetR(*color) / 255.f,
956 SkColorGetG(*color) / 255.f, 957 SkColorGetG(*color) / 255.f,
957 SkColorGetB(*color) / 255.f, 958 SkColorGetB(*color) / 255.f,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 key |= kThreeColorKey; 1020 key |= kThreeColorKey;
1020 } 1021 }
1021 1022
1022 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { 1023 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) {
1023 key |= kPremulBeforeInterpKey; 1024 key |= kPremulBeforeInterpKey;
1024 } 1025 }
1025 1026
1026 return key; 1027 return key;
1027 } 1028 }
1028 1029
1029 void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder, 1030 void GrGLGradientEffect::emitColor(GrGLSLFragmentBuilder* fragBuilder,
1030 GrGLSLFragmentBuilder* fragBuilder, 1031 GrGLSLUniformHandler* uniformHandler,
1031 const GrGLSLCaps* glslCaps, 1032 const GrGLSLCaps* glslCaps,
1032 const GrGradientEffect& ge, 1033 const GrGradientEffect& ge,
1033 const char* gradientTValue, 1034 const char* gradientTValue,
1034 const char* outputColor, 1035 const char* outputColor,
1035 const char* inputColor, 1036 const char* inputColor,
1036 const TextureSamplerArray& samplers) { 1037 const TextureSamplerArray& samplers) {
1037 if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()){ 1038 if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()){
1038 fragBuilder->codeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.0));\n", 1039 fragBuilder->codeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.0));\n",
1039 builder->getUniformVariable(fColorStartUni).c_s tr(), 1040 uniformHandler->getUniformVariable(fColorStartU ni).c_str(),
1040 builder->getUniformVariable(fColorEndUni).c_str (), 1041 uniformHandler->getUniformVariable(fColorEndUni ).c_str(),
1041 gradientTValue); 1042 gradientTValue);
1042 // Note that we could skip this step if both colors are known to be opaq ue. Two 1043 // Note that we could skip this step if both colors are known to be opaq ue. Two
1043 // considerations: 1044 // considerations:
1044 // The gradient SkShader reporting opaque is more restrictive than neces sary in the two pt 1045 // The gradient SkShader reporting opaque is more restrictive than neces sary in the two pt
1045 // case. Make sure the key reflects this optimization (and note that it can use the same 1046 // case. Make sure the key reflects this optimization (and note that it can use the same
1046 // shader as thekBeforeIterp case). This same optimization applies to th e 3 color case 1047 // shader as thekBeforeIterp case). This same optimization applies to th e 3 color case
1047 // below. 1048 // below.
1048 if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) { 1049 if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) {
1049 fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n"); 1050 fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n");
1050 } 1051 }
1051 1052
1052 fragBuilder->codeAppendf("\t%s = %s;\n", outputColor, 1053 fragBuilder->codeAppendf("\t%s = %s;\n", outputColor,
1053 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTe mp")).c_str()); 1054 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTe mp")).c_str());
1054 } else if (SkGradientShaderBase::kThree_GpuColorType == ge.getColorType()) { 1055 } else if (SkGradientShaderBase::kThree_GpuColorType == ge.getColorType()) {
1055 fragBuilder->codeAppendf("\tfloat oneMinus2t = 1.0 - (2.0 * (%s));\n", 1056 fragBuilder->codeAppendf("\tfloat oneMinus2t = 1.0 - (2.0 * (%s));\n",
1056 gradientTValue); 1057 gradientTValue);
1057 fragBuilder->codeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n", 1058 fragBuilder->codeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n",
1058 builder->getUniformVariable(fColorStartUni).c_s tr()); 1059 uniformHandler->getUniformVariable(fColorStartU ni).c_str());
1059 if (!glslCaps->canUseMinAndAbsTogether()) { 1060 if (!glslCaps->canUseMinAndAbsTogether()) {
1060 // The Tegra3 compiler will sometimes never return if we have 1061 // The Tegra3 compiler will sometimes never return if we have
1061 // min(abs(oneMinus2t), 1.0), or do the abs first in a separate expr ession. 1062 // min(abs(oneMinus2t), 1.0), or do the abs first in a separate expr ession.
1062 fragBuilder->codeAppend("\tfloat minAbs = abs(oneMinus2t);\n"); 1063 fragBuilder->codeAppend("\tfloat minAbs = abs(oneMinus2t);\n");
1063 fragBuilder->codeAppend("\tminAbs = minAbs > 1.0 ? 1.0 : minAbs;\n") ; 1064 fragBuilder->codeAppend("\tminAbs = minAbs > 1.0 ? 1.0 : minAbs;\n") ;
1064 fragBuilder->codeAppendf("\tcolorTemp += (1.0 - minAbs) * %s;\n", 1065 fragBuilder->codeAppendf("\tcolorTemp += (1.0 - minAbs) * %s;\n",
1065 builder->getUniformVariable(fColorMidUni).c _str()); 1066 uniformHandler->getUniformVariable(fColorMi dUni).c_str());
1066 } else { 1067 } else {
1067 fragBuilder->codeAppendf("\tcolorTemp += (1.0 - min(abs(oneMinus2t), 1.0)) * %s;\n", 1068 fragBuilder->codeAppendf("\tcolorTemp += (1.0 - min(abs(oneMinus2t), 1.0)) * %s;\n",
1068 builder->getUniformVariable(fColorMidUni).c _str()); 1069 uniformHandler->getUniformVariable(fColorMi dUni).c_str());
1069 } 1070 }
1070 fragBuilder->codeAppendf("\tcolorTemp += clamp(-oneMinus2t, 0.0, 1.0) * %s;\n", 1071 fragBuilder->codeAppendf("\tcolorTemp += clamp(-oneMinus2t, 0.0, 1.0) * %s;\n",
1071 builder->getUniformVariable(fColorEndUni).c_str ()); 1072 uniformHandler->getUniformVariable(fColorEndUni ).c_str());
1072 if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) { 1073 if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) {
1073 fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n"); 1074 fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n");
1074 } 1075 }
1075 1076
1076 fragBuilder->codeAppendf("\t%s = %s;\n", outputColor, 1077 fragBuilder->codeAppendf("\t%s = %s;\n", outputColor,
1077 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTe mp")).c_str()); 1078 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTe mp")).c_str());
1078 } else { 1079 } else {
1079 fragBuilder->codeAppendf("\tvec2 coord = vec2(%s, %s);\n", 1080 fragBuilder->codeAppendf("\tvec2 coord = vec2(%s, %s);\n",
1080 gradientTValue, 1081 gradientTValue,
1081 builder->getUniformVariable(fFSYUni).c_str()); 1082 uniformHandler->getUniformVariable(fFSYUni).c_s tr());
1082 fragBuilder->codeAppendf("\t%s = ", outputColor); 1083 fragBuilder->codeAppendf("\t%s = ", outputColor);
1083 fragBuilder->appendTextureLookupAndModulate(inputColor, 1084 fragBuilder->appendTextureLookupAndModulate(inputColor,
1084 samplers[0], 1085 samplers[0],
1085 "coord"); 1086 "coord");
1086 fragBuilder->codeAppend(";\n"); 1087 fragBuilder->codeAppend(";\n");
1087 } 1088 }
1088 } 1089 }
1089 1090
1090 ///////////////////////////////////////////////////////////////////// 1091 /////////////////////////////////////////////////////////////////////
1091 1092
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 (*stops)[i] = stop; 1210 (*stops)[i] = stop;
1210 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; 1211 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f;
1211 } 1212 }
1212 } 1213 }
1213 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); 1214 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount));
1214 1215
1215 return outColors; 1216 return outColors;
1216 } 1217 }
1217 1218
1218 #endif 1219 #endif
OLDNEW
« no previous file with comments | « src/effects/SkTableColorFilter.cpp ('k') | src/effects/gradients/SkGradientShaderPriv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698