| Index: cc/surfaces/display_scheduler_unittest.cc
|
| diff --git a/cc/surfaces/display_scheduler_unittest.cc b/cc/surfaces/display_scheduler_unittest.cc
|
| index a03aeacb66196a17b4d8342551d207599cca0f62..68e80a00e7adc99fb9235a787e4ac32286534972 100644
|
| --- a/cc/surfaces/display_scheduler_unittest.cc
|
| +++ b/cc/surfaces/display_scheduler_unittest.cc
|
| @@ -5,11 +5,13 @@
|
| #include "cc/surfaces/display_scheduler.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/stl_util.h"
|
| #include "base/test/null_task_runner.h"
|
| #include "base/test/simple_test_tick_clock.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "cc/output/begin_frame_args.h"
|
| #include "cc/surfaces/display.h"
|
| +#include "cc/surfaces/surface_info.h"
|
| #include "cc/test/fake_external_begin_frame_source.h"
|
| #include "cc/test/scheduler_test_common.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -23,21 +25,38 @@ static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
|
|
|
| class FakeDisplaySchedulerClient : public DisplaySchedulerClient {
|
| public:
|
| - FakeDisplaySchedulerClient() : draw_and_swap_count_(0) {}
|
| + FakeDisplaySchedulerClient()
|
| + : draw_and_swap_count_(0), next_draw_and_swap_fails_(false) {}
|
|
|
| ~FakeDisplaySchedulerClient() override {}
|
|
|
| bool DrawAndSwap() override {
|
| draw_and_swap_count_++;
|
| - return true;
|
| +
|
| + bool success = !next_draw_and_swap_fails_;
|
| + next_draw_and_swap_fails_ = false;
|
| +
|
| + if (success)
|
| + undrawn_surfaces_.clear();
|
| + return success;
|
| }
|
|
|
| - void Reset() { draw_and_swap_count_ = 0; }
|
| + bool SurfaceHasUndrawnFrame(const SurfaceId& surface_id) const override {
|
| + return base::ContainsKey(undrawn_surfaces_, surface_id);
|
| + }
|
|
|
| int draw_and_swap_count() const { return draw_and_swap_count_; }
|
|
|
| + void SetNextDrawAndSwapFails() { next_draw_and_swap_fails_ = true; }
|
| +
|
| + void SurfaceDamaged(const SurfaceId& surface_id) {
|
| + undrawn_surfaces_.insert(surface_id);
|
| + }
|
| +
|
| protected:
|
| int draw_and_swap_count_;
|
| + bool next_draw_and_swap_fails_;
|
| + std::set<SurfaceId> undrawn_surfaces_;
|
| };
|
|
|
| class TestDisplayScheduler : public DisplayScheduler {
|
| @@ -75,6 +94,8 @@ class TestDisplayScheduler : public DisplayScheduler {
|
| return inside_begin_frame_deadline_interval_;
|
| }
|
|
|
| + bool has_pending_surfaces() { return has_pending_surfaces_; }
|
| +
|
| protected:
|
| int scheduler_begin_frame_deadline_count_;
|
| };
|
| @@ -95,20 +116,35 @@ class DisplaySchedulerTest : public testing::Test {
|
|
|
| void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); }
|
|
|
| - void AdvanceTimeAndBeginFrameForTest() {
|
| + void AdvanceTimeAndBeginFrameForTest(
|
| + const std::vector<SurfaceId>& observing_surfaces) {
|
| now_src_.Advance(base::TimeDelta::FromMicroseconds(10000));
|
| // FakeBeginFrameSource deals with |source_id| and |sequence_number|.
|
| - BeginFrameArgs args = fake_begin_frame_source_.CreateBeginFrameArgs(
|
| + last_begin_frame_args_ = fake_begin_frame_source_.CreateBeginFrameArgs(
|
| BEGINFRAME_FROM_HERE, &now_src_);
|
| - fake_begin_frame_source_.TestOnBeginFrame(args);
|
| + fake_begin_frame_source_.TestOnBeginFrame(last_begin_frame_args_);
|
| + for (const SurfaceId& surface : observing_surfaces)
|
| + scheduler_.SurfaceDamageExpected(surface, last_begin_frame_args_);
|
| + }
|
| +
|
| + void SurfaceDamaged(const SurfaceId& surface_id) {
|
| + client_.SurfaceDamaged(surface_id);
|
| + scheduler_.SurfaceDamaged(surface_id, AckForCurrentBeginFrame(), true);
|
| }
|
|
|
| protected:
|
| base::SimpleTestTickClock& now_src() { return now_src_; }
|
| FakeDisplaySchedulerClient& client() { return client_; }
|
| DisplayScheduler& scheduler() { return scheduler_; }
|
| + BeginFrameAck AckForCurrentBeginFrame() {
|
| + DCHECK(last_begin_frame_args_.IsValid());
|
| + return BeginFrameAck(last_begin_frame_args_.source_id,
|
| + last_begin_frame_args_.sequence_number,
|
| + last_begin_frame_args_.sequence_number, true);
|
| + }
|
|
|
| FakeExternalBeginFrameSource fake_begin_frame_source_;
|
| + BeginFrameArgs last_begin_frame_args_;
|
|
|
| base::SimpleTestTickClock now_src_;
|
| scoped_refptr<base::NullTaskRunner> task_runner_;
|
| @@ -130,18 +166,22 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
|
| scheduler_.SetVisible(true);
|
|
|
| // Go trough an initial BeginFrame cycle with the root surface.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id1, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Resize on the next begin frame cycle should cause the deadline to wait
|
| // for a new root surface.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({root_surface_id1});
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.DisplayResized();
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| + scheduler_.SurfaceDestroyed(root_surface_id1);
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id2, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id2);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| @@ -149,10 +189,10 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
|
|
|
| // Verify deadline goes back to normal after resize.
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + AdvanceTimeAndBeginFrameForTest({root_surface_id2, sid1});
|
| + SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - scheduler_.SurfaceDamaged(root_surface_id2);
|
| + SurfaceDamaged(root_surface_id2);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| @@ -169,29 +209,31 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
|
| scheduler_.SetVisible(true);
|
|
|
| // Go trough an initial BeginFrame cycle with the root surface.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Resize on the next begin frame cycle should cause the deadline to wait
|
| // for a new root surface.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({root_surface_id});
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.DisplayResized();
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - scheduler_.SurfaceDamaged(root_surface_id);
|
| + SurfaceDamaged(root_surface_id);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Verify deadline goes back to normal after resize.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({root_surface_id, sid1});
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - scheduler_.SurfaceDamaged(root_surface_id);
|
| + SurfaceDamaged(root_surface_id);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| @@ -200,67 +242,75 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
|
| TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| - SurfaceId sid2(kArbitraryFrameSinkId,
|
| LocalSurfaceId(2, base::UnguessableToken::Create()));
|
| + SurfaceId sid2(kArbitraryFrameSinkId,
|
| + LocalSurfaceId(3, base::UnguessableToken::Create()));
|
|
|
| scheduler_.SetVisible(true);
|
|
|
| - // Set the root surface
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| - // Get scheduler to detect surface 1 as active by drawing
|
| - // two frames in a row with damage from surface 1.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| + // Set surface1 as active via SurfaceDamageExpected().
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
|
|
| // Damage only from surface 2 (inactive) does not trigger deadline early.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid2);
|
| + SurfaceDamaged(sid2);
|
| + EXPECT_TRUE(scheduler_.has_pending_surfaces());
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| // Damage from surface 1 triggers deadline early.
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| + EXPECT_FALSE(scheduler_.has_pending_surfaces());
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| - // Make both surface 1 and 2 active.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid2);
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| + // Set both surface 1 and 2 as active via SurfaceDamageExpected().
|
| + AdvanceTimeAndBeginFrameForTest({sid1, sid2});
|
|
|
| // Deadline doesn't trigger early until surface 1 and 2 are both damaged.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - scheduler_.SurfaceDamaged(sid2);
|
| + SurfaceDamaged(sid2);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| - // Make the system idle
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + // SurfaceDamage with |!has_damage| triggers early deadline.
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| + EXPECT_LT(now_src().NowTicks(),
|
| + scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| + BeginFrameAck ack = AckForCurrentBeginFrame();
|
| + ack.has_damage = false;
|
| + scheduler_.SurfaceDamaged(sid1, ack, false);
|
| + EXPECT_GE(now_src().NowTicks(),
|
| + scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| +
|
| + // System should be idle now.
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| + EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
|
| +
|
| + // SurfaceDamage with |!display_damaged| does not affect needs_draw and
|
| + // scheduler stays idle.
|
| + scheduler_.SurfaceDamaged(sid1, AckForCurrentBeginFrame(), false);
|
| EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
|
|
|
| // Deadline should trigger early if child surfaces are idle and
|
| // we get damage on the root surface.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + scheduler_.SurfaceDamageExpected(root_surface_id, last_begin_frame_args_);
|
| EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
|
| - scheduler_.SurfaceDamaged(root_surface_id);
|
| + SurfaceDamaged(root_surface_id);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| @@ -269,26 +319,28 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
|
| TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(2, base::UnguessableToken::Create()));
|
|
|
| scheduler_.SetVisible(true);
|
|
|
| - // Set the root surface
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers immediately on OutputSurfaceLost.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.OutputSurfaceLost();
|
| @@ -297,7 +349,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
|
|
|
| // Deadline does not DrawAndSwap after OutputSurfaceLost.
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
| }
|
| @@ -305,9 +357,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
|
| TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| - SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
|
|
| EXPECT_EQ(0u, fake_begin_frame_source_.num_observers());
|
| scheduler_.SetVisible(true);
|
| @@ -323,9 +373,9 @@ TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) {
|
| TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(2, base::UnguessableToken::Create()));
|
|
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| @@ -340,24 +390,27 @@ TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) {
|
| TEST_F(DisplaySchedulerTest, Visibility) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(2, base::UnguessableToken::Create()));
|
|
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| scheduler_.SetVisible(true);
|
| EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
|
|
|
| // DrawAndSwap normally.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| @@ -381,7 +434,7 @@ TEST_F(DisplaySchedulerTest, Visibility) {
|
| scheduler_.SetVisible(false);
|
|
|
| // Does not start listening for begin frames when damage arrives.
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_EQ(0u, fake_begin_frame_source_.num_observers());
|
|
|
| // But does when becoming visible with damage again.
|
| @@ -392,26 +445,28 @@ TEST_F(DisplaySchedulerTest, Visibility) {
|
| TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(2, base::UnguessableToken::Create()));
|
|
|
| scheduler_.SetVisible(true);
|
|
|
| - // Set the root surface
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| scheduler_.DisplayResized();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| // DisplayResized should trigger a swap to happen.
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(2, client_.draw_and_swap_count());
|
| @@ -420,46 +475,48 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
|
| TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(2, base::UnguessableToken::Create()));
|
| base::TimeTicks late_deadline;
|
|
|
| scheduler_.SetVisible(true);
|
|
|
| - // Set the root surface
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers late while root resources are locked.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1});
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SetRootSurfaceResourcesLocked(true);
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| // Deadline does not DrawAndSwap while root resources are locked.
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers normally when root resources are unlocked.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id});
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SetRootSurfaceResourcesLocked(false);
|
| - scheduler_.SurfaceDamaged(root_surface_id);
|
| + SurfaceDamaged(root_surface_id);
|
| EXPECT_EQ(base::TimeTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| @@ -471,56 +528,51 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
|
| TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
|
| SurfaceId root_surface_id(
|
| kArbitraryFrameSinkId,
|
| - LocalSurfaceId(0, base::UnguessableToken::Create()));
|
| + LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| SurfaceId sid1(kArbitraryFrameSinkId,
|
| - LocalSurfaceId(1, base::UnguessableToken::Create()));
|
| - SurfaceId sid2(kArbitraryFrameSinkId,
|
| LocalSurfaceId(2, base::UnguessableToken::Create()));
|
| + SurfaceId sid2(kArbitraryFrameSinkId,
|
| + LocalSurfaceId(3, base::UnguessableToken::Create()));
|
|
|
| scheduler_.SetVisible(true);
|
|
|
| - // Set the root surface
|
| + // Create surfaces and set the root surface.
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size()));
|
| + scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size()));
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| - // Get scheduler to detect surface 1 and 2 as active.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.SurfaceDamaged(sid2);
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.SurfaceDamaged(sid2);
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| + // Set surface 1 and 2 as active.
|
| + AdvanceTimeAndBeginFrameForTest({sid1, sid2});
|
|
|
| // DrawAndSwap normally.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| - EXPECT_EQ(2, client_.draw_and_swap_count());
|
| - scheduler_.SurfaceDamaged(sid1);
|
| - scheduler_.SurfaceDamaged(sid2);
|
| + EXPECT_EQ(0, client_.draw_and_swap_count());
|
| + SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid2);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - EXPECT_EQ(3, client_.draw_and_swap_count());
|
| + EXPECT_EQ(1, client_.draw_and_swap_count());
|
| scheduler_.DidSwapBuffers();
|
|
|
| // Deadline triggers late when swap throttled.
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid1, sid2});
|
| base::TimeTicks late_deadline =
|
| now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| // Damage surface 1, but not surface 2 so we avoid triggering deadline
|
| // early because all surfaces are ready.
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| // Don't draw and swap in deadline while swap throttled.
|
| - EXPECT_EQ(3, client_.draw_and_swap_count());
|
| + EXPECT_EQ(1, client_.draw_and_swap_count());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - EXPECT_EQ(3, client_.draw_and_swap_count());
|
| + EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers normally once not swap throttled.
|
| // Damage from previous BeginFrame should cary over, so don't damage again.
|
| scheduler_.DidReceiveSwapBuffersAck();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest({sid2});
|
| base::TimeTicks expected_deadline =
|
| scheduler_.LastUsedBeginFrameArgs().deadline -
|
| BeginFrameArgs::DefaultEstimatedParentDrawTime();
|
| @@ -528,13 +580,13 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| // Still waiting for surface 2. Once it updates, deadline should trigger
|
| // immediately again.
|
| - scheduler_.SurfaceDamaged(sid2);
|
| - EXPECT_EQ(scheduler_.DesiredBeginFrameDeadlineTimeForTest(),
|
| - base::TimeTicks());
|
| + SurfaceDamaged(sid2);
|
| + EXPECT_EQ(base::TimeTicks(),
|
| + scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| // Draw and swap now that we aren't throttled.
|
| - EXPECT_EQ(3, client_.draw_and_swap_count());
|
| + EXPECT_EQ(1, client_.draw_and_swap_count());
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - EXPECT_EQ(4, client_.draw_and_swap_count());
|
| + EXPECT_EQ(2, client_.draw_and_swap_count());
|
| }
|
|
|
| // This test verfies that we try to reschedule the deadline
|
| @@ -568,12 +620,12 @@ TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| scheduler_.BeginFrameDeadlineForTest();
|
| scheduler_.DidSwapBuffers();
|
| - AdvanceTimeAndBeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest(std::vector<SurfaceId>());
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| scheduler_.DidReceiveSwapBuffersAck();
|
| @@ -585,7 +637,7 @@ TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| - scheduler_.SurfaceDamaged(sid1);
|
| + SurfaceDamaged(sid1);
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| scheduler_.SetRootSurfaceResourcesLocked(true);
|
|
|