summaryrefslogtreecommitdiff
path: root/chromium/components/exo/surface_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/exo/surface_unittest.cc')
-rw-r--r--chromium/components/exo/surface_unittest.cc67
1 files changed, 65 insertions, 2 deletions
diff --git a/chromium/components/exo/surface_unittest.cc b/chromium/components/exo/surface_unittest.cc
index 680135e1159..9cdb9565cfc 100644
--- a/chromium/components/exo/surface_unittest.cc
+++ b/chromium/components/exo/surface_unittest.cc
@@ -190,6 +190,69 @@ TEST_P(SurfaceTest, Damage) {
}
}
+TEST_P(SurfaceTest, SubsurfaceDamageAggregation) {
+ gfx::Size buffer_size(256, 512);
+ auto buffer = std::make_unique<Buffer>(
+ exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
+ auto surface = std::make_unique<Surface>();
+ auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+ surface->Attach(buffer.get());
+
+ gfx::Size child_buffer_size(64, 128);
+ auto child_buffer = std::make_unique<Buffer>(
+ exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size));
+ auto child_surface = std::make_unique<Surface>();
+ auto sub_surface =
+ std::make_unique<SubSurface>(child_surface.get(), surface.get());
+ child_surface->Attach(child_buffer.get());
+ child_surface->Commit();
+ surface->Commit();
+ base::RunLoop().RunUntilIdle();
+
+ {
+ // Initial frame has full damage.
+ const viz::CompositorFrame& frame =
+ GetFrameFromSurface(shell_surface.get());
+ const gfx::Rect scaled_damage = gfx::ToNearestRect(gfx::ScaleRect(
+ gfx::RectF(gfx::Rect(buffer_size)), device_scale_factor()));
+ EXPECT_EQ(scaled_damage, frame.render_pass_list.back()->damage_rect);
+ }
+
+ const gfx::RectF surface_damage(16, 16);
+ const gfx::RectF subsurface_damage(32, 32, 16, 16);
+ int margin = ceil(device_scale_factor());
+
+ child_surface->Damage(gfx::ToNearestRect(subsurface_damage));
+ child_surface->Commit();
+ surface->Commit();
+ base::RunLoop().RunUntilIdle();
+
+ {
+ // Subsurface damage should be propagated.
+ const viz::CompositorFrame& frame =
+ GetFrameFromSurface(shell_surface.get());
+ const gfx::Rect scaled_damage = gfx::ToNearestRect(
+ gfx::ScaleRect(subsurface_damage, device_scale_factor()));
+ EXPECT_TRUE(scaled_damage.ApproximatelyEqual(
+ frame.render_pass_list.back()->damage_rect, margin));
+ }
+
+ surface->Damage(gfx::ToNearestRect(surface_damage));
+ surface->Commit();
+ base::RunLoop().RunUntilIdle();
+
+ {
+ // When commit is called on the root with no call on the child, the damage
+ // from the previous frame shouldn't persist.
+ const viz::CompositorFrame& frame =
+ GetFrameFromSurface(shell_surface.get());
+ const gfx::Rect scaled_damage = gfx::ToNearestRect(
+ gfx::ScaleRect(surface_damage, device_scale_factor()));
+ EXPECT_TRUE(scaled_damage.ApproximatelyEqual(
+ frame.render_pass_list.back()->damage_rect, margin));
+ }
+}
+
void SetFrameTime(base::TimeTicks* result, base::TimeTicks frame_time) {
*result = frame_time;
}
@@ -1102,11 +1165,11 @@ TEST_P(SurfaceTest, UpdatesOcclusionOnDestroyingSubsurface) {
auto sub_surface =
std::make_unique<SubSurface>(child_surface.get(), surface.get());
child_surface->Attach(child_buffer.get());
+ // Turn on occlusion tracking.
+ child_surface->SetOcclusionTracking(true);
child_surface->Commit();
surface->Commit();
- // Turn on occlusion tracking.
- child_surface->SetOcclusionTracking(true);
SurfaceObserverForTest observer;
ScopedSurface scoped_child_surface(child_surface.get(), &observer);