| OLD | NEW |
| 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.h" | 5 #include "cc/scheduler/scheduler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 PushAction("SendBeginMainFrameNotExpectedSoon"); | 175 PushAction("SendBeginMainFrameNotExpectedSoon"); |
| 176 } | 176 } |
| 177 | 177 |
| 178 bool IsInsideBeginImplFrame() const { return inside_begin_impl_frame_; } | 178 bool IsInsideBeginImplFrame() const { return inside_begin_impl_frame_; } |
| 179 | 179 |
| 180 base::Callback<bool(void)> InsideBeginImplFrame(bool state) { | 180 base::Callback<bool(void)> InsideBeginImplFrame(bool state) { |
| 181 return base::Bind(&FakeSchedulerClient::InsideBeginImplFrameCallback, | 181 return base::Bind(&FakeSchedulerClient::InsideBeginImplFrameCallback, |
| 182 base::Unretained(this), state); | 182 base::Unretained(this), state); |
| 183 } | 183 } |
| 184 | 184 |
| 185 bool IsCurrentFrame(int last_frame_number) const { |
| 186 return scheduler_->current_frame_number() == last_frame_number; |
| 187 } |
| 188 |
| 189 base::Callback<bool(void)> FrameHasNotAdvancedCallback() { |
| 190 return base::Bind(&FakeSchedulerClient::IsCurrentFrame, |
| 191 base::Unretained(this), |
| 192 scheduler_->current_frame_number()); |
| 193 } |
| 194 |
| 185 void PushAction(const char* description) { | 195 void PushAction(const char* description) { |
| 186 actions_.push_back(description); | 196 actions_.push_back(description); |
| 187 states_.push_back(scheduler_->AsValue()); | 197 states_.push_back(scheduler_->AsValue()); |
| 188 } | 198 } |
| 189 | 199 |
| 190 // FakeExternalBeginFrameSource::Client implementation. | 200 // FakeExternalBeginFrameSource::Client implementation. |
| 191 void OnAddObserver(BeginFrameObserver* obs) override { | 201 void OnAddObserver(BeginFrameObserver* obs) override { |
| 192 PushAction("AddObserver(this)"); | 202 PushAction("AddObserver(this)"); |
| 193 } | 203 } |
| 194 void OnRemoveObserver(BeginFrameObserver* obs) override { | 204 void OnRemoveObserver(BeginFrameObserver* obs) override { |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 EXPECT_FALSE(scheduler_->begin_frames_expected()); | 381 EXPECT_FALSE(scheduler_->begin_frames_expected()); |
| 372 client_->Reset(); | 382 client_->Reset(); |
| 373 } | 383 } |
| 374 | 384 |
| 375 // As this function contains EXPECT macros, to allow debugging it should be | 385 // As this function contains EXPECT macros, to allow debugging it should be |
| 376 // called inside EXPECT_SCOPED like so; | 386 // called inside EXPECT_SCOPED like so; |
| 377 // EXPECT_SCOPED(client.AdvanceFrame()); | 387 // EXPECT_SCOPED(client.AdvanceFrame()); |
| 378 void AdvanceFrame() { | 388 void AdvanceFrame() { |
| 379 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), | 389 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), |
| 380 "FakeSchedulerClient::AdvanceFrame"); | 390 "FakeSchedulerClient::AdvanceFrame"); |
| 381 // Consume any previous deadline first, if no deadline is currently | |
| 382 // pending, InsideBeginImplFrame will return false straight away and we | |
| 383 // will run no tasks. | |
| 384 task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
| 385 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 386 | 391 |
| 387 // Send the next BeginFrame message if using an external source, otherwise | 392 // Send the next BeginFrame message if using an external source, otherwise |
| 388 // it will be already in the task queue. | 393 // it will be already in the task queue. |
| 389 if (scheduler_->begin_frame_source() == | 394 if (scheduler_->begin_frame_source() == |
| 390 fake_external_begin_frame_source_.get()) { | 395 fake_external_begin_frame_source_.get()) { |
| 391 EXPECT_TRUE(scheduler_->begin_frames_expected()); | 396 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| 392 SendNextBeginFrame(); | 397 SendNextBeginFrame(); |
| 393 } | 398 } else { |
| 394 | 399 task_runner_->RunTasksWhile(client_->FrameHasNotAdvancedCallback()); |
| 395 if (!scheduler_->settings().using_synchronous_renderer_compositor) { | |
| 396 // Then run tasks until new deadline is scheduled. | |
| 397 EXPECT_TRUE( | |
| 398 task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(false))); | |
| 399 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 400 } | 400 } |
| 401 } | 401 } |
| 402 | 402 |
| 403 BeginFrameArgs SendNextBeginFrame() { | 403 BeginFrameArgs SendNextBeginFrame() { |
| 404 DCHECK_EQ(scheduler_->begin_frame_source(), | 404 DCHECK_EQ(scheduler_->begin_frame_source(), |
| 405 fake_external_begin_frame_source_.get()); | 405 fake_external_begin_frame_source_.get()); |
| 406 // Creep the time forward so that any BeginFrameArgs is not equal to the | 406 // Creep the time forward so that any BeginFrameArgs is not equal to the |
| 407 // last one otherwise we violate the BeginFrameSource contract. | 407 // last one otherwise we violate the BeginFrameSource contract. |
| 408 now_src_->Advance(BeginFrameArgs::DefaultInterval()); | 408 now_src_->Advance(BeginFrameArgs::DefaultInterval()); |
| 409 BeginFrameArgs args = | 409 BeginFrameArgs args = |
| (...skipping 1591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2001 EXPECT_NO_ACTION(client_); | 2001 EXPECT_NO_ACTION(client_); |
| 2002 | 2002 |
| 2003 // Activate the pending tree, which also unblocks the commit immediately | 2003 // Activate the pending tree, which also unblocks the commit immediately |
| 2004 // while we are in an idle state. | 2004 // while we are in an idle state. |
| 2005 client_->Reset(); | 2005 client_->Reset(); |
| 2006 scheduler_->NotifyReadyToActivate(); | 2006 scheduler_->NotifyReadyToActivate(); |
| 2007 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); | 2007 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); |
| 2008 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 2); | 2008 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 2); |
| 2009 } | 2009 } |
| 2010 | 2010 |
| 2011 TEST_F(SchedulerTest, BeginRetroFrame) { | |
| 2012 SetUpScheduler(EXTERNAL_BFS); | |
| 2013 | |
| 2014 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
| 2015 scheduler_->SetNeedsBeginMainFrame(); | |
| 2016 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2017 client_->Reset(); | |
| 2018 | |
| 2019 // Create a BeginFrame with a long deadline to avoid race conditions. | |
| 2020 // This is the first BeginFrame, which will be handled immediately. | |
| 2021 BeginFrameArgs args = | |
| 2022 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 2023 args.deadline += base::TimeDelta::FromHours(1); | |
| 2024 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2025 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2026 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2027 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2028 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2029 client_->Reset(); | |
| 2030 | |
| 2031 // Queue BeginFrames while we are still handling the previous BeginFrame. | |
| 2032 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2033 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2034 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2035 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2036 | |
| 2037 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
| 2038 task_runner().RunPendingTasks(); // Run posted deadline. | |
| 2039 EXPECT_NO_ACTION(client_); | |
| 2040 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2041 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2042 client_->Reset(); | |
| 2043 | |
| 2044 // NotifyReadyToCommit should trigger the commit. | |
| 2045 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
| 2046 scheduler_->NotifyReadyToCommit(); | |
| 2047 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | |
| 2048 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2049 client_->Reset(); | |
| 2050 | |
| 2051 // NotifyReadyToActivate should trigger the activation. | |
| 2052 scheduler_->NotifyReadyToActivate(); | |
| 2053 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | |
| 2054 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2055 client_->Reset(); | |
| 2056 | |
| 2057 // BeginImplFrame should prepare the draw. | |
| 2058 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | |
| 2059 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | |
| 2060 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2061 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2062 client_->Reset(); | |
| 2063 | |
| 2064 // BeginImplFrame deadline should draw. | |
| 2065 task_runner().RunPendingTasks(); // Run posted deadline. | |
| 2066 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
| 2067 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2068 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2069 client_->Reset(); | |
| 2070 | |
| 2071 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | |
| 2072 // to avoid excessive toggles. | |
| 2073 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | |
| 2074 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); | |
| 2075 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2076 client_->Reset(); | |
| 2077 | |
| 2078 task_runner().RunPendingTasks(); // Run posted deadline. | |
| 2079 EXPECT_ACTION("RemoveObserver(this)", client_, 0, 2); | |
| 2080 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); | |
| 2081 client_->Reset(); | |
| 2082 } | |
| 2083 | |
| 2084 TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) { | |
| 2085 SetUpScheduler(EXTERNAL_BFS); | |
| 2086 | |
| 2087 scheduler_->SetNeedsBeginMainFrame(); | |
| 2088 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2089 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2090 | |
| 2091 client_->Reset(); | |
| 2092 EXPECT_SCOPED(AdvanceFrame()); | |
| 2093 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2094 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2095 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2096 | |
| 2097 client_->Reset(); | |
| 2098 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
| 2099 | |
| 2100 client_->Reset(); | |
| 2101 BeginFrameArgs retro_frame_args = SendNextBeginFrame(); | |
| 2102 // This BeginFrame is queued up as a retro frame. | |
| 2103 EXPECT_NO_ACTION(client_); | |
| 2104 // The previous deadline is still pending. | |
| 2105 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2106 | |
| 2107 client_->Reset(); | |
| 2108 // This main frame activating should schedule the (previous) deadline to | |
| 2109 // trigger immediately. | |
| 2110 scheduler_->NotifyReadyToCommit(); | |
| 2111 scheduler_->NotifyReadyToActivate(); | |
| 2112 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 2); | |
| 2113 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2); | |
| 2114 | |
| 2115 client_->Reset(); | |
| 2116 // The deadline task should trigger causing a draw. | |
| 2117 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2118 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
| 2119 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
| 2120 | |
| 2121 // Keep animating. | |
| 2122 client_->Reset(); | |
| 2123 scheduler_->SetNeedsOneBeginImplFrame(); | |
| 2124 scheduler_->SetNeedsRedraw(); | |
| 2125 EXPECT_NO_ACTION(client_); | |
| 2126 | |
| 2127 // Let's advance to the retro frame's deadline. | |
| 2128 now_src()->Advance(retro_frame_args.deadline - now_src()->NowTicks()); | |
| 2129 | |
| 2130 // The retro frame hasn't expired yet. | |
| 2131 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false)); | |
| 2132 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | |
| 2133 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2134 | |
| 2135 // This is an immediate deadline case. | |
| 2136 client_->Reset(); | |
| 2137 task_runner().RunPendingTasks(); | |
| 2138 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2139 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); | |
| 2140 } | |
| 2141 | |
| 2142 TEST_F(SchedulerTest, RetroFrameExpiresOnTime) { | |
| 2143 SetUpScheduler(EXTERNAL_BFS); | |
| 2144 | |
| 2145 scheduler_->SetNeedsBeginMainFrame(); | |
| 2146 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2147 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2148 | |
| 2149 client_->Reset(); | |
| 2150 EXPECT_SCOPED(AdvanceFrame()); | |
| 2151 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2152 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2153 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2154 | |
| 2155 client_->Reset(); | |
| 2156 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
| 2157 | |
| 2158 client_->Reset(); | |
| 2159 BeginFrameArgs retro_frame_args = SendNextBeginFrame(); | |
| 2160 // This BeginFrame is queued up as a retro frame. | |
| 2161 EXPECT_NO_ACTION(client_); | |
| 2162 // The previous deadline is still pending. | |
| 2163 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2164 | |
| 2165 client_->Reset(); | |
| 2166 // This main frame activating should schedule the (previous) deadline to | |
| 2167 // trigger immediately. | |
| 2168 scheduler_->NotifyReadyToCommit(); | |
| 2169 scheduler_->NotifyReadyToActivate(); | |
| 2170 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 2); | |
| 2171 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2); | |
| 2172 | |
| 2173 client_->Reset(); | |
| 2174 // The deadline task should trigger causing a draw. | |
| 2175 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2176 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
| 2177 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
| 2178 | |
| 2179 // Keep animating. | |
| 2180 client_->Reset(); | |
| 2181 scheduler_->SetNeedsOneBeginImplFrame(); | |
| 2182 scheduler_->SetNeedsRedraw(); | |
| 2183 EXPECT_NO_ACTION(client_); | |
| 2184 | |
| 2185 // Let's advance sufficiently past the retro frame's deadline. | |
| 2186 now_src()->Advance(retro_frame_args.deadline - now_src()->NowTicks() + | |
| 2187 base::TimeDelta::FromMicroseconds(1)); | |
| 2188 | |
| 2189 // The retro frame should've expired. | |
| 2190 EXPECT_NO_ACTION(client_); | |
| 2191 } | |
| 2192 | |
| 2193 TEST_F(SchedulerTest, MissedFrameDoesNotExpireTooEarly) { | |
| 2194 SetUpScheduler(EXTERNAL_BFS); | |
| 2195 | |
| 2196 scheduler_->SetNeedsBeginMainFrame(); | |
| 2197 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2198 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2199 | |
| 2200 BeginFrameArgs missed_frame_args = | |
| 2201 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 2202 missed_frame_args.type = BeginFrameArgs::MISSED; | |
| 2203 | |
| 2204 // Advance to the deadline. | |
| 2205 now_src()->Advance(missed_frame_args.deadline - now_src()->NowTicks()); | |
| 2206 | |
| 2207 // Missed frame is handled because it's on time. | |
| 2208 client_->Reset(); | |
| 2209 fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args); | |
| 2210 EXPECT_TRUE( | |
| 2211 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false))); | |
| 2212 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2213 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2214 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2215 } | |
| 2216 | |
| 2217 TEST_F(SchedulerTest, MissedFrameExpiresOnTime) { | |
| 2218 SetUpScheduler(EXTERNAL_BFS); | |
| 2219 | |
| 2220 scheduler_->SetNeedsBeginMainFrame(); | |
| 2221 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2222 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2223 | |
| 2224 BeginFrameArgs missed_frame_args = | |
| 2225 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 2226 missed_frame_args.type = BeginFrameArgs::MISSED; | |
| 2227 | |
| 2228 // Advance sufficiently past the deadline. | |
| 2229 now_src()->Advance(missed_frame_args.deadline - now_src()->NowTicks() + | |
| 2230 base::TimeDelta::FromMicroseconds(1)); | |
| 2231 | |
| 2232 // Missed frame is dropped because it's too late. | |
| 2233 client_->Reset(); | |
| 2234 fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args); | |
| 2235 EXPECT_FALSE( | |
| 2236 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false))); | |
| 2237 EXPECT_NO_ACTION(client_); | |
| 2238 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2239 } | |
| 2240 | |
| 2241 void SchedulerTest::BeginFramesNotFromClient(BeginFrameSourceType bfs_type) { | 2011 void SchedulerTest::BeginFramesNotFromClient(BeginFrameSourceType bfs_type) { |
| 2242 SetUpScheduler(bfs_type); | 2012 SetUpScheduler(bfs_type); |
| 2243 | 2013 |
| 2244 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame | 2014 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame |
| 2245 // without calling SetNeedsBeginFrame. | 2015 // without calling SetNeedsBeginFrame. |
| 2246 scheduler_->SetNeedsBeginMainFrame(); | 2016 scheduler_->SetNeedsBeginMainFrame(); |
| 2247 EXPECT_NO_ACTION(client_); | 2017 EXPECT_NO_ACTION(client_); |
| 2248 client_->Reset(); | 2018 client_->Reset(); |
| 2249 | 2019 |
| 2250 // When the client-driven BeginFrame are disabled, the scheduler posts it's | 2020 EXPECT_SCOPED(AdvanceFrame()); |
| 2251 // own BeginFrame tasks. | |
| 2252 task_runner().RunPendingTasks(); // Run posted BeginFrame. | |
| 2253 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 2021 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| 2254 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | 2022 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| 2255 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2023 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
| 2256 client_->Reset(); | 2024 client_->Reset(); |
| 2257 | 2025 |
| 2258 // If we don't swap on the deadline, we wait for the next BeginFrame. | 2026 // Can't run the deadline task because it can race with begin frame for the |
| 2259 task_runner().RunPendingTasks(); // Run posted deadline. | 2027 // SyntheticBFS case. |
| 2260 EXPECT_NO_ACTION(client_); | 2028 EXPECT_SCOPED(AdvanceFrame()); |
| 2261 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | 2029 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); |
| 2030 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
| 2262 client_->Reset(); | 2031 client_->Reset(); |
| 2263 | 2032 |
| 2264 // NotifyReadyToCommit should trigger the commit. | 2033 // NotifyReadyToCommit should trigger the commit. |
| 2265 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | 2034 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
| 2266 scheduler_->NotifyReadyToCommit(); | 2035 scheduler_->NotifyReadyToCommit(); |
| 2267 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | 2036 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| 2268 client_->Reset(); | 2037 client_->Reset(); |
| 2269 | 2038 |
| 2270 // NotifyReadyToActivate should trigger the activation. | 2039 // NotifyReadyToActivate should trigger the activation. |
| 2271 scheduler_->NotifyReadyToActivate(); | 2040 scheduler_->NotifyReadyToActivate(); |
| 2272 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | 2041 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); |
| 2273 client_->Reset(); | 2042 client_->Reset(); |
| 2274 | 2043 |
| 2275 // BeginImplFrame should prepare the draw. | 2044 // BeginImplFrame deadline should draw. The following BeginImplFrame deadline |
| 2276 task_runner().RunPendingTasks(); // Run posted BeginFrame. | 2045 // should SetNeedsBeginFrame(false) to avoid excessive toggles. |
| 2277 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | 2046 EXPECT_SCOPED(AdvanceFrame()); |
| 2278 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2047 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); |
| 2279 client_->Reset(); | 2048 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); |
| 2280 | |
| 2281 // BeginImplFrame deadline should draw. | |
| 2282 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
| 2283 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
| 2284 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2285 client_->Reset(); | |
| 2286 | |
| 2287 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | |
| 2288 // to avoid excessive toggles. | |
| 2289 task_runner().RunPendingTasks(); // Run posted BeginFrame. | |
| 2290 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); | |
| 2291 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2292 client_->Reset(); | 2049 client_->Reset(); |
| 2293 | 2050 |
| 2294 // Make sure SetNeedsBeginFrame isn't called on the client | 2051 // Make sure SetNeedsBeginFrame isn't called on the client |
| 2295 // when the BeginFrame is no longer needed. | 2052 // when the BeginFrame is no longer needed. |
| 2296 task_runner().RunPendingTasks(); // Run posted deadline. | 2053 task_runner().RunPendingTasks(); // Run posted deadline. |
| 2297 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); | 2054 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); |
| 2298 client_->Reset(); | 2055 client_->Reset(); |
| 2299 } | 2056 } |
| 2300 | 2057 |
| 2301 TEST_F(SchedulerTest, SyntheticBeginFrames) { | 2058 TEST_F(SchedulerTest, SyntheticBeginFrames) { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2549 | 2306 |
| 2550 client_->Reset(); | 2307 client_->Reset(); |
| 2551 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | 2308 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); |
| 2552 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 4); | 2309 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 4); |
| 2553 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 1, | 2310 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 1, |
| 2554 4); | 2311 4); |
| 2555 EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4); | 2312 EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4); |
| 2556 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4); | 2313 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4); |
| 2557 } | 2314 } |
| 2558 | 2315 |
| 2559 TEST_F(SchedulerTest, DidLoseCompositorFrameSinkAfterBeginRetroFramePosted) { | |
| 2560 SetUpScheduler(EXTERNAL_BFS); | |
| 2561 | |
| 2562 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
| 2563 scheduler_->SetNeedsBeginMainFrame(); | |
| 2564 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2565 | |
| 2566 // Create a BeginFrame with a long deadline to avoid race conditions. | |
| 2567 // This is the first BeginFrame, which will be handled immediately. | |
| 2568 client_->Reset(); | |
| 2569 BeginFrameArgs args = | |
| 2570 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 2571 args.deadline += base::TimeDelta::FromHours(1); | |
| 2572 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2573 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2574 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2575 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2576 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2577 | |
| 2578 // Queue BeginFrames while we are still handling the previous BeginFrame. | |
| 2579 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2580 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2581 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2582 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2583 | |
| 2584 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
| 2585 client_->Reset(); | |
| 2586 task_runner().RunPendingTasks(); // Run posted deadline. | |
| 2587 EXPECT_NO_ACTION(client_); | |
| 2588 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2589 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2590 | |
| 2591 // NotifyReadyToCommit should trigger the commit. | |
| 2592 client_->Reset(); | |
| 2593 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
| 2594 scheduler_->NotifyReadyToCommit(); | |
| 2595 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | |
| 2596 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2597 | |
| 2598 // NotifyReadyToActivate should trigger the activation. | |
| 2599 client_->Reset(); | |
| 2600 scheduler_->NotifyReadyToActivate(); | |
| 2601 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | |
| 2602 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2603 | |
| 2604 client_->Reset(); | |
| 2605 EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
| 2606 scheduler_->DidLoseCompositorFrameSink(); | |
| 2607 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 0, | |
| 2608 3); | |
| 2609 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); | |
| 2610 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); | |
| 2611 EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
| 2612 | |
| 2613 // Posted BeginRetroFrame is aborted. | |
| 2614 client_->Reset(); | |
| 2615 task_runner().RunPendingTasks(); | |
| 2616 EXPECT_NO_ACTION(client_); | |
| 2617 } | |
| 2618 | |
| 2619 TEST_F(SchedulerTest, DidLoseCompositorFrameSinkDuringBeginRetroFrameRunning) { | |
| 2620 SetUpScheduler(EXTERNAL_BFS); | |
| 2621 | |
| 2622 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
| 2623 scheduler_->SetNeedsBeginMainFrame(); | |
| 2624 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 2625 | |
| 2626 // Create a BeginFrame with a long deadline to avoid race conditions. | |
| 2627 // This is the first BeginFrame, which will be handled immediately. | |
| 2628 client_->Reset(); | |
| 2629 BeginFrameArgs args = | |
| 2630 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 2631 args.deadline += base::TimeDelta::FromHours(1); | |
| 2632 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2633 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 2634 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 2635 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2636 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2637 | |
| 2638 // Queue BeginFrames while we are still handling the previous BeginFrame. | |
| 2639 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2640 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2641 args.frame_time += base::TimeDelta::FromSeconds(1); | |
| 2642 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
| 2643 | |
| 2644 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
| 2645 client_->Reset(); | |
| 2646 task_runner().RunPendingTasks(); // Run posted deadline. | |
| 2647 EXPECT_NO_ACTION(client_); | |
| 2648 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2649 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2650 | |
| 2651 // NotifyReadyToCommit should trigger the commit. | |
| 2652 client_->Reset(); | |
| 2653 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
| 2654 scheduler_->NotifyReadyToCommit(); | |
| 2655 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | |
| 2656 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2657 | |
| 2658 // NotifyReadyToActivate should trigger the activation. | |
| 2659 client_->Reset(); | |
| 2660 scheduler_->NotifyReadyToActivate(); | |
| 2661 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | |
| 2662 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2663 | |
| 2664 // BeginImplFrame should prepare the draw. | |
| 2665 client_->Reset(); | |
| 2666 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | |
| 2667 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | |
| 2668 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
| 2669 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 2670 | |
| 2671 client_->Reset(); | |
| 2672 EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
| 2673 scheduler_->DidLoseCompositorFrameSink(); | |
| 2674 EXPECT_NO_ACTION(client_); | |
| 2675 EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
| 2676 | |
| 2677 // BeginImplFrame deadline should abort drawing. | |
| 2678 client_->Reset(); | |
| 2679 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
| 2680 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 0, | |
| 2681 3); | |
| 2682 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); | |
| 2683 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); | |
| 2684 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
| 2685 EXPECT_FALSE(scheduler_->begin_frames_expected()); | |
| 2686 | |
| 2687 // No more BeginRetroFrame because BeginRetroFrame queue is cleared. | |
| 2688 client_->Reset(); | |
| 2689 task_runner().RunPendingTasks(); | |
| 2690 EXPECT_NO_ACTION(client_); | |
| 2691 } | |
| 2692 | |
| 2693 TEST_F(SchedulerTest, | 2316 TEST_F(SchedulerTest, |
| 2694 DidLoseCompositorFrameSinkWithDelayBasedBeginFrameSource) { | 2317 DidLoseCompositorFrameSinkWithDelayBasedBeginFrameSource) { |
| 2695 SetUpScheduler(THROTTLED_BFS); | 2318 SetUpScheduler(THROTTLED_BFS); |
| 2696 | 2319 |
| 2697 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | 2320 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. |
| 2698 EXPECT_FALSE(scheduler_->begin_frames_expected()); | 2321 EXPECT_FALSE(scheduler_->begin_frames_expected()); |
| 2699 scheduler_->SetNeedsBeginMainFrame(); | 2322 scheduler_->SetNeedsBeginMainFrame(); |
| 2700 EXPECT_TRUE(scheduler_->begin_frames_expected()); | 2323 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| 2701 | 2324 |
| 2702 client_->Reset(); | 2325 client_->Reset(); |
| (...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3605 } | 3228 } |
| 3606 | 3229 |
| 3607 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { | 3230 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { |
| 3608 EXPECT_FALSE(BeginMainFrameOnCriticalPath( | 3231 EXPECT_FALSE(BeginMainFrameOnCriticalPath( |
| 3609 SMOOTHNESS_TAKES_PRIORITY, | 3232 SMOOTHNESS_TAKES_PRIORITY, |
| 3610 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); | 3233 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); |
| 3611 } | 3234 } |
| 3612 | 3235 |
| 3613 } // namespace | 3236 } // namespace |
| 3614 } // namespace cc | 3237 } // namespace cc |
| OLD | NEW |