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

Side by Side Diff: cc/output/shader.cc

Issue 664803003: Update from chromium a8e7c94b1b79a0948d05a1fcfff53391d22ce37a (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 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 | « cc/output/shader.h ('k') | cc/output/software_renderer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/shader.h" 5 #include "cc/output/shader.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "cc/output/gl_renderer.h" // For the GLC() macro. 11 #include "cc/output/gl_renderer.h" // For the GLC() macro.
12 #include "gpu/command_buffer/client/gles2_interface.h" 12 #include "gpu/command_buffer/client/gles2_interface.h"
13 13
14 #define SHADER0(Src) #Src 14 #define SHADER0(Src) #Src
15 #define VERTEX_SHADER(Src) SetVertexTexCoordPrecision(SHADER0(Src)) 15 #define VERTEX_SHADER(Src) SetVertexTexCoordPrecision(SHADER0(Src))
16 #define FRAGMENT_SHADER(Src) \ 16 #define FRAGMENT_SHADER(Src) \
17 SetFragmentTexCoordPrecision(precision, \ 17 SetFragmentTexCoordPrecision( \
18 SetFragmentSamplerType(sampler, SHADER0(Src))) 18 precision, \
19 SetFragmentSamplerType(sampler, SetBlendModeFunctions(SHADER0(Src))))
19 20
20 using gpu::gles2::GLES2Interface; 21 using gpu::gles2::GLES2Interface;
21 22
22 namespace cc { 23 namespace cc {
23 24
24 namespace { 25 namespace {
25 26
26 static void GetProgramUniformLocations(GLES2Interface* context, 27 static void GetProgramUniformLocations(GLES2Interface* context,
27 unsigned program, 28 unsigned program,
28 size_t count, 29 size_t count,
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 void main() { 660 void main() {
660 gl_Position = matrix * a_position; 661 gl_Position = matrix * a_position;
661 v_texCoord = 662 v_texCoord =
662 vec2(texMatrix * vec4(a_texCoord.x, 1.0 - a_texCoord.y, 0.0, 1.0)); 663 vec2(texMatrix * vec4(a_texCoord.x, 1.0 - a_texCoord.y, 0.0, 1.0));
663 } 664 }
664 // clang-format off 665 // clang-format off
665 ); // NOLINT(whitespace/parens) 666 ); // NOLINT(whitespace/parens)
666 // clang-format on 667 // clang-format on
667 } 668 }
668 669
670 #define BLEND_MODE_UNIFORMS "s_backdropTexture", "backdropRect"
671 #define UNUSED_BLEND_MODE_UNIFORMS (is_default_blend_mode() ? 2 : 0)
672 #define BLEND_MODE_SET_LOCATIONS(X, POS) \
673 if (!is_default_blend_mode()) { \
674 DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \
675 backdrop_location_ = locations[POS]; \
676 backdrop_rect_location_ = locations[POS + 1]; \
677 }
678
679 FragmentTexBlendMode::FragmentTexBlendMode()
680 : backdrop_location_(-1),
681 backdrop_rect_location_(-1),
682 blend_mode_(BlendModeNormal) {
683 }
684
685 std::string FragmentTexBlendMode::SetBlendModeFunctions(
686 std::string shader_string) const {
687 if (shader_string.find("ApplyBlendMode") == std::string::npos)
688 return shader_string;
689
690 if (is_default_blend_mode()) {
691 return "#define ApplyBlendMode(X) (X)\n" + shader_string;
692 }
693
694 // clang-format off
695 static const std::string kFunctionApplyBlendMode = SHADER0(
696 // clang-format on
697 uniform SamplerType s_backdropTexture;
698 uniform TexCoordPrecision vec4 backdropRect;
699
700 vec4 GetBackdropColor() {
701 TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
702 bgTexCoord.x /= backdropRect.z;
703 bgTexCoord.y /= backdropRect.w;
704 return TextureLookup(s_backdropTexture, bgTexCoord);
705 }
706
707 vec4 ApplyBlendMode(vec4 src) {
708 vec4 dst = GetBackdropColor();
709 return Blend(src, dst);
710 }
711 // clang-format off
712 );
713 // clang-format on
714
715 return "precision mediump float;" + GetHelperFunctions() +
716 GetBlendFunction() + kFunctionApplyBlendMode + shader_string;
717 }
718
719 std::string FragmentTexBlendMode::GetHelperFunctions() const {
720 // clang-format off
721 static const std::string kFunctionHardLight = SHADER0(
722 // clang-format on
723 vec3 hardLight(vec4 src, vec4 dst) {
724 vec3 result;
725 result.r =
726 (2.0 * src.r <= src.a)
727 ? (2.0 * src.r * dst.r)
728 : (src.a * dst.a - 2.0 * (dst.a - dst.r) * (src.a - src.r));
729 result.g =
730 (2.0 * src.g <= src.a)
731 ? (2.0 * src.g * dst.g)
732 : (src.a * dst.a - 2.0 * (dst.a - dst.g) * (src.a - src.g));
733 result.b =
734 (2.0 * src.b <= src.a)
735 ? (2.0 * src.b * dst.b)
736 : (src.a * dst.a - 2.0 * (dst.a - dst.b) * (src.a - src.b));
737 result.rgb += src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
738 return result;
739 }
740 // clang-format off
741 );
742
743 static const std::string kFunctionColorDodgeComponent = SHADER0(
744 // clang-format on
745 float getColorDodgeComponent(
746 float srcc, float srca, float dstc, float dsta) {
747 if (0.0 == dstc)
748 return srcc * (1.0 - dsta);
749 float d = srca - srcc;
750 if (0.0 == d)
751 return srca * dsta + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
752 d = min(dsta, dstc * srca / d);
753 return d * srca + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
754 }
755 // clang-format off
756 );
757
758 static const std::string kFunctionColorBurnComponent = SHADER0(
759 // clang-format on
760 float getColorBurnComponent(
761 float srcc, float srca, float dstc, float dsta) {
762 if (dsta == dstc)
763 return srca * dsta + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
764 if (0.0 == srcc)
765 return dstc * (1.0 - srca);
766 float d = max(0.0, dsta - (dsta - dstc) * srca / srcc);
767 return srca * d + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
768 }
769 // clang-format off
770 );
771
772 static const std::string kFunctionSoftLightComponentPosDstAlpha = SHADER0(
773 // clang-format on
774 float getSoftLightComponent(
775 float srcc, float srca, float dstc, float dsta) {
776 if (2.0 * srcc <= srca) {
777 return (dstc * dstc * (srca - 2.0 * srcc)) / dsta +
778 (1.0 - dsta) * srcc + dstc * (-srca + 2.0 * srcc + 1.0);
779 } else if (4.0 * dstc <= dsta) {
780 float DSqd = dstc * dstc;
781 float DCub = DSqd * dstc;
782 float DaSqd = dsta * dsta;
783 float DaCub = DaSqd * dsta;
784 return (-DaCub * srcc +
785 DaSqd * (srcc - dstc * (3.0 * srca - 6.0 * srcc - 1.0)) +
786 12.0 * dsta * DSqd * (srca - 2.0 * srcc) -
787 16.0 * DCub * (srca - 2.0 * srcc)) /
788 DaSqd;
789 } else {
790 return -sqrt(dsta * dstc) * (srca - 2.0 * srcc) - dsta * srcc +
791 dstc * (srca - 2.0 * srcc + 1.0) + srcc;
792 }
793 }
794 // clang-format off
795 );
796
797 static const std::string kFunctionLum = SHADER0(
798 // clang-format on
799 float luminance(vec3 color) { return dot(vec3(0.3, 0.59, 0.11), color); }
800
801 vec3 set_luminance(vec3 hueSat, float alpha, vec3 lumColor) {
802 float diff = luminance(lumColor - hueSat);
803 vec3 outColor = hueSat + diff;
804 float outLum = luminance(outColor);
805 float minComp = min(min(outColor.r, outColor.g), outColor.b);
806 float maxComp = max(max(outColor.r, outColor.g), outColor.b);
807 if (minComp < 0.0) {
808 outColor = outLum +
809 ((outColor - vec3(outLum, outLum, outLum)) * outLum) /
810 (outLum - minComp);
811 }
812 if (maxComp > alpha) {
813 outColor =
814 outLum +
815 ((outColor - vec3(outLum, outLum, outLum)) * (alpha - outLum)) /
816 (maxComp - outLum);
817 }
818 return outColor;
819 }
820 // clang-format off
821 );
822
823 static const std::string kFunctionSat = SHADER0(
824 // clang-format on
825 float saturation(vec3 color) {
826 return max(max(color.r, color.g), color.b) -
827 min(min(color.r, color.g), color.b);
828 }
829
830 vec3 set_saturation_helper(
831 float minComp, float midComp, float maxComp, float sat) {
832 if (minComp < maxComp) {
833 vec3 result;
834 result.r = 0.0;
835 result.g = sat * (midComp - minComp) / (maxComp - minComp);
836 result.b = sat;
837 return result;
838 } else {
839 return vec3(0, 0, 0);
840 }
841 }
842
843 vec3 set_saturation(vec3 hueLumColor, vec3 satColor) {
844 float sat = saturation(satColor);
845 if (hueLumColor.r <= hueLumColor.g) {
846 if (hueLumColor.g <= hueLumColor.b) {
847 hueLumColor.rgb = set_saturation_helper(
848 hueLumColor.r, hueLumColor.g, hueLumColor.b, sat);
849 } else if (hueLumColor.r <= hueLumColor.b) {
850 hueLumColor.rbg = set_saturation_helper(
851 hueLumColor.r, hueLumColor.b, hueLumColor.g, sat);
852 } else {
853 hueLumColor.brg = set_saturation_helper(
854 hueLumColor.b, hueLumColor.r, hueLumColor.g, sat);
855 }
856 } else if (hueLumColor.r <= hueLumColor.b) {
857 hueLumColor.grb = set_saturation_helper(
858 hueLumColor.g, hueLumColor.r, hueLumColor.b, sat);
859 } else if (hueLumColor.g <= hueLumColor.b) {
860 hueLumColor.gbr = set_saturation_helper(
861 hueLumColor.g, hueLumColor.b, hueLumColor.r, sat);
862 } else {
863 hueLumColor.bgr = set_saturation_helper(
864 hueLumColor.b, hueLumColor.g, hueLumColor.r, sat);
865 }
866 return hueLumColor;
867 }
868 // clang-format off
869 );
870 // clang-format on
871
872 switch (blend_mode_) {
873 case BlendModeOverlay:
874 case BlendModeHardLight:
875 return kFunctionHardLight;
876 case BlendModeColorDodge:
877 return kFunctionColorDodgeComponent;
878 case BlendModeColorBurn:
879 return kFunctionColorBurnComponent;
880 case BlendModeSoftLight:
881 return kFunctionSoftLightComponentPosDstAlpha;
882 case BlendModeHue:
883 case BlendModeSaturation:
884 return kFunctionLum + kFunctionSat;
885 case BlendModeColor:
886 case BlendModeLuminosity:
887 return kFunctionLum;
888 default:
889 return std::string();
890 }
891 }
892
893 std::string FragmentTexBlendMode::GetBlendFunction() const {
894 return "vec4 Blend(vec4 src, vec4 dst) {"
895 " vec4 result;"
896 " result.a = src.a + (1.0 - src.a) * dst.a;" +
897 GetBlendFunctionBodyForRGB() +
898 " return result;"
899 "}";
900 }
901
902 std::string FragmentTexBlendMode::GetBlendFunctionBodyForRGB() const {
903 switch (blend_mode_) {
904 case BlendModeLighten:
905 return "result.rgb = max((1.0 - src.a) * dst.rgb + src.rgb,"
906 " (1.0 - dst.a) * src.rgb + dst.rgb);";
907 case BlendModeOverlay:
908 return "result.rgb = hardLight(dst, src);";
909 case BlendModeDarken:
910 return "result.rgb = min((1.0 - src.a) * dst.rgb + src.rgb,"
911 " (1.0 - dst.a) * src.rgb + dst.rgb);";
912 case BlendModeColorDodge:
913 return "result.r = getColorDodgeComponent(src.r, src.a, dst.r, dst.a);"
914 "result.g = getColorDodgeComponent(src.g, src.a, dst.g, dst.a);"
915 "result.b = getColorDodgeComponent(src.b, src.a, dst.b, dst.a);";
916 case BlendModeColorBurn:
917 return "result.r = getColorBurnComponent(src.r, src.a, dst.r, dst.a);"
918 "result.g = getColorBurnComponent(src.g, src.a, dst.g, dst.a);"
919 "result.b = getColorBurnComponent(src.b, src.a, dst.b, dst.a);";
920 case BlendModeHardLight:
921 return "result.rgb = hardLight(src, dst);";
922 case BlendModeSoftLight:
923 return "if (0.0 == dst.a) {"
924 " result.rgb = src.rgb;"
925 "} else {"
926 " result.r = getSoftLightComponent(src.r, src.a, dst.r, dst.a);"
927 " result.g = getSoftLightComponent(src.g, src.a, dst.g, dst.a);"
928 " result.b = getSoftLightComponent(src.b, src.a, dst.b, dst.a);"
929 "}";
930 case BlendModeDifference:
931 return "result.rgb = src.rgb + dst.rgb -"
932 " 2.0 * min(src.rgb * dst.a, dst.rgb * src.a);";
933 case BlendModeExclusion:
934 return "result.rgb = dst.rgb + src.rgb - 2.0 * dst.rgb * src.rgb;";
935 case BlendModeMultiply:
936 return "result.rgb = (1.0 - src.a) * dst.rgb +"
937 " (1.0 - dst.a) * src.rgb + src.rgb * dst.rgb;";
938 case BlendModeHue:
939 return "vec4 dstSrcAlpha = dst * src.a;"
940 "result.rgb ="
941 " set_luminance(set_saturation(src.rgb * dst.a,"
942 " dstSrcAlpha.rgb),"
943 " dstSrcAlpha.a,"
944 " dstSrcAlpha.rgb);"
945 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
946 case BlendModeSaturation:
947 return "vec4 dstSrcAlpha = dst * src.a;"
948 "result.rgb = set_luminance(set_saturation(dstSrcAlpha.rgb,"
949 " src.rgb * dst.a),"
950 " dstSrcAlpha.a,"
951 " dstSrcAlpha.rgb);"
952 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
953 case BlendModeColor:
954 return "vec4 srcDstAlpha = src * dst.a;"
955 "result.rgb = set_luminance(srcDstAlpha.rgb,"
956 " srcDstAlpha.a,"
957 " dst.rgb * src.a);"
958 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
959 case BlendModeLuminosity:
960 return "vec4 srcDstAlpha = src * dst.a;"
961 "result.rgb = set_luminance(dst.rgb * src.a,"
962 " srcDstAlpha.a,"
963 " srcDstAlpha.rgb);"
964 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
965 default:
966 NOTREACHED();
967 // simple alpha compositing
968 return "result.rgb = src.rgb * src.a + dst.rgb * dst.a * (1 - src.a)";
969 }
970 }
971
669 FragmentTexAlphaBinding::FragmentTexAlphaBinding() 972 FragmentTexAlphaBinding::FragmentTexAlphaBinding()
670 : sampler_location_(-1), alpha_location_(-1) { 973 : sampler_location_(-1), alpha_location_(-1) {
671 } 974 }
672 975
673 void FragmentTexAlphaBinding::Init(GLES2Interface* context, 976 void FragmentTexAlphaBinding::Init(GLES2Interface* context,
674 unsigned program, 977 unsigned program,
675 int* base_uniform_index) { 978 int* base_uniform_index) {
676 static const char* uniforms[] = { 979 static const char* uniforms[] = {
677 "s_texture", "alpha", 980 "s_texture", "alpha", BLEND_MODE_UNIFORMS,
678 }; 981 };
679 int locations[arraysize(uniforms)]; 982 int locations[arraysize(uniforms)];
680 983
681 GetProgramUniformLocations(context, 984 GetProgramUniformLocations(context,
682 program, 985 program,
683 arraysize(uniforms), 986 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
684 uniforms, 987 uniforms,
685 locations, 988 locations,
686 base_uniform_index); 989 base_uniform_index);
687 sampler_location_ = locations[0]; 990 sampler_location_ = locations[0];
688 alpha_location_ = locations[1]; 991 alpha_location_ = locations[1];
992 BLEND_MODE_SET_LOCATIONS(locations, 2);
689 } 993 }
690 994
691 FragmentTexColorMatrixAlphaBinding::FragmentTexColorMatrixAlphaBinding() 995 FragmentTexColorMatrixAlphaBinding::FragmentTexColorMatrixAlphaBinding()
692 : sampler_location_(-1), 996 : sampler_location_(-1),
693 alpha_location_(-1), 997 alpha_location_(-1),
694 color_matrix_location_(-1), 998 color_matrix_location_(-1),
695 color_offset_location_(-1) { 999 color_offset_location_(-1) {
696 } 1000 }
697 1001
698 void FragmentTexColorMatrixAlphaBinding::Init(GLES2Interface* context, 1002 void FragmentTexColorMatrixAlphaBinding::Init(GLES2Interface* context,
699 unsigned program, 1003 unsigned program,
700 int* base_uniform_index) { 1004 int* base_uniform_index) {
701 static const char* uniforms[] = { 1005 static const char* uniforms[] = {
702 "s_texture", "alpha", "colorMatrix", "colorOffset", 1006 "s_texture", "alpha", "colorMatrix", "colorOffset", BLEND_MODE_UNIFORMS,
703 }; 1007 };
704 int locations[arraysize(uniforms)]; 1008 int locations[arraysize(uniforms)];
705 1009
706 GetProgramUniformLocations(context, 1010 GetProgramUniformLocations(context,
707 program, 1011 program,
708 arraysize(uniforms), 1012 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
709 uniforms, 1013 uniforms,
710 locations, 1014 locations,
711 base_uniform_index); 1015 base_uniform_index);
712 sampler_location_ = locations[0]; 1016 sampler_location_ = locations[0];
713 alpha_location_ = locations[1]; 1017 alpha_location_ = locations[1];
714 color_matrix_location_ = locations[2]; 1018 color_matrix_location_ = locations[2];
715 color_offset_location_ = locations[3]; 1019 color_offset_location_ = locations[3];
1020 BLEND_MODE_SET_LOCATIONS(locations, 4);
716 } 1021 }
717 1022
718 FragmentTexOpaqueBinding::FragmentTexOpaqueBinding() : sampler_location_(-1) { 1023 FragmentTexOpaqueBinding::FragmentTexOpaqueBinding() : sampler_location_(-1) {
719 } 1024 }
720 1025
721 void FragmentTexOpaqueBinding::Init(GLES2Interface* context, 1026 void FragmentTexOpaqueBinding::Init(GLES2Interface* context,
722 unsigned program, 1027 unsigned program,
723 int* base_uniform_index) { 1028 int* base_uniform_index) {
724 static const char* uniforms[] = { 1029 static const char* uniforms[] = {
725 "s_texture", 1030 "s_texture",
(...skipping 14 matching lines...) Expand all
740 SamplerType sampler) const { 1045 SamplerType sampler) const {
741 // clang-format off 1046 // clang-format off
742 return FRAGMENT_SHADER( 1047 return FRAGMENT_SHADER(
743 // clang-format on 1048 // clang-format on
744 precision mediump float; 1049 precision mediump float;
745 varying TexCoordPrecision vec2 v_texCoord; 1050 varying TexCoordPrecision vec2 v_texCoord;
746 uniform SamplerType s_texture; 1051 uniform SamplerType s_texture;
747 uniform float alpha; 1052 uniform float alpha;
748 void main() { 1053 void main() {
749 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1054 vec4 texColor = TextureLookup(s_texture, v_texCoord);
750 gl_FragColor = texColor * alpha; 1055 gl_FragColor = ApplyBlendMode(texColor * alpha);
751 } 1056 }
752 // clang-format off 1057 // clang-format off
753 ); // NOLINT(whitespace/parens) 1058 ); // NOLINT(whitespace/parens)
754 // clang-format on 1059 // clang-format on
755 } 1060 }
756 1061
757 std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderString( 1062 std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderString(
758 TexCoordPrecision precision, 1063 TexCoordPrecision precision,
759 SamplerType sampler) const { 1064 SamplerType sampler) const {
760 // clang-format off 1065 // clang-format off
761 return FRAGMENT_SHADER( 1066 return FRAGMENT_SHADER(
762 // clang-format on 1067 // clang-format on
763 precision mediump float; 1068 precision mediump float;
764 varying TexCoordPrecision vec2 v_texCoord; 1069 varying TexCoordPrecision vec2 v_texCoord;
765 uniform SamplerType s_texture; 1070 uniform SamplerType s_texture;
766 uniform float alpha; 1071 uniform float alpha;
767 uniform mat4 colorMatrix; 1072 uniform mat4 colorMatrix;
768 uniform vec4 colorOffset; 1073 uniform vec4 colorOffset;
769 void main() { 1074 void main() {
770 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1075 vec4 texColor = TextureLookup(s_texture, v_texCoord);
771 float nonZeroAlpha = max(texColor.a, 0.00001); 1076 float nonZeroAlpha = max(texColor.a, 0.00001);
772 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); 1077 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
773 texColor = colorMatrix * texColor + colorOffset; 1078 texColor = colorMatrix * texColor + colorOffset;
774 texColor.rgb *= texColor.a; 1079 texColor.rgb *= texColor.a;
775 texColor = clamp(texColor, 0.0, 1.0); 1080 texColor = clamp(texColor, 0.0, 1.0);
776 gl_FragColor = texColor * alpha; 1081 gl_FragColor = ApplyBlendMode(texColor * alpha);
777 } 1082 }
778 // clang-format off 1083 // clang-format off
779 ); // NOLINT(whitespace/parens) 1084 ); // NOLINT(whitespace/parens)
780 // clang-format on 1085 // clang-format on
781 } 1086 }
782 1087
783 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderString( 1088 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderString(
784 TexCoordPrecision precision, 1089 TexCoordPrecision precision,
785 SamplerType sampler) const { 1090 SamplerType sampler) const {
786 // clang-format off 1091 // clang-format off
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 } 1264 }
960 1265
961 FragmentShaderRGBATexAlphaAA::FragmentShaderRGBATexAlphaAA() 1266 FragmentShaderRGBATexAlphaAA::FragmentShaderRGBATexAlphaAA()
962 : sampler_location_(-1), alpha_location_(-1) { 1267 : sampler_location_(-1), alpha_location_(-1) {
963 } 1268 }
964 1269
965 void FragmentShaderRGBATexAlphaAA::Init(GLES2Interface* context, 1270 void FragmentShaderRGBATexAlphaAA::Init(GLES2Interface* context,
966 unsigned program, 1271 unsigned program,
967 int* base_uniform_index) { 1272 int* base_uniform_index) {
968 static const char* uniforms[] = { 1273 static const char* uniforms[] = {
969 "s_texture", "alpha", 1274 "s_texture", "alpha", BLEND_MODE_UNIFORMS,
970 }; 1275 };
971 int locations[arraysize(uniforms)]; 1276 int locations[arraysize(uniforms)];
972 1277
973 GetProgramUniformLocations(context, 1278 GetProgramUniformLocations(context,
974 program, 1279 program,
975 arraysize(uniforms), 1280 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
976 uniforms, 1281 uniforms,
977 locations, 1282 locations,
978 base_uniform_index); 1283 base_uniform_index);
979 sampler_location_ = locations[0]; 1284 sampler_location_ = locations[0];
980 alpha_location_ = locations[1]; 1285 alpha_location_ = locations[1];
1286 BLEND_MODE_SET_LOCATIONS(locations, 2);
981 } 1287 }
982 1288
983 std::string FragmentShaderRGBATexAlphaAA::GetShaderString( 1289 std::string FragmentShaderRGBATexAlphaAA::GetShaderString(
984 TexCoordPrecision precision, 1290 TexCoordPrecision precision,
985 SamplerType sampler) const { 1291 SamplerType sampler) const {
986 // clang-format off 1292 // clang-format off
987 return FRAGMENT_SHADER( 1293 return FRAGMENT_SHADER(
988 // clang-format on 1294 // clang-format on
989 precision mediump float; 1295 precision mediump float;
990 uniform SamplerType s_texture; 1296 uniform SamplerType s_texture;
991 uniform float alpha; 1297 uniform float alpha;
992 varying TexCoordPrecision vec2 v_texCoord; 1298 varying TexCoordPrecision vec2 v_texCoord;
993 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 1299 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
994 1300
995 void main() { 1301 void main() {
996 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1302 vec4 texColor = TextureLookup(s_texture, v_texCoord);
997 vec4 d4 = min(edge_dist[0], edge_dist[1]); 1303 vec4 d4 = min(edge_dist[0], edge_dist[1]);
998 vec2 d2 = min(d4.xz, d4.yw); 1304 vec2 d2 = min(d4.xz, d4.yw);
999 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); 1305 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
1000 gl_FragColor = texColor * alpha * aa; 1306 gl_FragColor = ApplyBlendMode(texColor * alpha * aa);
1001 } 1307 }
1002 // clang-format off 1308 // clang-format off
1003 ); // NOLINT(whitespace/parens) 1309 ); // NOLINT(whitespace/parens)
1004 // clang-format on 1310 // clang-format on
1005 } 1311 }
1006 1312
1007 FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding() 1313 FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding()
1008 : sampler_location_(-1), 1314 : sampler_location_(-1),
1009 alpha_location_(-1), 1315 alpha_location_(-1),
1010 fragment_tex_transform_location_(-1) { 1316 fragment_tex_transform_location_(-1) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 : sampler_location_(-1), 1396 : sampler_location_(-1),
1091 mask_sampler_location_(-1), 1397 mask_sampler_location_(-1),
1092 alpha_location_(-1), 1398 alpha_location_(-1),
1093 mask_tex_coord_scale_location_(-1) { 1399 mask_tex_coord_scale_location_(-1) {
1094 } 1400 }
1095 1401
1096 void FragmentShaderRGBATexAlphaMask::Init(GLES2Interface* context, 1402 void FragmentShaderRGBATexAlphaMask::Init(GLES2Interface* context,
1097 unsigned program, 1403 unsigned program,
1098 int* base_uniform_index) { 1404 int* base_uniform_index) {
1099 static const char* uniforms[] = { 1405 static const char* uniforms[] = {
1100 "s_texture", "s_mask", "alpha", "maskTexCoordScale", "maskTexCoordOffset", 1406 "s_texture",
1407 "s_mask",
1408 "alpha",
1409 "maskTexCoordScale",
1410 "maskTexCoordOffset",
1411 BLEND_MODE_UNIFORMS,
1101 }; 1412 };
1102 int locations[arraysize(uniforms)]; 1413 int locations[arraysize(uniforms)];
1103 1414
1104 GetProgramUniformLocations(context, 1415 GetProgramUniformLocations(context,
1105 program, 1416 program,
1106 arraysize(uniforms), 1417 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
1107 uniforms, 1418 uniforms,
1108 locations, 1419 locations,
1109 base_uniform_index); 1420 base_uniform_index);
1110 sampler_location_ = locations[0]; 1421 sampler_location_ = locations[0];
1111 mask_sampler_location_ = locations[1]; 1422 mask_sampler_location_ = locations[1];
1112 alpha_location_ = locations[2]; 1423 alpha_location_ = locations[2];
1113 mask_tex_coord_scale_location_ = locations[3]; 1424 mask_tex_coord_scale_location_ = locations[3];
1114 mask_tex_coord_offset_location_ = locations[4]; 1425 mask_tex_coord_offset_location_ = locations[4];
1426 BLEND_MODE_SET_LOCATIONS(locations, 5);
1115 } 1427 }
1116 1428
1117 std::string FragmentShaderRGBATexAlphaMask::GetShaderString( 1429 std::string FragmentShaderRGBATexAlphaMask::GetShaderString(
1118 TexCoordPrecision precision, 1430 TexCoordPrecision precision,
1119 SamplerType sampler) const { 1431 SamplerType sampler) const {
1120 // clang-format off 1432 // clang-format off
1121 return FRAGMENT_SHADER( 1433 return FRAGMENT_SHADER(
1122 // clang-format on 1434 // clang-format on
1123 precision mediump float; 1435 precision mediump float;
1124 varying TexCoordPrecision vec2 v_texCoord; 1436 varying TexCoordPrecision vec2 v_texCoord;
1125 uniform SamplerType s_texture; 1437 uniform SamplerType s_texture;
1126 uniform SamplerType s_mask; 1438 uniform SamplerType s_mask;
1127 uniform TexCoordPrecision vec2 maskTexCoordScale; 1439 uniform TexCoordPrecision vec2 maskTexCoordScale;
1128 uniform TexCoordPrecision vec2 maskTexCoordOffset; 1440 uniform TexCoordPrecision vec2 maskTexCoordOffset;
1129 uniform float alpha; 1441 uniform float alpha;
1130 void main() { 1442 void main() {
1131 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1443 vec4 texColor = TextureLookup(s_texture, v_texCoord);
1132 TexCoordPrecision vec2 maskTexCoord = 1444 TexCoordPrecision vec2 maskTexCoord =
1133 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, 1445 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
1134 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); 1446 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
1135 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); 1447 vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
1136 gl_FragColor = texColor * alpha * maskColor.w; 1448 gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w);
1137 } 1449 }
1138 // clang-format off 1450 // clang-format off
1139 ); // NOLINT(whitespace/parens) 1451 ); // NOLINT(whitespace/parens)
1140 // clang-format on 1452 // clang-format on
1141 } 1453 }
1142 1454
1143 FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA() 1455 FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA()
1144 : sampler_location_(-1), 1456 : sampler_location_(-1),
1145 mask_sampler_location_(-1), 1457 mask_sampler_location_(-1),
1146 alpha_location_(-1), 1458 alpha_location_(-1),
1147 mask_tex_coord_scale_location_(-1), 1459 mask_tex_coord_scale_location_(-1),
1148 mask_tex_coord_offset_location_(-1) { 1460 mask_tex_coord_offset_location_(-1) {
1149 } 1461 }
1150 1462
1151 void FragmentShaderRGBATexAlphaMaskAA::Init(GLES2Interface* context, 1463 void FragmentShaderRGBATexAlphaMaskAA::Init(GLES2Interface* context,
1152 unsigned program, 1464 unsigned program,
1153 int* base_uniform_index) { 1465 int* base_uniform_index) {
1154 static const char* uniforms[] = { 1466 static const char* uniforms[] = {
1155 "s_texture", "s_mask", "alpha", "maskTexCoordScale", "maskTexCoordOffset", 1467 "s_texture",
1468 "s_mask",
1469 "alpha",
1470 "maskTexCoordScale",
1471 "maskTexCoordOffset",
1472 BLEND_MODE_UNIFORMS,
1156 }; 1473 };
1157 int locations[arraysize(uniforms)]; 1474 int locations[arraysize(uniforms)];
1158 1475
1159 GetProgramUniformLocations(context, 1476 GetProgramUniformLocations(context,
1160 program, 1477 program,
1161 arraysize(uniforms), 1478 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
1162 uniforms, 1479 uniforms,
1163 locations, 1480 locations,
1164 base_uniform_index); 1481 base_uniform_index);
1165 sampler_location_ = locations[0]; 1482 sampler_location_ = locations[0];
1166 mask_sampler_location_ = locations[1]; 1483 mask_sampler_location_ = locations[1];
1167 alpha_location_ = locations[2]; 1484 alpha_location_ = locations[2];
1168 mask_tex_coord_scale_location_ = locations[3]; 1485 mask_tex_coord_scale_location_ = locations[3];
1169 mask_tex_coord_offset_location_ = locations[4]; 1486 mask_tex_coord_offset_location_ = locations[4];
1487 BLEND_MODE_SET_LOCATIONS(locations, 5);
1170 } 1488 }
1171 1489
1172 std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderString( 1490 std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderString(
1173 TexCoordPrecision precision, 1491 TexCoordPrecision precision,
1174 SamplerType sampler) const { 1492 SamplerType sampler) const {
1175 // clang-format off 1493 // clang-format off
1176 return FRAGMENT_SHADER( 1494 return FRAGMENT_SHADER(
1177 // clang-format on 1495 // clang-format on
1178 precision mediump float; 1496 precision mediump float;
1179 uniform SamplerType s_texture; 1497 uniform SamplerType s_texture;
1180 uniform SamplerType s_mask; 1498 uniform SamplerType s_mask;
1181 uniform TexCoordPrecision vec2 maskTexCoordScale; 1499 uniform TexCoordPrecision vec2 maskTexCoordScale;
1182 uniform TexCoordPrecision vec2 maskTexCoordOffset; 1500 uniform TexCoordPrecision vec2 maskTexCoordOffset;
1183 uniform float alpha; 1501 uniform float alpha;
1184 varying TexCoordPrecision vec2 v_texCoord; 1502 varying TexCoordPrecision vec2 v_texCoord;
1185 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 1503 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
1186 1504
1187 void main() { 1505 void main() {
1188 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1506 vec4 texColor = TextureLookup(s_texture, v_texCoord);
1189 TexCoordPrecision vec2 maskTexCoord = 1507 TexCoordPrecision vec2 maskTexCoord =
1190 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, 1508 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
1191 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); 1509 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
1192 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); 1510 vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
1193 vec4 d4 = min(edge_dist[0], edge_dist[1]); 1511 vec4 d4 = min(edge_dist[0], edge_dist[1]);
1194 vec2 d2 = min(d4.xz, d4.yw); 1512 vec2 d2 = min(d4.xz, d4.yw);
1195 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); 1513 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
1196 gl_FragColor = texColor * alpha * maskColor.w * aa; 1514 gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa);
1197 } 1515 }
1198 // clang-format off 1516 // clang-format off
1199 ); // NOLINT(whitespace/parens) 1517 ); // NOLINT(whitespace/parens)
1200 // clang-format on 1518 // clang-format on
1201 } 1519 }
1202 1520
1203 FragmentShaderRGBATexAlphaMaskColorMatrixAA:: 1521 FragmentShaderRGBATexAlphaMaskColorMatrixAA::
1204 FragmentShaderRGBATexAlphaMaskColorMatrixAA() 1522 FragmentShaderRGBATexAlphaMaskColorMatrixAA()
1205 : sampler_location_(-1), 1523 : sampler_location_(-1),
1206 mask_sampler_location_(-1), 1524 mask_sampler_location_(-1),
1207 alpha_location_(-1), 1525 alpha_location_(-1),
1208 mask_tex_coord_scale_location_(-1), 1526 mask_tex_coord_scale_location_(-1),
1209 color_matrix_location_(-1), 1527 color_matrix_location_(-1),
1210 color_offset_location_(-1) { 1528 color_offset_location_(-1) {
1211 } 1529 }
1212 1530
1213 void FragmentShaderRGBATexAlphaMaskColorMatrixAA::Init( 1531 void FragmentShaderRGBATexAlphaMaskColorMatrixAA::Init(
1214 GLES2Interface* context, 1532 GLES2Interface* context,
1215 unsigned program, 1533 unsigned program,
1216 int* base_uniform_index) { 1534 int* base_uniform_index) {
1217 static const char* uniforms[] = { 1535 static const char* uniforms[] = {
1218 "s_texture", 1536 "s_texture",
1219 "s_mask", 1537 "s_mask",
1220 "alpha", 1538 "alpha",
1221 "maskTexCoordScale", 1539 "maskTexCoordScale",
1222 "maskTexCoordOffset", 1540 "maskTexCoordOffset",
1223 "colorMatrix", 1541 "colorMatrix",
1224 "colorOffset", 1542 "colorOffset",
1543 BLEND_MODE_UNIFORMS,
1225 }; 1544 };
1226 int locations[arraysize(uniforms)]; 1545 int locations[arraysize(uniforms)];
1227 1546
1228 GetProgramUniformLocations(context, 1547 GetProgramUniformLocations(context,
1229 program, 1548 program,
1230 arraysize(uniforms), 1549 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
1231 uniforms, 1550 uniforms,
1232 locations, 1551 locations,
1233 base_uniform_index); 1552 base_uniform_index);
1234 sampler_location_ = locations[0]; 1553 sampler_location_ = locations[0];
1235 mask_sampler_location_ = locations[1]; 1554 mask_sampler_location_ = locations[1];
1236 alpha_location_ = locations[2]; 1555 alpha_location_ = locations[2];
1237 mask_tex_coord_scale_location_ = locations[3]; 1556 mask_tex_coord_scale_location_ = locations[3];
1238 mask_tex_coord_offset_location_ = locations[4]; 1557 mask_tex_coord_offset_location_ = locations[4];
1239 color_matrix_location_ = locations[5]; 1558 color_matrix_location_ = locations[5];
1240 color_offset_location_ = locations[6]; 1559 color_offset_location_ = locations[6];
1560 BLEND_MODE_SET_LOCATIONS(locations, 7);
1241 } 1561 }
1242 1562
1243 std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderString( 1563 std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderString(
1244 TexCoordPrecision precision, 1564 TexCoordPrecision precision,
1245 SamplerType sampler) const { 1565 SamplerType sampler) const {
1246 // clang-format off 1566 // clang-format off
1247 return FRAGMENT_SHADER( 1567 return FRAGMENT_SHADER(
1248 // clang-format on 1568 // clang-format on
1249 precision mediump float; 1569 precision mediump float;
1250 uniform SamplerType s_texture; 1570 uniform SamplerType s_texture;
(...skipping 13 matching lines...) Expand all
1264 texColor = colorMatrix * texColor + colorOffset; 1584 texColor = colorMatrix * texColor + colorOffset;
1265 texColor.rgb *= texColor.a; 1585 texColor.rgb *= texColor.a;
1266 texColor = clamp(texColor, 0.0, 1.0); 1586 texColor = clamp(texColor, 0.0, 1.0);
1267 TexCoordPrecision vec2 maskTexCoord = 1587 TexCoordPrecision vec2 maskTexCoord =
1268 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, 1588 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
1269 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); 1589 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
1270 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); 1590 vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
1271 vec4 d4 = min(edge_dist[0], edge_dist[1]); 1591 vec4 d4 = min(edge_dist[0], edge_dist[1]);
1272 vec2 d2 = min(d4.xz, d4.yw); 1592 vec2 d2 = min(d4.xz, d4.yw);
1273 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); 1593 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
1274 gl_FragColor = texColor * alpha * maskColor.w * aa; 1594 gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa);
1275 } 1595 }
1276 // clang-format off 1596 // clang-format off
1277 ); // NOLINT(whitespace/parens) 1597 ); // NOLINT(whitespace/parens)
1278 // clang-format on 1598 // clang-format on
1279 } 1599 }
1280 1600
1281 FragmentShaderRGBATexAlphaColorMatrixAA:: 1601 FragmentShaderRGBATexAlphaColorMatrixAA::
1282 FragmentShaderRGBATexAlphaColorMatrixAA() 1602 FragmentShaderRGBATexAlphaColorMatrixAA()
1283 : sampler_location_(-1), 1603 : sampler_location_(-1),
1284 alpha_location_(-1), 1604 alpha_location_(-1),
1285 color_matrix_location_(-1), 1605 color_matrix_location_(-1),
1286 color_offset_location_(-1) { 1606 color_offset_location_(-1) {
1287 } 1607 }
1288 1608
1289 void FragmentShaderRGBATexAlphaColorMatrixAA::Init(GLES2Interface* context, 1609 void FragmentShaderRGBATexAlphaColorMatrixAA::Init(GLES2Interface* context,
1290 unsigned program, 1610 unsigned program,
1291 int* base_uniform_index) { 1611 int* base_uniform_index) {
1292 static const char* uniforms[] = { 1612 static const char* uniforms[] = {
1293 "s_texture", "alpha", "colorMatrix", "colorOffset", 1613 "s_texture", "alpha", "colorMatrix", "colorOffset", BLEND_MODE_UNIFORMS,
1294 }; 1614 };
1295 int locations[arraysize(uniforms)]; 1615 int locations[arraysize(uniforms)];
1296 1616
1297 GetProgramUniformLocations(context, 1617 GetProgramUniformLocations(context,
1298 program, 1618 program,
1299 arraysize(uniforms), 1619 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
1300 uniforms, 1620 uniforms,
1301 locations, 1621 locations,
1302 base_uniform_index); 1622 base_uniform_index);
1303 sampler_location_ = locations[0]; 1623 sampler_location_ = locations[0];
1304 alpha_location_ = locations[1]; 1624 alpha_location_ = locations[1];
1305 color_matrix_location_ = locations[2]; 1625 color_matrix_location_ = locations[2];
1306 color_offset_location_ = locations[3]; 1626 color_offset_location_ = locations[3];
1627 BLEND_MODE_SET_LOCATIONS(locations, 4);
1307 } 1628 }
1308 1629
1309 std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderString( 1630 std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderString(
1310 TexCoordPrecision precision, 1631 TexCoordPrecision precision,
1311 SamplerType sampler) const { 1632 SamplerType sampler) const {
1312 // clang-format off 1633 // clang-format off
1313 return FRAGMENT_SHADER( 1634 return FRAGMENT_SHADER(
1314 // clang-format on 1635 // clang-format on
1315 precision mediump float; 1636 precision mediump float;
1316 uniform SamplerType s_texture; 1637 uniform SamplerType s_texture;
1317 uniform float alpha; 1638 uniform float alpha;
1318 uniform mat4 colorMatrix; 1639 uniform mat4 colorMatrix;
1319 uniform vec4 colorOffset; 1640 uniform vec4 colorOffset;
1320 varying TexCoordPrecision vec2 v_texCoord; 1641 varying TexCoordPrecision vec2 v_texCoord;
1321 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 1642 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
1322 1643
1323 void main() { 1644 void main() {
1324 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1645 vec4 texColor = TextureLookup(s_texture, v_texCoord);
1325 float nonZeroAlpha = max(texColor.a, 0.00001); 1646 float nonZeroAlpha = max(texColor.a, 0.00001);
1326 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); 1647 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
1327 texColor = colorMatrix * texColor + colorOffset; 1648 texColor = colorMatrix * texColor + colorOffset;
1328 texColor.rgb *= texColor.a; 1649 texColor.rgb *= texColor.a;
1329 texColor = clamp(texColor, 0.0, 1.0); 1650 texColor = clamp(texColor, 0.0, 1.0);
1330 vec4 d4 = min(edge_dist[0], edge_dist[1]); 1651 vec4 d4 = min(edge_dist[0], edge_dist[1]);
1331 vec2 d2 = min(d4.xz, d4.yw); 1652 vec2 d2 = min(d4.xz, d4.yw);
1332 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); 1653 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
1333 gl_FragColor = texColor * alpha * aa; 1654 gl_FragColor = ApplyBlendMode(texColor * alpha * aa);
1334 } 1655 }
1335 // clang-format off 1656 // clang-format off
1336 ); // NOLINT(whitespace/parens) 1657 ); // NOLINT(whitespace/parens)
1337 // clang-format on 1658 // clang-format on
1338 } 1659 }
1339 1660
1340 FragmentShaderRGBATexAlphaMaskColorMatrix:: 1661 FragmentShaderRGBATexAlphaMaskColorMatrix::
1341 FragmentShaderRGBATexAlphaMaskColorMatrix() 1662 FragmentShaderRGBATexAlphaMaskColorMatrix()
1342 : sampler_location_(-1), 1663 : sampler_location_(-1),
1343 mask_sampler_location_(-1), 1664 mask_sampler_location_(-1),
1344 alpha_location_(-1), 1665 alpha_location_(-1),
1345 mask_tex_coord_scale_location_(-1) { 1666 mask_tex_coord_scale_location_(-1) {
1346 } 1667 }
1347 1668
1348 void FragmentShaderRGBATexAlphaMaskColorMatrix::Init(GLES2Interface* context, 1669 void FragmentShaderRGBATexAlphaMaskColorMatrix::Init(GLES2Interface* context,
1349 unsigned program, 1670 unsigned program,
1350 int* base_uniform_index) { 1671 int* base_uniform_index) {
1351 static const char* uniforms[] = { 1672 static const char* uniforms[] = {
1352 "s_texture", 1673 "s_texture",
1353 "s_mask", 1674 "s_mask",
1354 "alpha", 1675 "alpha",
1355 "maskTexCoordScale", 1676 "maskTexCoordScale",
1356 "maskTexCoordOffset", 1677 "maskTexCoordOffset",
1357 "colorMatrix", 1678 "colorMatrix",
1358 "colorOffset", 1679 "colorOffset",
1680 BLEND_MODE_UNIFORMS,
1359 }; 1681 };
1360 int locations[arraysize(uniforms)]; 1682 int locations[arraysize(uniforms)];
1361 1683
1362 GetProgramUniformLocations(context, 1684 GetProgramUniformLocations(context,
1363 program, 1685 program,
1364 arraysize(uniforms), 1686 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS,
1365 uniforms, 1687 uniforms,
1366 locations, 1688 locations,
1367 base_uniform_index); 1689 base_uniform_index);
1368 sampler_location_ = locations[0]; 1690 sampler_location_ = locations[0];
1369 mask_sampler_location_ = locations[1]; 1691 mask_sampler_location_ = locations[1];
1370 alpha_location_ = locations[2]; 1692 alpha_location_ = locations[2];
1371 mask_tex_coord_scale_location_ = locations[3]; 1693 mask_tex_coord_scale_location_ = locations[3];
1372 mask_tex_coord_offset_location_ = locations[4]; 1694 mask_tex_coord_offset_location_ = locations[4];
1373 color_matrix_location_ = locations[5]; 1695 color_matrix_location_ = locations[5];
1374 color_offset_location_ = locations[6]; 1696 color_offset_location_ = locations[6];
1697 BLEND_MODE_SET_LOCATIONS(locations, 7);
1375 } 1698 }
1376 1699
1377 std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderString( 1700 std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderString(
1378 TexCoordPrecision precision, 1701 TexCoordPrecision precision,
1379 SamplerType sampler) const { 1702 SamplerType sampler) const {
1380 // clang-format off 1703 // clang-format off
1381 return FRAGMENT_SHADER( 1704 return FRAGMENT_SHADER(
1382 // clang-format on 1705 // clang-format on
1383 precision mediump float; 1706 precision mediump float;
1384 varying TexCoordPrecision vec2 v_texCoord; 1707 varying TexCoordPrecision vec2 v_texCoord;
1385 uniform SamplerType s_texture; 1708 uniform SamplerType s_texture;
1386 uniform SamplerType s_mask; 1709 uniform SamplerType s_mask;
1387 uniform vec2 maskTexCoordScale; 1710 uniform vec2 maskTexCoordScale;
1388 uniform vec2 maskTexCoordOffset; 1711 uniform vec2 maskTexCoordOffset;
1389 uniform mat4 colorMatrix; 1712 uniform mat4 colorMatrix;
1390 uniform vec4 colorOffset; 1713 uniform vec4 colorOffset;
1391 uniform float alpha; 1714 uniform float alpha;
1392 void main() { 1715 void main() {
1393 vec4 texColor = TextureLookup(s_texture, v_texCoord); 1716 vec4 texColor = TextureLookup(s_texture, v_texCoord);
1394 float nonZeroAlpha = max(texColor.a, 0.00001); 1717 float nonZeroAlpha = max(texColor.a, 0.00001);
1395 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); 1718 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
1396 texColor = colorMatrix * texColor + colorOffset; 1719 texColor = colorMatrix * texColor + colorOffset;
1397 texColor.rgb *= texColor.a; 1720 texColor.rgb *= texColor.a;
1398 texColor = clamp(texColor, 0.0, 1.0); 1721 texColor = clamp(texColor, 0.0, 1.0);
1399 TexCoordPrecision vec2 maskTexCoord = 1722 TexCoordPrecision vec2 maskTexCoord =
1400 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, 1723 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
1401 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); 1724 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
1402 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); 1725 vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
1403 gl_FragColor = texColor * alpha * maskColor.w; 1726 gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w);
1404 } 1727 }
1405 // clang-format off 1728 // clang-format off
1406 ); // NOLINT(whitespace/parens) 1729 ); // NOLINT(whitespace/parens)
1407 // clang-format on 1730 // clang-format on
1408 } 1731 }
1409 1732
1410 FragmentShaderYUVVideo::FragmentShaderYUVVideo() 1733 FragmentShaderYUVVideo::FragmentShaderYUVVideo()
1411 : y_texture_location_(-1), 1734 : y_texture_location_(-1),
1412 u_texture_location_(-1), 1735 u_texture_location_(-1),
1413 v_texture_location_(-1), 1736 v_texture_location_(-1),
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0); 1979 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0);
1657 float picker = abs(coord.x - coord.y); // NOLINT 1980 float picker = abs(coord.x - coord.y); // NOLINT
1658 gl_FragColor = mix(color1, color2, picker) * alpha; 1981 gl_FragColor = mix(color1, color2, picker) * alpha;
1659 } 1982 }
1660 // clang-format off 1983 // clang-format off
1661 ); // NOLINT(whitespace/parens) 1984 ); // NOLINT(whitespace/parens)
1662 // clang-format on 1985 // clang-format on
1663 } 1986 }
1664 1987
1665 } // namespace cc 1988 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/shader.h ('k') | cc/output/software_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698