[BGPT] Support kDstIn blend-mode for non-render surface quads
This allows us to remove the render surface for the effect
node representing a rounded-corner mask.
Bug: 926497
Test: multiple web tests exercise these code paths.
Change-Id: I8af37bb94e955a33314f397795b2b9149f29c6d7
Reviewed-on: https://chromium-review.googlesource.com/c/1460306
Reviewed-by: enne <enne@chromium.org>
Commit-Queue: Chris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#631511}
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 7d07aa39..fcdef58 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -158,10 +158,13 @@
visible_layer_rect(), layer_to_content_scale_x, layer_to_content_scale_y);
scaled_visible_layer_rect.Intersect(gfx::Rect(scaled_bounds));
+ EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
state->SetAll(scaled_draw_transform, gfx::Rect(scaled_bounds),
scaled_visible_layer_rect, draw_properties().clip_rect,
draw_properties().is_clipped, contents_opaque,
- draw_properties().opacity, SkBlendMode::kSrcOver,
+ draw_properties().opacity,
+ effect_node->has_render_surface ? SkBlendMode::kSrcOver
+ : effect_node->blend_mode,
GetSortingContextId());
}
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 0050c722..72c00d9 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -116,6 +116,13 @@
RunPixelTest(test_type_, content_root, expected_bitmap);
}
+void LayerTreeHostPixelResourceTest::RunPixelResourceTestWithLayerList(
+ scoped_refptr<Layer> root_layer,
+ base::FilePath file_name,
+ PropertyTrees* property_trees) {
+ RunPixelTestWithLayerList(test_type_, root_layer, file_name, property_trees);
+}
+
ParameterizedPixelResourceTest::ParameterizedPixelResourceTest()
: LayerTreeHostPixelResourceTest(::testing::get<0>(GetParam()),
::testing::get<1>(GetParam())) {}
diff --git a/cc/test/layer_tree_pixel_resource_test.h b/cc/test/layer_tree_pixel_resource_test.h
index 543e5c6..e5a16f2 100644
--- a/cc/test/layer_tree_pixel_resource_test.h
+++ b/cc/test/layer_tree_pixel_resource_test.h
@@ -31,6 +31,10 @@
void RunPixelResourceTest(scoped_refptr<Layer> content_root,
const SkBitmap& expected_bitmap);
+ void RunPixelResourceTestWithLayerList(scoped_refptr<Layer> root_layer,
+ base::FilePath file_name,
+ PropertyTrees* property_trees);
+
protected:
PixelResourceTestCase test_case_;
Layer::LayerMaskType mask_type_;
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
index 1f09c01..8526bd0 100644
--- a/cc/test/layer_tree_pixel_test.cc
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -17,6 +17,7 @@
#include "cc/test/pixel_test_output_surface.h"
#include "cc/test/pixel_test_utils.h"
#include "cc/test/test_in_process_context_provider.h"
+#include "cc/trees/effect_node.h"
#include "cc/trees/layer_tree_impl.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/frame_sinks/copy_output_result.h"
@@ -33,6 +34,7 @@
LayerTreePixelTest::LayerTreePixelTest()
: pixel_comparator_(new ExactPixelComparator(true)),
test_type_(PIXEL_TEST_GL),
+ property_trees_(nullptr),
pending_texture_mailbox_callbacks_(0) {}
LayerTreePixelTest::~LayerTreePixelTest() = default;
@@ -118,7 +120,16 @@
void LayerTreePixelTest::BeginTest() {
Layer* target =
readback_target_ ? readback_target_ : layer_tree_host()->root_layer();
- target->RequestCopyOfOutput(CreateCopyOutputRequest());
+ if (!property_trees_) {
+ target->RequestCopyOfOutput(CreateCopyOutputRequest());
+ } else {
+ layer_tree_host()->property_trees()->effect_tree.AddCopyRequest(
+ target->effect_tree_index(), CreateCopyOutputRequest());
+ layer_tree_host()
+ ->property_trees()
+ ->effect_tree.Node(target->effect_tree_index())
+ ->has_copy_request = true;
+ }
PostSetNeedsCommitToMainThread();
}
@@ -150,6 +161,8 @@
layer->SetIsDrawable(true);
layer->SetBounds(rect.size());
layer->SetPosition(gfx::PointF(rect.origin()));
+ layer->SetOffsetToTransformParent(
+ gfx::Vector2dF(rect.origin().x(), rect.origin().y()));
layer->SetBackgroundColor(color);
return layer;
}
@@ -205,10 +218,9 @@
return layer;
}
-void LayerTreePixelTest::RunPixelTest(
- PixelTestType test_type,
- scoped_refptr<Layer> content_root,
- base::FilePath file_name) {
+void LayerTreePixelTest::RunPixelTest(PixelTestType test_type,
+ scoped_refptr<Layer> content_root,
+ base::FilePath file_name) {
test_type_ = test_type;
content_root_ = content_root;
readback_target_ = nullptr;
@@ -227,6 +239,48 @@
RunTest(CompositorMode::THREADED);
}
+void LayerTreePixelTest::RunPixelTestWithLayerList(
+ PixelTestType test_type,
+ scoped_refptr<Layer> root_layer,
+ base::FilePath file_name,
+ PropertyTrees* property_trees) {
+ test_type_ = test_type;
+ content_root_ = root_layer;
+ property_trees_ = property_trees;
+ readback_target_ = nullptr;
+ ref_file_ = file_name;
+ RunTest(CompositorMode::THREADED);
+}
+
+void LayerTreePixelTest::InitializeForLayerListMode(
+ scoped_refptr<Layer>* root_layer,
+ PropertyTrees* property_trees) {
+ ClipNode clip_node;
+ property_trees->clip_tree.Insert(clip_node, 0);
+
+ EffectNode root_effect;
+ root_effect.clip_id = 1;
+ root_effect.stable_id = 1;
+ root_effect.transform_id = 1;
+ root_effect.has_render_surface = true;
+ property_trees->effect_tree.Insert(root_effect, 0);
+
+ ScrollNode scroll_node;
+ property_trees->scroll_tree.Insert(scroll_node, 0);
+
+ TransformNode transform_node;
+ property_trees->transform_tree.Insert(transform_node, 0);
+
+ *root_layer = Layer::Create();
+ (*root_layer)->SetBounds(gfx::Size(100, 100));
+ (*root_layer)->SetEffectTreeIndex(1);
+ (*root_layer)->SetClipTreeIndex(1);
+ (*root_layer)->SetScrollTreeIndex(1);
+ (*root_layer)->SetTransformTreeIndex(1);
+ (*root_layer)
+ ->set_property_tree_sequence_number(property_trees->sequence_number);
+}
+
void LayerTreePixelTest::RunSingleThreadedPixelTest(
PixelTestType test_type,
scoped_refptr<Layer> content_root,
@@ -251,10 +305,15 @@
}
void LayerTreePixelTest::SetupTree() {
- scoped_refptr<Layer> root = Layer::Create();
- root->SetBounds(content_root_->bounds());
- root->AddChild(content_root_);
- layer_tree_host()->SetRootLayer(root);
+ if (property_trees_) {
+ layer_tree_host()->SetRootLayer(content_root_);
+ layer_tree_host()->SetPropertyTreesForTesting(property_trees_);
+ } else {
+ scoped_refptr<Layer> root = Layer::Create();
+ root->SetBounds(content_root_->bounds());
+ root->AddChild(content_root_);
+ layer_tree_host()->SetRootLayer(root);
+ }
LayerTreeTest::SetupTree();
}
diff --git a/cc/test/layer_tree_pixel_test.h b/cc/test/layer_tree_pixel_test.h
index 3c95b739..4c37dc66 100644
--- a/cc/test/layer_tree_pixel_test.h
+++ b/cc/test/layer_tree_pixel_test.h
@@ -11,6 +11,10 @@
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "cc/test/layer_tree_test.h"
+#include "cc/trees/clip_node.h"
+#include "cc/trees/effect_node.h"
+#include "cc/trees/scroll_node.h"
+#include "cc/trees/transform_node.h"
#include "components/viz/common/resources/single_release_callback.h"
#include "ui/gl/gl_implementation.h"
@@ -71,6 +75,12 @@
int border_width,
SkColor border_color);
+ // Initializes the root layer and root PropertyTrees for layer list mode.
+ // In this mode, all other layers are direct children of |root_layer| and
+ // any property nodes are descendants of node id 1 in the respective trees.
+ void InitializeForLayerListMode(scoped_refptr<Layer>* root_layer,
+ PropertyTrees* property_trees);
+
void RunPixelTest(PixelTestType type,
scoped_refptr<Layer> content_root,
base::FilePath file_name);
@@ -78,6 +88,11 @@
scoped_refptr<Layer> content_root,
const SkBitmap& expected_bitmap);
+ void RunPixelTestWithLayerList(PixelTestType type,
+ scoped_refptr<Layer> root_layer,
+ base::FilePath file_name,
+ PropertyTrees* property_trees);
+
void RunSingleThreadedPixelTest(PixelTestType test_type,
scoped_refptr<Layer> content_root,
base::FilePath file_name);
@@ -111,6 +126,7 @@
std::unique_ptr<PixelComparator> pixel_comparator_;
PixelTestType test_type_;
scoped_refptr<Layer> content_root_;
+ PropertyTrees* property_trees_;
Layer* readback_target_;
base::FilePath ref_file_;
SkBitmap expected_bitmap_;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index d58a088..447726f 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1839,6 +1839,11 @@
return LayerListReverseIterator<Layer>(nullptr);
}
+void LayerTreeHost::SetPropertyTreesForTesting(
+ const PropertyTrees* property_trees) {
+ property_trees_ = *property_trees;
+}
+
void LayerTreeHost::SetNeedsDisplayOnAllLayers() {
for (auto* layer : *this)
layer->SetNeedsDisplay();
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 51dcb19..2dfc651f 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -491,6 +491,8 @@
PropertyTrees* property_trees() { return &property_trees_; }
const PropertyTrees* property_trees() const { return &property_trees_; }
+ void SetPropertyTreesForTesting(const PropertyTrees* property_trees);
+
void SetNeedsDisplayOnAllLayers();
void RegisterLayer(Layer* layer);
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index 46807685..5ba2606 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -93,6 +93,205 @@
base::FilePath(FILE_PATH_LITERAL("mask_of_layer.png")));
}
+class LayerTreeHostLayerListPixelTest : public ParameterizedPixelResourceTest {
+ void InitializeSettings(LayerTreeSettings* settings) override {
+ settings->use_layer_lists = true;
+ }
+};
+
+INSTANTIATE_PIXEL_RESOURCE_TEST_CASE_P(LayerTreeHostLayerListPixelTest);
+
+TEST_P(LayerTreeHostLayerListPixelTest, MaskWithEffect) {
+ PropertyTrees property_trees;
+ scoped_refptr<Layer> root_layer;
+ InitializeForLayerListMode(&root_layer, &property_trees);
+
+ EffectNode isolation_effect;
+ isolation_effect.clip_id = 1;
+ isolation_effect.stable_id = 2;
+ isolation_effect.has_render_surface = true;
+ isolation_effect.transform_id = 1;
+ property_trees.effect_tree.Insert(isolation_effect, 1);
+
+ EffectNode mask_effect;
+ mask_effect.clip_id = 1;
+ mask_effect.stable_id = 2;
+ mask_effect.transform_id = 1;
+ mask_effect.blend_mode = SkBlendMode::kDstIn;
+ property_trees.effect_tree.Insert(mask_effect, 2);
+
+ scoped_refptr<SolidColorLayer> background =
+ CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
+ background->set_property_tree_sequence_number(property_trees.sequence_number);
+ background->SetClipTreeIndex(1);
+ background->SetEffectTreeIndex(1);
+ background->SetScrollTreeIndex(1);
+ background->SetTransformTreeIndex(1);
+ root_layer->AddChild(background);
+
+ scoped_refptr<SolidColorLayer> green =
+ CreateSolidColorLayer(gfx::Rect(25, 25, 50, 50), kCSSGreen);
+ green->set_property_tree_sequence_number(property_trees.sequence_number);
+ green->SetClipTreeIndex(1);
+ green->SetEffectTreeIndex(2);
+ green->SetScrollTreeIndex(1);
+ green->SetTransformTreeIndex(1);
+
+ root_layer->AddChild(green);
+
+ gfx::Size mask_bounds(50, 50);
+ MaskContentLayerClient client(mask_bounds);
+
+ scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
+ mask->SetOffsetToTransformParent(gfx::Vector2dF(25, 25));
+ mask->set_property_tree_sequence_number(property_trees.sequence_number);
+ mask->SetBounds(mask_bounds);
+ mask->SetIsDrawable(true);
+ mask->SetClipTreeIndex(1);
+ mask->SetEffectTreeIndex(3);
+ mask->SetScrollTreeIndex(1);
+ mask->SetTransformTreeIndex(1);
+ root_layer->AddChild(mask);
+
+ RunPixelResourceTestWithLayerList(
+ root_layer, base::FilePath(FILE_PATH_LITERAL("mask_with_effect.png")),
+ &property_trees);
+}
+
+TEST_P(LayerTreeHostLayerListPixelTest, MaskWithEffectDifferentSize) {
+ PropertyTrees property_trees;
+ scoped_refptr<Layer> root_layer;
+ InitializeForLayerListMode(&root_layer, &property_trees);
+
+ EffectNode isolation_effect;
+ isolation_effect.clip_id = 1;
+ isolation_effect.stable_id = 2;
+ isolation_effect.has_render_surface = true;
+ isolation_effect.transform_id = 1;
+ property_trees.effect_tree.Insert(isolation_effect, 1);
+
+ EffectNode mask_effect;
+ mask_effect.clip_id = 1;
+ mask_effect.stable_id = 2;
+ mask_effect.transform_id = 1;
+ mask_effect.blend_mode = SkBlendMode::kDstIn;
+ property_trees.effect_tree.Insert(mask_effect, 2);
+
+ scoped_refptr<SolidColorLayer> background =
+ CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
+ background->set_property_tree_sequence_number(property_trees.sequence_number);
+ background->SetClipTreeIndex(1);
+ background->SetEffectTreeIndex(1);
+ background->SetScrollTreeIndex(1);
+ background->SetTransformTreeIndex(1);
+ root_layer->AddChild(background);
+
+ scoped_refptr<SolidColorLayer> green =
+ CreateSolidColorLayer(gfx::Rect(25, 25, 50, 50), kCSSGreen);
+ green->set_property_tree_sequence_number(property_trees.sequence_number);
+ green->SetClipTreeIndex(1);
+ green->SetEffectTreeIndex(2);
+ green->SetScrollTreeIndex(1);
+ green->SetTransformTreeIndex(1);
+
+ root_layer->AddChild(green);
+
+ gfx::Size mask_bounds(25, 25);
+ MaskContentLayerClient client(mask_bounds);
+
+ scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
+ mask->SetOffsetToTransformParent(gfx::Vector2dF(25, 25));
+ mask->set_property_tree_sequence_number(property_trees.sequence_number);
+ mask->SetBounds(mask_bounds);
+ mask->SetIsDrawable(true);
+ mask->SetClipTreeIndex(1);
+ mask->SetEffectTreeIndex(3);
+ mask->SetScrollTreeIndex(1);
+ mask->SetTransformTreeIndex(1);
+ root_layer->AddChild(mask);
+
+ // The mask is half the size of thing it's masking. In layer-list mode,
+ // the mask is not automatically scaled to match the other layer.
+ RunPixelResourceTestWithLayerList(
+ root_layer,
+ base::FilePath(FILE_PATH_LITERAL("mask_with_effect_different_size.png")),
+ &property_trees);
+}
+
+TEST_P(LayerTreeHostLayerListPixelTest, ImageMaskWithEffect) {
+ PropertyTrees property_trees;
+ scoped_refptr<Layer> root_layer;
+ InitializeForLayerListMode(&root_layer, &property_trees);
+
+ EffectNode isolation_effect;
+ isolation_effect.clip_id = 1;
+ isolation_effect.stable_id = 2;
+ isolation_effect.has_render_surface = true;
+ isolation_effect.transform_id = 1;
+ property_trees.effect_tree.Insert(isolation_effect, 1);
+
+ EffectNode mask_effect;
+ mask_effect.clip_id = 1;
+ mask_effect.stable_id = 2;
+ mask_effect.transform_id = 1;
+ mask_effect.blend_mode = SkBlendMode::kDstIn;
+ property_trees.effect_tree.Insert(mask_effect, 2);
+
+ scoped_refptr<SolidColorLayer> background =
+ CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
+ background->set_property_tree_sequence_number(property_trees.sequence_number);
+ background->SetClipTreeIndex(1);
+ background->SetEffectTreeIndex(1);
+ background->SetScrollTreeIndex(1);
+ background->SetTransformTreeIndex(1);
+ root_layer->AddChild(background);
+
+ scoped_refptr<SolidColorLayer> green =
+ CreateSolidColorLayer(gfx::Rect(25, 25, 50, 50), kCSSGreen);
+ green->set_property_tree_sequence_number(property_trees.sequence_number);
+ green->SetClipTreeIndex(1);
+ green->SetEffectTreeIndex(2);
+ green->SetScrollTreeIndex(1);
+ green->SetTransformTreeIndex(1);
+
+ root_layer->AddChild(green);
+
+ gfx::Size mask_bounds(50, 50);
+ MaskContentLayerClient client(mask_bounds);
+
+ scoped_refptr<PictureImageLayer> mask = PictureImageLayer::Create();
+ mask->SetOffsetToTransformParent(gfx::Vector2dF(25, 25));
+ mask->set_property_tree_sequence_number(property_trees.sequence_number);
+ mask->SetBounds(mask_bounds);
+ mask->SetIsDrawable(true);
+ mask->SetClipTreeIndex(1);
+ mask->SetEffectTreeIndex(3);
+ mask->SetScrollTreeIndex(1);
+ mask->SetTransformTreeIndex(1);
+
+ sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(200, 200);
+ SkCanvas* canvas = surface->getCanvas();
+ canvas->scale(SkIntToScalar(4), SkIntToScalar(4));
+ scoped_refptr<DisplayItemList> mask_display_list =
+ client.PaintContentsToDisplayList(
+ ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+ mask_display_list->Raster(canvas);
+ mask->SetImage(PaintImageBuilder::WithDefault()
+ .set_id(PaintImage::GetNextId())
+ .set_image(surface->makeImageSnapshot(),
+ PaintImage::GetNextContentId())
+ .TakePaintImage(),
+ SkMatrix::I(), false);
+ root_layer->AddChild(mask);
+
+ // The mask is half the size of thing it's masking. In layer-list mode,
+ // the mask is not automatically scaled to match the other layer.
+ RunPixelResourceTestWithLayerList(
+ root_layer,
+ base::FilePath(FILE_PATH_LITERAL("image_mask_with_effect.png")),
+ &property_trees);
+}
+
TEST_P(LayerTreeHostMasksPixelTest, ImageMaskOfLayer) {
scoped_refptr<SolidColorLayer> background =
CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
diff --git a/components/viz/common/quads/draw_quad.h b/components/viz/common/quads/draw_quad.h
index 4cbe49f..ab160c3 100644
--- a/components/viz/common/quads/draw_quad.h
+++ b/components/viz/common/quads/draw_quad.h
@@ -73,7 +73,8 @@
bool IsDebugQuad() const { return material == DEBUG_BORDER; }
bool ShouldDrawWithBlending() const {
- return needs_blending || shared_quad_state->opacity < 1.0f;
+ return needs_blending || shared_quad_state->opacity < 1.0f ||
+ shared_quad_state->blend_mode != SkBlendMode::kSrcOver;
}
// Is the left edge of this tile aligned with the originating layer's
diff --git a/components/viz/service/display/gl_renderer.cc b/components/viz/service/display/gl_renderer.cc
index 7d50893..7764f9e 100644
--- a/components/viz/service/display/gl_renderer.cc
+++ b/components/viz/service/display/gl_renderer.cc
@@ -1956,6 +1956,7 @@
fragment_tex_translate_x, fragment_tex_translate_y,
fragment_tex_scale_x, fragment_tex_scale_y);
+ DCHECK_EQ(quad->shared_quad_state->blend_mode, SkBlendMode::kSrcOver);
// Blending is required for antialiasing.
SetBlendEnabled(true);
SetShaderOpacity(quad->shared_quad_state->opacity);
@@ -2044,7 +2045,9 @@
tex_coord_rect.x(), tex_coord_rect.y(), tex_coord_rect.width(),
tex_coord_rect.height());
+ DCHECK(CanApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode));
SetBlendEnabled(quad->ShouldDrawWithBlending());
+ ApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode);
SetShaderOpacity(quad->shared_quad_state->opacity);
@@ -2086,6 +2089,7 @@
gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
num_triangles_drawn_ += 2;
+ RestoreBlendFuncToDefault(quad->shared_quad_state->blend_mode);
}
void GLRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
diff --git a/components/viz/test/data/image_mask_with_effect.png b/components/viz/test/data/image_mask_with_effect.png
new file mode 100644
index 0000000..8414527
--- /dev/null
+++ b/components/viz/test/data/image_mask_with_effect.png
Binary files differ
diff --git a/components/viz/test/data/mask_with_effect.png b/components/viz/test/data/mask_with_effect.png
new file mode 100644
index 0000000..8414527
--- /dev/null
+++ b/components/viz/test/data/mask_with_effect.png
Binary files differ
diff --git a/components/viz/test/data/mask_with_effect_different_size.png b/components/viz/test/data/mask_with_effect_different_size.png
new file mode 100644
index 0000000..82917eb
--- /dev/null
+++ b/components/viz/test/data/mask_with_effect_different_size.png
Binary files differ
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
index b3e4b42..d2b161c7 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -429,7 +429,6 @@
GetEffectTree().Insert(cc::EffectNode(), current_.effect_id));
mask_effect.stable_id = mask_effect_id.GetInternalValue();
mask_effect.clip_id = clip_id;
- mask_effect.has_render_surface = true;
mask_effect.blend_mode = SkBlendMode::kDstIn;
const auto& clip_space = current_.clip->LocalTransformSpace();
diff --git a/third_party/blink/web_tests/compositing/overflow/tiled-mask-expected.png b/third_party/blink/web_tests/compositing/overflow/tiled-mask-expected.png
index 0eac266..2fb86778 100644
--- a/third_party/blink/web_tests/compositing/overflow/tiled-mask-expected.png
+++ b/third_party/blink/web_tests/compositing/overflow/tiled-mask-expected.png
Binary files differ