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 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 |