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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) | 428 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
429 uniforms.push_back("uv_texture"); | 429 uniforms.push_back("uv_texture"); |
430 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 430 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
431 uniforms.push_back("u_texture"); | 431 uniforms.push_back("u_texture"); |
432 uniforms.push_back("v_texture"); | 432 uniforms.push_back("v_texture"); |
433 } | 433 } |
434 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 434 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
435 uniforms.push_back("a_texture"); | 435 uniforms.push_back("a_texture"); |
436 uniforms.push_back("ya_clamp_rect"); | 436 uniforms.push_back("ya_clamp_rect"); |
437 uniforms.push_back("uv_clamp_rect"); | 437 uniforms.push_back("uv_clamp_rect"); |
438 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { | |
439 uniforms.push_back("lut_texture"); | |
440 uniforms.push_back("lut_size"); | |
441 uniforms.push_back("resource_multiplier"); | |
442 uniforms.push_back("resource_offset"); | |
443 } else { | |
444 uniforms.push_back("yuv_matrix"); | |
445 uniforms.push_back("yuv_adj"); | |
446 } | |
447 break; | 438 break; |
448 case INPUT_COLOR_SOURCE_UNIFORM: | 439 case INPUT_COLOR_SOURCE_UNIFORM: |
449 uniforms.push_back("color"); | 440 uniforms.push_back("color"); |
450 break; | 441 break; |
451 } | 442 } |
452 | 443 |
444 if (has_resource_offset_) { | |
445 uniforms.push_back("resource_multiplier"); | |
446 uniforms.push_back("resource_offset"); | |
447 } | |
448 | |
449 if (has_lut_) { | |
450 uniforms.push_back("lut_texture"); | |
451 uniforms.push_back("lut_size"); | |
452 } | |
453 | |
453 locations.resize(uniforms.size()); | 454 locations.resize(uniforms.size()); |
454 | 455 |
455 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), | 456 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), |
456 locations.data(), base_uniform_index); | 457 locations.data(), base_uniform_index); |
457 | 458 |
458 size_t index = 0; | 459 size_t index = 0; |
459 if (has_blend_mode()) { | 460 if (has_blend_mode()) { |
460 backdrop_location_ = locations[index++]; | 461 backdrop_location_ = locations[index++]; |
461 original_backdrop_location_ = locations[index++]; | 462 original_backdrop_location_ = locations[index++]; |
462 backdrop_rect_location_ = locations[index++]; | 463 backdrop_rect_location_ = locations[index++]; |
(...skipping 22 matching lines...) Expand all Loading... | |
485 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) | 486 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
486 uv_texture_location_ = locations[index++]; | 487 uv_texture_location_ = locations[index++]; |
487 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 488 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
488 u_texture_location_ = locations[index++]; | 489 u_texture_location_ = locations[index++]; |
489 v_texture_location_ = locations[index++]; | 490 v_texture_location_ = locations[index++]; |
490 } | 491 } |
491 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 492 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
492 a_texture_location_ = locations[index++]; | 493 a_texture_location_ = locations[index++]; |
493 ya_clamp_rect_location_ = locations[index++]; | 494 ya_clamp_rect_location_ = locations[index++]; |
494 uv_clamp_rect_location_ = locations[index++]; | 495 uv_clamp_rect_location_ = locations[index++]; |
495 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { | |
496 lut_texture_location_ = locations[index++]; | |
497 lut_size_location_ = locations[index++]; | |
498 resource_multiplier_location_ = locations[index++]; | |
499 resource_offset_location_ = locations[index++]; | |
500 } else { | |
501 yuv_matrix_location_ = locations[index++]; | |
502 yuv_adj_location_ = locations[index++]; | |
503 } | |
504 break; | 496 break; |
505 case INPUT_COLOR_SOURCE_UNIFORM: | 497 case INPUT_COLOR_SOURCE_UNIFORM: |
506 color_location_ = locations[index++]; | 498 color_location_ = locations[index++]; |
507 break; | 499 break; |
508 } | 500 } |
501 if (has_resource_offset_) { | |
502 resource_multiplier_location_ = locations[index++]; | |
503 resource_offset_location_ = locations[index++]; | |
504 } | |
505 if (has_lut_) { | |
506 lut_texture_location_ = locations[index++]; | |
507 lut_size_location_ = locations[index++]; | |
508 } | |
509 | |
509 DCHECK_EQ(index, locations.size()); | 510 DCHECK_EQ(index, locations.size()); |
510 } | 511 } |
511 | 512 |
512 std::string FragmentShader::SetBlendModeFunctions( | 513 std::string FragmentShader::SetBlendModeFunctions( |
513 const std::string& shader_string) const { | 514 const std::string& shader_string) const { |
514 if (shader_string.find("ApplyBlendMode") == std::string::npos) | 515 if (shader_string.find("ApplyBlendMode") == std::string::npos) |
515 return shader_string; | 516 return shader_string; |
516 | 517 |
517 if (!has_blend_mode()) { | 518 if (!has_blend_mode()) { |
518 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; | 519 return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
841 } | 842 } |
842 break; | 843 break; |
843 case INPUT_COLOR_SOURCE_YUV_TEXTURES: | 844 case INPUT_COLOR_SOURCE_YUV_TEXTURES: |
844 // Compute the clamped texture coordinates for the YA and UV textures. | 845 // Compute the clamped texture coordinates for the YA and UV textures. |
845 HDR("uniform SamplerType y_texture;"); | 846 HDR("uniform SamplerType y_texture;"); |
846 SRC("// YUV texture lookup and conversion to RGB."); | 847 SRC("// YUV texture lookup and conversion to RGB."); |
847 SRC("vec2 ya_clamped ="); | 848 SRC("vec2 ya_clamped ="); |
848 SRC(" max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));"); | 849 SRC(" max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));"); |
849 SRC("vec2 uv_clamped ="); | 850 SRC("vec2 uv_clamped ="); |
850 SRC(" max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));"); | 851 SRC(" max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));"); |
851 // Read the Y and UV or U and V textures into |yuv|. | 852 // Read the Y and UV or U and V textures into |texColor|. |
852 SRC("vec3 yuv;"); | 853 // texColor will be converted to RGB using a lut or matrix below. |
853 SRC("yuv.x = TextureLookup(y_texture, ya_clamped).x;"); | 854 SRC("vec4 texColor;"); |
855 SRC("texColor.a = 1.0;"); | |
856 SRC("texColor.x = TextureLookup(y_texture, ya_clamped).x;"); | |
854 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) { | 857 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) { |
855 HDR("uniform SamplerType uv_texture;"); | 858 HDR("uniform SamplerType uv_texture;"); |
856 SRC("yuv.yz = TextureLookup(uv_texture, uv_clamped).xy;"); | 859 SRC("texColor.yz = TextureLookup(uv_texture, uv_clamped).xy;"); |
857 } | 860 } |
858 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 861 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
859 HDR("uniform SamplerType u_texture;"); | 862 HDR("uniform SamplerType u_texture;"); |
860 HDR("uniform SamplerType v_texture;"); | 863 HDR("uniform SamplerType v_texture;"); |
861 SRC("yuv.y = TextureLookup(u_texture, uv_clamped).x;"); | 864 SRC("texColor.y = TextureLookup(u_texture, uv_clamped).x;"); |
862 SRC("yuv.z = TextureLookup(v_texture, uv_clamped).x;"); | 865 SRC("texColor.z = TextureLookup(v_texture, uv_clamped).x;"); |
863 } | 866 } |
864 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 867 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
865 HDR("uniform SamplerType a_texture;"); | 868 HDR("uniform SamplerType a_texture;"); |
866 HDR("uniform vec4 ya_clamp_rect;"); | 869 HDR("uniform vec4 ya_clamp_rect;"); |
867 HDR("uniform vec4 uv_clamp_rect;"); | 870 HDR("uniform vec4 uv_clamp_rect;"); |
868 // Convert YUV to RGB. | |
869 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { | |
870 HDR("uniform sampler2D lut_texture;"); | |
871 HDR("uniform float lut_size;"); | |
872 HDR("uniform float resource_multiplier;"); | |
873 HDR("uniform float resource_offset;"); | |
874 HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); | |
875 HDR(" pos *= size - 1.0;"); | |
876 HDR(" // Select layer"); | |
877 HDR(" float layer = min(floor(pos.z), size - 2.0);"); | |
878 HDR(" // Compress the xy coordinates so they stay within"); | |
879 HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); | |
880 HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); | |
881 HDR(" pos.y = (pos.y + layer) / size;"); | |
882 HDR(" return mix(texture2D(sampler, pos.xy),"); | |
883 HDR(" texture2D(sampler, pos.xy + vec2(0, 1.0 / size)),"); | |
884 HDR(" pos.z - layer);"); | |
885 HDR("}"); | |
886 HDR("vec3 yuv2rgb(vec3 yuv) {"); | |
887 HDR(" yuv = (yuv - vec3(resource_offset)) * resource_multiplier;"); | |
888 HDR(" return LUT(lut_texture, yuv, lut_size).xyz;"); | |
889 HDR("}"); | |
890 } else { | |
891 HDR("uniform mat3 yuv_matrix;"); | |
892 HDR("uniform vec3 yuv_adj;"); | |
893 HDR("vec3 yuv2rgb(vec3 yuv) {"); | |
894 HDR(" return yuv_matrix * (yuv + yuv_adj);"); | |
895 HDR("}"); | |
896 } | |
897 HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); | 871 HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); |
898 HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); | 872 HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); |
899 SRC("vec4 texColor = vec4(yuv2rgb(yuv), 1.0);"); | 873 // Check that we have something that will convert the YUV to RGB later. |
874 DCHECK(has_lut_ || has_color_matrix_); | |
900 break; | 875 break; |
901 case INPUT_COLOR_SOURCE_UNIFORM: | 876 case INPUT_COLOR_SOURCE_UNIFORM: |
902 DCHECK(!ignore_sampler_type_); | 877 DCHECK(!ignore_sampler_type_); |
903 DCHECK(!has_rgba_fragment_tex_transform_); | 878 DCHECK(!has_rgba_fragment_tex_transform_); |
904 HDR("uniform vec4 color;"); | 879 HDR("uniform vec4 color;"); |
905 SRC("// Uniform color"); | 880 SRC("// Uniform color"); |
906 SRC("vec4 texColor = color;"); | 881 SRC("vec4 texColor = color;"); |
907 break; | 882 break; |
908 } | 883 } |
884 | |
ccameron
2017/02/02 23:38:07
I'm working on a patch to merge (resource_multipli
| |
885 if (has_resource_offset_) { | |
886 HDR("uniform float resource_multiplier;"); | |
887 HDR("uniform float resource_offset;"); | |
888 SRC("texColor.rgb = (texColor.rgb - vec3(resource_offset)) * "); | |
889 SRC(" resource_multiplier;"); | |
890 } | |
891 | |
909 // Apply the color matrix to texColor. | 892 // Apply the color matrix to texColor. |
910 if (has_color_matrix_) { | 893 if (has_color_matrix_) { |
911 HDR("uniform mat4 colorMatrix;"); | 894 HDR("uniform mat4 colorMatrix;"); |
912 HDR("uniform vec4 colorOffset;"); | 895 HDR("uniform vec4 colorOffset;"); |
913 SRC("// Apply color matrix"); | 896 SRC("// Apply color matrix"); |
914 SRC("float nonZeroAlpha = max(texColor.a, 0.00001);"); | 897 SRC("float nonZeroAlpha = max(texColor.a, 0.00001);"); |
915 SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);"); | 898 SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);"); |
916 SRC("texColor = colorMatrix * texColor + colorOffset;"); | 899 SRC("texColor = colorMatrix * texColor + colorOffset;"); |
917 SRC("texColor.rgb *= texColor.a;"); | 900 SRC("texColor.rgb *= texColor.a;"); |
918 SRC("texColor = clamp(texColor, 0.0, 1.0);"); | 901 SRC("texColor = clamp(texColor, 0.0, 1.0);"); |
919 } | 902 } |
920 | 903 |
904 if (has_lut_) { | |
905 HDR("uniform sampler2D lut_texture;"); | |
906 HDR("uniform float lut_size;"); | |
907 HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); | |
908 HDR(" pos *= size - 1.0;"); | |
909 HDR(" // Select layer"); | |
910 HDR(" float layer = min(floor(pos.z), size - 2.0);"); | |
911 HDR(" // Compress the xy coordinates so they stay within"); | |
912 HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); | |
913 HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); | |
914 HDR(" pos.y = (pos.y + layer) / size;"); | |
915 HDR(" return mix(texture2D(sampler, pos.xy),"); | |
916 HDR(" texture2D(sampler, pos.xy + vec2(0, 1.0 / size)),"); | |
917 HDR(" pos.z - layer);"); | |
918 HDR("}"); | |
919 SRC("texColor.xyz = LUT(lut_texture, texColor.xyz, lut_size).xyz;"); | |
920 } | |
921 | |
921 // Read the mask texture. | 922 // Read the mask texture. |
922 if (mask_mode_ != NO_MASK) { | 923 if (mask_mode_ != NO_MASK) { |
923 HDR("uniform SamplerType s_mask;"); | 924 HDR("uniform SamplerType s_mask;"); |
924 HDR("uniform vec2 maskTexCoordScale;"); | 925 HDR("uniform vec2 maskTexCoordScale;"); |
925 HDR("uniform vec2 maskTexCoordOffset;"); | 926 HDR("uniform vec2 maskTexCoordOffset;"); |
926 SRC("// Read the mask"); | 927 SRC("// Read the mask"); |
927 SRC("TexCoordPrecision vec2 maskTexCoord ="); | 928 SRC("TexCoordPrecision vec2 maskTexCoord ="); |
928 SRC(" vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,"); | 929 SRC(" vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,"); |
929 SRC(" maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);"); | 930 SRC(" maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);"); |
930 SRC("vec4 maskColor = TextureLookup(s_mask, maskTexCoord);"); | 931 SRC("vec4 maskColor = TextureLookup(s_mask, maskTexCoord);"); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1002 else | 1003 else |
1003 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); | 1004 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); |
1004 break; | 1005 break; |
1005 } | 1006 } |
1006 source += "}\n"; | 1007 source += "}\n"; |
1007 | 1008 |
1008 return header + source; | 1009 return header + source; |
1009 } | 1010 } |
1010 | 1011 |
1011 } // namespace cc | 1012 } // namespace cc |
OLD | NEW |