Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ | 763 DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ |
| 764 backdrop_location_ = locations[POS]; \ | 764 backdrop_location_ = locations[POS]; \ |
| 765 original_backdrop_location_ = locations[POS + 1]; \ | 765 original_backdrop_location_ = locations[POS + 1]; \ |
| 766 backdrop_rect_location_ = locations[POS + 2]; \ | 766 backdrop_rect_location_ = locations[POS + 2]; \ |
| 767 } | 767 } |
| 768 | 768 |
| 769 FragmentShaderBase::FragmentShaderBase() {} | 769 FragmentShaderBase::FragmentShaderBase() {} |
| 770 | 770 |
| 771 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, | 771 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, |
| 772 SamplerType sampler) const { | 772 SamplerType sampler) const { |
| 773 // The AA shader values will use TexCoordPrecision. | |
| 774 if (has_aa_ && precision == TEX_COORD_PRECISION_NA) | |
| 775 precision = TEX_COORD_PRECISION_MEDIUM; | |
| 773 return SetFragmentTexCoordPrecision( | 776 return SetFragmentTexCoordPrecision( |
| 774 precision, SetFragmentSamplerType( | 777 precision, SetFragmentSamplerType( |
| 775 sampler, SetBlendModeFunctions(GetShaderSource()))); | 778 sampler, SetBlendModeFunctions(GetShaderSource()))); |
| 776 } | 779 } |
| 777 | 780 |
| 778 void FragmentShaderBase::Init(GLES2Interface* context, | 781 void FragmentShaderBase::Init(GLES2Interface* context, |
| 779 unsigned program, | 782 unsigned program, |
| 780 int* base_uniform_index) { | 783 int* base_uniform_index) { |
| 781 std::vector<const char*> uniforms; | 784 std::vector<const char*> uniforms; |
| 782 std::vector<int> locations; | 785 std::vector<int> locations; |
| 783 if (has_blend_mode()) { | 786 if (has_blend_mode()) { |
| 784 uniforms.push_back("s_backdropTexture"); | 787 uniforms.push_back("s_backdropTexture"); |
| 785 uniforms.push_back("s_originalBackdropTexture"); | 788 uniforms.push_back("s_originalBackdropTexture"); |
| 786 uniforms.push_back("backdropRect"); | 789 uniforms.push_back("backdropRect"); |
| 787 } | 790 } |
| 788 if (has_mask_sampler_) { | 791 if (has_mask_sampler_) { |
| 789 uniforms.push_back("s_mask"); | 792 uniforms.push_back("s_mask"); |
| 790 uniforms.push_back("maskTexCoordScale"); | 793 uniforms.push_back("maskTexCoordScale"); |
| 791 uniforms.push_back("maskTexCoordOffset"); | 794 uniforms.push_back("maskTexCoordOffset"); |
| 792 } | 795 } |
| 793 if (has_color_matrix_) { | 796 if (has_color_matrix_) { |
| 794 uniforms.push_back("colorMatrix"); | 797 uniforms.push_back("colorMatrix"); |
| 795 uniforms.push_back("colorOffset"); | 798 uniforms.push_back("colorOffset"); |
| 796 } | 799 } |
| 797 if (has_sampler_) | |
| 798 uniforms.push_back("s_texture"); | |
| 799 if (has_uniform_alpha_) | 800 if (has_uniform_alpha_) |
| 800 uniforms.push_back("alpha"); | 801 uniforms.push_back("alpha"); |
| 801 if (has_background_color_) | 802 if (has_background_color_) |
| 802 uniforms.push_back("background_color"); | 803 uniforms.push_back("background_color"); |
| 803 if (has_fragment_tex_transform_) | 804 switch (input_color_type_) { |
| 804 uniforms.push_back("fragmentTexTransform"); | 805 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: |
| 805 if (has_uniform_color_) | 806 uniforms.push_back("s_texture"); |
| 806 uniforms.push_back("color"); | 807 if (has_rgba_fragment_tex_transform_) |
| 808 uniforms.push_back("fragmentTexTransform"); | |
| 809 break; | |
| 810 case INPUT_COLOR_SOURCE_UNIFORM: | |
| 811 uniforms.push_back("color"); | |
| 812 break; | |
| 813 } | |
| 807 | 814 |
| 808 locations.resize(uniforms.size()); | 815 locations.resize(uniforms.size()); |
| 809 | 816 |
| 810 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), | 817 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), |
| 811 locations.data(), base_uniform_index); | 818 locations.data(), base_uniform_index); |
| 812 | 819 |
| 813 size_t index = 0; | 820 size_t index = 0; |
| 814 if (has_blend_mode()) { | 821 if (has_blend_mode()) { |
| 815 backdrop_location_ = locations[index++]; | 822 backdrop_location_ = locations[index++]; |
| 816 original_backdrop_location_ = locations[index++]; | 823 original_backdrop_location_ = locations[index++]; |
| 817 backdrop_rect_location_ = locations[index++]; | 824 backdrop_rect_location_ = locations[index++]; |
| 818 } | 825 } |
| 819 if (has_mask_sampler_) { | 826 if (has_mask_sampler_) { |
| 820 mask_sampler_location_ = locations[index++]; | 827 mask_sampler_location_ = locations[index++]; |
| 821 mask_tex_coord_scale_location_ = locations[index++]; | 828 mask_tex_coord_scale_location_ = locations[index++]; |
| 822 mask_tex_coord_offset_location_ = locations[index++]; | 829 mask_tex_coord_offset_location_ = locations[index++]; |
| 823 } | 830 } |
| 824 if (has_color_matrix_) { | 831 if (has_color_matrix_) { |
| 825 color_matrix_location_ = locations[index++]; | 832 color_matrix_location_ = locations[index++]; |
| 826 color_offset_location_ = locations[index++]; | 833 color_offset_location_ = locations[index++]; |
| 827 } | 834 } |
| 828 if (has_sampler_) | |
| 829 sampler_location_ = locations[index++]; | |
| 830 if (has_uniform_alpha_) | 835 if (has_uniform_alpha_) |
| 831 alpha_location_ = locations[index++]; | 836 alpha_location_ = locations[index++]; |
| 832 if (has_background_color_) | 837 if (has_background_color_) |
| 833 background_color_location_ = locations[index++]; | 838 background_color_location_ = locations[index++]; |
| 834 if (has_fragment_tex_transform_) | 839 switch (input_color_type_) { |
| 835 fragment_tex_transform_location_ = locations[index++]; | 840 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: |
| 836 if (has_uniform_color_) | 841 sampler_location_ = locations[index++]; |
| 837 color_location_ = locations[index++]; | 842 if (has_rgba_fragment_tex_transform_) |
| 843 fragment_tex_transform_location_ = locations[index++]; | |
| 844 break; | |
| 845 case INPUT_COLOR_SOURCE_UNIFORM: | |
| 846 color_location_ = locations[index++]; | |
| 847 break; | |
| 848 } | |
| 838 DCHECK_EQ(index, locations.size()); | 849 DCHECK_EQ(index, locations.size()); |
| 839 } | 850 } |
| 840 | 851 |
| 841 void FragmentShaderBase::FillLocations(ShaderLocations* locations) const { | 852 void FragmentShaderBase::FillLocations(ShaderLocations* locations) const { |
| 842 if (has_blend_mode()) { | 853 if (has_blend_mode()) { |
| 843 locations->backdrop = backdrop_location_; | 854 locations->backdrop = backdrop_location_; |
| 844 locations->backdrop_rect = backdrop_rect_location_; | 855 locations->backdrop_rect = backdrop_rect_location_; |
| 845 } | 856 } |
| 846 if (mask_for_background()) | 857 if (mask_for_background()) |
| 847 locations->original_backdrop = original_backdrop_location_; | 858 locations->original_backdrop = original_backdrop_location_; |
| 848 if (has_mask_sampler_) { | 859 if (has_mask_sampler_) { |
| 849 locations->mask_sampler = mask_sampler_location_; | 860 locations->mask_sampler = mask_sampler_location_; |
| 850 locations->mask_tex_coord_scale = mask_tex_coord_scale_location_; | 861 locations->mask_tex_coord_scale = mask_tex_coord_scale_location_; |
| 851 locations->mask_tex_coord_offset = mask_tex_coord_offset_location_; | 862 locations->mask_tex_coord_offset = mask_tex_coord_offset_location_; |
| 852 } | 863 } |
| 853 if (has_color_matrix_) { | 864 if (has_color_matrix_) { |
| 854 locations->color_matrix = color_matrix_location_; | 865 locations->color_matrix = color_matrix_location_; |
| 855 locations->color_offset = color_offset_location_; | 866 locations->color_offset = color_offset_location_; |
| 856 } | 867 } |
| 857 if (has_sampler_) | |
| 858 locations->sampler = sampler_location_; | |
| 859 if (has_uniform_alpha_) | 868 if (has_uniform_alpha_) |
| 860 locations->alpha = alpha_location_; | 869 locations->alpha = alpha_location_; |
| 870 switch (input_color_type_) { | |
| 871 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: | |
| 872 locations->sampler = sampler_location_; | |
| 873 break; | |
| 874 case INPUT_COLOR_SOURCE_UNIFORM: | |
| 875 break; | |
| 876 } | |
| 861 } | 877 } |
| 862 | 878 |
| 863 std::string FragmentShaderBase::SetBlendModeFunctions( | 879 std::string FragmentShaderBase::SetBlendModeFunctions( |
| 864 const std::string& shader_string) const { | 880 const std::string& shader_string) const { |
| 865 if (shader_string.find("ApplyBlendMode") == std::string::npos) | 881 if (shader_string.find("ApplyBlendMode") == std::string::npos) |
| 866 return shader_string; | 882 return shader_string; |
| 867 | 883 |
| 868 if (!has_blend_mode()) { | 884 if (!has_blend_mode()) { |
| 869 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; | 885 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; |
| 870 } | 886 } |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1148 "result.rgb = set_luminance(dst.rgb * src.a," | 1164 "result.rgb = set_luminance(dst.rgb * src.a," |
| 1149 " srcDstAlpha.a," | 1165 " srcDstAlpha.a," |
| 1150 " srcDstAlpha.rgb);" | 1166 " srcDstAlpha.rgb);" |
| 1151 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 1167 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
| 1152 case BLEND_MODE_NONE: | 1168 case BLEND_MODE_NONE: |
| 1153 NOTREACHED(); | 1169 NOTREACHED(); |
| 1154 } | 1170 } |
| 1155 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; | 1171 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; |
| 1156 } | 1172 } |
| 1157 | 1173 |
| 1158 std::string FragmentShaderRGBATexAlpha::GetShaderSource() const { | 1174 std::string FragmentShaderBase::GetShaderSource() const { |
|
enne (OOO)
2017/01/03 21:42:58
Maybe this should be a followup, but it does seem
ccameron
2017/01/03 22:12:27
Yeah, they should definitely be handled in a simil
| |
| 1159 return SHADER0([]() { | 1175 std::string header = "precision mediump float;\n"; |
| 1160 precision mediump float; | 1176 std::string source = "void main() {\n"; |
| 1161 varying TexCoordPrecision vec2 v_texCoord; | |
| 1162 uniform SamplerType s_texture; | |
| 1163 uniform float alpha; | |
| 1164 void main() { | |
| 1165 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1166 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); | |
| 1167 } | |
| 1168 }); | |
| 1169 } | |
| 1170 | 1177 |
| 1171 std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderSource() const { | 1178 #define HDR(x) header += x + std::string("\n"); |
|
enne (OOO)
2017/01/03 21:42:58
Style nit: sure sure, macros are fine, but I like
ccameron
2017/01/03 22:12:27
Good call. Wrapped them a do{} while(0) to be more
| |
| 1172 return SHADER0([]() { | 1179 #define SRC(x) source += std::string(" ") + x + std::string("\n"); |
| 1173 precision mediump float; | |
| 1174 varying TexCoordPrecision vec2 v_texCoord; | |
| 1175 uniform SamplerType s_texture; | |
| 1176 uniform float alpha; | |
| 1177 uniform mat4 colorMatrix; | |
| 1178 uniform vec4 colorOffset; | |
| 1179 void main() { | |
| 1180 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1181 float nonZeroAlpha = max(texColor.a, 0.00001); | |
| 1182 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | |
| 1183 texColor = colorMatrix * texColor + colorOffset; | |
| 1184 texColor.rgb *= texColor.a; | |
| 1185 texColor = clamp(texColor, 0.0, 1.0); | |
| 1186 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); | |
| 1187 } | |
| 1188 }); | |
| 1189 } | |
| 1190 | 1180 |
| 1191 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderSource() const { | 1181 // Read the input into vec4 texColor. |
| 1192 return SHADER0([]() { | 1182 switch (input_color_type_) { |
| 1193 precision mediump float; | 1183 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: |
| 1194 varying TexCoordPrecision vec2 v_texCoord; | 1184 if (has_rgba_as_sampler_2d_) |
| 1195 varying float v_alpha; | 1185 HDR("uniform sampler2D s_texture;") |
| 1196 uniform SamplerType s_texture; | 1186 else |
| 1197 void main() { | 1187 HDR("uniform SamplerType s_texture;") |
| 1198 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1188 HDR("varying TexCoordPrecision vec2 v_texCoord;") |
| 1199 gl_FragColor = texColor * v_alpha; | 1189 if (has_rgba_fragment_tex_transform_) { |
| 1200 } | 1190 HDR("uniform TexCoordPrecision vec4 fragmentTexTransform;") |
| 1201 }); | 1191 SRC("// Transformed texture lookup") |
| 1202 } | 1192 SRC("TexCoordPrecision vec2 texCoord =") |
| 1193 SRC(" clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw +") | |
| 1194 SRC(" fragmentTexTransform.xy;") | |
| 1195 SRC("vec4 texColor = TextureLookup(s_texture, texCoord);") | |
| 1196 DCHECK(!has_rgba_as_sampler_2d_); | |
| 1197 } else { | |
| 1198 SRC("// Texture lookup"); | |
| 1199 if (has_rgba_as_sampler_2d_) | |
| 1200 SRC("vec4 texColor = texture2D(s_texture, v_texCoord);") | |
| 1201 else | |
| 1202 SRC("vec4 texColor = TextureLookup(s_texture, v_texCoord);") | |
| 1203 } | |
| 1204 break; | |
| 1205 case INPUT_COLOR_SOURCE_UNIFORM: | |
| 1206 DCHECK(!has_rgba_as_sampler_2d_); | |
| 1207 DCHECK(!has_rgba_fragment_tex_transform_); | |
| 1208 HDR("uniform vec4 color;") | |
| 1209 SRC("// Uniform color") | |
| 1210 SRC("vec4 texColor = color;") | |
| 1211 break; | |
| 1212 } | |
| 1213 // Apply the color matrix to texColor. | |
| 1214 if (has_color_matrix_) { | |
| 1215 HDR("uniform mat4 colorMatrix;"); | |
| 1216 HDR("uniform vec4 colorOffset;"); | |
| 1217 SRC("// Apply color matrix") | |
| 1218 SRC("float nonZeroAlpha = max(texColor.a, 0.00001);") | |
| 1219 SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);") | |
| 1220 SRC("texColor = colorMatrix * texColor + colorOffset;") | |
| 1221 SRC("texColor.rgb *= texColor.a;") | |
| 1222 SRC("texColor = clamp(texColor, 0.0, 1.0);") | |
| 1223 } | |
| 1203 | 1224 |
| 1204 std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderSource() const { | 1225 // Read the mask texture. |
| 1205 return SHADER0([]() { | 1226 if (has_mask_sampler_) { |
| 1206 precision mediump float; | 1227 HDR("uniform SamplerType s_mask;") |
| 1207 varying TexCoordPrecision vec2 v_texCoord; | 1228 HDR("uniform vec2 maskTexCoordScale;") |
| 1208 varying float v_alpha; | 1229 HDR("uniform vec2 maskTexCoordOffset;") |
| 1209 uniform SamplerType s_texture; | 1230 SRC("// Read the mask") |
| 1210 void main() { | 1231 SRC("TexCoordPrecision vec2 maskTexCoord =") |
| 1211 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1232 SRC(" vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,") |
| 1212 texColor.rgb *= texColor.a; | 1233 SRC(" maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);") |
| 1213 gl_FragColor = texColor * v_alpha; | 1234 SRC("vec4 maskColor = TextureLookup(s_mask, maskTexCoord);") |
| 1214 } | 1235 } |
| 1215 }); | |
| 1216 } | |
| 1217 | 1236 |
| 1218 std::string FragmentShaderTexBackgroundVaryingAlpha::GetShaderSource() const { | 1237 // Compute AA. |
| 1219 return SHADER0([]() { | 1238 if (has_aa_) { |
| 1220 precision mediump float; | 1239 HDR("varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances."); |
| 1221 varying TexCoordPrecision vec2 v_texCoord; | 1240 SRC("// Compute AA") |
| 1222 varying float v_alpha; | 1241 SRC("vec4 d4 = min(edge_dist[0], edge_dist[1]);") |
| 1223 uniform vec4 background_color; | 1242 SRC("vec2 d2 = min(d4.xz, d4.yw);") |
| 1224 uniform SamplerType s_texture; | 1243 SRC("float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);") |
| 1225 void main() { | 1244 } |
| 1226 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1227 texColor += background_color * (1.0 - texColor.a); | |
| 1228 gl_FragColor = texColor * v_alpha; | |
| 1229 } | |
| 1230 }); | |
| 1231 } | |
| 1232 | 1245 |
| 1233 std::string FragmentShaderTexBackgroundPremultiplyAlpha::GetShaderSource() | 1246 // Premultiply by alpha. |
| 1234 const { | 1247 if (has_premultiply_alpha_) { |
| 1235 return SHADER0([]() { | 1248 SRC("// Premultiply alpha") |
| 1236 precision mediump float; | 1249 SRC("texColor.rgb *= texColor.a;") |
| 1237 varying TexCoordPrecision vec2 v_texCoord; | 1250 } |
| 1238 varying float v_alpha; | |
| 1239 uniform vec4 background_color; | |
| 1240 uniform SamplerType s_texture; | |
| 1241 void main() { | |
| 1242 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1243 texColor.rgb *= texColor.a; | |
| 1244 texColor += background_color * (1.0 - texColor.a); | |
| 1245 gl_FragColor = texColor * v_alpha; | |
| 1246 } | |
| 1247 }); | |
| 1248 } | |
| 1249 | 1251 |
| 1250 std::string FragmentShaderRGBATexOpaque::GetShaderSource() const { | 1252 // Apply background texture. |
| 1251 return SHADER0([]() { | 1253 if (has_background_color_) { |
| 1252 precision mediump float; | 1254 HDR("uniform vec4 background_color;") |
| 1253 varying TexCoordPrecision vec2 v_texCoord; | 1255 SRC("// Apply uniform background color blending") |
| 1254 uniform SamplerType s_texture; | 1256 SRC("texColor += background_color * (1.0 - texColor.a);") |
| 1255 void main() { | 1257 } |
| 1256 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1257 gl_FragColor = vec4(texColor.rgb, 1.0); | |
| 1258 } | |
| 1259 }); | |
| 1260 } | |
| 1261 | 1258 |
| 1262 std::string FragmentShaderRGBATex::GetShaderSource() const { | 1259 // Apply swizzle. |
| 1263 return SHADER0([]() { | 1260 if (has_swizzle_) { |
| 1264 precision mediump float; | 1261 SRC("// Apply swizzle") |
| 1265 varying TexCoordPrecision vec2 v_texCoord; | 1262 SRC("texColor = texColor.bgra;\n") |
| 1266 uniform SamplerType s_texture; | 1263 } |
| 1267 void main() { gl_FragColor = TextureLookup(s_texture, v_texCoord); } | |
| 1268 }); | |
| 1269 } | |
| 1270 | 1264 |
| 1271 std::string FragmentShaderRGBATexSwizzleAlpha::GetShaderSource() const { | 1265 // Include header text for alpha. |
| 1272 return SHADER0([]() { | 1266 if (has_uniform_alpha_) { |
| 1273 precision mediump float; | 1267 HDR("uniform float alpha;") |
| 1274 varying TexCoordPrecision vec2 v_texCoord; | 1268 } |
| 1275 uniform SamplerType s_texture; | 1269 if (has_varying_alpha_) { |
| 1276 uniform float alpha; | 1270 HDR("varying float v_alpha;") |
| 1277 void main() { | 1271 } |
| 1278 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1279 gl_FragColor = | |
| 1280 vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha; | |
| 1281 } | |
| 1282 }); | |
| 1283 } | |
| 1284 | 1272 |
| 1285 std::string FragmentShaderRGBATexSwizzleOpaque::GetShaderSource() const { | 1273 // Apply uniform alpha, aa, varying alpha, and the mask. |
| 1286 return SHADER0([]() { | 1274 if (has_varying_alpha_ || has_aa_ || has_uniform_alpha_ || |
| 1287 precision mediump float; | 1275 has_mask_sampler_) { |
| 1288 varying TexCoordPrecision vec2 v_texCoord; | 1276 SRC("// Apply alpha from uniform, varying, aa, and mask.") |
| 1289 uniform SamplerType s_texture; | 1277 std::string line = " texColor = texColor"; |
| 1290 void main() { | 1278 if (has_varying_alpha_) |
| 1291 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1279 line += " * v_alpha"; |
| 1292 gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0); | 1280 if (has_uniform_alpha_) |
| 1293 } | 1281 line += " * alpha"; |
| 1294 }); | 1282 if (has_aa_) |
| 1295 } | 1283 line += " * aa"; |
| 1284 if (has_mask_sampler_) | |
| 1285 line += " * maskColor.a"; | |
| 1286 line += ";\n"; | |
| 1287 source += line; | |
| 1288 } | |
| 1296 | 1289 |
| 1297 std::string FragmentShaderRGBATexAlphaAA::GetShaderSource() const { | 1290 // Write the fragment color. |
| 1298 return SHADER0([]() { | 1291 SRC("// Write the fragment color") |
| 1299 precision mediump float; | 1292 switch (frag_color_mode_) { |
| 1300 uniform SamplerType s_texture; | 1293 case FRAG_COLOR_MODE_DEFAULT: |
| 1301 uniform float alpha; | 1294 DCHECK_EQ(blend_mode_, BLEND_MODE_NONE); |
| 1302 varying TexCoordPrecision vec2 v_texCoord; | 1295 SRC("gl_FragColor = texColor;") |
| 1303 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | 1296 break; |
| 1304 void main() { | 1297 case FRAG_COLOR_MODE_OPAQUE: |
| 1305 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1298 DCHECK_EQ(blend_mode_, BLEND_MODE_NONE); |
| 1306 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1299 SRC("gl_FragColor = vec4(texColor.rgb, 1.0);") |
| 1307 vec2 d2 = min(d4.xz, d4.yw); | 1300 break; |
| 1308 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1301 case FRAG_COLOR_MODE_APPLY_BLEND_MODE: |
| 1309 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); | 1302 if (has_mask_sampler_) |
| 1310 } | 1303 SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);") |
| 1311 }); | 1304 else |
| 1312 } | 1305 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);") |
| 1306 break; | |
| 1307 } | |
| 1308 source += "}\n"; | |
| 1313 | 1309 |
| 1314 std::string FragmentShaderRGBATexClampAlphaAA::GetShaderSource() const { | 1310 #undef HDR |
| 1315 return SHADER0([]() { | 1311 #undef SRC |
| 1316 precision mediump float; | |
| 1317 uniform SamplerType s_texture; | |
| 1318 uniform float alpha; | |
| 1319 uniform TexCoordPrecision vec4 fragmentTexTransform; | |
| 1320 varying TexCoordPrecision vec2 v_texCoord; | |
| 1321 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
| 1322 void main() { | |
| 1323 TexCoordPrecision vec2 texCoord = | |
| 1324 clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw + | |
| 1325 fragmentTexTransform.xy; | |
| 1326 vec4 texColor = TextureLookup(s_texture, texCoord); | |
| 1327 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1328 vec2 d2 = min(d4.xz, d4.yw); | |
| 1329 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1330 gl_FragColor = texColor * alpha * aa; | |
| 1331 } | |
| 1332 }); | |
| 1333 } | |
| 1334 | 1312 |
| 1335 std::string FragmentShaderRGBATexClampSwizzleAlphaAA::GetShaderSource() const { | 1313 return header + source; |
| 1336 return SHADER0([]() { | |
| 1337 precision mediump float; | |
| 1338 uniform SamplerType s_texture; | |
| 1339 uniform float alpha; | |
| 1340 uniform TexCoordPrecision vec4 fragmentTexTransform; | |
| 1341 varying TexCoordPrecision vec2 v_texCoord; | |
| 1342 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
| 1343 void main() { | |
| 1344 TexCoordPrecision vec2 texCoord = | |
| 1345 clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw + | |
| 1346 fragmentTexTransform.xy; | |
| 1347 vec4 texColor = TextureLookup(s_texture, texCoord); | |
| 1348 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1349 vec2 d2 = min(d4.xz, d4.yw); | |
| 1350 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1351 gl_FragColor = | |
| 1352 vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * aa; | |
| 1353 } | |
| 1354 }); | |
| 1355 } | |
| 1356 | |
| 1357 std::string FragmentShaderRGBATexAlphaMask::GetShaderSource() const { | |
| 1358 return SHADER0([]() { | |
| 1359 precision mediump float; | |
| 1360 varying TexCoordPrecision vec2 v_texCoord; | |
| 1361 uniform sampler2D s_texture; | |
| 1362 uniform SamplerType s_mask; | |
| 1363 uniform TexCoordPrecision vec2 maskTexCoordScale; | |
| 1364 uniform TexCoordPrecision vec2 maskTexCoordOffset; | |
| 1365 uniform float alpha; | |
| 1366 void main() { | |
| 1367 vec4 texColor = texture2D(s_texture, v_texCoord); | |
| 1368 TexCoordPrecision vec2 maskTexCoord = | |
| 1369 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | |
| 1370 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | |
| 1371 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | |
| 1372 gl_FragColor = ApplyBlendMode( | |
| 1373 texColor * alpha * maskColor.w, maskColor.w); | |
| 1374 } | |
| 1375 }); | |
| 1376 } | |
| 1377 | |
| 1378 std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderSource() const { | |
| 1379 return SHADER0([]() { | |
| 1380 precision mediump float; | |
| 1381 uniform sampler2D s_texture; | |
| 1382 uniform SamplerType s_mask; | |
| 1383 uniform TexCoordPrecision vec2 maskTexCoordScale; | |
| 1384 uniform TexCoordPrecision vec2 maskTexCoordOffset; | |
| 1385 uniform float alpha; | |
| 1386 varying TexCoordPrecision vec2 v_texCoord; | |
| 1387 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
| 1388 void main() { | |
| 1389 vec4 texColor = texture2D(s_texture, v_texCoord); | |
| 1390 TexCoordPrecision vec2 maskTexCoord = | |
| 1391 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | |
| 1392 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | |
| 1393 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | |
| 1394 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1395 vec2 d2 = min(d4.xz, d4.yw); | |
| 1396 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1397 gl_FragColor = ApplyBlendMode( | |
| 1398 texColor * alpha * maskColor.w * aa, maskColor.w); | |
| 1399 } | |
| 1400 }); | |
| 1401 } | |
| 1402 | |
| 1403 std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderSource() | |
| 1404 const { | |
| 1405 return SHADER0([]() { | |
| 1406 precision mediump float; | |
| 1407 uniform sampler2D s_texture; | |
| 1408 uniform SamplerType s_mask; | |
| 1409 uniform vec2 maskTexCoordScale; | |
| 1410 uniform vec2 maskTexCoordOffset; | |
| 1411 uniform mat4 colorMatrix; | |
| 1412 uniform vec4 colorOffset; | |
| 1413 uniform float alpha; | |
| 1414 varying TexCoordPrecision vec2 v_texCoord; | |
| 1415 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
| 1416 void main() { | |
| 1417 vec4 texColor = texture2D(s_texture, v_texCoord); | |
| 1418 float nonZeroAlpha = max(texColor.a, 0.00001); | |
| 1419 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | |
| 1420 texColor = colorMatrix * texColor + colorOffset; | |
| 1421 texColor.rgb *= texColor.a; | |
| 1422 texColor = clamp(texColor, 0.0, 1.0); | |
| 1423 TexCoordPrecision vec2 maskTexCoord = | |
| 1424 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | |
| 1425 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | |
| 1426 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | |
| 1427 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1428 vec2 d2 = min(d4.xz, d4.yw); | |
| 1429 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1430 gl_FragColor = ApplyBlendMode( | |
| 1431 texColor * alpha * maskColor.w * aa, maskColor.w); | |
| 1432 } | |
| 1433 }); | |
| 1434 } | |
| 1435 | |
| 1436 std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderSource() const { | |
| 1437 return SHADER0([]() { | |
| 1438 precision mediump float; | |
| 1439 uniform SamplerType s_texture; | |
| 1440 uniform float alpha; | |
| 1441 uniform mat4 colorMatrix; | |
| 1442 uniform vec4 colorOffset; | |
| 1443 varying TexCoordPrecision vec2 v_texCoord; | |
| 1444 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
| 1445 void main() { | |
| 1446 vec4 texColor = TextureLookup(s_texture, v_texCoord); | |
| 1447 float nonZeroAlpha = max(texColor.a, 0.00001); | |
| 1448 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | |
| 1449 texColor = colorMatrix * texColor + colorOffset; | |
| 1450 texColor.rgb *= texColor.a; | |
| 1451 texColor = clamp(texColor, 0.0, 1.0); | |
| 1452 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1453 vec2 d2 = min(d4.xz, d4.yw); | |
| 1454 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1455 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); | |
| 1456 } | |
| 1457 }); | |
| 1458 } | |
| 1459 | |
| 1460 std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderSource() const { | |
| 1461 return SHADER0([]() { | |
| 1462 precision mediump float; | |
| 1463 varying TexCoordPrecision vec2 v_texCoord; | |
| 1464 uniform sampler2D s_texture; | |
| 1465 uniform SamplerType s_mask; | |
| 1466 uniform vec2 maskTexCoordScale; | |
| 1467 uniform vec2 maskTexCoordOffset; | |
| 1468 uniform mat4 colorMatrix; | |
| 1469 uniform vec4 colorOffset; | |
| 1470 uniform float alpha; | |
| 1471 void main() { | |
| 1472 vec4 texColor = texture2D(s_texture, v_texCoord); | |
| 1473 float nonZeroAlpha = max(texColor.a, 0.00001); | |
| 1474 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | |
| 1475 texColor = colorMatrix * texColor + colorOffset; | |
| 1476 texColor.rgb *= texColor.a; | |
| 1477 texColor = clamp(texColor, 0.0, 1.0); | |
| 1478 TexCoordPrecision vec2 maskTexCoord = | |
| 1479 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | |
| 1480 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | |
| 1481 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | |
| 1482 gl_FragColor = ApplyBlendMode( | |
| 1483 texColor * alpha * maskColor.w, maskColor.w); | |
| 1484 } | |
| 1485 }); | |
| 1486 } | 1314 } |
| 1487 | 1315 |
| 1488 FragmentShaderYUVVideo::FragmentShaderYUVVideo() | 1316 FragmentShaderYUVVideo::FragmentShaderYUVVideo() |
| 1489 : y_texture_location_(-1), | 1317 : y_texture_location_(-1), |
| 1490 u_texture_location_(-1), | 1318 u_texture_location_(-1), |
| 1491 v_texture_location_(-1), | 1319 v_texture_location_(-1), |
| 1492 uv_texture_location_(-1), | 1320 uv_texture_location_(-1), |
| 1493 a_texture_location_(-1), | 1321 a_texture_location_(-1), |
| 1494 lut_texture_location_(-1), | 1322 lut_texture_location_(-1), |
| 1495 alpha_location_(-1), | 1323 alpha_location_(-1), |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1640 vec2 uv_clamped = | 1468 vec2 uv_clamped = |
| 1641 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); | 1469 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); |
| 1642 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); | 1470 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); |
| 1643 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); | 1471 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); |
| 1644 } | 1472 } |
| 1645 }); | 1473 }); |
| 1646 | 1474 |
| 1647 return head + functions; | 1475 return head + functions; |
| 1648 } | 1476 } |
| 1649 | 1477 |
| 1650 std::string FragmentShaderColor::GetShaderSource() const { | |
| 1651 return SHADER0([]() { | |
| 1652 precision mediump float; | |
| 1653 uniform vec4 color; | |
| 1654 void main() { gl_FragColor = color; } | |
| 1655 }); | |
| 1656 } | |
| 1657 | |
| 1658 std::string FragmentShaderColorAA::GetShaderSource() const { | |
| 1659 return SHADER0([]() { | |
| 1660 precision mediump float; | |
| 1661 uniform vec4 color; | |
| 1662 varying vec4 edge_dist[2]; // 8 edge distances. | |
| 1663 void main() { | |
| 1664 vec4 d4 = min(edge_dist[0], edge_dist[1]); | |
| 1665 vec2 d2 = min(d4.xz, d4.yw); | |
| 1666 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | |
| 1667 gl_FragColor = color * aa; | |
| 1668 } | |
| 1669 }); | |
| 1670 } | |
| 1671 | |
| 1672 } // namespace cc | 1478 } // namespace cc |
| OLD | NEW |