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

Side by Side Diff: cc/scheduler/scheduler_state_machine_unittest.cc

Issue 2659123004: cc: Add scheduler support for invalidating content on impl thread. (Closed)
Patch Set: moar tests 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/scheduler/scheduler_state_machine.h" 5 #include "cc/scheduler/scheduler_state_machine.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "cc/scheduler/scheduler.h" 10 #include "cc/scheduler/scheduler.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 143
144 bool PendingActivationsShouldBeForced() const { 144 bool PendingActivationsShouldBeForced() const {
145 return SchedulerStateMachine::PendingActivationsShouldBeForced(); 145 return SchedulerStateMachine::PendingActivationsShouldBeForced();
146 } 146 }
147 147
148 bool has_pending_tree() const { return has_pending_tree_; } 148 bool has_pending_tree() const { return has_pending_tree_; }
149 void SetHasPendingTree(bool has_pending_tree) { 149 void SetHasPendingTree(bool has_pending_tree) {
150 has_pending_tree_ = has_pending_tree; 150 has_pending_tree_ = has_pending_tree;
151 } 151 }
152 152
153 bool needs_impl_side_invalidation() const {
154 return needs_impl_side_invalidation_;
155 }
156
153 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; 157 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
154 using SchedulerStateMachine::ProactiveBeginFrameWanted; 158 using SchedulerStateMachine::ProactiveBeginFrameWanted;
155 using SchedulerStateMachine::WillCommit; 159 using SchedulerStateMachine::WillCommit;
156 160
157 protected: 161 protected:
158 DrawResult draw_result_for_test_; 162 DrawResult draw_result_for_test_;
159 }; 163 };
160 164
161 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) { 165 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
162 switch (action) { 166 switch (action) {
(...skipping 30 matching lines...) Expand all
193 sm->WillBeginCompositorFrameSinkCreation(); 197 sm->WillBeginCompositorFrameSinkCreation();
194 return; 198 return;
195 199
196 case SchedulerStateMachine::ACTION_PREPARE_TILES: 200 case SchedulerStateMachine::ACTION_PREPARE_TILES:
197 sm->WillPrepareTiles(); 201 sm->WillPrepareTiles();
198 return; 202 return;
199 203
200 case SchedulerStateMachine::ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK: 204 case SchedulerStateMachine::ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK:
201 sm->WillInvalidateCompositorFrameSink(); 205 sm->WillInvalidateCompositorFrameSink();
202 return; 206 return;
207
208 case SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION:
209 sm->WillPerformImplSideInvalidation();
210 return;
203 } 211 }
204 } 212 }
205 213
206 TEST(SchedulerStateMachineTest, BeginFrameNeeded) { 214 TEST(SchedulerStateMachineTest, BeginFrameNeeded) {
207 SchedulerSettings default_scheduler_settings; 215 SchedulerSettings default_scheduler_settings;
208 StateMachine state(default_scheduler_settings); 216 StateMachine state(default_scheduler_settings);
209 state.SetVisible(true); 217 state.SetVisible(true);
210 EXPECT_ACTION_UPDATE_STATE( 218 EXPECT_ACTION_UPDATE_STATE(
211 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 219 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
212 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after
2116 // to release the CompositorFrameSink. 2124 // to release the CompositorFrameSink.
2117 state.NotifyBeginMainFrameStarted(); 2125 state.NotifyBeginMainFrameStarted();
2118 state.BeginMainFrameAborted( 2126 state.BeginMainFrameAborted(
2119 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST); 2127 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST);
2120 2128
2121 // The scheduler should begin the CompositorFrameSink creation now. 2129 // The scheduler should begin the CompositorFrameSink creation now.
2122 EXPECT_ACTION_UPDATE_STATE( 2130 EXPECT_ACTION_UPDATE_STATE(
2123 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 2131 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
2124 } 2132 }
2125 2133
2134 TEST(SchedulerStateMachineTest, NoImplSideInvalidationsWhileInvsible) {
brianderson 2017/02/21 23:34:59 Invsible -> Invisible
Khushal 2017/02/22 20:24:02 Done.
2135 SchedulerSettings settings;
2136 StateMachine state(settings);
2137 SET_UP_STATE(state);
2138
2139 // No impl-side invalidations should be performed while we are not visible.
2140 state.SetVisible(false);
2141 state.SetNeedsImplSideInvalidation();
2142 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2143 }
2144
2145 TEST(SchedulerStateMachineTest,
2146 NoImplSideInvalidationsWhenBeginFrameSourcePaused) {
2147 SchedulerSettings settings;
2148 StateMachine state(settings);
2149 SET_UP_STATE(state);
2150
2151 // No impl-side invalidations should be performed while we can not make impl
2152 // frames.
2153 state.SetBeginFrameSourcePaused(true);
2154 state.SetNeedsImplSideInvalidation();
2155 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2156 }
2157
2158 TEST(SchedulerStateMachineTest,
2159 NoImplSideInvalidationWithoutCompositorFrameSink) {
2160 SchedulerSettings settings;
2161 StateMachine state(settings);
2162 SET_UP_STATE(state);
2163
2164 // Impl-side invalidations should not be triggered till the frame sink is
2165 // initialized.
2166 state.DidLoseCompositorFrameSink();
2167 EXPECT_ACTION_UPDATE_STATE(
2168 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
2169 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2170
2171 // No impl-side invalidations should be performed during frame sink creation.
2172 state.OnBeginImplFrame();
2173 state.SetNeedsImplSideInvalidation();
2174 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2175
2176 // Initializing the CompositorFrameSink puts us in a state waiting for the
2177 // first commit.
2178 state.DidCreateAndInitializeCompositorFrameSink();
2179 EXPECT_ACTION_UPDATE_STATE(
2180 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2181 state.NotifyBeginMainFrameStarted();
2182 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
2183 EXPECT_ACTION_UPDATE_STATE(
2184 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2185 }
2186
2187 TEST(SchedulerStateMachineTest, ImplSideInvalidationWhenPendingTreeExists) {
2188 SchedulerSettings settings;
2189 StateMachine state(settings);
2190 SET_UP_STATE(state);
2191
2192 // Set up request for the main frame, commit and create the pending tree.
2193 state.SetNeedsBeginMainFrame();
2194 state.OnBeginImplFrame();
2195 EXPECT_ACTION_UPDATE_STATE(
2196 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2197 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2198 state.NotifyBeginMainFrameStarted();
2199 state.NotifyReadyToCommit();
2200 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2201 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2202
2203 // Request an impl-side invalidation after the commit. The request should wait
2204 // till the current pending tree is activated.
2205 state.SetNeedsImplSideInvalidation();
2206 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2207
2208 // Activate the pending tree. Since the commit fills the impl-side
2209 // invalidation funnel as well, the request should wait until the next
2210 // BeginFrame.
2211 state.NotifyReadyToActivate();
2212 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
2213 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2214
2215 // Since there is no main frame request, this should perform impl-side
2216 // invalidations.
2217 state.OnBeginImplFrame();
2218 EXPECT_ACTION_UPDATE_STATE(
2219 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2220 }
2221
2222 TEST(SchedulerStateMachineTest, ImplSideInvalidationWhileMainFramePending) {
2223 SchedulerSettings settings;
2224 StateMachine state(settings);
2225 SET_UP_STATE(state);
2226
2227 // Set up request for the main frame.
2228 state.SetNeedsBeginMainFrame();
2229 state.OnBeginImplFrame();
2230 EXPECT_ACTION_UPDATE_STATE(
2231 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2232 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2233
2234 // Request an impl-side invalidation. The request should wait till a response
2235 // is received from the main thread.
2236 state.SetNeedsImplSideInvalidation();
2237 EXPECT_TRUE(state.needs_impl_side_invalidation());
2238 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2239
2240 // Perform a commit, the impl-side invalidation request should be reset since
2241 // they will be merged with the commit.
2242 state.NotifyBeginMainFrameStarted();
2243 state.NotifyReadyToCommit();
2244 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2245 EXPECT_FALSE(state.needs_impl_side_invalidation());
2246 }
2247
2248 TEST(SchedulerStateMachineTest,
2249 ConsecutiveImplSideInvalidationsWaitForBeginFrame) {
2250 SchedulerSettings settings;
2251 StateMachine state(settings);
2252 SET_UP_STATE(state);
2253
2254 // Set up a request for impl-side invalidation.
2255 state.SetNeedsImplSideInvalidation();
2256 state.OnBeginImplFrame();
2257 EXPECT_ACTION_UPDATE_STATE(
2258 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2259 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2260
2261 // Request another invalidation before the pending tree is activated. The
2262 // request should wait until the next BeginFrame.
2263 state.SetNeedsImplSideInvalidation();
2264 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2265 state.NotifyReadyToActivate();
2266 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
2267 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2268 state.OnBeginImplFrame();
2269 EXPECT_ACTION_UPDATE_STATE(
2270 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2271 }
2272
2273 TEST(SchedulerStateMachineTest, ImplSideInvalidationsThrottledOnDraw) {
2274 // In commit_to_active_tree mode, performing the next invalidation should be
2275 // throttled on the active tree being drawn.
2276 SchedulerSettings settings;
2277 settings.commit_to_active_tree = true;
2278 StateMachine state(settings);
2279 SET_UP_STATE(state);
2280
2281 // Commit to the sync tree and activate.
2282 state.SetNeedsBeginMainFrame();
2283 state.OnBeginImplFrame();
2284 EXPECT_ACTION_UPDATE_STATE(
2285 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2286 state.NotifyBeginMainFrameStarted();
2287 state.NotifyReadyToCommit();
2288 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2289 state.NotifyReadyToActivate();
2290 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
2291 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2292
2293 // BeginImplFrame deadline, the draw is blocked on NotifyReadyToDraw.
2294 state.OnBeginImplFrameDeadline();
2295 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2296
2297 // Request impl-side invalidation which should be blocked on the active tree
2298 // being drawn and submitted.
2299 state.SetNeedsImplSideInvalidation();
2300 state.OnBeginImplFrame();
2301 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2302 state.NotifyReadyToDraw();
2303 state.OnBeginImplFrameDeadline();
2304 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
2305 state.DidSubmitCompositorFrame();
2306 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2307 state.DidReceiveCompositorFrameAck();
2308
2309 // The frame being acked should perform impl-side invalidation.
2310 EXPECT_ACTION_UPDATE_STATE(
2311 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2312 }
2313
2314 TEST(SchedulerStateMachineTest,
2315 ImplSideInvalidationsTakePriorityForAbortedCommits) {
2316 SchedulerSettings settings;
2317 settings.main_frame_before_activation_enabled = true;
2318 StateMachine state(settings);
2319 SET_UP_STATE(state);
2320
2321 // Set up request for the main frame.
2322 state.SetNeedsBeginMainFrame();
2323 state.OnBeginImplFrame();
2324 EXPECT_ACTION_UPDATE_STATE(
2325 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2326 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2327
2328 // Request an impl-side invalidation, which should wait until a response is
2329 // received for the BeginMainFrame.
2330 state.SetNeedsImplSideInvalidation();
2331 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2332
2333 // Request another main frame, and abort the sent BeginMainFrame. Aborting
2334 // this frame should create a pending tree for impl-side invalidation.
2335 state.SetNeedsBeginMainFrame();
2336 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2337 state.NotifyBeginMainFrameStarted();
2338 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
2339 EXPECT_ACTION_UPDATE_STATE(
2340 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2341
2342 // Trigger the frame deadline, this should send the BeginMainFrame since MFBA
2343 // is enabled.
2344 state.OnBeginImplFrameDeadline();
2345 state.OnBeginImplFrame();
2346 EXPECT_ACTION_UPDATE_STATE(
2347 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2348 }
2349
2350 TEST(SchedulerStateMachineTest,
2351 ImplSideInvalidationsBlockedOnSendingBeginMainFrame) {
2352 SchedulerSettings settings;
2353 StateMachine state(settings);
2354 SET_UP_STATE(state);
2355
2356 // BeginMainFrame, commit and activate the sync tree.
2357 state.SetNeedsBeginMainFrame();
2358 state.OnBeginImplFrame();
2359 EXPECT_ACTION_UPDATE_STATE(
2360 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2361 state.NotifyBeginMainFrameStarted();
2362 state.NotifyReadyToCommit();
2363 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2364 state.NotifyReadyToActivate();
2365 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
2366
2367 // Set the tree priority to smoothness mode and request a main frame and
2368 // impl-side invalidations.
2369 state.OnBeginImplFrameDeadline();
2370 state.OnBeginImplFrame();
2371 state.SetTreePrioritiesAndScrollState(
2372 TreePriority::SMOOTHNESS_TAKES_PRIORITY,
2373 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER);
2374 state.SetNeedsBeginMainFrame();
2375 state.SetNeedsImplSideInvalidation();
2376 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2377
2378 // The impl-side invalidations should wait until BeginMainFrame is sent and
2379 // a response is received.
2380 state.SetTreePrioritiesAndScrollState(
2381 TreePriority::SMOOTHNESS_TAKES_PRIORITY,
2382 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER);
2383 EXPECT_ACTION_UPDATE_STATE(
2384 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2385 state.NotifyBeginMainFrameStarted();
2386 state.NotifyReadyToCommit();
2387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2388 EXPECT_FALSE(state.needs_impl_side_invalidation());
2389 }
2390
2391 TEST(SchedulerStateMachineTest, BeginMainFrameAfterImplSideInvalidation) {
2392 // A BeginMainFrame should be sent, if the request is received after an
2393 // impl-side invalidation.
2394 SchedulerSettings settings;
2395 settings.main_frame_before_activation_enabled = true;
2396 StateMachine state(settings);
2397 SET_UP_STATE(state);
2398
2399 // Request an impl side invalidation and perform the action.
2400 state.SetNeedsImplSideInvalidation();
2401 state.OnBeginImplFrame();
2402 EXPECT_ACTION_UPDATE_STATE(
2403 SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
2404 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2405
2406 // Request a main frame, which should be sent within the same BeginFrame in
2407 // MFBA mode.
2408 state.SetNeedsBeginMainFrame();
2409 EXPECT_ACTION_UPDATE_STATE(
2410 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2411 }
2412
2126 } // namespace 2413 } // namespace
2127 } // namespace cc 2414 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698