| Index: cc/CCSchedulerTest.cpp
|
| diff --git a/cc/CCSchedulerTest.cpp b/cc/CCSchedulerTest.cpp
|
| deleted file mode 100644
|
| index dc218b9fcc81bf1cce1a2286684115a23c0bf19c..0000000000000000000000000000000000000000
|
| --- a/cc/CCSchedulerTest.cpp
|
| +++ /dev/null
|
| @@ -1,471 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "CCScheduler.h"
|
| -
|
| -#include "CCSchedulerTestCommon.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include <wtf/OwnPtr.h>
|
| -
|
| -using namespace cc;
|
| -using namespace WebKitTests;
|
| -using namespace WTF;
|
| -
|
| -namespace {
|
| -
|
| -class FakeCCSchedulerClient : public CCSchedulerClient {
|
| -public:
|
| - FakeCCSchedulerClient() { reset(); }
|
| - void reset()
|
| - {
|
| - m_actions.clear();
|
| - m_drawWillHappen = true;
|
| - m_swapWillHappenIfDrawHappens = true;
|
| - m_numDraws = 0;
|
| - }
|
| -
|
| - int numDraws() const { return m_numDraws; }
|
| - int numActions() const { return static_cast<int>(m_actions.size()); }
|
| - const char* action(int i) const { return m_actions[i]; }
|
| -
|
| - bool hasAction(const char* action) const
|
| - {
|
| - for (size_t i = 0; i < m_actions.size(); i++)
|
| - if (!strcmp(m_actions[i], action))
|
| - return true;
|
| - return false;
|
| - }
|
| -
|
| - virtual void scheduledActionBeginFrame() OVERRIDE { m_actions.push_back("scheduledActionBeginFrame"); }
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE
|
| - {
|
| - m_actions.push_back("scheduledActionDrawAndSwapIfPossible");
|
| - m_numDraws++;
|
| - return CCScheduledActionDrawAndSwapResult(m_drawWillHappen, m_drawWillHappen && m_swapWillHappenIfDrawHappens);
|
| - }
|
| -
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE
|
| - {
|
| - m_actions.push_back("scheduledActionDrawAndSwapForced");
|
| - return CCScheduledActionDrawAndSwapResult(true, m_swapWillHappenIfDrawHappens);
|
| - }
|
| -
|
| - virtual void scheduledActionCommit() OVERRIDE { m_actions.push_back("scheduledActionCommit"); }
|
| - virtual void scheduledActionBeginContextRecreation() OVERRIDE { m_actions.push_back("scheduledActionBeginContextRecreation"); }
|
| - virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE { m_actions.push_back("scheduledActionAcquireLayerTexturesForMainThread"); }
|
| - virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { }
|
| -
|
| - void setDrawWillHappen(bool drawWillHappen) { m_drawWillHappen = drawWillHappen; }
|
| - void setSwapWillHappenIfDrawHappens(bool swapWillHappenIfDrawHappens) { m_swapWillHappenIfDrawHappens = swapWillHappenIfDrawHappens; }
|
| -
|
| -protected:
|
| - bool m_drawWillHappen;
|
| - bool m_swapWillHappenIfDrawHappens;
|
| - int m_numDraws;
|
| - std::vector<const char*> m_actions;
|
| -};
|
| -
|
| -TEST(CCSchedulerTest, RequestCommit)
|
| -{
|
| - FakeCCSchedulerClient client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - // SetNeedsCommit should begin the frame.
|
| - scheduler->setNeedsCommit();
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(0));
|
| - EXPECT_FALSE(timeSource->active());
|
| - client.reset();
|
| -
|
| - // beginFrameComplete should commit
|
| - scheduler->beginFrameComplete();
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionCommit", client.action(0));
|
| - EXPECT_TRUE(timeSource->active());
|
| - client.reset();
|
| -
|
| - // Tick should draw.
|
| - timeSource->tick();
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionDrawAndSwapIfPossible", client.action(0));
|
| - EXPECT_FALSE(timeSource->active());
|
| - client.reset();
|
| -
|
| - // Timer should be off.
|
| - EXPECT_FALSE(timeSource->active());
|
| -}
|
| -
|
| -TEST(CCSchedulerTest, RequestCommitAfterBeginFrame)
|
| -{
|
| - FakeCCSchedulerClient client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - // SetNedsCommit should begin the frame.
|
| - scheduler->setNeedsCommit();
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(0));
|
| - client.reset();
|
| -
|
| - // Now setNeedsCommit again. Calling here means we need a second frame.
|
| - scheduler->setNeedsCommit();
|
| -
|
| - // Since, another commit is needed, beginFrameComplete should commit,
|
| - // then begin another frame.
|
| - scheduler->beginFrameComplete();
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionCommit", client.action(0));
|
| - client.reset();
|
| -
|
| - // Tick should draw but then begin another frame.
|
| - timeSource->tick();
|
| - EXPECT_FALSE(timeSource->active());
|
| - EXPECT_EQ(2, client.numActions());
|
| - EXPECT_STREQ("scheduledActionDrawAndSwapIfPossible", client.action(0));
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(1));
|
| - client.reset();
|
| -}
|
| -
|
| -TEST(CCSchedulerTest, TextureAcquisitionCollision)
|
| -{
|
| - FakeCCSchedulerClient client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - scheduler->setNeedsCommit();
|
| - scheduler->setMainThreadNeedsLayerTextures();
|
| - EXPECT_EQ(2, client.numActions());
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(0));
|
| - EXPECT_STREQ("scheduledActionAcquireLayerTexturesForMainThread", client.action(1));
|
| - client.reset();
|
| -
|
| - // Compositor not scheduled to draw because textures are locked by main thread
|
| - EXPECT_FALSE(timeSource->active());
|
| -
|
| - // Trigger the commit
|
| - scheduler->beginFrameComplete();
|
| - EXPECT_TRUE(timeSource->active());
|
| - client.reset();
|
| -
|
| - // Between commit and draw, texture acquisition for main thread delayed,
|
| - // and main thread blocks.
|
| - scheduler->setMainThreadNeedsLayerTextures();
|
| - EXPECT_EQ(0, client.numActions());
|
| - client.reset();
|
| -
|
| - // Once compositor draw complete, the delayed texture acquisition fires.
|
| - timeSource->tick();
|
| - EXPECT_EQ(3, client.numActions());
|
| - EXPECT_STREQ("scheduledActionDrawAndSwapIfPossible", client.action(0));
|
| - EXPECT_STREQ("scheduledActionAcquireLayerTexturesForMainThread", client.action(1));
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(2));
|
| - client.reset();
|
| -}
|
| -
|
| -TEST(CCSchedulerTest, VisibilitySwitchWithTextureAcquisition)
|
| -{
|
| - FakeCCSchedulerClient client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - scheduler->setNeedsCommit();
|
| - scheduler->beginFrameComplete();
|
| - scheduler->setMainThreadNeedsLayerTextures();
|
| - client.reset();
|
| - // Verify that pending texture acquisition fires when visibility
|
| - // is lost in order to avoid a deadlock.
|
| - scheduler->setVisible(false);
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionAcquireLayerTexturesForMainThread", client.action(0));
|
| - client.reset();
|
| -
|
| - // Regaining visibility with textures acquired by main thread while
|
| - // compositor is waiting for first draw should result in a request
|
| - // for a new frame in order to escape a deadlock.
|
| - scheduler->setVisible(true);
|
| - EXPECT_EQ(1, client.numActions());
|
| - EXPECT_STREQ("scheduledActionBeginFrame", client.action(0));
|
| - client.reset();
|
| -}
|
| -
|
| -class SchedulerClientThatSetNeedsDrawInsideDraw : public FakeCCSchedulerClient {
|
| -public:
|
| - SchedulerClientThatSetNeedsDrawInsideDraw()
|
| - : m_scheduler(0) { }
|
| -
|
| - void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; }
|
| -
|
| - virtual void scheduledActionBeginFrame() OVERRIDE { }
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE
|
| - {
|
| - // Only setNeedsRedraw the first time this is called
|
| - if (!m_numDraws)
|
| - m_scheduler->setNeedsRedraw();
|
| - return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible();
|
| - }
|
| -
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE
|
| - {
|
| - ASSERT_NOT_REACHED();
|
| - return CCScheduledActionDrawAndSwapResult(true, true);
|
| - }
|
| -
|
| - virtual void scheduledActionCommit() OVERRIDE { }
|
| - virtual void scheduledActionBeginContextRecreation() OVERRIDE { }
|
| - virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { }
|
| -
|
| -protected:
|
| - CCScheduler* m_scheduler;
|
| -};
|
| -
|
| -// Tests for two different situations:
|
| -// 1. the scheduler dropping setNeedsRedraw requests that happen inside
|
| -// a scheduledActionDrawAndSwap
|
| -// 2. the scheduler drawing twice inside a single tick
|
| -TEST(CCSchedulerTest, RequestRedrawInsideDraw)
|
| -{
|
| - SchedulerClientThatSetNeedsDrawInsideDraw client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - client.setScheduler(scheduler.get());
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| - EXPECT_EQ(0, client.numDraws());
|
| -
|
| - timeSource->tick();
|
| - EXPECT_EQ(1, client.numDraws());
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - timeSource->tick();
|
| - EXPECT_EQ(2, client.numDraws());
|
| - EXPECT_FALSE(scheduler->redrawPending());
|
| - EXPECT_FALSE(timeSource->active());
|
| -}
|
| -
|
| -// Test that requesting redraw inside a failed draw doesn't lose the request.
|
| -TEST(CCSchedulerTest, RequestRedrawInsideFailedDraw)
|
| -{
|
| - SchedulerClientThatSetNeedsDrawInsideDraw client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - client.setScheduler(scheduler.get());
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| - client.setDrawWillHappen(false);
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| - EXPECT_EQ(0, client.numDraws());
|
| -
|
| - // Fail the draw.
|
| - timeSource->tick();
|
| - EXPECT_EQ(1, client.numDraws());
|
| -
|
| - // We have a commit pending and the draw failed, and we didn't lose the redraw request.
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - // Fail the draw again.
|
| - timeSource->tick();
|
| - EXPECT_EQ(2, client.numDraws());
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - // Draw successfully.
|
| - client.setDrawWillHappen(true);
|
| - timeSource->tick();
|
| - EXPECT_EQ(3, client.numDraws());
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_FALSE(scheduler->redrawPending());
|
| - EXPECT_FALSE(timeSource->active());
|
| -}
|
| -
|
| -class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeCCSchedulerClient {
|
| -public:
|
| - SchedulerClientThatSetNeedsCommitInsideDraw()
|
| - : m_scheduler(0) { }
|
| -
|
| - void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; }
|
| -
|
| - virtual void scheduledActionBeginFrame() OVERRIDE { }
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE
|
| - {
|
| - // Only setNeedsCommit the first time this is called
|
| - if (!m_numDraws)
|
| - m_scheduler->setNeedsCommit();
|
| - return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible();
|
| - }
|
| -
|
| - virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE
|
| - {
|
| - ASSERT_NOT_REACHED();
|
| - return CCScheduledActionDrawAndSwapResult(true, true);
|
| - }
|
| -
|
| - virtual void scheduledActionCommit() OVERRIDE { }
|
| - virtual void scheduledActionBeginContextRecreation() OVERRIDE { }
|
| - virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { }
|
| -
|
| -protected:
|
| - CCScheduler* m_scheduler;
|
| -};
|
| -
|
| -// Tests for the scheduler infinite-looping on setNeedsCommit requests that
|
| -// happen inside a scheduledActionDrawAndSwap
|
| -TEST(CCSchedulerTest, RequestCommitInsideDraw)
|
| -{
|
| - SchedulerClientThatSetNeedsCommitInsideDraw client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - client.setScheduler(scheduler.get());
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_EQ(0, client.numDraws());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - timeSource->tick();
|
| - EXPECT_FALSE(timeSource->active());
|
| - EXPECT_EQ(1, client.numDraws());
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - scheduler->beginFrameComplete();
|
| -
|
| - timeSource->tick();
|
| - EXPECT_EQ(2, client.numDraws());
|
| - EXPECT_FALSE(timeSource->active());
|
| - EXPECT_FALSE(scheduler->redrawPending());
|
| -}
|
| -
|
| -// Tests that when a draw fails then the pending commit should not be dropped.
|
| -TEST(CCSchedulerTest, RequestCommitInsideFailedDraw)
|
| -{
|
| - SchedulerClientThatSetNeedsDrawInsideDraw client;
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, make_scoped_ptr(new CCFrameRateController(timeSource)));
|
| - client.setScheduler(scheduler.get());
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| - client.setDrawWillHappen(false);
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| - EXPECT_EQ(0, client.numDraws());
|
| -
|
| - // Fail the draw.
|
| - timeSource->tick();
|
| - EXPECT_EQ(1, client.numDraws());
|
| -
|
| - // We have a commit pending and the draw failed, and we didn't lose the commit request.
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - // Fail the draw again.
|
| - timeSource->tick();
|
| - EXPECT_EQ(2, client.numDraws());
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - // Draw successfully.
|
| - client.setDrawWillHappen(true);
|
| - timeSource->tick();
|
| - EXPECT_EQ(3, client.numDraws());
|
| - EXPECT_TRUE(scheduler->commitPending());
|
| - EXPECT_FALSE(scheduler->redrawPending());
|
| - EXPECT_FALSE(timeSource->active());
|
| -}
|
| -
|
| -TEST(CCSchedulerTest, NoBeginFrameWhenDrawFails)
|
| -{
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - SchedulerClientThatSetNeedsCommitInsideDraw client;
|
| - scoped_ptr<FakeCCFrameRateController> controller(new FakeCCFrameRateController(timeSource));
|
| - FakeCCFrameRateController* controllerPtr = controller.get();
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, controller.PassAs<CCFrameRateController>());
|
| - client.setScheduler(scheduler.get());
|
| - scheduler->setCanBeginFrame(true);
|
| - scheduler->setVisible(true);
|
| - scheduler->setCanDraw(true);
|
| -
|
| - EXPECT_EQ(0, controllerPtr->numFramesPending());
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| - EXPECT_EQ(0, client.numDraws());
|
| -
|
| - // Draw successfully, this starts a new frame.
|
| - timeSource->tick();
|
| - EXPECT_EQ(1, client.numDraws());
|
| - EXPECT_EQ(1, controllerPtr->numFramesPending());
|
| - scheduler->didSwapBuffersComplete();
|
| - EXPECT_EQ(0, controllerPtr->numFramesPending());
|
| -
|
| - scheduler->setNeedsRedraw();
|
| - EXPECT_TRUE(scheduler->redrawPending());
|
| - EXPECT_TRUE(timeSource->active());
|
| -
|
| - // Fail to draw, this should not start a frame.
|
| - client.setDrawWillHappen(false);
|
| - timeSource->tick();
|
| - EXPECT_EQ(2, client.numDraws());
|
| - EXPECT_EQ(0, controllerPtr->numFramesPending());
|
| -}
|
| -
|
| -TEST(CCSchedulerTest, NoBeginFrameWhenSwapFailsDuringForcedCommit)
|
| -{
|
| - RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource());
|
| - FakeCCSchedulerClient client;
|
| - scoped_ptr<FakeCCFrameRateController> controller(new FakeCCFrameRateController(timeSource));
|
| - FakeCCFrameRateController* controllerPtr = controller.get();
|
| - OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, controller.PassAs<CCFrameRateController>());
|
| -
|
| - EXPECT_EQ(0, controllerPtr->numFramesPending());
|
| -
|
| - // Tell the client that it will fail to swap.
|
| - client.setDrawWillHappen(true);
|
| - client.setSwapWillHappenIfDrawHappens(false);
|
| -
|
| - // Get the compositor to do a scheduledActionDrawAndSwapForced.
|
| - scheduler->setNeedsRedraw();
|
| - scheduler->setNeedsForcedRedraw();
|
| - EXPECT_TRUE(client.hasAction("scheduledActionDrawAndSwapForced"));
|
| -
|
| - // We should not have told the frame rate controller that we began a frame.
|
| - EXPECT_EQ(0, controllerPtr->numFramesPending());
|
| -}
|
| -
|
| -}
|
|
|