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

Unified Diff: cc/output/shader.cc

Issue 959283004: Background filters are affected by masks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 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 side-by-side diff with in-line comments
Download patch
Index: cc/output/shader.cc
diff --git a/cc/output/shader.cc b/cc/output/shader.cc
index 287ffcc9b4662cc0d18366f1c7ecfbe6c9254d3c..7c994a2211299f40cec3b215ec96e7195f1fd575 100644
--- a/cc/output/shader.cc
+++ b/cc/output/shader.cc
@@ -741,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(
@@ -762,11 +767,14 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions(
return shader_string;
if (!has_blend_mode()) {
- return "#define ApplyBlendMode(X) (X)\n" + shader_string;
+ return "#define ApplyBlendMode(X) (X)\n"
+ "#define ApplyBlendModeWithMask(X, Y) (X)\n" +
+ shader_string;
}
static const std::string kFunctionApplyBlendMode = SHADER0([]() {
uniform sampler2D s_backdropTexture;
+ uniform sampler2D s_originalBackdropTexture;
uniform TexCoordPrecision vec4 backdropRect;
vec4 GetBackdropColor() {
@@ -780,6 +788,20 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions(
vec4 dst = GetBackdropColor();
return Blend(src, dst);
}
+
+ vec4 GetBackdropColorWithMask(float mask) {
+ TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
+ bgTexCoord.x /= backdropRect.z;
+ bgTexCoord.y /= backdropRect.w;
+ vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord);
+ vec4 original_backdrop = texture2D(s_originalBackdropTexture, bgTexCoord);
enne (OOO) 2015/03/03 23:27:47 Would it be more precise to call this unfiltered,
+ return mix(original_backdrop, backdrop, mask);
+ }
+
+ vec4 ApplyBlendModeWithMask(vec4 src, float mask) {
+ vec4 dst = GetBackdropColorWithMask(mask);
+ return Blend(src, dst);
+ }
});
return "precision mediump float;" + GetHelperFunctions() +
@@ -1577,7 +1599,7 @@ void FragmentShaderRGBATexAlphaMask::Init(GLES2Interface* context,
std::string FragmentShaderRGBATexAlphaMask::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody());
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background()));
}
std::string FragmentShaderRGBATexAlphaMask::GetShaderHead() {
@@ -1592,17 +1614,21 @@ std::string FragmentShaderRGBATexAlphaMask::GetShaderHead() {
});
}
-std::string FragmentShaderRGBATexAlphaMask::GetShaderBody() {
+std::string FragmentShaderRGBATexAlphaMask::GetShaderBody(
+ bool mask_for_background) {
return SHADER0([]() {
void main() {
vec4 texColor = texture2D(s_texture, v_texCoord);
TexCoordPrecision vec2 maskTexCoord =
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);
- }
- });
+ vec4 maskColor = TextureLookup(s_mask, maskTexCoord); }) +
+ (mask_for_background
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask(
+ texColor * alpha * maskColor.w, maskColor.w); })
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w); })) +
+ SHADER0([]() {}});
}
void FragmentShaderRGBATexAlphaMask::FillLocations(
@@ -1614,6 +1640,8 @@ void FragmentShaderRGBATexAlphaMask::FillLocations(
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()
@@ -1654,7 +1682,7 @@ void FragmentShaderRGBATexAlphaMaskAA::Init(GLES2Interface* context,
std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody());
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background()));
}
std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderHead() {
@@ -1670,7 +1698,8 @@ std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderHead() {
});
}
-std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody() {
+std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody(
+ bool mask_for_background) {
return SHADER0([]() {
void main() {
vec4 texColor = texture2D(s_texture, v_texCoord);
@@ -1680,10 +1709,13 @@ std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody() {
vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
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);
- }
- });
+ float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); }) +
+ (mask_for_background
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask(
+ texColor * alpha * maskColor.w * aa, maskColor.w); })
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w * aa); })) +
+ SHADER0([]() {}});
}
void FragmentShaderRGBATexAlphaMaskAA::FillLocations(
@@ -1695,6 +1727,8 @@ void FragmentShaderRGBATexAlphaMaskAA::FillLocations(
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::
@@ -1742,7 +1776,7 @@ void FragmentShaderRGBATexAlphaMaskColorMatrixAA::Init(
std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody());
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background()));
}
std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderHead() {
@@ -1760,7 +1794,8 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderHead() {
});
}
-std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody() {
+std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody(
+ bool mask_for_background) {
return SHADER0([]() {
void main() {
vec4 texColor = texture2D(s_texture, v_texCoord);
@@ -1775,10 +1810,13 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody() {
vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
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);
- }
- });
+ float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); }) +
+ (mask_for_background
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask(
enne (OOO) 2015/03/03 23:27:47 Can you make this easier to read and reduce the co
+ texColor * alpha * maskColor.w * aa, maskColor.w); })
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w * aa); })) +
+ SHADER0([]() {}});
}
void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations(
@@ -1792,6 +1830,8 @@ void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations(
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::
@@ -1910,7 +1950,7 @@ void FragmentShaderRGBATexAlphaMaskColorMatrix::Init(GLES2Interface* context,
std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody());
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background()));
}
std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderHead() {
@@ -1927,7 +1967,8 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderHead() {
});
}
-std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody() {
+std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody(
+ bool mask_for_background) {
return SHADER0([]() {
void main() {
vec4 texColor = texture2D(s_texture, v_texCoord);
@@ -1939,10 +1980,13 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody() {
TexCoordPrecision vec2 maskTexCoord =
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);
- }
- });
+ vec4 maskColor = TextureLookup(s_mask, maskTexCoord); }) +
+ (mask_for_background
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask(
+ texColor * alpha * maskColor.w, maskColor.w); })
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w); })) +
+ SHADER0([]() {}});
}
void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations(
@@ -1956,6 +2000,8 @@ void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations(
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()

Powered by Google App Engine
This is Rietveld 408576698