Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: cc/output/shader.cc

Issue 2675813002: Make LUTs independent of YUV in cc shaders (Closed)
Patch Set: compile fix Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« cc/output/shader.h ('K') | « cc/output/shader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« cc/output/shader.h ('K') | « cc/output/shader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698