| 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 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
| 5 | 5 |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 if (automatic_swap_ack_) | 127 if (automatic_swap_ack_) |
| 128 scheduler_->DidSwapBuffersComplete(); | 128 scheduler_->DidSwapBuffersComplete(); |
| 129 } | 129 } |
| 130 return result; | 130 return result; |
| 131 } | 131 } |
| 132 virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { | 132 virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { |
| 133 actions_.push_back("ScheduledActionDrawAndSwapForced"); | 133 actions_.push_back("ScheduledActionDrawAndSwapForced"); |
| 134 states_.push_back(scheduler_->AsValue().release()); | 134 states_.push_back(scheduler_->AsValue().release()); |
| 135 return DRAW_SUCCESS; | 135 return DRAW_SUCCESS; |
| 136 } | 136 } |
| 137 virtual DrawResult ScheduledActionDrawAndReadback() OVERRIDE { | |
| 138 actions_.push_back("ScheduledActionDrawAndReadback"); | |
| 139 states_.push_back(scheduler_->AsValue().release()); | |
| 140 return DRAW_SUCCESS; | |
| 141 } | |
| 142 virtual void ScheduledActionCommit() OVERRIDE { | 137 virtual void ScheduledActionCommit() OVERRIDE { |
| 143 actions_.push_back("ScheduledActionCommit"); | 138 actions_.push_back("ScheduledActionCommit"); |
| 144 states_.push_back(scheduler_->AsValue().release()); | 139 states_.push_back(scheduler_->AsValue().release()); |
| 145 } | 140 } |
| 146 virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE { | 141 virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE { |
| 147 actions_.push_back("ScheduledActionUpdateVisibleTiles"); | 142 actions_.push_back("ScheduledActionUpdateVisibleTiles"); |
| 148 states_.push_back(scheduler_->AsValue().release()); | 143 states_.push_back(scheduler_->AsValue().release()); |
| 149 } | 144 } |
| 150 virtual void ScheduledActionActivatePendingTree() OVERRIDE { | 145 virtual void ScheduledActionActivatePendingTree() OVERRIDE { |
| 151 actions_.push_back("ScheduledActionActivatePendingTree"); | 146 actions_.push_back("ScheduledActionActivatePendingTree"); |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 EXPECT_TRUE(client.needs_begin_frame()); | 633 EXPECT_TRUE(client.needs_begin_frame()); |
| 639 | 634 |
| 640 // Fail to draw, this should not start a frame. | 635 // Fail to draw, this should not start a frame. |
| 641 client.SetDrawWillHappen(false); | 636 client.SetDrawWillHappen(false); |
| 642 client.SetNeedsCommitOnNextDraw(); | 637 client.SetNeedsCommitOnNextDraw(); |
| 643 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 638 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); |
| 644 client.task_runner().RunPendingTasks(); // Run posted deadline. | 639 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 645 EXPECT_EQ(2, client.num_draws()); | 640 EXPECT_EQ(2, client.num_draws()); |
| 646 } | 641 } |
| 647 | 642 |
| 648 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { | |
| 649 FakeSchedulerClient client; | |
| 650 SchedulerSettings default_scheduler_settings; | |
| 651 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | |
| 652 | |
| 653 // Tell the client that it will fail to swap. | |
| 654 client.SetDrawWillHappen(true); | |
| 655 client.SetSwapWillHappenIfDrawHappens(false); | |
| 656 | |
| 657 // Get the compositor to do a ScheduledActionDrawAndReadback. | |
| 658 scheduler->SetCanDraw(true); | |
| 659 scheduler->SetNeedsRedraw(); | |
| 660 scheduler->SetNeedsForcedCommitForReadback(); | |
| 661 scheduler->NotifyBeginMainFrameStarted(); | |
| 662 scheduler->NotifyReadyToCommit(); | |
| 663 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | |
| 664 } | |
| 665 | |
| 666 TEST(SchedulerTest, BackToBackReadbackAllowed) { | |
| 667 // Some clients call readbacks twice in a row before the replacement | |
| 668 // commit comes in. Make sure it is allowed. | |
| 669 FakeSchedulerClient client; | |
| 670 SchedulerSettings default_scheduler_settings; | |
| 671 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | |
| 672 | |
| 673 // Get the compositor to do 2 ScheduledActionDrawAndReadbacks before | |
| 674 // the replacement commit comes in. | |
| 675 scheduler->SetCanDraw(true); | |
| 676 scheduler->SetNeedsRedraw(); | |
| 677 scheduler->SetNeedsForcedCommitForReadback(); | |
| 678 scheduler->NotifyBeginMainFrameStarted(); | |
| 679 scheduler->NotifyReadyToCommit(); | |
| 680 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | |
| 681 | |
| 682 client.Reset(); | |
| 683 scheduler->SetNeedsForcedCommitForReadback(); | |
| 684 scheduler->NotifyBeginMainFrameStarted(); | |
| 685 scheduler->NotifyReadyToCommit(); | |
| 686 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | |
| 687 | |
| 688 // The replacement commit comes in after 2 readbacks. | |
| 689 client.Reset(); | |
| 690 scheduler->NotifyBeginMainFrameStarted(); | |
| 691 scheduler->NotifyReadyToCommit(); | |
| 692 } | |
| 693 | |
| 694 | |
| 695 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { | 643 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { |
| 696 public: | 644 public: |
| 697 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() | 645 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() |
| 698 OVERRIDE { | 646 OVERRIDE { |
| 699 scheduler_->SetNeedsManageTiles(); | 647 scheduler_->SetNeedsManageTiles(); |
| 700 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 648 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
| 701 } | 649 } |
| 702 }; | 650 }; |
| 703 | 651 |
| 704 // Test manage tiles is independant of draws. | 652 // Test manage tiles is independant of draws. |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1466 TEST(SchedulerTest, | 1414 TEST(SchedulerTest, |
| 1467 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { | 1415 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| 1468 bool begin_frame_scheduling_enabled = false; | 1416 bool begin_frame_scheduling_enabled = false; |
| 1469 bool throttle_frame_production = false; | 1417 bool throttle_frame_production = false; |
| 1470 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1418 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1471 throttle_frame_production); | 1419 throttle_frame_production); |
| 1472 } | 1420 } |
| 1473 | 1421 |
| 1474 } // namespace | 1422 } // namespace |
| 1475 } // namespace cc | 1423 } // namespace cc |
| OLD | NEW |