| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |