Index: cc/output/shader.cc |
diff --git a/cc/output/shader.cc b/cc/output/shader.cc |
index 055bedaaba359a943e8285c9d3bb8a21f7b85ddd..e64dd0528d4647dc6ab96f6f139a2da454254dec 100644 |
--- a/cc/output/shader.cc |
+++ b/cc/output/shader.cc |
@@ -435,20 +435,16 @@ void FragmentShader::Init(GLES2Interface* context, |
uniforms.push_back("a_texture"); |
uniforms.push_back("ya_clamp_rect"); |
uniforms.push_back("uv_clamp_rect"); |
- if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { |
- uniforms.push_back("lut_texture"); |
- uniforms.push_back("lut_size"); |
- uniforms.push_back("resource_multiplier"); |
- uniforms.push_back("resource_offset"); |
- } else { |
- uniforms.push_back("yuv_matrix"); |
- uniforms.push_back("yuv_adj"); |
- } |
+ uniforms.push_back("yuv_and_resource_matrix"); |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
uniforms.push_back("color"); |
break; |
} |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { |
+ uniforms.push_back("lut_texture"); |
+ uniforms.push_back("lut_size"); |
+ } |
locations.resize(uniforms.size()); |
@@ -492,20 +488,16 @@ void FragmentShader::Init(GLES2Interface* context, |
a_texture_location_ = locations[index++]; |
ya_clamp_rect_location_ = locations[index++]; |
uv_clamp_rect_location_ = locations[index++]; |
- if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { |
- lut_texture_location_ = locations[index++]; |
- lut_size_location_ = locations[index++]; |
- resource_multiplier_location_ = locations[index++]; |
- resource_offset_location_ = locations[index++]; |
- } else { |
- yuv_matrix_location_ = locations[index++]; |
- yuv_adj_location_ = locations[index++]; |
- } |
+ yuv_and_resource_matrix_location_ = locations[index++]; |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
color_location_ = locations[index++]; |
break; |
} |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { |
+ lut_texture_location_ = locations[index++]; |
+ lut_size_location_ = locations[index++]; |
+ } |
DCHECK_EQ(index, locations.size()); |
} |
@@ -849,54 +841,27 @@ std::string FragmentShader::GetShaderSource() const { |
SRC("vec2 uv_clamped ="); |
SRC(" max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));"); |
// Read the Y and UV or U and V textures into |yuv|. |
- SRC("vec3 yuv;"); |
- SRC("yuv.x = TextureLookup(y_texture, ya_clamped).x;"); |
+ SRC("vec4 texColor;"); |
+ SRC("texColor.w = 1.0;"); |
+ SRC("texColor.x = TextureLookup(y_texture, ya_clamped).x;"); |
if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) { |
HDR("uniform SamplerType uv_texture;"); |
- SRC("yuv.yz = TextureLookup(uv_texture, uv_clamped).xy;"); |
+ SRC("texColor.yz = TextureLookup(uv_texture, uv_clamped).xy;"); |
} |
if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
HDR("uniform SamplerType u_texture;"); |
HDR("uniform SamplerType v_texture;"); |
- SRC("yuv.y = TextureLookup(u_texture, uv_clamped).x;"); |
- SRC("yuv.z = TextureLookup(v_texture, uv_clamped).x;"); |
+ SRC("texColor.y = TextureLookup(u_texture, uv_clamped).x;"); |
+ SRC("texColor.z = TextureLookup(v_texture, uv_clamped).x;"); |
} |
if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
HDR("uniform SamplerType a_texture;"); |
HDR("uniform vec4 ya_clamp_rect;"); |
HDR("uniform vec4 uv_clamp_rect;"); |
- // Convert YUV to RGB. |
- if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT_FROM_YUV) { |
- HDR("uniform sampler2D lut_texture;"); |
- HDR("uniform float lut_size;"); |
- HDR("uniform float resource_multiplier;"); |
- HDR("uniform float resource_offset;"); |
- HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); |
- HDR(" pos *= size - 1.0;"); |
- HDR(" // Select layer"); |
- HDR(" float layer = min(floor(pos.z), size - 2.0);"); |
- HDR(" // Compress the xy coordinates so they stay within"); |
- HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); |
- HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); |
- HDR(" pos.y = (pos.y + layer) / size;"); |
- HDR(" return mix(texture2D(sampler, pos.xy),"); |
- HDR(" texture2D(sampler, pos.xy + vec2(0, 1.0 / size)),"); |
- HDR(" pos.z - layer);"); |
- HDR("}"); |
- HDR("vec3 yuv2rgb(vec3 yuv) {"); |
- HDR(" yuv = (yuv - vec3(resource_offset)) * resource_multiplier;"); |
- HDR(" return LUT(lut_texture, yuv, lut_size).xyz;"); |
- HDR("}"); |
- } else { |
- HDR("uniform mat3 yuv_matrix;"); |
- HDR("uniform vec3 yuv_adj;"); |
- HDR("vec3 yuv2rgb(vec3 yuv) {"); |
- HDR(" return yuv_matrix * (yuv + yuv_adj);"); |
- HDR("}"); |
- } |
+ HDR("uniform mat4 yuv_and_resource_matrix;"); |
HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); |
HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); |
- SRC("vec4 texColor = vec4(yuv2rgb(yuv), 1.0);"); |
+ SRC("texColor = yuv_and_resource_matrix * texColor;"); |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
DCHECK(!ignore_sampler_type_); |
@@ -906,6 +871,26 @@ std::string FragmentShader::GetShaderSource() const { |
SRC("vec4 texColor = color;"); |
break; |
} |
+ |
+ // Apply LUT based color conversion. |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) { |
+ HDR("uniform sampler2D lut_texture;"); |
+ HDR("uniform float lut_size;"); |
+ HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {"); |
+ HDR(" pos *= size - 1.0;"); |
+ HDR(" // Select layer"); |
+ HDR(" float layer = min(floor(pos.z), size - 2.0);"); |
+ HDR(" // Compress the xy coordinates so they stay within"); |
+ HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)"); |
+ HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;"); |
+ HDR(" pos.y = (pos.y + layer) / size;"); |
+ HDR(" return mix(texture2D(sampler, pos.xy),"); |
+ HDR(" texture2D(sampler, pos.xy + vec2(0, 1.0 / size)),"); |
+ HDR(" pos.z - layer);"); |
+ HDR("}"); |
+ SRC("texColor.xyz = LUT(lut_texture, texColor.xyz, lut_size).xyz;"); |
+ } |
+ |
// Apply the color matrix to texColor. |
if (has_color_matrix_) { |
HDR("uniform mat4 colorMatrix;"); |