| Index: cc/surfaces/surface_aggregator_unittest.cc
|
| diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc
|
| index dd60d046cbf84db75ad6ded3f1f8928fa827325a..c3f236a0b654f316e670ccd824da1537ba7e427c 100644
|
| --- a/cc/surfaces/surface_aggregator_unittest.cc
|
| +++ b/cc/surfaces/surface_aggregator_unittest.cc
|
| @@ -1446,6 +1446,113 @@ TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) {
|
| factory_.Destroy(child_surface_id);
|
| }
|
|
|
| +// Check that damage is correctly calculated for surfaces with
|
| +// SetPreviousFrameSurface.
|
| +TEST_F(SurfaceAggregatorValidSurfaceTest, SwitchSurfaceDamage) {
|
| + test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)};
|
| +
|
| + test::Pass root_passes[] = {test::Pass(root_render_pass_quads,
|
| + arraysize(root_render_pass_quads),
|
| + RenderPassId(2, 1))};
|
| +
|
| + RenderPassList root_pass_list;
|
| + AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes,
|
| + arraysize(root_passes));
|
| +
|
| + root_pass_list[0]->damage_rect = gfx::Rect(5, 5, 100, 100);
|
| +
|
| + std::unique_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
|
| + root_pass_list.swap(root_frame_data->render_pass_list);
|
| +
|
| + std::unique_ptr<CompositorFrame> root_frame(new CompositorFrame);
|
| + root_frame->delegated_frame_data = std::move(root_frame_data);
|
| +
|
| + factory_.SubmitCompositorFrame(root_surface_id_, std::move(root_frame),
|
| + SurfaceFactory::DrawCallback());
|
| +
|
| + {
|
| + std::unique_ptr<CompositorFrame> aggregated_frame =
|
| + aggregator_.Aggregate(root_surface_id_);
|
| +
|
| + ASSERT_TRUE(aggregated_frame);
|
| + ASSERT_TRUE(aggregated_frame->delegated_frame_data);
|
| +
|
| + DelegatedFrameData* frame_data =
|
| + aggregated_frame->delegated_frame_data.get();
|
| +
|
| + const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
|
| +
|
| + ASSERT_EQ(1u, aggregated_pass_list.size());
|
| +
|
| + // Damage rect for first aggregation should contain entire root surface.
|
| + EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.Contains(
|
| + gfx::Rect(SurfaceSize())));
|
| + }
|
| +
|
| + SurfaceId second_root_surface_id = allocator_.GenerateId();
|
| + {
|
| + test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)};
|
| +
|
| + test::Pass root_passes[] = {test::Pass(root_render_pass_quads,
|
| + arraysize(root_render_pass_quads),
|
| + RenderPassId(2, 1))};
|
| +
|
| + RenderPassList root_pass_list;
|
| + AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes,
|
| + arraysize(root_passes));
|
| +
|
| + root_pass_list[0]->damage_rect = gfx::Rect(1, 2, 3, 4);
|
| +
|
| + std::unique_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
|
| + root_pass_list.swap(root_frame_data->render_pass_list);
|
| +
|
| + std::unique_ptr<CompositorFrame> root_frame(new CompositorFrame);
|
| + root_frame->delegated_frame_data = std::move(root_frame_data);
|
| +
|
| + factory_.Create(second_root_surface_id);
|
| + factory_.SubmitCompositorFrame(second_root_surface_id,
|
| + std::move(root_frame),
|
| + SurfaceFactory::DrawCallback());
|
| + factory_.SetPreviousFrameSurface(second_root_surface_id, root_surface_id_);
|
| + }
|
| + {
|
| + std::unique_ptr<CompositorFrame> aggregated_frame =
|
| + aggregator_.Aggregate(second_root_surface_id);
|
| +
|
| + ASSERT_TRUE(aggregated_frame);
|
| + ASSERT_TRUE(aggregated_frame->delegated_frame_data);
|
| +
|
| + DelegatedFrameData* frame_data =
|
| + aggregated_frame->delegated_frame_data.get();
|
| +
|
| + const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
|
| +
|
| + ASSERT_EQ(1u, aggregated_pass_list.size());
|
| +
|
| + // Frame from SetPreviousFrameSurface was aggregated last, so damage rect
|
| + // from new surface should be used.
|
| + EXPECT_EQ(gfx::Rect(1, 2, 3, 4), aggregated_pass_list[0]->damage_rect);
|
| + }
|
| + {
|
| + std::unique_ptr<CompositorFrame> aggregated_frame =
|
| + aggregator_.Aggregate(second_root_surface_id);
|
| +
|
| + ASSERT_TRUE(aggregated_frame);
|
| + ASSERT_TRUE(aggregated_frame->delegated_frame_data);
|
| +
|
| + DelegatedFrameData* frame_data =
|
| + aggregated_frame->delegated_frame_data.get();
|
| +
|
| + const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
|
| +
|
| + ASSERT_EQ(1u, aggregated_pass_list.size());
|
| +
|
| + // No new frame, so no new damage.
|
| + EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty());
|
| + }
|
| + factory_.Destroy(second_root_surface_id);
|
| +}
|
| +
|
| class SurfaceAggregatorPartialSwapTest
|
| : public SurfaceAggregatorValidSurfaceTest {
|
| public:
|
|
|