Cherrypick #29783 to flutter-2.8-candidate.6 (#29812)

* PhysicalShapeLayer: Only push cull rect during diff if clipping (#29783)

* add branch to test for CI

Co-authored-by: Matej Knopp <matej.knopp@gmail.com>
diff --git a/.ci.yaml b/.ci.yaml
index 12abdde..fd3edae 100644
--- a/.ci.yaml
+++ b/.ci.yaml
@@ -11,6 +11,7 @@
   - dev
   - beta
   - stable
+  - flutter-2.8-candidate.6
 
 platform_properties:
   linux:
diff --git a/flow/layers/physical_shape_layer.cc b/flow/layers/physical_shape_layer.cc
index d443448..8215f3d 100644
--- a/flow/layers/physical_shape_layer.cc
+++ b/flow/layers/physical_shape_layer.cc
@@ -46,7 +46,8 @@
 
   context->AddLayerBounds(bounds);
 
-  if (context->PushCullRect(bounds)) {
+  // Only push cull rect if there is clip.
+  if (clip_behavior_ == Clip::none || context->PushCullRect(bounds)) {
     DiffChildren(context, prev);
   }
   context->SetLayerPaintRegion(this, context->CurrentSubtreeRegion());
diff --git a/flow/layers/physical_shape_layer_unittests.cc b/flow/layers/physical_shape_layer_unittests.cc
index e81c280..9a9bafb 100644
--- a/flow/layers/physical_shape_layer_unittests.cc
+++ b/flow/layers/physical_shape_layer_unittests.cc
@@ -4,6 +4,7 @@
 
 #include "flutter/flow/layers/physical_shape_layer.h"
 
+#include "flutter/flow/testing/diff_context_test.h"
 #include "flutter/flow/testing/layer_test.h"
 #include "flutter/flow/testing/mock_layer.h"
 #include "flutter/fml/macros.h"
@@ -350,5 +351,43 @@
   EXPECT_TRUE(ReadbackResult(context, save_layer, reader, true));
 }
 
+using PhysicalShapeLayerDiffTest = DiffContextTest;
+
+TEST_F(PhysicalShapeLayerDiffTest, NoClipPaintRegion) {
+  MockLayerTree tree1;
+  const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100));
+  auto layer =
+      std::make_shared<PhysicalShapeLayer>(SK_ColorGREEN, SK_ColorBLACK,
+                                           0.0f,  // elevation
+                                           layer_path, Clip::none);
+
+  const SkPath layer_path2 =
+      SkPath().addRect(SkRect::MakeXYWH(200, 200, 200, 200));
+  auto layer2 = std::make_shared<MockLayer>(layer_path2);
+  layer->Add(layer2);
+  tree1.root()->Add(layer);
+
+  auto damage = DiffLayerTree(tree1, MockLayerTree());
+  EXPECT_EQ(damage.frame_damage, SkIRect::MakeLTRB(0, 0, 400, 400));
+}
+
+TEST_F(PhysicalShapeLayerDiffTest, ClipPaintRegion) {
+  MockLayerTree tree1;
+  const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100));
+  auto layer =
+      std::make_shared<PhysicalShapeLayer>(SK_ColorGREEN, SK_ColorBLACK,
+                                           0.0f,  // elevation
+                                           layer_path, Clip::hardEdge);
+
+  const SkPath layer_path2 =
+      SkPath().addRect(SkRect::MakeXYWH(200, 200, 200, 200));
+  auto layer2 = std::make_shared<MockLayer>(layer_path2);
+  layer->Add(layer2);
+  tree1.root()->Add(layer);
+
+  auto damage = DiffLayerTree(tree1, MockLayerTree());
+  EXPECT_EQ(damage.frame_damage, SkIRect::MakeLTRB(0, 0, 100, 100));
+}
+
 }  // namespace testing
 }  // namespace flutter