Index: cc/output/shader.cc |
diff --git a/cc/output/shader.cc b/cc/output/shader.cc |
index 189154637d6ab9bffbecf1244b516762e1f9114e..883b68353996e3857f0d463fd9d20f07fc6665b3 100644 |
--- a/cc/output/shader.cc |
+++ b/cc/output/shader.cc |
@@ -144,6 +144,9 @@ static std::string SetFragmentSamplerType(SamplerType requested_type, |
} // namespace |
+ShaderLocations::ShaderLocations() { |
+} |
+ |
TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context, |
int* highp_threshold_cache, |
int highp_threshold_min, |
@@ -347,6 +350,12 @@ std::string VertexShaderPosTexTransform::GetShaderBody() { |
}); |
} |
+void VertexShaderPosTexTransform::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->matrix = matrix_location(); |
+ locations->tex_transform = tex_transform_location(); |
+} |
+ |
std::string VertexShaderPosTexIdentity::GetShaderString() const { |
return VERTEX_SHADER(GetShaderHead(), GetShaderBody()); |
} |
@@ -560,6 +569,16 @@ std::string VertexShaderQuadTexTransformAA::GetShaderBody() { |
}); |
} |
+void VertexShaderQuadTexTransformAA::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->quad = quad_location(); |
+ locations->edge = edge_location(); |
+ locations->viewport = viewport_location(); |
+ locations->matrix = matrix_location(); |
+ locations->tex_transform = tex_transform_location(); |
+} |
+ |
+ |
VertexShaderTile::VertexShaderTile() |
: matrix_location_(-1), |
quad_location_(-1), |
@@ -722,19 +741,24 @@ std::string VertexShaderVideoTransform::GetShaderBody() { |
}); |
} |
-#define BLEND_MODE_UNIFORMS "s_backdropTexture", "backdropRect" |
-#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 2 : 0) |
+#define BLEND_MODE_UNIFORMS "s_backdropTexture", \ |
+ "s_originalBackdropTexture", \ |
+ "backdropRect" |
+#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0) |
#define BLEND_MODE_SET_LOCATIONS(X, POS) \ |
if (has_blend_mode()) { \ |
- DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \ |
+ DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ |
backdrop_location_ = locations[POS]; \ |
- backdrop_rect_location_ = locations[POS + 1]; \ |
+ original_backdrop_location_ = locations[POS + 1]; \ |
+ backdrop_rect_location_ = locations[POS + 2]; \ |
} |
FragmentTexBlendMode::FragmentTexBlendMode() |
: backdrop_location_(-1), |
+ original_backdrop_location_(-1), |
backdrop_rect_location_(-1), |
- blend_mode_(BLEND_MODE_NONE) { |
+ blend_mode_(BLEND_MODE_NONE), |
+ mask_for_background_(false) { |
} |
std::string FragmentTexBlendMode::SetBlendModeFunctions( |
@@ -743,28 +767,50 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions( |
return shader_string; |
if (!has_blend_mode()) { |
- return "#define ApplyBlendMode(X) (X)\n" + shader_string; |
+ return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; |
} |
- static const std::string kFunctionApplyBlendMode = SHADER0([]() { |
+ static const std::string kUniforms = SHADER0([]() { |
uniform sampler2D s_backdropTexture; |
+ uniform sampler2D s_originalBackdropTexture; |
uniform TexCoordPrecision vec4 backdropRect; |
+ }); |
- vec4 GetBackdropColor() { |
+ std::string mixFunction; |
+ if (mask_for_background()) { |
+ mixFunction = SHADER0([]() { |
+ vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) { |
+ vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord); |
+ vec4 original_backdrop = |
+ texture2D(s_originalBackdropTexture, bgTexCoord); |
+ return mix(original_backdrop, backdrop, mask); |
+ } |
+ }); |
+ } else { |
+ mixFunction = SHADER0([]() { |
+ vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) { |
+ return texture2D(s_backdropTexture, bgTexCoord); |
+ } |
+ }); |
+ } |
+ |
+ static const std::string kFunctionApplyBlendMode = SHADER0([]() { |
+ vec4 GetBackdropColor(float mask) { |
TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy; |
bgTexCoord.x /= backdropRect.z; |
bgTexCoord.y /= backdropRect.w; |
- return texture2D(s_backdropTexture, bgTexCoord); |
+ return MixBackdrop(bgTexCoord, mask); |
} |
- vec4 ApplyBlendMode(vec4 src) { |
- vec4 dst = GetBackdropColor(); |
+ vec4 ApplyBlendMode(vec4 src, float mask) { |
+ vec4 dst = GetBackdropColor(mask); |
return Blend(src, dst); |
} |
}); |
return "precision mediump float;" + GetHelperFunctions() + |
- GetBlendFunction() + kFunctionApplyBlendMode + shader_string; |
+ GetBlendFunction() + kUniforms + mixFunction + |
+ kFunctionApplyBlendMode + shader_string; |
} |
std::string FragmentTexBlendMode::GetHelperFunctions() const { |
@@ -1100,11 +1146,19 @@ std::string FragmentShaderRGBATexAlpha::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha); |
+ gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
} |
}); |
} |
+void FragmentShaderRGBATexAlpha::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->alpha = alpha_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+} |
+ |
std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
@@ -1131,11 +1185,21 @@ std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderBody() { |
texColor = colorMatrix * texColor + colorOffset; |
texColor.rgb *= texColor.a; |
texColor = clamp(texColor, 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha); |
+ gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
} |
}); |
} |
+void FragmentShaderRGBATexColorMatrixAlpha::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->alpha = alpha_location(); |
+ locations->color_matrix = color_matrix_location(); |
+ locations->color_offset = color_offset_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+} |
+ |
std::string FragmentShaderRGBATexVaryingAlpha::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
@@ -1400,11 +1464,19 @@ std::string FragmentShaderRGBATexAlphaAA::GetShaderBody() { |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * aa); |
+ gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaAA::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->alpha = alpha_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+} |
+ |
FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding() |
: sampler_location_(-1), |
alpha_location_(-1), |
@@ -1555,11 +1627,25 @@ std::string FragmentShaderRGBATexAlphaMask::GetShaderBody() { |
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w); |
+ gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w, maskColor.w); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaMask::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->mask_sampler = mask_sampler_location(); |
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); |
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); |
+ locations->alpha = alpha_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
+} |
+ |
FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA() |
: sampler_location_(-1), |
mask_sampler_location_(-1), |
@@ -1625,11 +1711,25 @@ std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody() { |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa); |
+ gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w * aa, maskColor.w); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaMaskAA::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->mask_sampler = mask_sampler_location(); |
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); |
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); |
+ locations->alpha = alpha_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
+} |
+ |
FragmentShaderRGBATexAlphaMaskColorMatrixAA:: |
FragmentShaderRGBATexAlphaMaskColorMatrixAA() |
: sampler_location_(-1), |
@@ -1709,11 +1809,27 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody() { |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa); |
+ gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w * aa, maskColor.w); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->alpha = alpha_location(); |
+ locations->mask_sampler = mask_sampler_location(); |
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); |
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); |
+ locations->color_matrix = color_matrix_location(); |
+ locations->color_offset = color_offset_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
+} |
+ |
FragmentShaderRGBATexAlphaColorMatrixAA:: |
FragmentShaderRGBATexAlphaColorMatrixAA() |
: sampler_location_(-1), |
@@ -1773,11 +1889,21 @@ std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderBody() { |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * aa); |
+ gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaColorMatrixAA::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->alpha = alpha_location(); |
+ locations->color_matrix = color_matrix_location(); |
+ locations->color_offset = color_offset_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+} |
+ |
FragmentShaderRGBATexAlphaMaskColorMatrix:: |
FragmentShaderRGBATexAlphaMaskColorMatrix() |
: sampler_location_(-1), |
@@ -1850,11 +1976,27 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody() { |
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w); |
+ gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w, maskColor.w); |
} |
}); |
} |
+void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations( |
+ ShaderLocations* locations) const { |
+ locations->sampler = sampler_location(); |
+ locations->mask_sampler = mask_sampler_location(); |
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location(); |
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location(); |
+ locations->alpha = alpha_location(); |
+ locations->color_matrix = color_matrix_location(); |
+ locations->color_offset = color_offset_location(); |
+ locations->backdrop = backdrop_location(); |
+ locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
+} |
+ |
FragmentShaderYUVVideo::FragmentShaderYUVVideo() |
: y_texture_location_(-1), |
u_texture_location_(-1), |