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

Unified Diff: cc/output/shader.cc

Issue 2549623002: Add layout qualifiers to compositor shaders (Closed)
Patch Set: Add require line Created 4 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
});
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698