Index: cc/output/shader.cc |
diff --git a/cc/output/shader.cc b/cc/output/shader.cc |
index 4b23bd97a46a57b14311d231f405c68d7af548c1..6981c43dca269baf53a2a021f5e9bb47db23dfbf 100644 |
--- a/cc/output/shader.cc |
+++ b/cc/output/shader.cc |
@@ -15,6 +15,28 @@ |
#include "ui/gfx/geometry/point.h" |
#include "ui/gfx/geometry/size.h" |
+static const char* blend_mode_to_layout_qualifier[cc::LAST_BLEND_MODE + 1] = { |
+ // These first two should get skipped by conditionals and never |
+ // appear in a shader. |
+ "error_blend_none_shouldnt_use_this", |
+ "error_blend_normal_shouldnt_use_this", |
+ "blend_support_screen", |
+ "blend_support_overlay", |
+ "blend_support_darken", |
+ "blend_support_lighten", |
+ "blend_support_colordodge", |
+ "blend_support_colorburn", |
+ "blend_support_hardlight", |
+ "blend_support_softlight", |
+ "blend_support_difference", |
+ "blend_support_exclusion", |
+ "blend_support_multiply", |
+ "blend_support_hsl_hue", |
+ "blend_support_hsl_saturation", |
+ "blend_support_hsl_color", |
+ "blend_support_hsl_luminosity", |
+}; |
+ |
template <size_t size> |
std::string StripLambda(const char(&shader)[size]) { |
// Must contain at least "[]() {}" and trailing null (included in size). |
@@ -779,11 +801,13 @@ FragmentTexBlendMode::FragmentTexBlendMode() |
std::string FragmentTexBlendMode::SetBlendModeFunctions( |
const std::string& shader_string) const { |
- if (shader_string.find("ApplyBlendMode") == std::string::npos) |
- return shader_string; |
+ if (shader_string.find("ApplyBlendMode") == std::string::npos) { |
+ return "out vec4 outFragColor;\n" + shader_string; |
+ } |
if (!has_blend_mode()) { |
- return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string; |
+ return "#define ApplyBlendMode(X, Y) (X)\nout vec4 outFragColor;\n" + |
+ shader_string; |
} |
static const std::string kUniforms = SHADER0([]() { |
@@ -792,6 +816,16 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions( |
uniform TexCoordPrecision vec4 backdropRect; |
}); |
+ std::string outColor; |
+ if (blend_mode() == BLEND_MODE_NORMAL) { |
+ outColor = "out vec4 outFragColor;"; |
+ } else { |
+ outColor = base::StringPrintf( |
+ "#extension GL_KHR_blend_equation_advanced : require\n" |
Ken Russell (switch to Gerrit)
2016/12/05 05:44:33
I'm pretty sure this extension directive has to co
|
+ "layout(%s) out vec4 outFragColor;\n", |
+ blend_mode_to_layout_qualifier[blend_mode()]); |
+ } |
+ |
std::string mixFunction; |
if (mask_for_background()) { |
mixFunction = SHADER0([]() { |
@@ -826,7 +860,7 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions( |
return "precision mediump float;" + GetHelperFunctions() + |
GetBlendFunction() + kUniforms + mixFunction + |
- kFunctionApplyBlendMode + shader_string; |
+ kFunctionApplyBlendMode + outColor + shader_string; |
} |
std::string FragmentTexBlendMode::GetHelperFunctions() const { |
@@ -1162,7 +1196,7 @@ std::string FragmentShaderRGBATexAlpha::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
+ outFragColor = ApplyBlendMode(texColor * alpha, 0.0); |
} |
}); |
} |
@@ -1201,7 +1235,7 @@ std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderBody() { |
texColor = colorMatrix * texColor + colorOffset; |
texColor.rgb *= texColor.a; |
texColor = clamp(texColor, 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0); |
+ outFragColor = ApplyBlendMode(texColor * alpha, 0.0); |
} |
}); |
} |
@@ -1235,7 +1269,7 @@ std::string FragmentShaderRGBATexVaryingAlpha::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = texColor * v_alpha; |
+ outFragColor = texColor * v_alpha; |
} |
}); |
} |
@@ -1260,7 +1294,7 @@ std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderBody() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
texColor.rgb *= texColor.a; |
- gl_FragColor = texColor * v_alpha; |
+ outFragColor = texColor * v_alpha; |
} |
}); |
} |
@@ -1312,7 +1346,7 @@ std::string FragmentShaderTexBackgroundVaryingAlpha::GetShaderBody() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
texColor += background_color * (1.0 - texColor.a); |
- gl_FragColor = texColor * v_alpha; |
+ outFragColor = texColor * v_alpha; |
} |
}); |
} |
@@ -1339,7 +1373,7 @@ std::string FragmentShaderTexBackgroundPremultiplyAlpha::GetShaderBody() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
texColor.rgb *= texColor.a; |
texColor += background_color * (1.0 - texColor.a); |
- gl_FragColor = texColor * v_alpha; |
+ outFragColor = texColor * v_alpha; |
} |
}); |
} |
@@ -1362,7 +1396,7 @@ std::string FragmentShaderRGBATexOpaque::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = vec4(texColor.rgb, 1.0); |
+ outFragColor = vec4(texColor.rgb, 1.0); |
} |
}); |
} |
@@ -1382,7 +1416,7 @@ std::string FragmentShaderRGBATex::GetShaderHead() { |
std::string FragmentShaderRGBATex::GetShaderBody() { |
return SHADER0([]() { |
- void main() { gl_FragColor = TextureLookup(s_texture, v_texCoord); } |
+ void main() { outFragColor = TextureLookup(s_texture, v_texCoord); } |
}); |
} |
@@ -1405,7 +1439,7 @@ std::string FragmentShaderRGBATexSwizzleAlpha::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = |
+ outFragColor = |
vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha; |
} |
}); |
@@ -1429,7 +1463,7 @@ std::string FragmentShaderRGBATexSwizzleOpaque::GetShaderBody() { |
return SHADER0([]() { |
void main() { |
vec4 texColor = TextureLookup(s_texture, v_texCoord); |
- gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0); |
+ outFragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0); |
} |
}); |
} |
@@ -1480,7 +1514,7 @@ 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, 0.0); |
+ outFragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
} |
}); |
} |
@@ -1545,7 +1579,7 @@ std::string FragmentShaderRGBATexClampAlphaAA::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 = texColor * alpha * aa; |
+ outFragColor = texColor * alpha * aa; |
} |
}); |
} |
@@ -1577,7 +1611,7 @@ std::string FragmentShaderRGBATexClampSwizzleAlphaAA::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 = |
+ outFragColor = |
vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * aa; |
} |
}); |
@@ -1643,8 +1677,8 @@ 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, maskColor.w); |
+ outFragColor = |
+ ApplyBlendMode(texColor * alpha * maskColor.w, maskColor.w); |
} |
}); |
} |
@@ -1727,8 +1761,8 @@ 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, maskColor.w); |
+ outFragColor = |
+ ApplyBlendMode(texColor * alpha * maskColor.w * aa, maskColor.w); |
} |
}); |
} |
@@ -1825,8 +1859,8 @@ 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, maskColor.w); |
+ outFragColor = |
+ ApplyBlendMode(texColor * alpha * maskColor.w * aa, maskColor.w); |
} |
}); |
} |
@@ -1905,7 +1939,7 @@ 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, 0.0); |
+ outFragColor = ApplyBlendMode(texColor * alpha * aa, 0.0); |
} |
}); |
} |
@@ -1992,8 +2026,8 @@ 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, maskColor.w); |
+ outFragColor = |
+ ApplyBlendMode(texColor * alpha * maskColor.w, maskColor.w); |
} |
}); |
} |
@@ -2169,7 +2203,7 @@ std::string FragmentShaderYUVVideo::GetShaderString(TexCoordPrecision precision, |
vec2 uv_clamped = |
max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); |
vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); |
- gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); |
+ outFragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); |
} |
}); |
@@ -2210,7 +2244,7 @@ std::string FragmentShaderColor::GetShaderHead() { |
std::string FragmentShaderColor::GetShaderBody() { |
return SHADER0([]() { |
- void main() { gl_FragColor = color; } |
+ void main() { outFragColor = color; } |
}); |
} |
@@ -2253,7 +2287,7 @@ std::string FragmentShaderColorAA::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 = color * aa; |
+ outFragColor = color * aa; |
} |
}); |
} |