Chromium Code Reviews| Index: cc/surfaces/surface_unittest.cc |
| diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc |
| index 23266e2b1008324316dbb95be76d8d4ffd87315d..7aa75828482bc934c409eace4dacaba192413481 100644 |
| --- a/cc/surfaces/surface_unittest.cc |
| +++ b/cc/surfaces/surface_unittest.cc |
| @@ -4,6 +4,7 @@ |
| #include "cc/surfaces/surface.h" |
| #include "base/memory/ptr_util.h" |
| +#include "cc/output/copy_output_result.h" |
| #include "cc/surfaces/local_surface_id_allocator.h" |
| #include "cc/surfaces/surface_dependency_tracker.h" |
| #include "cc/surfaces/surface_factory.h" |
| @@ -61,5 +62,59 @@ TEST(SurfaceTest, SurfaceIds) { |
| } |
| } |
| +void TestCopyResultCallback(bool* called, |
| + std::unique_ptr<CopyOutputResult> result) { |
| + *called = true; |
| +} |
| + |
| +// Test that CopyOutputRequests can outlive the current frame and be |
| +// aggregated on the next frame. |
| +TEST(SurfaceTest, CopyRequestLifetime) { |
| + SurfaceManager manager; |
| + FakeSurfaceFactoryClient surface_factory_client; |
| + SurfaceFactory factory(kArbitraryFrameSinkId, &manager, |
| + &surface_factory_client); |
| + |
| + LocalSurfaceId local_surface_id(6, base::UnguessableToken::Create()); |
| + SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); |
| + CompositorFrame frame; |
| + frame.render_pass_list.push_back(RenderPass::Create()); |
| + factory.SubmitCompositorFrame(local_surface_id, std::move(frame), |
| + SurfaceFactory::DrawCallback()); |
| + Surface* surface = manager.GetSurfaceForId(surface_id); |
| + ASSERT_TRUE(!!surface); |
| + |
| + bool copy_called = false; |
| + factory.RequestCopyOfSurface(CopyOutputRequest::CreateRequest( |
| + base::Bind(&TestCopyResultCallback, ©_called))); |
| + EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); |
| + EXPECT_FALSE(copy_called); |
| + |
| + CompositorFrame frame2; |
| + frame2.render_pass_list.push_back(RenderPass::Create()); |
| + frame2.render_pass_list.back()->id = 1; |
| + frame2.render_pass_list.push_back(RenderPass::Create()); |
| + frame2.render_pass_list.back()->id = 2; |
| + factory.SubmitCompositorFrame(local_surface_id, std::move(frame2), |
| + SurfaceFactory::DrawCallback()); |
| + |
| + // The copy request should stay on the Surface after a new frame is created. |
| + EXPECT_FALSE(copy_called); |
| + EXPECT_EQ( |
| + 1u, |
| + surface->GetActiveFrame().render_pass_list.back()->copy_requests.size()); |
|
danakj
2017/02/28 17:33:15
This is some serious pointer travelling, and I thi
|
| + |
| + std::multimap<int, std::unique_ptr<CopyOutputRequest>> copy_requests; |
| + surface->TakeCopyOutputRequests(©_requests); |
| + EXPECT_EQ(1u, copy_requests.size()); |
| + // Last (root) pass should receive copy request. |
| + ASSERT_EQ(1u, copy_requests.count(2)); |
| + EXPECT_FALSE(copy_called); |
| + copy_requests.find(2)->second->SendEmptyResult(); |
| + EXPECT_TRUE(copy_called); |
| + |
| + factory.EvictSurface(); |
| +} |
| + |
| } // namespace |
| } // namespace cc |