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 2020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2031 EXPECT_NO_ACTION(client_); | 2031 EXPECT_NO_ACTION(client_); |
2032 | 2032 |
2033 // Activate the pending tree, which also unblocks the commit immediately | 2033 // Activate the pending tree, which also unblocks the commit immediately |
2034 // while we are in an idle state. | 2034 // while we are in an idle state. |
2035 client_->Reset(); | 2035 client_->Reset(); |
2036 scheduler_->NotifyReadyToActivate(); | 2036 scheduler_->NotifyReadyToActivate(); |
2037 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); | 2037 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); |
2038 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 2); | 2038 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 2); |
2039 } | 2039 } |
2040 | 2040 |
2041 TEST_F(SchedulerTest, BeginRetroFrame) { | 2041 TEST_F(SchedulerTest, BeginFrameWhileInsidePreviousFrame) { |
2042 scheduler_settings_.use_external_begin_frame_source = true; | 2042 scheduler_settings_.use_external_begin_frame_source = true; |
2043 SetUpScheduler(true); | 2043 SetUpScheduler(true); |
2044 | 2044 |
2045 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
2046 scheduler_->SetNeedsBeginMainFrame(); | 2045 scheduler_->SetNeedsBeginMainFrame(); |
2047 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | 2046 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
| 2047 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
2048 client_->Reset(); | 2048 client_->Reset(); |
2049 | 2049 |
2050 // Create a BeginFrame with a long deadline to avoid race conditions. | 2050 EXPECT_SCOPED(AdvanceFrame()); |
2051 // This is the first BeginFrame, which will be handled immediately. | |
2052 BeginFrameArgs args = | |
2053 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
2054 args.deadline += base::TimeDelta::FromHours(1); | |
2055 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2056 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 2051 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
2057 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | 2052 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
2058 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2053 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
| 2054 client_->Reset(); |
| 2055 |
| 2056 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
| 2057 scheduler_->NotifyReadyToCommit(); |
| 2058 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| 2059 client_->Reset(); |
| 2060 |
| 2061 scheduler_->NotifyReadyToActivate(); |
| 2062 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); |
| 2063 client_->Reset(); |
| 2064 |
| 2065 // Send next begin frame while inside previous frame. |
| 2066 SendNextBeginFrame(); |
| 2067 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); |
| 2068 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); |
| 2069 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
| 2070 } |
| 2071 |
| 2072 TEST_F(SchedulerTest, BeginFrameWhileWaitForReadyToDraw) { |
| 2073 scheduler_settings_.use_external_begin_frame_source = true; |
| 2074 scheduler_settings_.commit_to_active_tree = true; |
| 2075 SetUpScheduler(true); |
| 2076 |
| 2077 scheduler_->SetNeedsBeginMainFrame(); |
| 2078 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
2059 EXPECT_TRUE(scheduler_->begin_frames_expected()); | 2079 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
2060 client_->Reset(); | 2080 client_->Reset(); |
2061 | 2081 |
2062 // Queue BeginFrames while we are still handling the previous BeginFrame. | 2082 EXPECT_SCOPED(AdvanceFrame()); |
2063 args.frame_time += base::TimeDelta::FromSeconds(1); | 2083 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
2064 fake_external_begin_frame_source()->TestOnBeginFrame(args); | 2084 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
2065 args.frame_time += base::TimeDelta::FromSeconds(1); | 2085 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
2066 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2067 | |
2068 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
2069 task_runner().RunPendingTasks(); // Run posted deadline. | |
2070 EXPECT_NO_ACTION(client_); | |
2071 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2072 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2073 client_->Reset(); | 2086 client_->Reset(); |
2074 | 2087 |
2075 // NotifyReadyToCommit should trigger the commit. | |
2076 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | 2088 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
2077 scheduler_->NotifyReadyToCommit(); | 2089 scheduler_->NotifyReadyToCommit(); |
2078 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | 2090 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
2079 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2080 client_->Reset(); | 2091 client_->Reset(); |
2081 | 2092 |
2082 // NotifyReadyToActivate should trigger the activation. | |
2083 scheduler_->NotifyReadyToActivate(); | 2093 scheduler_->NotifyReadyToActivate(); |
2084 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | 2094 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); |
2085 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2086 client_->Reset(); | 2095 client_->Reset(); |
2087 | 2096 |
2088 // BeginImplFrame should prepare the draw. | 2097 // Send next begin frame while inside previous frame. No draw while we're |
2089 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 2098 // waiting for ready to draw. |
2090 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | 2099 SendNextBeginFrame(); |
2091 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2092 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2093 client_->Reset(); | |
2094 | |
2095 // BeginImplFrame deadline should draw. | |
2096 task_runner().RunPendingTasks(); // Run posted deadline. | |
2097 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
2098 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2099 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2100 client_->Reset(); | |
2101 | |
2102 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | |
2103 // to avoid excessive toggles. | |
2104 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | |
2105 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); | 2100 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
2106 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2101 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
2107 client_->Reset(); | 2102 client_->Reset(); |
2108 | 2103 |
2109 task_runner().RunPendingTasks(); // Run posted deadline. | 2104 scheduler_->NotifyReadyToDraw(); |
2110 EXPECT_ACTION("RemoveObserver(this)", client_, 0, 2); | |
2111 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); | |
2112 client_->Reset(); | |
2113 } | |
2114 | |
2115 TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) { | |
2116 scheduler_settings_.use_external_begin_frame_source = true; | |
2117 SetUpScheduler(true); | |
2118 | |
2119 scheduler_->SetNeedsBeginMainFrame(); | |
2120 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2121 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2122 | |
2123 client_->Reset(); | |
2124 EXPECT_SCOPED(AdvanceFrame()); | |
2125 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
2126 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
2127 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2128 | |
2129 client_->Reset(); | |
2130 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
2131 | |
2132 client_->Reset(); | |
2133 BeginFrameArgs retro_frame_args = SendNextBeginFrame(); | |
2134 // This BeginFrame is queued up as a retro frame. | |
2135 EXPECT_NO_ACTION(client_); | |
2136 // The previous deadline is still pending. | |
2137 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2138 | |
2139 client_->Reset(); | |
2140 // This main frame activating should schedule the (previous) deadline to | |
2141 // trigger immediately. | |
2142 scheduler_->NotifyReadyToCommit(); | |
2143 scheduler_->NotifyReadyToActivate(); | |
2144 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 2); | |
2145 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2); | |
2146 | |
2147 client_->Reset(); | |
2148 // The deadline task should trigger causing a draw. | |
2149 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2150 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
2151 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
2152 | |
2153 // Keep animating. | |
2154 client_->Reset(); | |
2155 scheduler_->SetNeedsOneBeginImplFrame(); | |
2156 scheduler_->SetNeedsRedraw(); | |
2157 EXPECT_NO_ACTION(client_); | 2105 EXPECT_NO_ACTION(client_); |
2158 | 2106 |
2159 // Let's advance to the retro frame's deadline. | 2107 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); |
2160 now_src()->Advance(retro_frame_args.deadline - now_src()->NowTicks()); | |
2161 | |
2162 // The retro frame hasn't expired yet. | |
2163 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false)); | |
2164 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | |
2165 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2166 | |
2167 // This is an immediate deadline case. | |
2168 client_->Reset(); | |
2169 task_runner().RunPendingTasks(); | |
2170 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2171 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); | 2108 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); |
2172 } | |
2173 | |
2174 TEST_F(SchedulerTest, RetroFrameExpiresOnTime) { | |
2175 scheduler_settings_.use_external_begin_frame_source = true; | |
2176 SetUpScheduler(true); | |
2177 | |
2178 scheduler_->SetNeedsBeginMainFrame(); | |
2179 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2180 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2181 | |
2182 client_->Reset(); | |
2183 EXPECT_SCOPED(AdvanceFrame()); | |
2184 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
2185 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
2186 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2187 | |
2188 client_->Reset(); | |
2189 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
2190 | |
2191 client_->Reset(); | |
2192 BeginFrameArgs retro_frame_args = SendNextBeginFrame(); | |
2193 // This BeginFrame is queued up as a retro frame. | |
2194 EXPECT_NO_ACTION(client_); | |
2195 // The previous deadline is still pending. | |
2196 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2197 | |
2198 client_->Reset(); | |
2199 // This main frame activating should schedule the (previous) deadline to | |
2200 // trigger immediately. | |
2201 scheduler_->NotifyReadyToCommit(); | |
2202 scheduler_->NotifyReadyToActivate(); | |
2203 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 2); | |
2204 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2); | |
2205 | |
2206 client_->Reset(); | |
2207 // The deadline task should trigger causing a draw. | |
2208 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2209 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
2210 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
2211 | |
2212 // Keep animating. | |
2213 client_->Reset(); | |
2214 scheduler_->SetNeedsOneBeginImplFrame(); | |
2215 scheduler_->SetNeedsRedraw(); | |
2216 EXPECT_NO_ACTION(client_); | |
2217 | |
2218 // Let's advance sufficiently past the retro frame's deadline. | |
2219 now_src()->Advance(retro_frame_args.deadline - now_src()->NowTicks() + | |
2220 base::TimeDelta::FromMicroseconds(1)); | |
2221 | |
2222 // The retro frame should've expired. | |
2223 EXPECT_NO_ACTION(client_); | |
2224 } | |
2225 | |
2226 TEST_F(SchedulerTest, MissedFrameDoesNotExpireTooEarly) { | |
2227 scheduler_settings_.use_external_begin_frame_source = true; | |
2228 SetUpScheduler(true); | |
2229 | |
2230 scheduler_->SetNeedsBeginMainFrame(); | |
2231 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2232 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2233 | |
2234 BeginFrameArgs missed_frame_args = | |
2235 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
2236 missed_frame_args.type = BeginFrameArgs::MISSED; | |
2237 | |
2238 // Advance to the deadline. | |
2239 now_src()->Advance(missed_frame_args.deadline - now_src()->NowTicks()); | |
2240 | |
2241 // Missed frame is handled because it's on time. | |
2242 client_->Reset(); | |
2243 fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args); | |
2244 EXPECT_TRUE( | |
2245 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false))); | |
2246 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
2247 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
2248 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2249 } | |
2250 | |
2251 TEST_F(SchedulerTest, MissedFrameExpiresOnTime) { | |
2252 scheduler_settings_.use_external_begin_frame_source = true; | |
2253 SetUpScheduler(true); | |
2254 | |
2255 scheduler_->SetNeedsBeginMainFrame(); | |
2256 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2257 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2258 | |
2259 BeginFrameArgs missed_frame_args = | |
2260 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
2261 missed_frame_args.type = BeginFrameArgs::MISSED; | |
2262 | |
2263 // Advance sufficiently past the deadline. | |
2264 now_src()->Advance(missed_frame_args.deadline - now_src()->NowTicks() + | |
2265 base::TimeDelta::FromMicroseconds(1)); | |
2266 | |
2267 // Missed frame is dropped because it's too late. | |
2268 client_->Reset(); | |
2269 fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args); | |
2270 EXPECT_FALSE( | |
2271 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false))); | |
2272 EXPECT_NO_ACTION(client_); | |
2273 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | 2109 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
2274 } | 2110 } |
2275 | 2111 |
2276 void SchedulerTest::BeginFramesNotFromClient( | 2112 void SchedulerTest::BeginFramesNotFromClient( |
2277 bool use_external_begin_frame_source, | 2113 bool use_external_begin_frame_source, |
2278 bool throttle_frame_production) { | 2114 bool throttle_frame_production) { |
2279 scheduler_settings_.use_external_begin_frame_source = | 2115 scheduler_settings_.use_external_begin_frame_source = |
2280 use_external_begin_frame_source; | 2116 use_external_begin_frame_source; |
2281 scheduler_settings_.throttle_frame_production = throttle_frame_production; | 2117 scheduler_settings_.throttle_frame_production = throttle_frame_production; |
2282 SetUpScheduler(true); | 2118 SetUpScheduler(true); |
2283 | 2119 |
2284 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame | 2120 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame |
2285 // without calling SetNeedsBeginFrame. | 2121 // without calling SetNeedsBeginFrame. |
2286 scheduler_->SetNeedsBeginMainFrame(); | 2122 scheduler_->SetNeedsBeginMainFrame(); |
2287 EXPECT_NO_ACTION(client_); | 2123 EXPECT_NO_ACTION(client_); |
2288 client_->Reset(); | 2124 client_->Reset(); |
2289 | 2125 |
2290 // When the client-driven BeginFrame are disabled, the scheduler posts it's | 2126 // When the client-driven BeginFrame are disabled, the scheduler posts it's |
2291 // own BeginFrame tasks. | 2127 // own BeginFrame tasks. |
2292 task_runner().RunPendingTasks(); // Run posted BeginFrame. | 2128 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(false)); |
2293 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 2129 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
2294 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | 2130 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
2295 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2131 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
2296 client_->Reset(); | 2132 client_->Reset(); |
2297 | 2133 |
2298 // If we don't swap on the deadline, we wait for the next BeginFrame. | 2134 // BeginImplFrame should prepare the draw. |
2299 task_runner().RunPendingTasks(); // Run posted deadline. | 2135 // Run deadline and posted begin frame. |
2300 EXPECT_NO_ACTION(client_); | 2136 task_runner().RunTasksWhile(scheduler_->InCurrentFrame()); |
2301 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | 2137 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
| 2138 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
2302 client_->Reset(); | 2139 client_->Reset(); |
2303 | 2140 |
2304 // NotifyReadyToCommit should trigger the commit. | 2141 // NotifyReadyToCommit should trigger the commit. |
2305 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | 2142 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
2306 scheduler_->NotifyReadyToCommit(); | 2143 scheduler_->NotifyReadyToCommit(); |
2307 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | 2144 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
2308 client_->Reset(); | 2145 client_->Reset(); |
2309 | 2146 |
2310 // NotifyReadyToActivate should trigger the activation. | 2147 // NotifyReadyToActivate should trigger the activation. |
2311 scheduler_->NotifyReadyToActivate(); | 2148 scheduler_->NotifyReadyToActivate(); |
2312 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | 2149 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); |
2313 client_->Reset(); | 2150 client_->Reset(); |
2314 | 2151 |
2315 // BeginImplFrame should prepare the draw. | 2152 // Deadline should draw and next begin frame should stop the source. |
2316 task_runner().RunPendingTasks(); // Run posted BeginFrame. | 2153 // Run deadline and posted begin frame. |
2317 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | 2154 task_runner().RunTasksWhile(scheduler_->InCurrentFrame()); |
| 2155 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); |
| 2156 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); |
2318 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | 2157 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); |
2319 client_->Reset(); | 2158 client_->Reset(); |
2320 | 2159 |
2321 // BeginImplFrame deadline should draw. | |
2322 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
2323 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); | |
2324 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2325 client_->Reset(); | |
2326 | |
2327 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | |
2328 // to avoid excessive toggles. | |
2329 task_runner().RunPendingTasks(); // Run posted BeginFrame. | |
2330 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); | |
2331 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2332 client_->Reset(); | |
2333 | |
2334 // Make sure SetNeedsBeginFrame isn't called on the client | 2160 // Make sure SetNeedsBeginFrame isn't called on the client |
2335 // when the BeginFrame is no longer needed. | 2161 // when the BeginFrame is no longer needed. |
2336 task_runner().RunPendingTasks(); // Run posted deadline. | 2162 task_runner().RunPendingTasks(); // Run posted deadline. |
2337 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); | 2163 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); |
2338 client_->Reset(); | 2164 client_->Reset(); |
2339 } | 2165 } |
2340 | 2166 |
2341 TEST_F(SchedulerTest, SyntheticBeginFrames) { | 2167 TEST_F(SchedulerTest, SyntheticBeginFrames) { |
2342 bool use_external_begin_frame_source = false; | 2168 bool use_external_begin_frame_source = false; |
2343 bool throttle_frame_production = true; | 2169 bool throttle_frame_production = true; |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2620 EXPECT_NO_ACTION(client_); | 2446 EXPECT_NO_ACTION(client_); |
2621 | 2447 |
2622 client_->Reset(); | 2448 client_->Reset(); |
2623 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | 2449 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); |
2624 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 4); | 2450 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 4); |
2625 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 1, 4); | 2451 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 1, 4); |
2626 EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4); | 2452 EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4); |
2627 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4); | 2453 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4); |
2628 } | 2454 } |
2629 | 2455 |
2630 TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterBeginRetroFramePosted) { | |
2631 scheduler_settings_.use_external_begin_frame_source = true; | |
2632 SetUpScheduler(true); | |
2633 | |
2634 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
2635 scheduler_->SetNeedsBeginMainFrame(); | |
2636 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2637 | |
2638 // Create a BeginFrame with a long deadline to avoid race conditions. | |
2639 // This is the first BeginFrame, which will be handled immediately. | |
2640 client_->Reset(); | |
2641 BeginFrameArgs args = | |
2642 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
2643 args.deadline += base::TimeDelta::FromHours(1); | |
2644 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2645 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
2646 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
2647 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2648 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2649 | |
2650 // Queue BeginFrames while we are still handling the previous BeginFrame. | |
2651 args.frame_time += base::TimeDelta::FromSeconds(1); | |
2652 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2653 args.frame_time += base::TimeDelta::FromSeconds(1); | |
2654 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2655 | |
2656 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
2657 client_->Reset(); | |
2658 task_runner().RunPendingTasks(); // Run posted deadline. | |
2659 EXPECT_NO_ACTION(client_); | |
2660 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2661 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2662 | |
2663 // NotifyReadyToCommit should trigger the commit. | |
2664 client_->Reset(); | |
2665 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
2666 scheduler_->NotifyReadyToCommit(); | |
2667 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | |
2668 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2669 | |
2670 // NotifyReadyToActivate should trigger the activation. | |
2671 client_->Reset(); | |
2672 scheduler_->NotifyReadyToActivate(); | |
2673 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | |
2674 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2675 | |
2676 client_->Reset(); | |
2677 EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
2678 scheduler_->DidLoseOutputSurface(); | |
2679 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 3); | |
2680 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); | |
2681 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); | |
2682 EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
2683 | |
2684 // Posted BeginRetroFrame is aborted. | |
2685 client_->Reset(); | |
2686 task_runner().RunPendingTasks(); | |
2687 EXPECT_NO_ACTION(client_); | |
2688 } | |
2689 | |
2690 TEST_F(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { | |
2691 scheduler_settings_.use_external_begin_frame_source = true; | |
2692 SetUpScheduler(true); | |
2693 | |
2694 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | |
2695 scheduler_->SetNeedsBeginMainFrame(); | |
2696 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
2697 | |
2698 // Create a BeginFrame with a long deadline to avoid race conditions. | |
2699 // This is the first BeginFrame, which will be handled immediately. | |
2700 client_->Reset(); | |
2701 BeginFrameArgs args = | |
2702 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
2703 args.deadline += base::TimeDelta::FromHours(1); | |
2704 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2705 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
2706 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
2707 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2708 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2709 | |
2710 // Queue BeginFrames while we are still handling the previous BeginFrame. | |
2711 args.frame_time += base::TimeDelta::FromSeconds(1); | |
2712 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2713 args.frame_time += base::TimeDelta::FromSeconds(1); | |
2714 fake_external_begin_frame_source()->TestOnBeginFrame(args); | |
2715 | |
2716 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | |
2717 client_->Reset(); | |
2718 task_runner().RunPendingTasks(); // Run posted deadline. | |
2719 EXPECT_NO_ACTION(client_); | |
2720 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2721 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2722 | |
2723 // NotifyReadyToCommit should trigger the commit. | |
2724 client_->Reset(); | |
2725 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | |
2726 scheduler_->NotifyReadyToCommit(); | |
2727 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); | |
2728 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2729 | |
2730 // NotifyReadyToActivate should trigger the activation. | |
2731 client_->Reset(); | |
2732 scheduler_->NotifyReadyToActivate(); | |
2733 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); | |
2734 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2735 | |
2736 // BeginImplFrame should prepare the draw. | |
2737 client_->Reset(); | |
2738 task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | |
2739 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); | |
2740 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); | |
2741 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
2742 | |
2743 client_->Reset(); | |
2744 EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
2745 scheduler_->DidLoseOutputSurface(); | |
2746 EXPECT_NO_ACTION(client_); | |
2747 EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); | |
2748 | |
2749 // BeginImplFrame deadline should abort drawing. | |
2750 client_->Reset(); | |
2751 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); | |
2752 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 3); | |
2753 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); | |
2754 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); | |
2755 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); | |
2756 EXPECT_FALSE(scheduler_->begin_frames_expected()); | |
2757 | |
2758 // No more BeginRetroFrame because BeginRetroFrame queue is cleared. | |
2759 client_->Reset(); | |
2760 task_runner().RunPendingTasks(); | |
2761 EXPECT_NO_ACTION(client_); | |
2762 } | |
2763 | |
2764 TEST_F(SchedulerTest, DidLoseOutputSurfaceWithDelayBasedBeginFrameSource) { | 2456 TEST_F(SchedulerTest, DidLoseOutputSurfaceWithDelayBasedBeginFrameSource) { |
2765 SetUpScheduler(true); | 2457 SetUpScheduler(true); |
2766 | 2458 |
2767 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | 2459 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. |
2768 EXPECT_FALSE(scheduler_->begin_frames_expected()); | 2460 EXPECT_FALSE(scheduler_->begin_frames_expected()); |
2769 scheduler_->SetNeedsBeginMainFrame(); | 2461 scheduler_->SetNeedsBeginMainFrame(); |
2770 EXPECT_TRUE(scheduler_->begin_frames_expected()); | 2462 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
2771 | 2463 |
2772 client_->Reset(); | 2464 client_->Reset(); |
2773 AdvanceFrame(); | 2465 AdvanceFrame(); |
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3687 } | 3379 } |
3688 | 3380 |
3689 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { | 3381 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { |
3690 EXPECT_FALSE(BeginMainFrameOnCriticalPath( | 3382 EXPECT_FALSE(BeginMainFrameOnCriticalPath( |
3691 SMOOTHNESS_TAKES_PRIORITY, | 3383 SMOOTHNESS_TAKES_PRIORITY, |
3692 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); | 3384 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); |
3693 } | 3385 } |
3694 | 3386 |
3695 } // namespace | 3387 } // namespace |
3696 } // namespace cc | 3388 } // namespace cc |
OLD | NEW |