| 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.h" | 5 #include "cc/scheduler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "cc/test/scheduler_test_common.h" | 8 #include "cc/test/scheduler_test_common.h" |
| 9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 | 199 |
| 200 // Regaining visibility with textures acquired by main thread while | 200 // Regaining visibility with textures acquired by main thread while |
| 201 // compositor is waiting for first draw should result in a request | 201 // compositor is waiting for first draw should result in a request |
| 202 // for a new frame in order to escape a deadlock. | 202 // for a new frame in order to escape a deadlock. |
| 203 scheduler->setVisible(true); | 203 scheduler->setVisible(true); |
| 204 EXPECT_EQ(1, client.numActions()); | 204 EXPECT_EQ(1, client.numActions()); |
| 205 EXPECT_STREQ("scheduledActionBeginFrame", client.action(0)); | 205 EXPECT_STREQ("scheduledActionBeginFrame", client.action(0)); |
| 206 client.reset(); | 206 client.reset(); |
| 207 } | 207 } |
| 208 | 208 |
| 209 class SchedulerClientThatSetNeedsDrawInsideDraw : public FakeSchedulerClient { | 209 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
| 210 public: | 210 public: |
| 211 SchedulerClientThatSetNeedsDrawInsideDraw() | 211 SchedulerClientThatsetNeedsDrawInsideDraw() |
| 212 : m_scheduler(0) { } | 212 : m_scheduler(0) { } |
| 213 | 213 |
| 214 void setScheduler(Scheduler* scheduler) { m_scheduler = scheduler; } | 214 void setScheduler(Scheduler* scheduler) { m_scheduler = scheduler; } |
| 215 | 215 |
| 216 virtual void scheduledActionBeginFrame() OVERRIDE { } | 216 virtual void scheduledActionBeginFrame() OVERRIDE { } |
| 217 virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossibl
e() OVERRIDE | 217 virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossibl
e() OVERRIDE |
| 218 { | 218 { |
| 219 // Only setNeedsRedraw the first time this is called | 219 // Only setNeedsRedraw the first time this is called |
| 220 if (!m_numDraws) | 220 if (!m_numDraws) |
| 221 m_scheduler->setNeedsRedraw(); | 221 m_scheduler->setNeedsRedraw(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 235 protected: | 235 protected: |
| 236 Scheduler* m_scheduler; | 236 Scheduler* m_scheduler; |
| 237 }; | 237 }; |
| 238 | 238 |
| 239 // Tests for two different situations: | 239 // Tests for two different situations: |
| 240 // 1. the scheduler dropping setNeedsRedraw requests that happen inside | 240 // 1. the scheduler dropping setNeedsRedraw requests that happen inside |
| 241 // a scheduledActionDrawAndSwap | 241 // a scheduledActionDrawAndSwap |
| 242 // 2. the scheduler drawing twice inside a single tick | 242 // 2. the scheduler drawing twice inside a single tick |
| 243 TEST(SchedulerTest, RequestRedrawInsideDraw) | 243 TEST(SchedulerTest, RequestRedrawInsideDraw) |
| 244 { | 244 { |
| 245 SchedulerClientThatSetNeedsDrawInsideDraw client; | 245 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 246 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); | 246 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); |
| 247 SchedulerSettings defaultSchedulerSettings; | 247 SchedulerSettings defaultSchedulerSettings; |
| 248 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); | 248 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); |
| 249 client.setScheduler(scheduler.get()); | 249 client.setScheduler(scheduler.get()); |
| 250 scheduler->setCanBeginFrame(true); | 250 scheduler->setCanBeginFrame(true); |
| 251 scheduler->setVisible(true); | 251 scheduler->setVisible(true); |
| 252 scheduler->setCanDraw(true); | 252 scheduler->setCanDraw(true); |
| 253 | 253 |
| 254 scheduler->setNeedsRedraw(); | 254 scheduler->setNeedsRedraw(); |
| 255 EXPECT_TRUE(scheduler->redrawPending()); | 255 EXPECT_TRUE(scheduler->redrawPending()); |
| 256 EXPECT_TRUE(timeSource->active()); | 256 EXPECT_TRUE(timeSource->active()); |
| 257 EXPECT_EQ(0, client.numDraws()); | 257 EXPECT_EQ(0, client.numDraws()); |
| 258 | 258 |
| 259 timeSource->tick(); | 259 timeSource->tick(); |
| 260 EXPECT_EQ(1, client.numDraws()); | 260 EXPECT_EQ(1, client.numDraws()); |
| 261 EXPECT_TRUE(scheduler->redrawPending()); | 261 EXPECT_TRUE(scheduler->redrawPending()); |
| 262 EXPECT_TRUE(timeSource->active()); | 262 EXPECT_TRUE(timeSource->active()); |
| 263 | 263 |
| 264 timeSource->tick(); | 264 timeSource->tick(); |
| 265 EXPECT_EQ(2, client.numDraws()); | 265 EXPECT_EQ(2, client.numDraws()); |
| 266 EXPECT_FALSE(scheduler->redrawPending()); | 266 EXPECT_FALSE(scheduler->redrawPending()); |
| 267 EXPECT_FALSE(timeSource->active()); | 267 EXPECT_FALSE(timeSource->active()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 // Test that requesting redraw inside a failed draw doesn't lose the request. | 270 // Test that requesting redraw inside a failed draw doesn't lose the request. |
| 271 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) | 271 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) |
| 272 { | 272 { |
| 273 SchedulerClientThatSetNeedsDrawInsideDraw client; | 273 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 274 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); | 274 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); |
| 275 SchedulerSettings defaultSchedulerSettings; | 275 SchedulerSettings defaultSchedulerSettings; |
| 276 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); | 276 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); |
| 277 client.setScheduler(scheduler.get()); | 277 client.setScheduler(scheduler.get()); |
| 278 scheduler->setCanBeginFrame(true); | 278 scheduler->setCanBeginFrame(true); |
| 279 scheduler->setVisible(true); | 279 scheduler->setVisible(true); |
| 280 scheduler->setCanDraw(true); | 280 scheduler->setCanDraw(true); |
| 281 client.setDrawWillHappen(false); | 281 client.setDrawWillHappen(false); |
| 282 | 282 |
| 283 scheduler->setNeedsRedraw(); | 283 scheduler->setNeedsRedraw(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 303 | 303 |
| 304 // Draw successfully. | 304 // Draw successfully. |
| 305 client.setDrawWillHappen(true); | 305 client.setDrawWillHappen(true); |
| 306 timeSource->tick(); | 306 timeSource->tick(); |
| 307 EXPECT_EQ(3, client.numDraws()); | 307 EXPECT_EQ(3, client.numDraws()); |
| 308 EXPECT_TRUE(scheduler->commitPending()); | 308 EXPECT_TRUE(scheduler->commitPending()); |
| 309 EXPECT_FALSE(scheduler->redrawPending()); | 309 EXPECT_FALSE(scheduler->redrawPending()); |
| 310 EXPECT_FALSE(timeSource->active()); | 310 EXPECT_FALSE(timeSource->active()); |
| 311 } | 311 } |
| 312 | 312 |
| 313 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { | 313 class SchedulerClientThatsetNeedsCommitInsideDraw : public FakeSchedulerClient { |
| 314 public: | 314 public: |
| 315 SchedulerClientThatSetNeedsCommitInsideDraw() | 315 SchedulerClientThatsetNeedsCommitInsideDraw() |
| 316 : m_scheduler(0) { } | 316 : m_scheduler(0) { } |
| 317 | 317 |
| 318 void setScheduler(Scheduler* scheduler) { m_scheduler = scheduler; } | 318 void setScheduler(Scheduler* scheduler) { m_scheduler = scheduler; } |
| 319 | 319 |
| 320 virtual void scheduledActionBeginFrame() OVERRIDE { } | 320 virtual void scheduledActionBeginFrame() OVERRIDE { } |
| 321 virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossibl
e() OVERRIDE | 321 virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossibl
e() OVERRIDE |
| 322 { | 322 { |
| 323 // Only setNeedsCommit the first time this is called | 323 // Only setNeedsCommit the first time this is called |
| 324 if (!m_numDraws) | 324 if (!m_numDraws) |
| 325 m_scheduler->setNeedsCommit(); | 325 m_scheduler->setNeedsCommit(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 337 virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { } | 337 virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { } |
| 338 | 338 |
| 339 protected: | 339 protected: |
| 340 Scheduler* m_scheduler; | 340 Scheduler* m_scheduler; |
| 341 }; | 341 }; |
| 342 | 342 |
| 343 // Tests for the scheduler infinite-looping on setNeedsCommit requests that | 343 // Tests for the scheduler infinite-looping on setNeedsCommit requests that |
| 344 // happen inside a scheduledActionDrawAndSwap | 344 // happen inside a scheduledActionDrawAndSwap |
| 345 TEST(SchedulerTest, RequestCommitInsideDraw) | 345 TEST(SchedulerTest, RequestCommitInsideDraw) |
| 346 { | 346 { |
| 347 SchedulerClientThatSetNeedsCommitInsideDraw client; | 347 SchedulerClientThatsetNeedsCommitInsideDraw client; |
| 348 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); | 348 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); |
| 349 SchedulerSettings defaultSchedulerSettings; | 349 SchedulerSettings defaultSchedulerSettings; |
| 350 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); | 350 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); |
| 351 client.setScheduler(scheduler.get()); | 351 client.setScheduler(scheduler.get()); |
| 352 scheduler->setCanBeginFrame(true); | 352 scheduler->setCanBeginFrame(true); |
| 353 scheduler->setVisible(true); | 353 scheduler->setVisible(true); |
| 354 scheduler->setCanDraw(true); | 354 scheduler->setCanDraw(true); |
| 355 | 355 |
| 356 scheduler->setNeedsRedraw(); | 356 scheduler->setNeedsRedraw(); |
| 357 EXPECT_TRUE(scheduler->redrawPending()); | 357 EXPECT_TRUE(scheduler->redrawPending()); |
| 358 EXPECT_EQ(0, client.numDraws()); | 358 EXPECT_EQ(0, client.numDraws()); |
| 359 EXPECT_TRUE(timeSource->active()); | 359 EXPECT_TRUE(timeSource->active()); |
| 360 | 360 |
| 361 timeSource->tick(); | 361 timeSource->tick(); |
| 362 EXPECT_FALSE(timeSource->active()); | 362 EXPECT_FALSE(timeSource->active()); |
| 363 EXPECT_EQ(1, client.numDraws()); | 363 EXPECT_EQ(1, client.numDraws()); |
| 364 EXPECT_TRUE(scheduler->commitPending()); | 364 EXPECT_TRUE(scheduler->commitPending()); |
| 365 scheduler->beginFrameComplete(); | 365 scheduler->beginFrameComplete(); |
| 366 | 366 |
| 367 timeSource->tick(); | 367 timeSource->tick(); |
| 368 EXPECT_EQ(2, client.numDraws()); | 368 EXPECT_EQ(2, client.numDraws()); |
| 369 EXPECT_FALSE(timeSource->active()); | 369 EXPECT_FALSE(timeSource->active()); |
| 370 EXPECT_FALSE(scheduler->redrawPending()); | 370 EXPECT_FALSE(scheduler->redrawPending()); |
| 371 } | 371 } |
| 372 | 372 |
| 373 // Tests that when a draw fails then the pending commit should not be dropped. | 373 // Tests that when a draw fails then the pending commit should not be dropped. |
| 374 TEST(SchedulerTest, RequestCommitInsideFailedDraw) | 374 TEST(SchedulerTest, RequestCommitInsideFailedDraw) |
| 375 { | 375 { |
| 376 SchedulerClientThatSetNeedsDrawInsideDraw client; | 376 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 377 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); | 377 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); |
| 378 SchedulerSettings defaultSchedulerSettings; | 378 SchedulerSettings defaultSchedulerSettings; |
| 379 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); | 379 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, make_scoped_ptr
(new FrameRateController(timeSource)), defaultSchedulerSettings); |
| 380 client.setScheduler(scheduler.get()); | 380 client.setScheduler(scheduler.get()); |
| 381 scheduler->setCanBeginFrame(true); | 381 scheduler->setCanBeginFrame(true); |
| 382 scheduler->setVisible(true); | 382 scheduler->setVisible(true); |
| 383 scheduler->setCanDraw(true); | 383 scheduler->setCanDraw(true); |
| 384 client.setDrawWillHappen(false); | 384 client.setDrawWillHappen(false); |
| 385 | 385 |
| 386 scheduler->setNeedsRedraw(); | 386 scheduler->setNeedsRedraw(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 409 timeSource->tick(); | 409 timeSource->tick(); |
| 410 EXPECT_EQ(3, client.numDraws()); | 410 EXPECT_EQ(3, client.numDraws()); |
| 411 EXPECT_TRUE(scheduler->commitPending()); | 411 EXPECT_TRUE(scheduler->commitPending()); |
| 412 EXPECT_FALSE(scheduler->redrawPending()); | 412 EXPECT_FALSE(scheduler->redrawPending()); |
| 413 EXPECT_FALSE(timeSource->active()); | 413 EXPECT_FALSE(timeSource->active()); |
| 414 } | 414 } |
| 415 | 415 |
| 416 TEST(SchedulerTest, NoBeginFrameWhenDrawFails) | 416 TEST(SchedulerTest, NoBeginFrameWhenDrawFails) |
| 417 { | 417 { |
| 418 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); | 418 scoped_refptr<FakeTimeSource> timeSource(new FakeTimeSource()); |
| 419 SchedulerClientThatSetNeedsCommitInsideDraw client; | 419 SchedulerClientThatsetNeedsCommitInsideDraw client; |
| 420 scoped_ptr<FakeFrameRateController> controller(new FakeFrameRateController(t
imeSource)); | 420 scoped_ptr<FakeFrameRateController> controller(new FakeFrameRateController(t
imeSource)); |
| 421 FakeFrameRateController* controllerPtr = controller.get(); | 421 FakeFrameRateController* controllerPtr = controller.get(); |
| 422 SchedulerSettings defaultSchedulerSettings; | 422 SchedulerSettings defaultSchedulerSettings; |
| 423 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, controller.Pass
As<FrameRateController>(), defaultSchedulerSettings); | 423 scoped_ptr<Scheduler> scheduler = Scheduler::create(&client, controller.Pass
As<FrameRateController>(), defaultSchedulerSettings); |
| 424 client.setScheduler(scheduler.get()); | 424 client.setScheduler(scheduler.get()); |
| 425 scheduler->setCanBeginFrame(true); | 425 scheduler->setCanBeginFrame(true); |
| 426 scheduler->setVisible(true); | 426 scheduler->setVisible(true); |
| 427 scheduler->setCanDraw(true); | 427 scheduler->setCanDraw(true); |
| 428 | 428 |
| 429 EXPECT_EQ(0, controllerPtr->numFramesPending()); | 429 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 scheduler->setNeedsRedraw(); | 470 scheduler->setNeedsRedraw(); |
| 471 scheduler->setNeedsForcedRedraw(); | 471 scheduler->setNeedsForcedRedraw(); |
| 472 EXPECT_TRUE(client.hasAction("scheduledActionDrawAndSwapForced")); | 472 EXPECT_TRUE(client.hasAction("scheduledActionDrawAndSwapForced")); |
| 473 | 473 |
| 474 // We should not have told the frame rate controller that we began a frame. | 474 // We should not have told the frame rate controller that we began a frame. |
| 475 EXPECT_EQ(0, controllerPtr->numFramesPending()); | 475 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| 476 } | 476 } |
| 477 | 477 |
| 478 } // namespace | 478 } // namespace |
| 479 } // namespace cc | 479 } // namespace cc |
| OLD | NEW |