Index: cc/output/shader.cc |
diff --git a/cc/output/shader.cc b/cc/output/shader.cc |
index c86344c8910181f5b14423f0c2fc7f0636c6f924..ccc5cceeb1b24158739e961424a094278a0577b0 100644 |
--- a/cc/output/shader.cc |
+++ b/cc/output/shader.cc |
@@ -387,7 +387,7 @@ FragmentShader::FragmentShader() {} |
std::string FragmentShader::GetShaderString() const { |
// TODO(ccameron): Merge YUV shaders into the main shader generator. |
std::string source; |
- if (input_color_type_ == INPUT_COLOR_SOURCE_YUV_TEXTURES) |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_2D_LUT_AS_3D_FROM_YUV) |
source = GetShaderStringYUVVideo(); |
else |
source = GetShaderSource(); |
@@ -405,7 +405,7 @@ void FragmentShader::Init(GLES2Interface* context, |
unsigned program, |
int* base_uniform_index) { |
// TODO(ccameron): Merge YUV shaders into the main shader generator. |
- if (input_color_type_ == INPUT_COLOR_SOURCE_YUV_TEXTURES) { |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_2D_LUT_AS_3D_FROM_YUV) { |
InitYUVVideo(context, program, base_uniform_index); |
return; |
} |
@@ -437,7 +437,19 @@ void FragmentShader::Init(GLES2Interface* context, |
uniforms.push_back("fragmentTexTransform"); |
break; |
case INPUT_COLOR_SOURCE_YUV_TEXTURES: |
- NOTREACHED(); |
+ uniforms.push_back("y_texture"); |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
+ uniforms.push_back("uv_texture"); |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
+ uniforms.push_back("u_texture"); |
+ uniforms.push_back("v_texture"); |
+ } |
+ if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
+ uniforms.push_back("a_texture"); |
+ uniforms.push_back("ya_clamp_rect"); |
+ uniforms.push_back("uv_clamp_rect"); |
+ uniforms.push_back("yuv_matrix"); |
+ uniforms.push_back("yuv_adj"); |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
uniforms.push_back("color"); |
@@ -475,7 +487,19 @@ void FragmentShader::Init(GLES2Interface* context, |
fragment_tex_transform_location_ = locations[index++]; |
break; |
case INPUT_COLOR_SOURCE_YUV_TEXTURES: |
- NOTREACHED(); |
+ y_texture_location_ = locations[index++]; |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) |
+ uv_texture_location_ = locations[index++]; |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
+ u_texture_location_ = locations[index++]; |
+ v_texture_location_ = locations[index++]; |
+ } |
+ if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
+ a_texture_location_ = locations[index++]; |
+ ya_clamp_rect_location_ = locations[index++]; |
+ uv_clamp_rect_location_ = locations[index++]; |
+ yuv_matrix_location_ = locations[index++]; |
+ yuv_adj_location_ = locations[index++]; |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
color_location_ = locations[index++]; |
@@ -808,7 +832,32 @@ std::string FragmentShader::GetShaderSource() const { |
} |
break; |
case INPUT_COLOR_SOURCE_YUV_TEXTURES: |
- NOTREACHED(); |
+ HDR("uniform SamplerType y_texture;"); |
+ SRC("vec2 ya_clamped ="); |
+ SRC(" max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));"); |
+ SRC("vec2 uv_clamped ="); |
+ SRC(" max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));"); |
+ SRC("vec3 yuv;"); |
+ SRC("yuv.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;"); |
+ } |
+ 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;"); |
+ } |
+ 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;"); |
+ HDR("uniform mat3 yuv_matrix;"); |
+ HDR("uniform vec3 yuv_adj;"); |
+ HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); |
+ HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); |
+ SRC("vec4 texColor = vec4(yuv_matrix * (yuv + yuv_adj), 1.0);"); |
break; |
case INPUT_COLOR_SOURCE_UNIFORM: |
DCHECK(!ignore_sampler_type_); |
@@ -891,6 +940,8 @@ std::string FragmentShader::GetShaderSource() const { |
line += " * aa"; |
if (mask_mode_ != NO_MASK) |
line += " * maskColor.a"; |
+ if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) |
+ line += " * TextureLookup(a_texture, ya_clamped).x"; |
line += ";\n"; |
source += line; |
} |
@@ -945,20 +996,22 @@ void FragmentShader::InitYUVVideo(GLES2Interface* context, |
locations, |
base_uniform_index); |
y_texture_location_ = locations[0]; |
- if (!use_nv12_) { |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
u_texture_location_ = locations[1]; |
v_texture_location_ = locations[2]; |
- } else { |
+ } |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) { |
uv_texture_location_ = locations[3]; |
} |
- if (use_alpha_texture_) { |
+ if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) { |
a_texture_location_ = locations[4]; |
} |
- if (use_color_lut_) { |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_2D_LUT_AS_3D_FROM_YUV) { |
lut_texture_location_ = locations[5]; |
resource_multiplier_location_ = locations[6]; |
resource_offset_location_ = locations[7]; |
- } else { |
+ } |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_NONE) { |
yuv_matrix_location_ = locations[8]; |
yuv_adj_location_ = locations[9]; |
} |
@@ -980,14 +1033,15 @@ std::string FragmentShader::GetShaderStringYUVVideo() const { |
}); |
std::string functions = ""; |
- if (use_nv12_) { |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) { |
head += " uniform SamplerType uv_texture;\n"; |
functions += SHADER0([]() { |
vec2 GetUV(vec2 uv_clamped) { |
return TextureLookup(uv_texture, uv_clamped).xy; |
} |
}); |
- } else { |
+ } |
+ if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) { |
head += " uniform SamplerType u_texture;\n"; |
head += " uniform SamplerType v_texture;\n"; |
functions += SHADER0([]() { |
@@ -998,7 +1052,7 @@ std::string FragmentShader::GetShaderStringYUVVideo() const { |
}); |
} |
- if (use_alpha_texture_) { |
+ if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE) { |
head += " uniform SamplerType a_texture;\n"; |
functions += SHADER0([]() { |
float GetAlpha(vec2 ya_clamped) { |
@@ -1011,7 +1065,7 @@ std::string FragmentShader::GetShaderStringYUVVideo() const { |
}); |
} |
- if (use_color_lut_) { |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_2D_LUT_AS_3D_FROM_YUV) { |
head += " uniform sampler2D lut_texture;\n"; |
head += " uniform float resource_multiplier;\n"; |
head += " uniform float resource_offset;\n"; |
@@ -1034,7 +1088,8 @@ std::string FragmentShader::GetShaderStringYUVVideo() const { |
return LUT(lut_texture, yuv, 17.0).xyz; |
} |
}); |
- } else { |
+ } |
+ if (color_conversion_mode_ == COLOR_CONVERSION_MODE_NONE) { |
head += " uniform mat3 yuv_matrix;\n"; |
head += " uniform vec3 yuv_adj;\n"; |
functions += SHADER0([]() { |