summaryrefslogtreecommitdiff
path: root/chromium/components/viz/service/display/shader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/viz/service/display/shader.cc')
-rw-r--r--chromium/components/viz/service/display/shader.cc85
1 files changed, 31 insertions, 54 deletions
diff --git a/chromium/components/viz/service/display/shader.cc b/chromium/components/viz/service/display/shader.cc
index e7a927d140e..62bab35ad8b 100644
--- a/chromium/components/viz/service/display/shader.cc
+++ b/chromium/components/viz/service/display/shader.cc
@@ -11,6 +11,7 @@
#include <vector>
#include "base/logging.h"
+#include "base/strings/char_traits.h"
#include "base/strings/stringprintf.h"
#include "components/viz/service/display/static_geometry_binding.h"
#include "gpu/command_buffer/client/gles2_interface.h"
@@ -18,29 +19,18 @@
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
-constexpr bool ConstexprEqual(const char* a, const char* b, size_t length) {
- for (size_t i = 0; i < length; i++) {
- if (a[i] != b[i])
- return false;
- }
- return true;
-}
-
constexpr base::StringPiece StripLambda(base::StringPiece shader) {
- // Must contain at least "[]() {}" and trailing null (included in size).
- // TODO(jbroman): Simplify this once we're in a post-C++17 world, where
- // starts_with and ends_with can easily be made constexpr.
- DCHECK(shader.size() >= 7); // NOLINT
- DCHECK(ConstexprEqual(shader.data(), "[]() {", 6));
+ // Must contain at least "[]() {}".
+ DCHECK(shader.starts_with("[]() {"));
+ DCHECK(shader.ends_with("}"));
shader.remove_prefix(6);
- DCHECK(shader[shader.size() - 1] == '}'); // NOLINT
shader.remove_suffix(1);
return shader;
}
// Shaders are passed in with lambda syntax, which tricks clang-format into
// handling them correctly. StripLambda removes this.
-#define SHADER0(Src) StripLambda(base::StringPiece(#Src, sizeof(#Src) - 1))
+#define SHADER0(Src) StripLambda(#Src)
#define HDR(x) \
do { \
@@ -535,11 +525,7 @@ void FragmentShader::Init(GLES2Interface* context,
}
void FragmentShader::SetBlendModeFunctions(std::string* shader_string) const {
- if (shader_string->find("ApplyBlendMode") == std::string::npos)
- return;
-
if (!has_blend_mode()) {
- shader_string->insert(0, "#define ApplyBlendMode(X, Y) (X)\n");
return;
}
@@ -549,48 +535,39 @@ void FragmentShader::SetBlendModeFunctions(std::string* shader_string) const {
uniform TexCoordPrecision vec4 backdropRect;
});
- base::StringPiece mixFunction;
+ base::StringPiece function_apply_blend_mode;
if (mask_for_background_) {
- static constexpr base::StringPiece kMixFunctionWithMask = SHADER0([]() {
- vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) {
+ static constexpr base::StringPiece kFunctionApplyBlendMode = SHADER0([]() {
+ vec4 ApplyBlendMode(vec4 src, float mask) {
+ TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
+ bgTexCoord *= backdropRect.zw;
vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord);
vec4 original_backdrop =
texture2D(s_originalBackdropTexture, bgTexCoord);
- return mix(original_backdrop, backdrop, mask);
+ vec4 dst = mix(original_backdrop, backdrop, mask);
+ return Blend(src, dst);
}
});
- mixFunction = kMixFunctionWithMask;
+ function_apply_blend_mode = kFunctionApplyBlendMode;
} else {
- static constexpr base::StringPiece kMixFunctionWithoutMask = SHADER0([]() {
- vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) {
- return texture2D(s_backdropTexture, bgTexCoord);
+ static constexpr base::StringPiece kFunctionApplyBlendMode = SHADER0([]() {
+ vec4 ApplyBlendMode(vec4 src) {
+ TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
+ bgTexCoord *= backdropRect.zw;
+ vec4 dst = texture2D(s_backdropTexture, bgTexCoord);
+ return Blend(src, dst);
}
});
- mixFunction = kMixFunctionWithoutMask;
+ function_apply_blend_mode = kFunctionApplyBlendMode;
}
- static constexpr base::StringPiece kFunctionApplyBlendMode = SHADER0([]() {
- vec4 GetBackdropColor(float mask) {
- TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
- bgTexCoord.x /= backdropRect.z;
- bgTexCoord.y /= backdropRect.w;
- return MixBackdrop(bgTexCoord, mask);
- }
-
- vec4 ApplyBlendMode(vec4 src, float mask) {
- vec4 dst = GetBackdropColor(mask);
- return Blend(src, dst);
- }
- });
-
std::string shader;
shader.reserve(shader_string->size() + 1024);
shader += "precision mediump float;";
AppendHelperFunctions(&shader);
AppendBlendFunction(&shader);
kUniforms.AppendToString(&shader);
- mixFunction.AppendToString(&shader);
- kFunctionApplyBlendMode.AppendToString(&shader);
+ function_apply_blend_mode.AppendToString(&shader);
shader += *shader_string;
*shader_string = std::move(shader);
}
@@ -1015,12 +992,6 @@ std::string FragmentShader::GetShaderSource() const {
SRC("float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);");
}
- // Premultiply by alpha.
- if (premultiply_alpha_mode_ == NON_PREMULTIPLIED_ALPHA) {
- SRC("// Premultiply alpha");
- SRC("texColor.rgb *= texColor.a;");
- }
-
// Apply background texture.
if (has_background_color_) {
HDR("uniform vec4 background_color;");
@@ -1087,10 +1058,16 @@ std::string FragmentShader::GetShaderSource() const {
SRC("gl_FragColor = vec4(texColor.rgb, 1.0);");
break;
case FRAG_COLOR_MODE_APPLY_BLEND_MODE:
- if (mask_mode_ != NO_MASK)
- SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);");
- else
- SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);");
+ if (!has_blend_mode()) {
+ SRC("gl_FragColor = texColor;");
+ } else if (mask_mode_ != NO_MASK) {
+ if (mask_for_background_)
+ SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);");
+ else
+ SRC("gl_FragColor = ApplyBlendMode(texColor);");
+ } else {
+ SRC("gl_FragColor = ApplyBlendMode(texColor);");
+ }
break;
}
source += "}\n";