Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(509)

Unified Diff: cc/surfaces/surface_unittest.cc

Issue 2695243006: Don't delete CopyOutputRequests when queueing a new Surface frame. (Closed)
Patch Set: rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/surfaces/surface.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, &copy_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(&copy_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
« no previous file with comments | « cc/surfaces/surface.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698