diff options
Diffstat (limited to 'chromium/components/viz/service/display/shader.cc')
-rw-r--r-- | chromium/components/viz/service/display/shader.cc | 85 |
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"; |