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

Side by Side Diff: cc/surfaces/compositor_frame_sink_support_unittest.cc

Issue 2785103003: [cc] CompositorFrameSinkSupport: Defer BeginFrameAck of pending frames. (Closed)
Patch Set: add comment Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/surfaces/compositor_frame_sink_support.h" 5 #include "cc/surfaces/compositor_frame_sink_support.h"
6 6
7 #include "base/debug/stack_trace.h" 7 #include "base/debug/stack_trace.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/surfaces/compositor_frame_sink_support_client.h" 10 #include "cc/surfaces/compositor_frame_sink_support_client.h"
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker( 180 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
181 new SurfaceDependencyTracker(&surface_manager_, 181 new SurfaceDependencyTracker(&surface_manager_,
182 begin_frame_source_.get())); 182 begin_frame_source_.get()));
183 surface_manager_.SetDependencyTracker(std::move(dependency_tracker)); 183 surface_manager_.SetDependencyTracker(std::move(dependency_tracker));
184 supports_.push_back(CreateCompositorFrameSinkSupport(kDisplayFrameSink, 184 supports_.push_back(CreateCompositorFrameSinkSupport(kDisplayFrameSink,
185 true /* is_root */)); 185 true /* is_root */));
186 supports_.push_back(CreateCompositorFrameSinkSupport(kParentFrameSink)); 186 supports_.push_back(CreateCompositorFrameSinkSupport(kParentFrameSink));
187 supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink1)); 187 supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink1));
188 supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink2)); 188 supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink2));
189 // Normally, the BeginFrameSource would be registered by the Display. We 189 // Normally, the BeginFrameSource would be registered by the Display. We
190 // register it here so that BeginFrames are received by the display support, 190 // register it here so that BeginFrames are received by the supports,
191 // for use in the PassesOnBeginFrameAcks test. Other supports do not receive 191 // for use in the BeginFrameAck tests.
192 // BeginFrames, since the frame sink hierarchy is not set up in this test.
193 surface_manager_.RegisterBeginFrameSource(begin_frame_source_.get(), 192 surface_manager_.RegisterBeginFrameSource(begin_frame_source_.get(),
194 kDisplayFrameSink); 193 kDisplayFrameSink);
194 // Setup hierarchy so that other supports receive BeginFrames, too.
195 surface_manager_.RegisterFrameSinkHierarchy(kDisplayFrameSink,
196 kParentFrameSink);
197 surface_manager_.RegisterFrameSinkHierarchy(kParentFrameSink,
198 kChildFrameSink1);
199 surface_manager_.RegisterFrameSinkHierarchy(kParentFrameSink,
200 kChildFrameSink2);
195 } 201 }
196 202
197 void TearDown() override { 203 void TearDown() override {
198 surface_manager_.SetDependencyTracker(nullptr); 204 surface_manager_.SetDependencyTracker(nullptr);
199 surface_manager_.UnregisterBeginFrameSource(begin_frame_source_.get()); 205 surface_manager_.UnregisterBeginFrameSource(begin_frame_source_.get());
200 206
201 // SurfaceDependencyTracker depends on this BeginFrameSource and so it must 207 // SurfaceDependencyTracker depends on this BeginFrameSource and so it must
202 // be destroyed AFTER the dependency tracker is destroyed. 208 // be destroyed AFTER the dependency tracker is destroyed.
203 begin_frame_source_.reset(); 209 begin_frame_source_.reset();
204 210
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 aggregated_latency_info.AddNewLatencyFrom(info_list[1]); 957 aggregated_latency_info.AddNewLatencyFrom(info_list[1]);
952 EXPECT_EQ(2u, aggregated_latency_info.latency_components().size()); 958 EXPECT_EQ(2u, aggregated_latency_info.latency_components().size());
953 959
954 ui::LatencyInfo::LatencyComponent comp1; 960 ui::LatencyInfo::LatencyComponent comp1;
955 EXPECT_TRUE( 961 EXPECT_TRUE(
956 aggregated_latency_info.FindLatency(latency_type1, latency_id1, &comp1)); 962 aggregated_latency_info.FindLatency(latency_type1, latency_id1, &comp1));
957 EXPECT_EQ(latency_sequence_number1, comp1.sequence_number); 963 EXPECT_EQ(latency_sequence_number1, comp1.sequence_number);
958 } 964 }
959 965
960 TEST_F(CompositorFrameSinkSupportTest, PassesOnBeginFrameAcks) { 966 TEST_F(CompositorFrameSinkSupportTest, PassesOnBeginFrameAcks) {
967 const SurfaceId display_id = MakeSurfaceId(kDisplayFrameSink, 1);
968
961 // Request BeginFrames. 969 // Request BeginFrames.
962 display_support().SetNeedsBeginFrame(true); 970 display_support().SetNeedsBeginFrame(true);
963 971
964 // Issue a BeginFrame. 972 // Issue a BeginFrame.
965 BeginFrameArgs args = 973 BeginFrameArgs args =
966 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); 974 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
967 begin_frame_source()->TestOnBeginFrame(args); 975 begin_frame_source()->TestOnBeginFrame(args);
968 976
969 // Check that the support forwards a BeginFrameDidNotSwap ack to the 977 // Check that the support forwards a BeginFrameDidNotSwap ack to the
970 // BeginFrameSource. 978 // BeginFrameSource.
971 BeginFrameAck ack(0, 1, 1, false); 979 BeginFrameAck ack(0, 1, 1, false);
972 display_support().BeginFrameDidNotSwap(ack); 980 display_support().BeginFrameDidNotSwap(ack);
973 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support())); 981 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support()));
974 982
975 // TODO(eseckler): Check that the support forwards the BeginFrameAck attached 983 // Issue another BeginFrame.
984 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
985 begin_frame_source()->TestOnBeginFrame(args);
986
987 // Check that the support forwards the BeginFrameAck attached
976 // to a CompositorFrame to the BeginFrameSource. 988 // to a CompositorFrame to the BeginFrameSource.
989 BeginFrameAck ack2(0, 2, 2, true);
990 CompositorFrame frame = MakeCompositorFrame();
991 frame.metadata.begin_frame_ack = ack2;
992 display_support().SubmitCompositorFrame(display_id.local_surface_id(),
993 std::move(frame));
994 EXPECT_EQ(ack2, begin_frame_source()->LastAckForObserver(&display_support()));
995 }
996
997 TEST_F(CompositorFrameSinkSupportTest,
998 WaitsToPassOnCompositorFrameBeginFrameAckUntilActivated) {
999 const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1);
1000 const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2);
1001 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
1002 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2);
1003
1004 // Parent client submits a frame with blocked dependency on child.
1005 parent_support().SetNeedsBeginFrame(true);
1006 BeginFrameArgs args =
1007 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
1008 begin_frame_source()->TestOnBeginFrame(args);
1009 CompositorFrame frame = MakeCompositorFrame({child_id1});
1010 frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true);
1011 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(),
1012 std::move(frame));
1013 // Parent doesn't ack immediately.
1014 EXPECT_EQ(BeginFrameAck(),
1015 begin_frame_source()->LastAckForObserver(&parent_support()));
1016
1017 // Parent client no longer needs BeginFrames, but parent needs to continue
1018 // observing.
1019 size_t num_observers = begin_frame_source()->num_observers();
1020 parent_support().SetNeedsBeginFrame(false);
1021 EXPECT_EQ(num_observers, begin_frame_source()->num_observers());
1022
1023 // On new BeginFrame, parent acknowledges the past one without updates.
1024 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
1025 begin_frame_source()->TestOnBeginFrame(args);
1026 EXPECT_EQ(BeginFrameAck(0, 1, 0, false),
1027 begin_frame_source()->LastAckForObserver(&parent_support()));
1028
1029 // Same again. As the client doesn't have updates (isn't requesting
1030 // BeginFrames), the pending ack is updated to confirm the last BeginFrame.
1031 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3);
1032 begin_frame_source()->TestOnBeginFrame(args);
1033 EXPECT_EQ(BeginFrameAck(0, 2, 0, false),
1034 begin_frame_source()->LastAckForObserver(&parent_support()));
1035 EXPECT_EQ(2u, parent_support()
1036 .begin_frame_ack_for_pending_frame_for_testing()
1037 ->latest_confirmed_sequence_number);
1038
1039 // Concurrent DidNotSwapAck from parent client updates pending ack.
1040 parent_support().SetNeedsBeginFrame(true);
1041 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4);
1042 begin_frame_source()->TestOnBeginFrame(args);
1043 // Parent acknowledges prior frame.
1044 EXPECT_EQ(BeginFrameAck(0, 3, 0, false),
1045 begin_frame_source()->LastAckForObserver(&parent_support()));
1046 parent_support().BeginFrameDidNotSwap(BeginFrameAck(0, 4, 4, false));
1047 // Parent doesn't ack immediately.
1048 EXPECT_EQ(BeginFrameAck(0, 3, 0, false),
1049 begin_frame_source()->LastAckForObserver(&parent_support()));
1050 EXPECT_EQ(4u, parent_support()
1051 .begin_frame_ack_for_pending_frame_for_testing()
1052 ->latest_confirmed_sequence_number);
1053
1054 // When child client unblocks parent, parent sends pending ack.
1055 child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
1056 MakeCompositorFrame());
1057 EXPECT_EQ(BeginFrameAck(0, 4, 4, true),
1058 begin_frame_source()->LastAckForObserver(&parent_support()));
1059
1060 // Parent client submits another frame with blocked dependency on child.
1061 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 5);
1062 begin_frame_source()->TestOnBeginFrame(args);
1063 frame = MakeCompositorFrame({child_id2});
1064 frame.metadata.begin_frame_ack = BeginFrameAck(0, 5, 5, true);
1065 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(),
1066 std::move(frame));
1067 // Parent doesn't ack immediately.
1068 EXPECT_EQ(BeginFrameAck(0, 4, 4, true),
1069 begin_frame_source()->LastAckForObserver(&parent_support()));
1070
1071 // Submission of another CompositorFrame to parent updates pending ack.
1072 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 6);
1073 begin_frame_source()->TestOnBeginFrame(args);
1074 // Parent acknowledges prior frame.
1075 EXPECT_EQ(BeginFrameAck(0, 5, 4, false),
1076 begin_frame_source()->LastAckForObserver(&parent_support()));
1077 frame = MakeCompositorFrame({child_id2});
1078 frame.metadata.begin_frame_ack = BeginFrameAck(0, 6, 6, true);
1079 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(),
1080 std::move(frame));
1081 // Parent doesn't ack immediately.
1082 EXPECT_EQ(BeginFrameAck(0, 5, 4, false),
1083 begin_frame_source()->LastAckForObserver(&parent_support()));
1084 EXPECT_EQ(6u, parent_support()
1085 .begin_frame_ack_for_pending_frame_for_testing()
1086 ->latest_confirmed_sequence_number);
1087
1088 // Submission of a CompositorFrame to different surface updates pending ack.
1089 args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 7);
1090 begin_frame_source()->TestOnBeginFrame(args);
1091 // Parent acknowledges prior frame.
1092 EXPECT_EQ(BeginFrameAck(0, 6, 4, false),
1093 begin_frame_source()->LastAckForObserver(&parent_support()));
1094 frame = MakeCompositorFrame({child_id2});
1095 frame.metadata.begin_frame_ack = BeginFrameAck(0, 7, 7, true);
1096 parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(),
1097 std::move(frame));
1098 // Parent doesn't ack immediately.
1099 EXPECT_EQ(BeginFrameAck(0, 6, 4, false),
1100 begin_frame_source()->LastAckForObserver(&parent_support()));
1101 EXPECT_EQ(7u, parent_support()
1102 .begin_frame_ack_for_pending_frame_for_testing()
1103 ->latest_confirmed_sequence_number);
1104
1105 // Parent acks immediately but without damage when frame is dropped.
1106 parent_support().EvictFrame();
1107 EXPECT_EQ(BeginFrameAck(0, 7, 4, false),
1108 begin_frame_source()->LastAckForObserver(&parent_support()));
977 } 1109 }
978 1110
979 // Checks whether the resources are returned before we send an ack. 1111 // Checks whether the resources are returned before we send an ack.
980 TEST_F(CompositorFrameSinkSupportTest, ReturnResourcesBeforeAck) { 1112 TEST_F(CompositorFrameSinkSupportTest, ReturnResourcesBeforeAck) {
981 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); 1113 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
982 TransferableResource resource; 1114 TransferableResource resource;
983 resource.id = 1234; 1115 resource.id = 1234;
984 parent_support().SubmitCompositorFrame( 1116 parent_support().SubmitCompositorFrame(
985 parent_id.local_surface_id(), 1117 parent_id.local_surface_id(),
986 MakeCompositorFrameWithResources(empty_surface_ids(), {resource})); 1118 MakeCompositorFrameWithResources(empty_surface_ids(), {resource}));
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 // be used and destroyed() must return false. The surface must have a factory. 1227 // be used and destroyed() must return false. The surface must have a factory.
1096 child_support->SubmitCompositorFrame( 1228 child_support->SubmitCompositorFrame(
1097 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); 1229 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
1098 EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id)); 1230 EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id));
1099 EXPECT_TRUE(surface->factory()); 1231 EXPECT_TRUE(surface->factory());
1100 EXPECT_FALSE(surface->destroyed()); 1232 EXPECT_FALSE(surface->destroyed());
1101 } 1233 }
1102 1234
1103 } // namespace test 1235 } // namespace test
1104 } // namespace cc 1236 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.cc ('k') | cc/surfaces/direct_compositor_frame_sink_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698