[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