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 | 11 |
11 #include "base/logging.h" | 12 #include "base/logging.h" |
12 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
13 #include "cc/output/static_geometry_binding.h" | 14 #include "cc/output/static_geometry_binding.h" |
14 #include "gpu/command_buffer/client/gles2_interface.h" | 15 #include "gpu/command_buffer/client/gles2_interface.h" |
15 #include "ui/gfx/geometry/point.h" | 16 #include "ui/gfx/geometry/point.h" |
16 #include "ui/gfx/geometry/size.h" | 17 #include "ui/gfx/geometry/size.h" |
17 | 18 |
18 template <size_t size> | 19 template <size_t size> |
19 std::string StripLambda(const char(&shader)[size]) { | 20 std::string StripLambda(const char(&shader)[size]) { |
(...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 "backdropRect" | 759 "backdropRect" |
759 #define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0) | 760 #define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0) |
760 #define BLEND_MODE_SET_LOCATIONS(X, POS) \ | 761 #define BLEND_MODE_SET_LOCATIONS(X, POS) \ |
761 if (has_blend_mode()) { \ | 762 if (has_blend_mode()) { \ |
762 DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ | 763 DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ |
763 backdrop_location_ = locations[POS]; \ | 764 backdrop_location_ = locations[POS]; \ |
764 original_backdrop_location_ = locations[POS + 1]; \ | 765 original_backdrop_location_ = locations[POS + 1]; \ |
765 backdrop_rect_location_ = locations[POS + 2]; \ | 766 backdrop_rect_location_ = locations[POS + 2]; \ |
766 } | 767 } |
767 | 768 |
768 FragmentShaderBase::FragmentShaderBase() | 769 FragmentShaderBase::FragmentShaderBase() {} |
769 : backdrop_location_(-1), | |
770 original_backdrop_location_(-1), | |
771 backdrop_rect_location_(-1), | |
772 blend_mode_(BLEND_MODE_NONE), | |
773 mask_for_background_(false) {} | |
774 | 770 |
775 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, | 771 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, |
776 SamplerType sampler) const { | 772 SamplerType sampler) const { |
777 return SetFragmentTexCoordPrecision( | 773 return SetFragmentTexCoordPrecision( |
778 precision, SetFragmentSamplerType( | 774 precision, SetFragmentSamplerType( |
779 sampler, SetBlendModeFunctions(GetShaderSource()))); | 775 sampler, SetBlendModeFunctions(GetShaderSource()))); |
780 } | 776 } |
781 | 777 |
| 778 void FragmentShaderBase::Init(GLES2Interface* context, |
| 779 unsigned program, |
| 780 int* base_uniform_index) { |
| 781 std::vector<const char*> uniforms; |
| 782 std::vector<int> locations; |
| 783 if (has_blend_mode()) { |
| 784 uniforms.push_back("s_backdropTexture"); |
| 785 uniforms.push_back("s_originalBackdropTexture"); |
| 786 uniforms.push_back("backdropRect"); |
| 787 } |
| 788 if (has_mask_sampler_) { |
| 789 uniforms.push_back("s_mask"); |
| 790 uniforms.push_back("maskTexCoordScale"); |
| 791 uniforms.push_back("maskTexCoordOffset"); |
| 792 } |
| 793 if (has_color_matrix_) { |
| 794 uniforms.push_back("colorMatrix"); |
| 795 uniforms.push_back("colorOffset"); |
| 796 } |
| 797 if (has_sampler_) |
| 798 uniforms.push_back("s_texture"); |
| 799 if (has_uniform_alpha_) |
| 800 uniforms.push_back("alpha"); |
| 801 if (has_background_color_) |
| 802 uniforms.push_back("background_color"); |
| 803 if (has_fragment_tex_transform_) |
| 804 uniforms.push_back("fragmentTexTransform"); |
| 805 if (has_uniform_color_) |
| 806 uniforms.push_back("color"); |
| 807 |
| 808 locations.resize(uniforms.size()); |
| 809 |
| 810 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), |
| 811 locations.data(), base_uniform_index); |
| 812 |
| 813 size_t index = 0; |
| 814 if (has_blend_mode()) { |
| 815 backdrop_location_ = locations[index++]; |
| 816 original_backdrop_location_ = locations[index++]; |
| 817 backdrop_rect_location_ = locations[index++]; |
| 818 } |
| 819 if (has_mask_sampler_) { |
| 820 mask_sampler_location_ = locations[index++]; |
| 821 mask_tex_coord_scale_location_ = locations[index++]; |
| 822 mask_tex_coord_offset_location_ = locations[index++]; |
| 823 } |
| 824 if (has_color_matrix_) { |
| 825 color_matrix_location_ = locations[index++]; |
| 826 color_offset_location_ = locations[index++]; |
| 827 } |
| 828 if (has_sampler_) |
| 829 sampler_location_ = locations[index++]; |
| 830 if (has_uniform_alpha_) |
| 831 alpha_location_ = locations[index++]; |
| 832 if (has_background_color_) |
| 833 background_color_location_ = locations[index++]; |
| 834 if (has_fragment_tex_transform_) |
| 835 fragment_tex_transform_location_ = locations[index++]; |
| 836 if (has_uniform_color_) |
| 837 color_location_ = locations[index++]; |
| 838 DCHECK_EQ(index, locations.size()); |
| 839 } |
| 840 |
| 841 void FragmentShaderBase::FillLocations(ShaderLocations* locations) const { |
| 842 if (has_blend_mode()) { |
| 843 locations->backdrop = backdrop_location_; |
| 844 locations->backdrop_rect = backdrop_rect_location_; |
| 845 } |
| 846 if (mask_for_background()) |
| 847 locations->original_backdrop = original_backdrop_location_; |
| 848 if (has_mask_sampler_) { |
| 849 locations->mask_sampler = mask_sampler_location_; |
| 850 locations->mask_tex_coord_scale = mask_tex_coord_scale_location_; |
| 851 locations->mask_tex_coord_offset = mask_tex_coord_offset_location_; |
| 852 } |
| 853 if (has_color_matrix_) { |
| 854 locations->color_matrix = color_matrix_location_; |
| 855 locations->color_offset = color_offset_location_; |
| 856 } |
| 857 if (has_sampler_) |
| 858 locations->sampler = sampler_location_; |
| 859 if (has_uniform_alpha_) |
| 860 locations->alpha = alpha_location_; |
| 861 } |
| 862 |
782 std::string FragmentShaderBase::SetBlendModeFunctions( | 863 std::string FragmentShaderBase::SetBlendModeFunctions( |
783 const std::string& shader_string) const { | 864 const std::string& shader_string) const { |
784 if (shader_string.find("ApplyBlendMode") == std::string::npos) | 865 if (shader_string.find("ApplyBlendMode") == std::string::npos) |
785 return shader_string; | 866 return shader_string; |
786 | 867 |
787 if (!has_blend_mode()) { | 868 if (!has_blend_mode()) { |
788 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; | 869 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; |
789 } | 870 } |
790 | 871 |
791 static const std::string kUniforms = SHADER0([]() { | 872 static const std::string kUniforms = SHADER0([]() { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 "result.rgb = set_luminance(dst.rgb * src.a," | 1148 "result.rgb = set_luminance(dst.rgb * src.a," |
1068 " srcDstAlpha.a," | 1149 " srcDstAlpha.a," |
1069 " srcDstAlpha.rgb);" | 1150 " srcDstAlpha.rgb);" |
1070 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 1151 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
1071 case BLEND_MODE_NONE: | 1152 case BLEND_MODE_NONE: |
1072 NOTREACHED(); | 1153 NOTREACHED(); |
1073 } | 1154 } |
1074 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; | 1155 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; |
1075 } | 1156 } |
1076 | 1157 |
1077 FragmentTexAlphaBinding::FragmentTexAlphaBinding() | |
1078 : sampler_location_(-1), alpha_location_(-1) { | |
1079 } | |
1080 | |
1081 void FragmentTexAlphaBinding::Init(GLES2Interface* context, | |
1082 unsigned program, | |
1083 int* base_uniform_index) { | |
1084 static const char* uniforms[] = { | |
1085 "s_texture", "alpha", BLEND_MODE_UNIFORMS, | |
1086 }; | |
1087 int locations[arraysize(uniforms)]; | |
1088 | |
1089 GetProgramUniformLocations(context, | |
1090 program, | |
1091 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1092 uniforms, | |
1093 locations, | |
1094 base_uniform_index); | |
1095 sampler_location_ = locations[0]; | |
1096 alpha_location_ = locations[1]; | |
1097 BLEND_MODE_SET_LOCATIONS(locations, 2); | |
1098 } | |
1099 | |
1100 FragmentTexColorMatrixAlphaBinding::FragmentTexColorMatrixAlphaBinding() | |
1101 : sampler_location_(-1), | |
1102 alpha_location_(-1), | |
1103 color_matrix_location_(-1), | |
1104 color_offset_location_(-1) { | |
1105 } | |
1106 | |
1107 void FragmentTexColorMatrixAlphaBinding::Init(GLES2Interface* context, | |
1108 unsigned program, | |
1109 int* base_uniform_index) { | |
1110 static const char* uniforms[] = { | |
1111 "s_texture", "alpha", "colorMatrix", "colorOffset", BLEND_MODE_UNIFORMS, | |
1112 }; | |
1113 int locations[arraysize(uniforms)]; | |
1114 | |
1115 GetProgramUniformLocations(context, | |
1116 program, | |
1117 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1118 uniforms, | |
1119 locations, | |
1120 base_uniform_index); | |
1121 sampler_location_ = locations[0]; | |
1122 alpha_location_ = locations[1]; | |
1123 color_matrix_location_ = locations[2]; | |
1124 color_offset_location_ = locations[3]; | |
1125 BLEND_MODE_SET_LOCATIONS(locations, 4); | |
1126 } | |
1127 | |
1128 FragmentTexOpaqueBinding::FragmentTexOpaqueBinding() : sampler_location_(-1) { | |
1129 } | |
1130 | |
1131 void FragmentTexOpaqueBinding::Init(GLES2Interface* context, | |
1132 unsigned program, | |
1133 int* base_uniform_index) { | |
1134 static const char* uniforms[] = { | |
1135 "s_texture", | |
1136 }; | |
1137 int locations[arraysize(uniforms)]; | |
1138 | |
1139 GetProgramUniformLocations(context, | |
1140 program, | |
1141 arraysize(uniforms), | |
1142 uniforms, | |
1143 locations, | |
1144 base_uniform_index); | |
1145 sampler_location_ = locations[0]; | |
1146 } | |
1147 | |
1148 std::string FragmentShaderRGBATexAlpha::GetShaderSource() const { | 1158 std::string FragmentShaderRGBATexAlpha::GetShaderSource() const { |
1149 return SHADER0([]() { | 1159 return SHADER0([]() { |
1150 precision mediump float; | 1160 precision mediump float; |
1151 varying TexCoordPrecision vec2 v_texCoord; | 1161 varying TexCoordPrecision vec2 v_texCoord; |
1152 uniform SamplerType s_texture; | 1162 uniform SamplerType s_texture; |
1153 uniform float alpha; | 1163 uniform float alpha; |
1154 void main() { | 1164 void main() { |
1155 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1165 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1156 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); | 1166 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
1157 } | 1167 } |
1158 }); | 1168 }); |
1159 } | 1169 } |
1160 | 1170 |
1161 void FragmentShaderRGBATexAlpha::FillLocations( | |
1162 ShaderLocations* locations) const { | |
1163 locations->sampler = sampler_location(); | |
1164 locations->alpha = alpha_location(); | |
1165 locations->backdrop = backdrop_location(); | |
1166 locations->backdrop_rect = backdrop_rect_location(); | |
1167 } | |
1168 | |
1169 std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderSource() const { | 1171 std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderSource() const { |
1170 return SHADER0([]() { | 1172 return SHADER0([]() { |
1171 precision mediump float; | 1173 precision mediump float; |
1172 varying TexCoordPrecision vec2 v_texCoord; | 1174 varying TexCoordPrecision vec2 v_texCoord; |
1173 uniform SamplerType s_texture; | 1175 uniform SamplerType s_texture; |
1174 uniform float alpha; | 1176 uniform float alpha; |
1175 uniform mat4 colorMatrix; | 1177 uniform mat4 colorMatrix; |
1176 uniform vec4 colorOffset; | 1178 uniform vec4 colorOffset; |
1177 void main() { | 1179 void main() { |
1178 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1180 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1179 float nonZeroAlpha = max(texColor.a, 0.00001); | 1181 float nonZeroAlpha = max(texColor.a, 0.00001); |
1180 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | 1182 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); |
1181 texColor = colorMatrix * texColor + colorOffset; | 1183 texColor = colorMatrix * texColor + colorOffset; |
1182 texColor.rgb *= texColor.a; | 1184 texColor.rgb *= texColor.a; |
1183 texColor = clamp(texColor, 0.0, 1.0); | 1185 texColor = clamp(texColor, 0.0, 1.0); |
1184 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); | 1186 gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
1185 } | 1187 } |
1186 }); | 1188 }); |
1187 } | 1189 } |
1188 | 1190 |
1189 void FragmentShaderRGBATexColorMatrixAlpha::FillLocations( | |
1190 ShaderLocations* locations) const { | |
1191 locations->sampler = sampler_location(); | |
1192 locations->alpha = alpha_location(); | |
1193 locations->color_matrix = color_matrix_location(); | |
1194 locations->color_offset = color_offset_location(); | |
1195 locations->backdrop = backdrop_location(); | |
1196 locations->backdrop_rect = backdrop_rect_location(); | |
1197 } | |
1198 | |
1199 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderSource() const { | 1191 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderSource() const { |
1200 return SHADER0([]() { | 1192 return SHADER0([]() { |
1201 precision mediump float; | 1193 precision mediump float; |
1202 varying TexCoordPrecision vec2 v_texCoord; | 1194 varying TexCoordPrecision vec2 v_texCoord; |
1203 varying float v_alpha; | 1195 varying float v_alpha; |
1204 uniform SamplerType s_texture; | 1196 uniform SamplerType s_texture; |
1205 void main() { | 1197 void main() { |
1206 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1198 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1207 gl_FragColor = texColor * v_alpha; | 1199 gl_FragColor = texColor * v_alpha; |
1208 } | 1200 } |
1209 }); | 1201 }); |
1210 } | 1202 } |
1211 | 1203 |
1212 std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderSource() const { | 1204 std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderSource() const { |
1213 return SHADER0([]() { | 1205 return SHADER0([]() { |
1214 precision mediump float; | 1206 precision mediump float; |
1215 varying TexCoordPrecision vec2 v_texCoord; | 1207 varying TexCoordPrecision vec2 v_texCoord; |
1216 varying float v_alpha; | 1208 varying float v_alpha; |
1217 uniform SamplerType s_texture; | 1209 uniform SamplerType s_texture; |
1218 void main() { | 1210 void main() { |
1219 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1211 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1220 texColor.rgb *= texColor.a; | 1212 texColor.rgb *= texColor.a; |
1221 gl_FragColor = texColor * v_alpha; | 1213 gl_FragColor = texColor * v_alpha; |
1222 } | 1214 } |
1223 }); | 1215 }); |
1224 } | 1216 } |
1225 | 1217 |
1226 FragmentTexBackgroundBinding::FragmentTexBackgroundBinding() | |
1227 : background_color_location_(-1), sampler_location_(-1) { | |
1228 } | |
1229 | |
1230 void FragmentTexBackgroundBinding::Init(GLES2Interface* context, | |
1231 unsigned program, | |
1232 int* base_uniform_index) { | |
1233 static const char* uniforms[] = { | |
1234 "s_texture", "background_color", | |
1235 }; | |
1236 int locations[arraysize(uniforms)]; | |
1237 | |
1238 GetProgramUniformLocations(context, | |
1239 program, | |
1240 arraysize(uniforms), | |
1241 uniforms, | |
1242 locations, | |
1243 base_uniform_index); | |
1244 | |
1245 sampler_location_ = locations[0]; | |
1246 DCHECK_NE(sampler_location_, -1); | |
1247 | |
1248 background_color_location_ = locations[1]; | |
1249 DCHECK_NE(background_color_location_, -1); | |
1250 } | |
1251 | |
1252 std::string FragmentShaderTexBackgroundVaryingAlpha::GetShaderSource() const { | 1218 std::string FragmentShaderTexBackgroundVaryingAlpha::GetShaderSource() const { |
1253 return SHADER0([]() { | 1219 return SHADER0([]() { |
1254 precision mediump float; | 1220 precision mediump float; |
1255 varying TexCoordPrecision vec2 v_texCoord; | 1221 varying TexCoordPrecision vec2 v_texCoord; |
1256 varying float v_alpha; | 1222 varying float v_alpha; |
1257 uniform vec4 background_color; | 1223 uniform vec4 background_color; |
1258 uniform SamplerType s_texture; | 1224 uniform SamplerType s_texture; |
1259 void main() { | 1225 void main() { |
1260 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1226 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1261 texColor += background_color * (1.0 - texColor.a); | 1227 texColor += background_color * (1.0 - texColor.a); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 precision mediump float; | 1287 precision mediump float; |
1322 varying TexCoordPrecision vec2 v_texCoord; | 1288 varying TexCoordPrecision vec2 v_texCoord; |
1323 uniform SamplerType s_texture; | 1289 uniform SamplerType s_texture; |
1324 void main() { | 1290 void main() { |
1325 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1291 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1326 gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0); | 1292 gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0); |
1327 } | 1293 } |
1328 }); | 1294 }); |
1329 } | 1295 } |
1330 | 1296 |
1331 FragmentShaderRGBATexAlphaAA::FragmentShaderRGBATexAlphaAA() | |
1332 : sampler_location_(-1), alpha_location_(-1) { | |
1333 } | |
1334 | |
1335 void FragmentShaderRGBATexAlphaAA::Init(GLES2Interface* context, | |
1336 unsigned program, | |
1337 int* base_uniform_index) { | |
1338 static const char* uniforms[] = { | |
1339 "s_texture", "alpha", BLEND_MODE_UNIFORMS, | |
1340 }; | |
1341 int locations[arraysize(uniforms)]; | |
1342 | |
1343 GetProgramUniformLocations(context, | |
1344 program, | |
1345 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1346 uniforms, | |
1347 locations, | |
1348 base_uniform_index); | |
1349 sampler_location_ = locations[0]; | |
1350 alpha_location_ = locations[1]; | |
1351 BLEND_MODE_SET_LOCATIONS(locations, 2); | |
1352 } | |
1353 | |
1354 std::string FragmentShaderRGBATexAlphaAA::GetShaderSource() const { | 1297 std::string FragmentShaderRGBATexAlphaAA::GetShaderSource() const { |
1355 return SHADER0([]() { | 1298 return SHADER0([]() { |
1356 precision mediump float; | 1299 precision mediump float; |
1357 uniform SamplerType s_texture; | 1300 uniform SamplerType s_texture; |
1358 uniform float alpha; | 1301 uniform float alpha; |
1359 varying TexCoordPrecision vec2 v_texCoord; | 1302 varying TexCoordPrecision vec2 v_texCoord; |
1360 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | 1303 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. |
1361 void main() { | 1304 void main() { |
1362 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1305 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1363 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1306 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
1364 vec2 d2 = min(d4.xz, d4.yw); | 1307 vec2 d2 = min(d4.xz, d4.yw); |
1365 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1308 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
1366 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); | 1309 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
1367 } | 1310 } |
1368 }); | 1311 }); |
1369 } | 1312 } |
1370 | 1313 |
1371 void FragmentShaderRGBATexAlphaAA::FillLocations( | |
1372 ShaderLocations* locations) const { | |
1373 locations->sampler = sampler_location(); | |
1374 locations->alpha = alpha_location(); | |
1375 locations->backdrop = backdrop_location(); | |
1376 locations->backdrop_rect = backdrop_rect_location(); | |
1377 } | |
1378 | |
1379 FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding() | |
1380 : sampler_location_(-1), | |
1381 alpha_location_(-1), | |
1382 fragment_tex_transform_location_(-1) { | |
1383 } | |
1384 | |
1385 void FragmentTexClampAlphaAABinding::Init(GLES2Interface* context, | |
1386 unsigned program, | |
1387 int* base_uniform_index) { | |
1388 static const char* uniforms[] = { | |
1389 "s_texture", "alpha", "fragmentTexTransform", | |
1390 }; | |
1391 int locations[arraysize(uniforms)]; | |
1392 | |
1393 GetProgramUniformLocations(context, | |
1394 program, | |
1395 arraysize(uniforms), | |
1396 uniforms, | |
1397 locations, | |
1398 base_uniform_index); | |
1399 sampler_location_ = locations[0]; | |
1400 alpha_location_ = locations[1]; | |
1401 fragment_tex_transform_location_ = locations[2]; | |
1402 } | |
1403 | |
1404 std::string FragmentShaderRGBATexClampAlphaAA::GetShaderSource() const { | 1314 std::string FragmentShaderRGBATexClampAlphaAA::GetShaderSource() const { |
1405 return SHADER0([]() { | 1315 return SHADER0([]() { |
1406 precision mediump float; | 1316 precision mediump float; |
1407 uniform SamplerType s_texture; | 1317 uniform SamplerType s_texture; |
1408 uniform float alpha; | 1318 uniform float alpha; |
1409 uniform TexCoordPrecision vec4 fragmentTexTransform; | 1319 uniform TexCoordPrecision vec4 fragmentTexTransform; |
1410 varying TexCoordPrecision vec2 v_texCoord; | 1320 varying TexCoordPrecision vec2 v_texCoord; |
1411 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | 1321 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. |
1412 void main() { | 1322 void main() { |
1413 TexCoordPrecision vec2 texCoord = | 1323 TexCoordPrecision vec2 texCoord = |
(...skipping 23 matching lines...) Expand all Loading... |
1437 vec4 texColor = TextureLookup(s_texture, texCoord); | 1347 vec4 texColor = TextureLookup(s_texture, texCoord); |
1438 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1348 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
1439 vec2 d2 = min(d4.xz, d4.yw); | 1349 vec2 d2 = min(d4.xz, d4.yw); |
1440 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1350 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
1441 gl_FragColor = | 1351 gl_FragColor = |
1442 vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * aa; | 1352 vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * aa; |
1443 } | 1353 } |
1444 }); | 1354 }); |
1445 } | 1355 } |
1446 | 1356 |
1447 FragmentShaderRGBATexAlphaMask::FragmentShaderRGBATexAlphaMask() | |
1448 : sampler_location_(-1), | |
1449 mask_sampler_location_(-1), | |
1450 alpha_location_(-1), | |
1451 mask_tex_coord_scale_location_(-1) { | |
1452 } | |
1453 | |
1454 void FragmentShaderRGBATexAlphaMask::Init(GLES2Interface* context, | |
1455 unsigned program, | |
1456 int* base_uniform_index) { | |
1457 static const char* uniforms[] = { | |
1458 "s_texture", | |
1459 "s_mask", | |
1460 "alpha", | |
1461 "maskTexCoordScale", | |
1462 "maskTexCoordOffset", | |
1463 BLEND_MODE_UNIFORMS, | |
1464 }; | |
1465 int locations[arraysize(uniforms)]; | |
1466 | |
1467 GetProgramUniformLocations(context, | |
1468 program, | |
1469 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1470 uniforms, | |
1471 locations, | |
1472 base_uniform_index); | |
1473 sampler_location_ = locations[0]; | |
1474 mask_sampler_location_ = locations[1]; | |
1475 alpha_location_ = locations[2]; | |
1476 mask_tex_coord_scale_location_ = locations[3]; | |
1477 mask_tex_coord_offset_location_ = locations[4]; | |
1478 BLEND_MODE_SET_LOCATIONS(locations, 5); | |
1479 } | |
1480 | |
1481 std::string FragmentShaderRGBATexAlphaMask::GetShaderSource() const { | 1357 std::string FragmentShaderRGBATexAlphaMask::GetShaderSource() const { |
1482 return SHADER0([]() { | 1358 return SHADER0([]() { |
1483 precision mediump float; | 1359 precision mediump float; |
1484 varying TexCoordPrecision vec2 v_texCoord; | 1360 varying TexCoordPrecision vec2 v_texCoord; |
1485 uniform sampler2D s_texture; | 1361 uniform sampler2D s_texture; |
1486 uniform SamplerType s_mask; | 1362 uniform SamplerType s_mask; |
1487 uniform TexCoordPrecision vec2 maskTexCoordScale; | 1363 uniform TexCoordPrecision vec2 maskTexCoordScale; |
1488 uniform TexCoordPrecision vec2 maskTexCoordOffset; | 1364 uniform TexCoordPrecision vec2 maskTexCoordOffset; |
1489 uniform float alpha; | 1365 uniform float alpha; |
1490 void main() { | 1366 void main() { |
1491 vec4 texColor = texture2D(s_texture, v_texCoord); | 1367 vec4 texColor = texture2D(s_texture, v_texCoord); |
1492 TexCoordPrecision vec2 maskTexCoord = | 1368 TexCoordPrecision vec2 maskTexCoord = |
1493 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | 1369 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
1494 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | 1370 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
1495 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | 1371 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
1496 gl_FragColor = ApplyBlendMode( | 1372 gl_FragColor = ApplyBlendMode( |
1497 texColor * alpha * maskColor.w, maskColor.w); | 1373 texColor * alpha * maskColor.w, maskColor.w); |
1498 } | 1374 } |
1499 }); | 1375 }); |
1500 } | 1376 } |
1501 | 1377 |
1502 void FragmentShaderRGBATexAlphaMask::FillLocations( | |
1503 ShaderLocations* locations) const { | |
1504 locations->sampler = sampler_location(); | |
1505 locations->mask_sampler = mask_sampler_location(); | |
1506 locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); | |
1507 locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); | |
1508 locations->alpha = alpha_location(); | |
1509 locations->backdrop = backdrop_location(); | |
1510 locations->backdrop_rect = backdrop_rect_location(); | |
1511 if (mask_for_background()) | |
1512 locations->original_backdrop = original_backdrop_location(); | |
1513 } | |
1514 | |
1515 FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA() | |
1516 : sampler_location_(-1), | |
1517 mask_sampler_location_(-1), | |
1518 alpha_location_(-1), | |
1519 mask_tex_coord_scale_location_(-1), | |
1520 mask_tex_coord_offset_location_(-1) { | |
1521 } | |
1522 | |
1523 void FragmentShaderRGBATexAlphaMaskAA::Init(GLES2Interface* context, | |
1524 unsigned program, | |
1525 int* base_uniform_index) { | |
1526 static const char* uniforms[] = { | |
1527 "s_texture", | |
1528 "s_mask", | |
1529 "alpha", | |
1530 "maskTexCoordScale", | |
1531 "maskTexCoordOffset", | |
1532 BLEND_MODE_UNIFORMS, | |
1533 }; | |
1534 int locations[arraysize(uniforms)]; | |
1535 | |
1536 GetProgramUniformLocations(context, | |
1537 program, | |
1538 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1539 uniforms, | |
1540 locations, | |
1541 base_uniform_index); | |
1542 sampler_location_ = locations[0]; | |
1543 mask_sampler_location_ = locations[1]; | |
1544 alpha_location_ = locations[2]; | |
1545 mask_tex_coord_scale_location_ = locations[3]; | |
1546 mask_tex_coord_offset_location_ = locations[4]; | |
1547 BLEND_MODE_SET_LOCATIONS(locations, 5); | |
1548 } | |
1549 | |
1550 std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderSource() const { | 1378 std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderSource() const { |
1551 return SHADER0([]() { | 1379 return SHADER0([]() { |
1552 precision mediump float; | 1380 precision mediump float; |
1553 uniform sampler2D s_texture; | 1381 uniform sampler2D s_texture; |
1554 uniform SamplerType s_mask; | 1382 uniform SamplerType s_mask; |
1555 uniform TexCoordPrecision vec2 maskTexCoordScale; | 1383 uniform TexCoordPrecision vec2 maskTexCoordScale; |
1556 uniform TexCoordPrecision vec2 maskTexCoordOffset; | 1384 uniform TexCoordPrecision vec2 maskTexCoordOffset; |
1557 uniform float alpha; | 1385 uniform float alpha; |
1558 varying TexCoordPrecision vec2 v_texCoord; | 1386 varying TexCoordPrecision vec2 v_texCoord; |
1559 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | 1387 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. |
1560 void main() { | 1388 void main() { |
1561 vec4 texColor = texture2D(s_texture, v_texCoord); | 1389 vec4 texColor = texture2D(s_texture, v_texCoord); |
1562 TexCoordPrecision vec2 maskTexCoord = | 1390 TexCoordPrecision vec2 maskTexCoord = |
1563 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | 1391 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
1564 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | 1392 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
1565 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | 1393 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
1566 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1394 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
1567 vec2 d2 = min(d4.xz, d4.yw); | 1395 vec2 d2 = min(d4.xz, d4.yw); |
1568 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1396 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
1569 gl_FragColor = ApplyBlendMode( | 1397 gl_FragColor = ApplyBlendMode( |
1570 texColor * alpha * maskColor.w * aa, maskColor.w); | 1398 texColor * alpha * maskColor.w * aa, maskColor.w); |
1571 } | 1399 } |
1572 }); | 1400 }); |
1573 } | 1401 } |
1574 | 1402 |
1575 void FragmentShaderRGBATexAlphaMaskAA::FillLocations( | |
1576 ShaderLocations* locations) const { | |
1577 locations->sampler = sampler_location(); | |
1578 locations->mask_sampler = mask_sampler_location(); | |
1579 locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); | |
1580 locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); | |
1581 locations->alpha = alpha_location(); | |
1582 locations->backdrop = backdrop_location(); | |
1583 locations->backdrop_rect = backdrop_rect_location(); | |
1584 if (mask_for_background()) | |
1585 locations->original_backdrop = original_backdrop_location(); | |
1586 } | |
1587 | |
1588 FragmentShaderRGBATexAlphaMaskColorMatrixAA:: | |
1589 FragmentShaderRGBATexAlphaMaskColorMatrixAA() | |
1590 : sampler_location_(-1), | |
1591 mask_sampler_location_(-1), | |
1592 alpha_location_(-1), | |
1593 mask_tex_coord_scale_location_(-1), | |
1594 color_matrix_location_(-1), | |
1595 color_offset_location_(-1) { | |
1596 } | |
1597 | |
1598 void FragmentShaderRGBATexAlphaMaskColorMatrixAA::Init( | |
1599 GLES2Interface* context, | |
1600 unsigned program, | |
1601 int* base_uniform_index) { | |
1602 static const char* uniforms[] = { | |
1603 "s_texture", | |
1604 "s_mask", | |
1605 "alpha", | |
1606 "maskTexCoordScale", | |
1607 "maskTexCoordOffset", | |
1608 "colorMatrix", | |
1609 "colorOffset", | |
1610 BLEND_MODE_UNIFORMS, | |
1611 }; | |
1612 int locations[arraysize(uniforms)]; | |
1613 | |
1614 GetProgramUniformLocations(context, | |
1615 program, | |
1616 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1617 uniforms, | |
1618 locations, | |
1619 base_uniform_index); | |
1620 sampler_location_ = locations[0]; | |
1621 mask_sampler_location_ = locations[1]; | |
1622 alpha_location_ = locations[2]; | |
1623 mask_tex_coord_scale_location_ = locations[3]; | |
1624 mask_tex_coord_offset_location_ = locations[4]; | |
1625 color_matrix_location_ = locations[5]; | |
1626 color_offset_location_ = locations[6]; | |
1627 BLEND_MODE_SET_LOCATIONS(locations, 7); | |
1628 } | |
1629 | |
1630 std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderSource() | 1403 std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderSource() |
1631 const { | 1404 const { |
1632 return SHADER0([]() { | 1405 return SHADER0([]() { |
1633 precision mediump float; | 1406 precision mediump float; |
1634 uniform sampler2D s_texture; | 1407 uniform sampler2D s_texture; |
1635 uniform SamplerType s_mask; | 1408 uniform SamplerType s_mask; |
1636 uniform vec2 maskTexCoordScale; | 1409 uniform vec2 maskTexCoordScale; |
1637 uniform vec2 maskTexCoordOffset; | 1410 uniform vec2 maskTexCoordOffset; |
1638 uniform mat4 colorMatrix; | 1411 uniform mat4 colorMatrix; |
1639 uniform vec4 colorOffset; | 1412 uniform vec4 colorOffset; |
(...skipping 13 matching lines...) Expand all Loading... |
1653 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | 1426 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
1654 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1427 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
1655 vec2 d2 = min(d4.xz, d4.yw); | 1428 vec2 d2 = min(d4.xz, d4.yw); |
1656 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1429 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
1657 gl_FragColor = ApplyBlendMode( | 1430 gl_FragColor = ApplyBlendMode( |
1658 texColor * alpha * maskColor.w * aa, maskColor.w); | 1431 texColor * alpha * maskColor.w * aa, maskColor.w); |
1659 } | 1432 } |
1660 }); | 1433 }); |
1661 } | 1434 } |
1662 | 1435 |
1663 void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations( | |
1664 ShaderLocations* locations) const { | |
1665 locations->sampler = sampler_location(); | |
1666 locations->alpha = alpha_location(); | |
1667 locations->mask_sampler = mask_sampler_location(); | |
1668 locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); | |
1669 locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); | |
1670 locations->color_matrix = color_matrix_location(); | |
1671 locations->color_offset = color_offset_location(); | |
1672 locations->backdrop = backdrop_location(); | |
1673 locations->backdrop_rect = backdrop_rect_location(); | |
1674 if (mask_for_background()) | |
1675 locations->original_backdrop = original_backdrop_location(); | |
1676 } | |
1677 | |
1678 FragmentShaderRGBATexAlphaColorMatrixAA:: | |
1679 FragmentShaderRGBATexAlphaColorMatrixAA() | |
1680 : sampler_location_(-1), | |
1681 alpha_location_(-1), | |
1682 color_matrix_location_(-1), | |
1683 color_offset_location_(-1) { | |
1684 } | |
1685 | |
1686 void FragmentShaderRGBATexAlphaColorMatrixAA::Init(GLES2Interface* context, | |
1687 unsigned program, | |
1688 int* base_uniform_index) { | |
1689 static const char* uniforms[] = { | |
1690 "s_texture", "alpha", "colorMatrix", "colorOffset", BLEND_MODE_UNIFORMS, | |
1691 }; | |
1692 int locations[arraysize(uniforms)]; | |
1693 | |
1694 GetProgramUniformLocations(context, | |
1695 program, | |
1696 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1697 uniforms, | |
1698 locations, | |
1699 base_uniform_index); | |
1700 sampler_location_ = locations[0]; | |
1701 alpha_location_ = locations[1]; | |
1702 color_matrix_location_ = locations[2]; | |
1703 color_offset_location_ = locations[3]; | |
1704 BLEND_MODE_SET_LOCATIONS(locations, 4); | |
1705 } | |
1706 | |
1707 std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderSource() const { | 1436 std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderSource() const { |
1708 return SHADER0([]() { | 1437 return SHADER0([]() { |
1709 precision mediump float; | 1438 precision mediump float; |
1710 uniform SamplerType s_texture; | 1439 uniform SamplerType s_texture; |
1711 uniform float alpha; | 1440 uniform float alpha; |
1712 uniform mat4 colorMatrix; | 1441 uniform mat4 colorMatrix; |
1713 uniform vec4 colorOffset; | 1442 uniform vec4 colorOffset; |
1714 varying TexCoordPrecision vec2 v_texCoord; | 1443 varying TexCoordPrecision vec2 v_texCoord; |
1715 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | 1444 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. |
1716 void main() { | 1445 void main() { |
1717 vec4 texColor = TextureLookup(s_texture, v_texCoord); | 1446 vec4 texColor = TextureLookup(s_texture, v_texCoord); |
1718 float nonZeroAlpha = max(texColor.a, 0.00001); | 1447 float nonZeroAlpha = max(texColor.a, 0.00001); |
1719 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | 1448 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); |
1720 texColor = colorMatrix * texColor + colorOffset; | 1449 texColor = colorMatrix * texColor + colorOffset; |
1721 texColor.rgb *= texColor.a; | 1450 texColor.rgb *= texColor.a; |
1722 texColor = clamp(texColor, 0.0, 1.0); | 1451 texColor = clamp(texColor, 0.0, 1.0); |
1723 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1452 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
1724 vec2 d2 = min(d4.xz, d4.yw); | 1453 vec2 d2 = min(d4.xz, d4.yw); |
1725 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1454 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
1726 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); | 1455 gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
1727 } | 1456 } |
1728 }); | 1457 }); |
1729 } | 1458 } |
1730 | 1459 |
1731 void FragmentShaderRGBATexAlphaColorMatrixAA::FillLocations( | |
1732 ShaderLocations* locations) const { | |
1733 locations->sampler = sampler_location(); | |
1734 locations->alpha = alpha_location(); | |
1735 locations->color_matrix = color_matrix_location(); | |
1736 locations->color_offset = color_offset_location(); | |
1737 locations->backdrop = backdrop_location(); | |
1738 locations->backdrop_rect = backdrop_rect_location(); | |
1739 } | |
1740 | |
1741 FragmentShaderRGBATexAlphaMaskColorMatrix:: | |
1742 FragmentShaderRGBATexAlphaMaskColorMatrix() | |
1743 : sampler_location_(-1), | |
1744 mask_sampler_location_(-1), | |
1745 alpha_location_(-1), | |
1746 mask_tex_coord_scale_location_(-1) { | |
1747 } | |
1748 | |
1749 void FragmentShaderRGBATexAlphaMaskColorMatrix::Init(GLES2Interface* context, | |
1750 unsigned program, | |
1751 int* base_uniform_index) { | |
1752 static const char* uniforms[] = { | |
1753 "s_texture", | |
1754 "s_mask", | |
1755 "alpha", | |
1756 "maskTexCoordScale", | |
1757 "maskTexCoordOffset", | |
1758 "colorMatrix", | |
1759 "colorOffset", | |
1760 BLEND_MODE_UNIFORMS, | |
1761 }; | |
1762 int locations[arraysize(uniforms)]; | |
1763 | |
1764 GetProgramUniformLocations(context, | |
1765 program, | |
1766 arraysize(uniforms) - UNUSED_BLEND_MODE_UNIFORMS, | |
1767 uniforms, | |
1768 locations, | |
1769 base_uniform_index); | |
1770 sampler_location_ = locations[0]; | |
1771 mask_sampler_location_ = locations[1]; | |
1772 alpha_location_ = locations[2]; | |
1773 mask_tex_coord_scale_location_ = locations[3]; | |
1774 mask_tex_coord_offset_location_ = locations[4]; | |
1775 color_matrix_location_ = locations[5]; | |
1776 color_offset_location_ = locations[6]; | |
1777 BLEND_MODE_SET_LOCATIONS(locations, 7); | |
1778 } | |
1779 | |
1780 std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderSource() const { | 1460 std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderSource() const { |
1781 return SHADER0([]() { | 1461 return SHADER0([]() { |
1782 precision mediump float; | 1462 precision mediump float; |
1783 varying TexCoordPrecision vec2 v_texCoord; | 1463 varying TexCoordPrecision vec2 v_texCoord; |
1784 uniform sampler2D s_texture; | 1464 uniform sampler2D s_texture; |
1785 uniform SamplerType s_mask; | 1465 uniform SamplerType s_mask; |
1786 uniform vec2 maskTexCoordScale; | 1466 uniform vec2 maskTexCoordScale; |
1787 uniform vec2 maskTexCoordOffset; | 1467 uniform vec2 maskTexCoordOffset; |
1788 uniform mat4 colorMatrix; | 1468 uniform mat4 colorMatrix; |
1789 uniform vec4 colorOffset; | 1469 uniform vec4 colorOffset; |
1790 uniform float alpha; | 1470 uniform float alpha; |
1791 void main() { | 1471 void main() { |
1792 vec4 texColor = texture2D(s_texture, v_texCoord); | 1472 vec4 texColor = texture2D(s_texture, v_texCoord); |
1793 float nonZeroAlpha = max(texColor.a, 0.00001); | 1473 float nonZeroAlpha = max(texColor.a, 0.00001); |
1794 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); | 1474 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); |
1795 texColor = colorMatrix * texColor + colorOffset; | 1475 texColor = colorMatrix * texColor + colorOffset; |
1796 texColor.rgb *= texColor.a; | 1476 texColor.rgb *= texColor.a; |
1797 texColor = clamp(texColor, 0.0, 1.0); | 1477 texColor = clamp(texColor, 0.0, 1.0); |
1798 TexCoordPrecision vec2 maskTexCoord = | 1478 TexCoordPrecision vec2 maskTexCoord = |
1799 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, | 1479 vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
1800 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); | 1480 maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
1801 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); | 1481 vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
1802 gl_FragColor = ApplyBlendMode( | 1482 gl_FragColor = ApplyBlendMode( |
1803 texColor * alpha * maskColor.w, maskColor.w); | 1483 texColor * alpha * maskColor.w, maskColor.w); |
1804 } | 1484 } |
1805 }); | 1485 }); |
1806 } | 1486 } |
1807 | 1487 |
1808 void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations( | |
1809 ShaderLocations* locations) const { | |
1810 locations->sampler = sampler_location(); | |
1811 locations->mask_sampler = mask_sampler_location(); | |
1812 locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); | |
1813 locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); | |
1814 locations->alpha = alpha_location(); | |
1815 locations->color_matrix = color_matrix_location(); | |
1816 locations->color_offset = color_offset_location(); | |
1817 locations->backdrop = backdrop_location(); | |
1818 locations->backdrop_rect = backdrop_rect_location(); | |
1819 if (mask_for_background()) | |
1820 locations->original_backdrop = original_backdrop_location(); | |
1821 } | |
1822 | |
1823 FragmentShaderYUVVideo::FragmentShaderYUVVideo() | 1488 FragmentShaderYUVVideo::FragmentShaderYUVVideo() |
1824 : y_texture_location_(-1), | 1489 : y_texture_location_(-1), |
1825 u_texture_location_(-1), | 1490 u_texture_location_(-1), |
1826 v_texture_location_(-1), | 1491 v_texture_location_(-1), |
1827 uv_texture_location_(-1), | 1492 uv_texture_location_(-1), |
1828 a_texture_location_(-1), | 1493 a_texture_location_(-1), |
1829 lut_texture_location_(-1), | 1494 lut_texture_location_(-1), |
1830 alpha_location_(-1), | 1495 alpha_location_(-1), |
1831 yuv_matrix_location_(-1), | 1496 yuv_matrix_location_(-1), |
1832 yuv_adj_location_(-1), | 1497 yuv_adj_location_(-1), |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1975 vec2 uv_clamped = | 1640 vec2 uv_clamped = |
1976 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); | 1641 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); |
1977 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); | 1642 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); |
1978 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); | 1643 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); |
1979 } | 1644 } |
1980 }); | 1645 }); |
1981 | 1646 |
1982 return head + functions; | 1647 return head + functions; |
1983 } | 1648 } |
1984 | 1649 |
1985 FragmentShaderColor::FragmentShaderColor() : color_location_(-1) { | |
1986 } | |
1987 | |
1988 void FragmentShaderColor::Init(GLES2Interface* context, | |
1989 unsigned program, | |
1990 int* base_uniform_index) { | |
1991 static const char* uniforms[] = { | |
1992 "color", | |
1993 }; | |
1994 int locations[arraysize(uniforms)]; | |
1995 | |
1996 GetProgramUniformLocations(context, | |
1997 program, | |
1998 arraysize(uniforms), | |
1999 uniforms, | |
2000 locations, | |
2001 base_uniform_index); | |
2002 color_location_ = locations[0]; | |
2003 } | |
2004 | |
2005 std::string FragmentShaderColor::GetShaderSource() const { | 1650 std::string FragmentShaderColor::GetShaderSource() const { |
2006 return SHADER0([]() { | 1651 return SHADER0([]() { |
2007 precision mediump float; | 1652 precision mediump float; |
2008 uniform vec4 color; | 1653 uniform vec4 color; |
2009 void main() { gl_FragColor = color; } | 1654 void main() { gl_FragColor = color; } |
2010 }); | 1655 }); |
2011 } | 1656 } |
2012 | 1657 |
2013 FragmentShaderColorAA::FragmentShaderColorAA() : color_location_(-1) { | |
2014 } | |
2015 | |
2016 void FragmentShaderColorAA::Init(GLES2Interface* context, | |
2017 unsigned program, | |
2018 int* base_uniform_index) { | |
2019 static const char* uniforms[] = { | |
2020 "color", | |
2021 }; | |
2022 int locations[arraysize(uniforms)]; | |
2023 | |
2024 GetProgramUniformLocations(context, | |
2025 program, | |
2026 arraysize(uniforms), | |
2027 uniforms, | |
2028 locations, | |
2029 base_uniform_index); | |
2030 color_location_ = locations[0]; | |
2031 } | |
2032 | |
2033 std::string FragmentShaderColorAA::GetShaderSource() const { | 1658 std::string FragmentShaderColorAA::GetShaderSource() const { |
2034 return SHADER0([]() { | 1659 return SHADER0([]() { |
2035 precision mediump float; | 1660 precision mediump float; |
2036 uniform vec4 color; | 1661 uniform vec4 color; |
2037 varying vec4 edge_dist[2]; // 8 edge distances. | 1662 varying vec4 edge_dist[2]; // 8 edge distances. |
2038 void main() { | 1663 void main() { |
2039 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 1664 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
2040 vec2 d2 = min(d4.xz, d4.yw); | 1665 vec2 d2 = min(d4.xz, d4.yw); |
2041 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 1666 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
2042 gl_FragColor = color * aa; | 1667 gl_FragColor = color * aa; |
2043 } | 1668 } |
2044 }); | 1669 }); |
2045 } | 1670 } |
2046 | 1671 |
2047 } // namespace cc | 1672 } // namespace cc |
OLD | NEW |