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> |
11 | 11 |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "cc/output/static_geometry_binding.h" | 14 #include "cc/output/static_geometry_binding.h" |
15 #include "gpu/command_buffer/client/gles2_interface.h" | 15 #include "gpu/command_buffer/client/gles2_interface.h" |
| 16 #include "ui/gfx/color_transform.h" |
16 #include "ui/gfx/geometry/point.h" | 17 #include "ui/gfx/geometry/point.h" |
17 #include "ui/gfx/geometry/size.h" | 18 #include "ui/gfx/geometry/size.h" |
18 | 19 |
19 template <size_t size> | 20 template <size_t size> |
20 std::string StripLambda(const char(&shader)[size]) { | 21 std::string StripLambda(const char(&shader)[size]) { |
21 // Must contain at least "[]() {}" and trailing null (included in size). | 22 // Must contain at least "[]() {}" and trailing null (included in size). |
22 static_assert(size >= 8, | 23 static_assert(size >= 8, |
23 "String passed to StripLambda must be at least 8 characters"); | 24 "String passed to StripLambda must be at least 8 characters"); |
24 DCHECK_EQ(strncmp("[]() {", shader, 6), 0); | 25 DCHECK_EQ(strncmp("[]() {", shader, 6), 0); |
25 DCHECK_EQ(shader[size - 2], '}'); | 26 DCHECK_EQ(shader[size - 2], '}'); |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) | 433 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
433 uniforms.push_back("uv_texture"); | 434 uniforms.push_back("uv_texture"); |
434 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 435 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
435 uniforms.push_back("u_texture"); | 436 uniforms.push_back("u_texture"); |
436 uniforms.push_back("v_texture"); | 437 uniforms.push_back("v_texture"); |
437 } | 438 } |
438 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 439 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
439 uniforms.push_back("a_texture"); | 440 uniforms.push_back("a_texture"); |
440 uniforms.push_back("ya_clamp_rect"); | 441 uniforms.push_back("ya_clamp_rect"); |
441 uniforms.push_back("uv_clamp_rect"); | 442 uniforms.push_back("uv_clamp_rect"); |
442 uniforms.push_back("yuv_and_resource_matrix"); | 443 uniforms.push_back("resource_multiplier"); |
| 444 uniforms.push_back("resource_offset"); |
443 break; | 445 break; |
444 case INPUT_COLOR_SOURCE_UNIFORM: | 446 case INPUT_COLOR_SOURCE_UNIFORM: |
445 uniforms.push_back("color"); | 447 uniforms.push_back("color"); |
446 break; | 448 break; |
447 } | 449 } |
448 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { | 450 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { |
449 uniforms.push_back("lut_texture"); | 451 uniforms.push_back("lut_texture"); |
450 uniforms.push_back("lut_size"); | 452 uniforms.push_back("lut_size"); |
451 } | 453 } |
452 | 454 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) | 487 if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
486 uv_texture_location_ = locations[index++]; | 488 uv_texture_location_ = locations[index++]; |
487 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 489 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
488 u_texture_location_ = locations[index++]; | 490 u_texture_location_ = locations[index++]; |
489 v_texture_location_ = locations[index++]; | 491 v_texture_location_ = locations[index++]; |
490 } | 492 } |
491 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 493 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
492 a_texture_location_ = locations[index++]; | 494 a_texture_location_ = locations[index++]; |
493 ya_clamp_rect_location_ = locations[index++]; | 495 ya_clamp_rect_location_ = locations[index++]; |
494 uv_clamp_rect_location_ = locations[index++]; | 496 uv_clamp_rect_location_ = locations[index++]; |
495 yuv_and_resource_matrix_location_ = locations[index++]; | 497 resource_multiplier_location_ = locations[index++]; |
| 498 resource_offset_location_ = locations[index++]; |
496 break; | 499 break; |
497 case INPUT_COLOR_SOURCE_UNIFORM: | 500 case INPUT_COLOR_SOURCE_UNIFORM: |
498 color_location_ = locations[index++]; | 501 color_location_ = locations[index++]; |
499 break; | 502 break; |
500 } | 503 } |
501 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { | 504 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { |
502 lut_texture_location_ = locations[index++]; | 505 lut_texture_location_ = locations[index++]; |
503 lut_size_location_ = locations[index++]; | 506 lut_size_location_ = locations[index++]; |
504 } | 507 } |
505 DCHECK_EQ(index, locations.size()); | 508 DCHECK_EQ(index, locations.size()); |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { | 858 if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
856 HDR("uniform SamplerType u_texture;"); | 859 HDR("uniform SamplerType u_texture;"); |
857 HDR("uniform SamplerType v_texture;"); | 860 HDR("uniform SamplerType v_texture;"); |
858 SRC("texColor.y = TextureLookup(u_texture, uv_clamped).x;"); | 861 SRC("texColor.y = TextureLookup(u_texture, uv_clamped).x;"); |
859 SRC("texColor.z = TextureLookup(v_texture, uv_clamped).x;"); | 862 SRC("texColor.z = TextureLookup(v_texture, uv_clamped).x;"); |
860 } | 863 } |
861 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) | 864 if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
862 HDR("uniform SamplerType a_texture;"); | 865 HDR("uniform SamplerType a_texture;"); |
863 HDR("uniform vec4 ya_clamp_rect;"); | 866 HDR("uniform vec4 ya_clamp_rect;"); |
864 HDR("uniform vec4 uv_clamp_rect;"); | 867 HDR("uniform vec4 uv_clamp_rect;"); |
865 HDR("uniform mat4 yuv_and_resource_matrix;"); | 868 HDR("uniform float resource_multiplier;"); |
| 869 HDR("uniform float resource_offset;"); |
866 HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); | 870 HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); |
867 HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); | 871 HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); |
868 SRC("texColor = yuv_and_resource_matrix * texColor;"); | 872 SRC("texColor.xyz -= vec3(resource_offset);"); |
| 873 SRC("texColor.xyz *= resource_multiplier;"); |
869 break; | 874 break; |
870 case INPUT_COLOR_SOURCE_UNIFORM: | 875 case INPUT_COLOR_SOURCE_UNIFORM: |
871 DCHECK(!ignore_sampler_type_); | 876 DCHECK(!ignore_sampler_type_); |
872 DCHECK(!has_rgba_fragment_tex_transform_); | 877 DCHECK(!has_rgba_fragment_tex_transform_); |
873 HDR("uniform vec4 color;"); | 878 HDR("uniform vec4 color;"); |
874 SRC("// Uniform color"); | 879 SRC("// Uniform color"); |
875 SRC("vec4 texColor = color;"); | 880 SRC("vec4 texColor = color;"); |
876 break; | 881 break; |
877 } | 882 } |
878 | 883 |
879 // Apply LUT based color conversion. | 884 // Apply LUT based color conversion. |
880 if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { | 885 switch (color_conversion_mode_) { |
881 HDR("uniform sampler2D lut_texture;"); | 886 case COLOR_CONVERSION_MODE_LUT: |
882 HDR("uniform float lut_size;"); | 887 HDR("uniform sampler2D lut_texture;"); |
883 HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); | 888 HDR("uniform float lut_size;"); |
884 HDR(" pos *= size - 1.0;"); | 889 HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); |
885 HDR(" // Select layer"); | 890 HDR(" pos *= size - 1.0;"); |
886 HDR(" float layer = min(floor(pos.z), size - 2.0);"); | 891 HDR(" // Select layer"); |
887 HDR(" // Compress the xy coordinates so they stay within"); | 892 HDR(" float layer = min(floor(pos.z), size - 2.0);"); |
888 HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); | 893 HDR(" // Compress the xy coordinates so they stay within"); |
889 HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); | 894 HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); |
890 HDR(" pos.y = (pos.y + layer) / size;"); | 895 HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); |
891 HDR(" return mix(LutLookup(sampler, pos.xy),"); | 896 HDR(" pos.y = (pos.y + layer) / size;"); |
892 HDR(" LutLookup(sampler, pos.xy + vec2(0, 1.0 / size)),"); | 897 HDR(" return mix(LutLookup(sampler, pos.xy),"); |
893 HDR(" pos.z - layer);"); | 898 HDR(" LutLookup(sampler, pos.xy + vec2(0, 1.0 / size)),"); |
894 HDR("}"); | 899 HDR(" pos.z - layer);"); |
895 SRC("texColor.xyz = LUT(lut_texture, texColor.xyz, lut_size).xyz;"); | 900 HDR("}"); |
| 901 SRC("texColor.rgb = LUT(lut_texture, texColor.xyz, lut_size).xyz;"); |
| 902 break; |
| 903 case COLOR_CONVERSION_MODE_SHADER: |
| 904 header += color_transform_->GetShaderSource(); |
| 905 SRC("texColor.rgb = DoColorConversion(texColor.xyz);"); |
| 906 break; |
| 907 case COLOR_CONVERSION_MODE_NONE: |
| 908 break; |
896 } | 909 } |
897 | 910 |
898 // Apply the color matrix to texColor. | 911 // Apply the color matrix to texColor. |
899 if (has_color_matrix_) { | 912 if (has_color_matrix_) { |
900 HDR("uniform mat4 colorMatrix;"); | 913 HDR("uniform mat4 colorMatrix;"); |
901 HDR("uniform vec4 colorOffset;"); | 914 HDR("uniform vec4 colorOffset;"); |
902 SRC("// Apply color matrix"); | 915 SRC("// Apply color matrix"); |
903 SRC("float nonZeroAlpha = max(texColor.a, 0.00001);"); | 916 SRC("float nonZeroAlpha = max(texColor.a, 0.00001);"); |
904 SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);"); | 917 SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);"); |
905 SRC("texColor = colorMatrix * texColor + colorOffset;"); | 918 SRC("texColor = colorMatrix * texColor + colorOffset;"); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 else | 1004 else |
992 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); | 1005 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); |
993 break; | 1006 break; |
994 } | 1007 } |
995 source += "}\n"; | 1008 source += "}\n"; |
996 | 1009 |
997 return header + source; | 1010 return header + source; |
998 } | 1011 } |
999 | 1012 |
1000 } // namespace cc | 1013 } // namespace cc |
OLD | NEW |