| Index: cc/CCLayerTreeHostTest.cpp
|
| diff --git a/cc/CCLayerTreeHostTest.cpp b/cc/CCLayerTreeHostTest.cpp
|
| deleted file mode 100644
|
| index c8e7ed0a03e312eaab28db0d3b06f284c58cd32b..0000000000000000000000000000000000000000
|
| --- a/cc/CCLayerTreeHostTest.cpp
|
| +++ /dev/null
|
| @@ -1,3003 +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 "CCLayerTreeHost.h"
|
| -
|
| -#include "CCGeometryTestUtils.h"
|
| -#include "CCGraphicsContext.h"
|
| -#include "CCLayerTreeHostImpl.h"
|
| -#include "CCOcclusionTrackerTestCommon.h"
|
| -#include "CCSettings.h"
|
| -#include "CCSingleThreadProxy.h"
|
| -#include "CCTextureUpdateQueue.h"
|
| -#include "CCThreadedTest.h"
|
| -#include "CCTimingFunction.h"
|
| -#include "ContentLayerChromium.h"
|
| -#include "ContentLayerChromiumClient.h"
|
| -#include "Extensions3DChromium.h"
|
| -#include "FakeWebCompositorOutputSurface.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include <public/Platform.h>
|
| -#include <public/WebLayerScrollClient.h>
|
| -#include <public/WebSize.h>
|
| -#include <wtf/OwnArrayPtr.h>
|
| -
|
| -using namespace cc;
|
| -using namespace WebKit;
|
| -using namespace WebKitTests;
|
| -
|
| -namespace {
|
| -
|
| -class CCLayerTreeHostTest : public CCThreadedTest { };
|
| -
|
| -// Shortlived layerTreeHosts shouldn't die.
|
| -class CCLayerTreeHostTestShortlived1 : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestShortlived1() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -// Shortlived layerTreeHosts shouldn't die with a commit in flight.
|
| -class CCLayerTreeHostTestShortlived2 : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestShortlived2() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| -
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestShortlived2)
|
| -
|
| -// Shortlived layerTreeHosts shouldn't die with a redraw in flight.
|
| -class CCLayerTreeHostTestShortlived3 : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestShortlived3() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsRedrawToMainThread();
|
| -
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestShortlived3)
|
| -
|
| -// Test interleaving of redraws and commits
|
| -class CCLayerTreeHostTestCommitingWithContinuousRedraw : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestCommitingWithContinuousRedraw()
|
| - : m_numCompleteCommits(0)
|
| - , m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - m_numCompleteCommits++;
|
| - if (m_numCompleteCommits == 2)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - if (m_numDraws == 1)
|
| - postSetNeedsCommitToMainThread();
|
| - m_numDraws++;
|
| - postSetNeedsRedrawToMainThread();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numCompleteCommits;
|
| - int m_numDraws;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestCommitingWithContinuousRedraw, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1
|
| -// draw with frame 0.
|
| -class CCLayerTreeHostTestSetNeedsCommit1 : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetNeedsCommit1()
|
| - : m_numCommits(0)
|
| - , m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_numDraws++;
|
| - if (!impl->sourceFrameNumber())
|
| - endTest();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_GE(1, m_numCommits);
|
| - EXPECT_GE(1, m_numDraws);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| - int m_numDraws;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetNeedsCommit1, DISABLED_runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// A setNeedsCommit should lead to 1 commit. Issuing a second commit after that
|
| -// first committed frame draws should lead to another commit.
|
| -class CCLayerTreeHostTestSetNeedsCommit2 : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetNeedsCommit2()
|
| - : m_numCommits(0)
|
| - , m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - if (!impl->sourceFrameNumber())
|
| - postSetNeedsCommitToMainThread();
|
| - else if (impl->sourceFrameNumber() == 1)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(2, m_numCommits);
|
| - EXPECT_GE(2, m_numDraws);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| - int m_numDraws;
|
| -};
|
| -
|
| -#if OS(WINDOWS)
|
| -// http://webkit.org/b/74623
|
| -TEST_F(CCLayerTreeHostTestSetNeedsCommit2, FLAKY_runMultiThread)
|
| -#else
|
| -TEST_F(CCLayerTreeHostTestSetNeedsCommit2, runMultiThread)
|
| -#endif
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// 1 setNeedsRedraw after the first commit has completed should lead to 1
|
| -// additional draw.
|
| -class CCLayerTreeHostTestSetNeedsRedraw : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetNeedsRedraw()
|
| - : m_numCommits(0)
|
| - , m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - EXPECT_EQ(0, impl->sourceFrameNumber());
|
| - if (!m_numDraws)
|
| - postSetNeedsRedrawToMainThread(); // Redraw again to verify that the second redraw doesn't commit.
|
| - else
|
| - endTest();
|
| - m_numDraws++;
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - EXPECT_EQ(0, m_numDraws);
|
| - m_numCommits++;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_GE(2, m_numDraws);
|
| - EXPECT_EQ(1, m_numCommits);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| - int m_numDraws;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetNeedsRedraw, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// If the layerTreeHost says it can't draw, then we should not try to draw.
|
| -class CCLayerTreeHostTestCanDrawBlocksDrawing : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestCanDrawBlocksDrawing()
|
| - : m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - // Only the initial draw should bring us here.
|
| - EXPECT_TRUE(impl->canDraw());
|
| - EXPECT_EQ(0, impl->sourceFrameNumber());
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - if (m_numCommits >= 1) {
|
| - // After the first commit, we should not be able to draw.
|
| - EXPECT_FALSE(impl->canDraw());
|
| - }
|
| - }
|
| -
|
| - virtual void didCommit() OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - if (m_numCommits == 1) {
|
| - // Make the viewport empty so the host says it can't draw.
|
| - m_layerTreeHost->setViewportSize(IntSize(0, 0), IntSize(0, 0));
|
| -
|
| - OwnArrayPtr<char> pixels(adoptArrayPtr(new char[4]));
|
| - m_layerTreeHost->compositeAndReadback(static_cast<void*>(pixels.get()), IntRect(0, 0, 1, 1));
|
| - } else if (m_numCommits == 2) {
|
| - m_layerTreeHost->setNeedsRedraw();
|
| - m_layerTreeHost->setNeedsCommit();
|
| - } else
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestCanDrawBlocksDrawing)
|
| -
|
| -// beginLayerWrite should prevent draws from executing until a commit occurs
|
| -class CCLayerTreeHostTestWriteLayersRedraw : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestWriteLayersRedraw()
|
| - : m_numCommits(0)
|
| - , m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAcquireLayerTextures();
|
| - postSetNeedsRedrawToMainThread(); // should be inhibited without blocking
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_numDraws++;
|
| - EXPECT_EQ(m_numDraws, m_numCommits);
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(1, m_numCommits);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| - int m_numDraws;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestWriteLayersRedraw, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Verify that when resuming visibility, requesting layer write permission
|
| -// will not deadlock the main thread even though there are not yet any
|
| -// scheduled redraws. This behavior is critical for reliably surviving tab
|
| -// switching. There are no failure conditions to this test, it just passes
|
| -// by not timing out.
|
| -class CCLayerTreeHostTestWriteLayersAfterVisible : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestWriteLayersAfterVisible()
|
| - : m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - if (m_numCommits == 2)
|
| - endTest();
|
| - else {
|
| - postSetVisibleToMainThread(false);
|
| - postSetVisibleToMainThread(true);
|
| - postAcquireLayerTextures();
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestWriteLayersAfterVisible, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// A compositeAndReadback while invisible should force a normal commit without assertion.
|
| -class CCLayerTreeHostTestCompositeAndReadbackWhileInvisible : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestCompositeAndReadbackWhileInvisible()
|
| - : m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - m_numCommits++;
|
| - if (m_numCommits == 1) {
|
| - m_layerTreeHost->setVisible(false);
|
| - m_layerTreeHost->setNeedsCommit();
|
| - m_layerTreeHost->setNeedsCommit();
|
| - OwnArrayPtr<char> pixels(adoptArrayPtr(new char[4]));
|
| - m_layerTreeHost->compositeAndReadback(static_cast<void*>(pixels.get()), IntRect(0, 0, 1, 1));
|
| - } else
|
| - endTest();
|
| -
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestCompositeAndReadbackWhileInvisible, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestAbortFrameWhenInvisible : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAbortFrameWhenInvisible()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - // Request a commit (from the main thread), which will trigger the commit flow from the impl side.
|
| - m_layerTreeHost->setNeedsCommit();
|
| - // Then mark ourselves as not visible before processing any more messages on the main thread.
|
| - m_layerTreeHost->setVisible(false);
|
| - // If we make it without kicking a frame, we pass!
|
| - endTestAfterDelay(1);
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - ASSERT_FALSE(true);
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestAbortFrameWhenInvisible, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Makes sure that setNedsAnimate does not cause the commitRequested() state to be set.
|
| -class CCLayerTreeHostTestSetNeedsAnimateShouldNotSetCommitRequested : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetNeedsAnimateShouldNotSetCommitRequested()
|
| - : m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - // The tests start up with a commit pending because we give them a root layer.
|
| - // We need to wait for the commit to happen before doing anything.
|
| - EXPECT_TRUE(m_layerTreeHost->commitRequested());
|
| - }
|
| -
|
| - virtual void animate(double monotonicTime) OVERRIDE
|
| - {
|
| - // We skip the first commit becasue its the commit that populates the
|
| - // impl thread with a tree.
|
| - if (!m_numCommits)
|
| - return;
|
| -
|
| - m_layerTreeHost->setNeedsAnimate();
|
| - // Right now, commitRequested is going to be true, because during
|
| - // beginFrame, we force commitRequested to true to prevent requests from
|
| - // hitting the impl thread. But, when the next didCommit happens, we should
|
| - // verify that commitRequested has gone back to false.
|
| - }
|
| - virtual void didCommit() OVERRIDE
|
| - {
|
| - if (!m_numCommits) {
|
| - EXPECT_FALSE(m_layerTreeHost->commitRequested());
|
| - m_layerTreeHost->setNeedsAnimate();
|
| - EXPECT_FALSE(m_layerTreeHost->commitRequested());
|
| - m_numCommits++;
|
| - }
|
| -
|
| - // Verifies that the setNeedsAnimate we made in ::animate did not
|
| - // trigger commitRequested.
|
| - EXPECT_FALSE(m_layerTreeHost->commitRequested());
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numCommits;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetNeedsAnimateShouldNotSetCommitRequested, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -
|
| -
|
| -// Trigger a frame with setNeedsCommit. Then, inside the resulting animate
|
| -// callback, requet another frame using setNeedsAnimate. End the test when
|
| -// animate gets called yet-again, indicating that the proxy is correctly
|
| -// handling the case where setNeedsAnimate() is called inside the begin frame
|
| -// flow.
|
| -class CCLayerTreeHostTestSetNeedsAnimateInsideAnimationCallback : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetNeedsAnimateInsideAnimationCallback()
|
| - : m_numAnimates(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsAnimateToMainThread();
|
| - }
|
| -
|
| - virtual void animate(double) OVERRIDE
|
| - {
|
| - if (!m_numAnimates) {
|
| - m_layerTreeHost->setNeedsAnimate();
|
| - m_numAnimates++;
|
| - return;
|
| - }
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numAnimates;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetNeedsAnimateInsideAnimationCallback, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Add a layer animation and confirm that CCLayerTreeHostImpl::animateLayers does get
|
| -// called and continues to get called.
|
| -class CCLayerTreeHostTestAddAnimation : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAddAnimation()
|
| - : m_numAnimates(0)
|
| - , m_receivedAnimationStartedNotification(false)
|
| - , m_startTime(0)
|
| - , m_firstMonotonicTime(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddInstantAnimationToMainThread();
|
| - }
|
| -
|
| - virtual void animateLayers(CCLayerTreeHostImpl* layerTreeHostImpl, double monotonicTime) OVERRIDE
|
| - {
|
| - if (!m_numAnimates) {
|
| - // The animation had zero duration so layerTreeHostImpl should no
|
| - // longer need to animate its layers.
|
| - EXPECT_FALSE(layerTreeHostImpl->needsAnimateLayers());
|
| - m_numAnimates++;
|
| - m_firstMonotonicTime = monotonicTime;
|
| - return;
|
| - }
|
| - EXPECT_LT(0, m_startTime);
|
| - EXPECT_LT(0, m_firstMonotonicTime);
|
| - EXPECT_NE(m_startTime, m_firstMonotonicTime);
|
| - EXPECT_TRUE(m_receivedAnimationStartedNotification);
|
| - endTest();
|
| - }
|
| -
|
| - virtual void notifyAnimationStarted(double wallClockTime) OVERRIDE
|
| - {
|
| - m_receivedAnimationStartedNotification = true;
|
| - m_startTime = wallClockTime;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numAnimates;
|
| - bool m_receivedAnimationStartedNotification;
|
| - double m_startTime;
|
| - double m_firstMonotonicTime;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestAddAnimation, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Add a layer animation to a layer, but continually fail to draw. Confirm that after
|
| -// a while, we do eventually force a draw.
|
| -class CCLayerTreeHostTestCheckerboardDoesNotStarveDraws : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestCheckerboardDoesNotStarveDraws()
|
| - : m_startedAnimating(false)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddAnimationToMainThread();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void animateLayers(CCLayerTreeHostImpl* layerTreeHostImpl, double monotonicTime) OVERRIDE
|
| - {
|
| - m_startedAnimating = true;
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - if (m_startedAnimating)
|
| - endTest();
|
| - }
|
| -
|
| - virtual bool prepareToDrawOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - return false;
|
| - }
|
| -
|
| -private:
|
| - bool m_startedAnimating;
|
| -};
|
| -
|
| -// Starvation can only be an issue with the MT compositor.
|
| -TEST_F(CCLayerTreeHostTestCheckerboardDoesNotStarveDraws, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Ensures that animations continue to be ticked when we are backgrounded.
|
| -class CCLayerTreeHostTestTickAnimationWhileBackgrounded : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestTickAnimationWhileBackgrounded()
|
| - : m_numAnimates(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddAnimationToMainThread();
|
| - }
|
| -
|
| - // Use willAnimateLayers to set visible false before the animation runs and
|
| - // causes a commit, so we block the second visible animate in single-thread
|
| - // mode.
|
| - virtual void willAnimateLayers(CCLayerTreeHostImpl* layerTreeHostImpl, double monotonicTime) OVERRIDE
|
| - {
|
| - if (m_numAnimates < 2) {
|
| - if (!m_numAnimates) {
|
| - // We have a long animation running. It should continue to tick even if we are not visible.
|
| - postSetVisibleToMainThread(false);
|
| - }
|
| - m_numAnimates++;
|
| - return;
|
| - }
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - int m_numAnimates;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestTickAnimationWhileBackgrounded)
|
| -
|
| -// Ensures that animations continue to be ticked when we are backgrounded.
|
| -class CCLayerTreeHostTestAddAnimationWithTimingFunction : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAddAnimationWithTimingFunction()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddAnimationToMainThread();
|
| - }
|
| -
|
| - virtual void animateLayers(CCLayerTreeHostImpl* layerTreeHostImpl, double monotonicTime) OVERRIDE
|
| - {
|
| - const CCActiveAnimation* animation = m_layerTreeHost->rootLayer()->layerAnimationController()->getActiveAnimation(0, CCActiveAnimation::Opacity);
|
| - if (!animation)
|
| - return;
|
| - const CCFloatAnimationCurve* curve = animation->curve()->toFloatAnimationCurve();
|
| - float startOpacity = curve->getValue(0);
|
| - float endOpacity = curve->getValue(curve->duration());
|
| - float linearlyInterpolatedOpacity = 0.25 * endOpacity + 0.75 * startOpacity;
|
| - double time = curve->duration() * 0.25;
|
| - // If the linear timing function associated with this animation was not picked up,
|
| - // then the linearly interpolated opacity would be different because of the
|
| - // default ease timing function.
|
| - EXPECT_FLOAT_EQ(linearlyInterpolatedOpacity, curve->getValue(time));
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestAddAnimationWithTimingFunction)
|
| -
|
| -// Ensures that when opacity is being animated, this value does not cause the subtree to be skipped.
|
| -class CCLayerTreeHostTestDoNotSkipLayersWithAnimatedOpacity : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestDoNotSkipLayersWithAnimatedOpacity()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setDrawOpacity(1);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - m_layerTreeHost->rootLayer()->setOpacity(0);
|
| - postAddAnimationToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - // If the subtree was skipped when preparing to draw, the layer's draw opacity
|
| - // will not have been updated. It should be set to 0 due to the animation.
|
| - // Without the animation, the layer will be skipped since it has zero opacity.
|
| - EXPECT_EQ(0, m_layerTreeHost->rootLayer()->drawOpacity());
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -#if OS(WINDOWS)
|
| -// http://webkit.org/b/74623
|
| -TEST_F(CCLayerTreeHostTestDoNotSkipLayersWithAnimatedOpacity, FLAKY_runMultiThread)
|
| -#else
|
| -TEST_F(CCLayerTreeHostTestDoNotSkipLayersWithAnimatedOpacity, runMultiThread)
|
| -#endif
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Ensures that main thread animations have their start times synchronized with impl thread animations.
|
| -class CCLayerTreeHostTestSynchronizeAnimationStartTimes : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSynchronizeAnimationStartTimes()
|
| - : m_layerTreeHostImpl(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddAnimationToMainThread();
|
| - }
|
| -
|
| - // This is guaranteed to be called before CCLayerTreeHostImpl::animateLayers.
|
| - virtual void willAnimateLayers(CCLayerTreeHostImpl* layerTreeHostImpl, double monotonicTime) OVERRIDE
|
| - {
|
| - m_layerTreeHostImpl = layerTreeHostImpl;
|
| - }
|
| -
|
| - virtual void notifyAnimationStarted(double time) OVERRIDE
|
| - {
|
| - EXPECT_TRUE(m_layerTreeHostImpl);
|
| -
|
| - CCLayerAnimationController* controllerImpl = m_layerTreeHostImpl->rootLayer()->layerAnimationController();
|
| - CCLayerAnimationController* controller = m_layerTreeHost->rootLayer()->layerAnimationController();
|
| - CCActiveAnimation* animationImpl = controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity);
|
| - CCActiveAnimation* animation = controller->getActiveAnimation(0, CCActiveAnimation::Opacity);
|
| -
|
| - EXPECT_EQ(animationImpl->startTime(), animation->startTime());
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - CCLayerTreeHostImpl* m_layerTreeHostImpl;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestSynchronizeAnimationStartTimes)
|
| -
|
| -// Ensures that main thread animations have their start times synchronized with impl thread animations.
|
| -class CCLayerTreeHostTestAnimationFinishedEvents : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAnimationFinishedEvents()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postAddInstantAnimationToMainThread();
|
| - }
|
| -
|
| - virtual void notifyAnimationFinished(double time) OVERRIDE
|
| - {
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestAnimationFinishedEvents)
|
| -
|
| -class CCLayerTreeHostTestScrollSimple : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestScrollSimple()
|
| - : m_initialScroll(IntPoint(10, 20))
|
| - , m_secondScroll(IntPoint(40, 5))
|
| - , m_scrollAmount(2, -1)
|
| - , m_scrolls(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setScrollable(true);
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(m_initialScroll);
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - LayerChromium* root = m_layerTreeHost->rootLayer();
|
| - if (!m_layerTreeHost->commitNumber())
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll);
|
| - else {
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll + m_scrollAmount);
|
| -
|
| - // Pretend like Javascript updated the scroll position itself.
|
| - root->setScrollPosition(m_secondScroll);
|
| - }
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CCLayerImpl* root = impl->rootLayer();
|
| - EXPECT_EQ(root->scrollDelta(), IntSize());
|
| -
|
| - root->setScrollable(true);
|
| - root->setMaxScrollPosition(IntSize(100, 100));
|
| - root->scrollBy(m_scrollAmount);
|
| -
|
| - if (!impl->sourceFrameNumber()) {
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll);
|
| - EXPECT_EQ(root->scrollDelta(), m_scrollAmount);
|
| - postSetNeedsCommitToMainThread();
|
| - } else if (impl->sourceFrameNumber() == 1) {
|
| - EXPECT_EQ(root->scrollPosition(), m_secondScroll);
|
| - EXPECT_EQ(root->scrollDelta(), m_scrollAmount);
|
| - endTest();
|
| - }
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float scale) OVERRIDE
|
| - {
|
| - IntPoint position = m_layerTreeHost->rootLayer()->scrollPosition();
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(position + scrollDelta);
|
| - m_scrolls++;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(1, m_scrolls);
|
| - }
|
| -private:
|
| - IntPoint m_initialScroll;
|
| - IntPoint m_secondScroll;
|
| - IntSize m_scrollAmount;
|
| - int m_scrolls;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestScrollSimple, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestScrollMultipleRedraw : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestScrollMultipleRedraw()
|
| - : m_initialScroll(IntPoint(40, 10))
|
| - , m_scrollAmount(-3, 17)
|
| - , m_scrolls(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setScrollable(true);
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(m_initialScroll);
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void beginCommitOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - LayerChromium* root = m_layerTreeHost->rootLayer();
|
| - if (!m_layerTreeHost->commitNumber())
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll);
|
| - else if (m_layerTreeHost->commitNumber() == 1)
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll + m_scrollAmount + m_scrollAmount);
|
| - else if (m_layerTreeHost->commitNumber() == 2)
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll + m_scrollAmount + m_scrollAmount);
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CCLayerImpl* root = impl->rootLayer();
|
| - root->setScrollable(true);
|
| - root->setMaxScrollPosition(IntSize(100, 100));
|
| -
|
| - if (!impl->sourceFrameNumber() && impl->sourceAnimationFrameNumber() == 1) {
|
| - // First draw after first commit.
|
| - EXPECT_EQ(root->scrollDelta(), IntSize());
|
| - root->scrollBy(m_scrollAmount);
|
| - EXPECT_EQ(root->scrollDelta(), m_scrollAmount);
|
| -
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll);
|
| - postSetNeedsRedrawToMainThread();
|
| - } else if (!impl->sourceFrameNumber() && impl->sourceAnimationFrameNumber() == 2) {
|
| - // Second draw after first commit.
|
| - EXPECT_EQ(root->scrollDelta(), m_scrollAmount);
|
| - root->scrollBy(m_scrollAmount);
|
| - EXPECT_EQ(root->scrollDelta(), m_scrollAmount + m_scrollAmount);
|
| -
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll);
|
| - postSetNeedsCommitToMainThread();
|
| - } else if (impl->sourceFrameNumber() == 1) {
|
| - // Third or later draw after second commit.
|
| - EXPECT_GE(impl->sourceAnimationFrameNumber(), 3);
|
| - EXPECT_EQ(root->scrollDelta(), IntSize());
|
| - EXPECT_EQ(root->scrollPosition(), m_initialScroll + m_scrollAmount + m_scrollAmount);
|
| - endTest();
|
| - }
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float scale) OVERRIDE
|
| - {
|
| - IntPoint position = m_layerTreeHost->rootLayer()->scrollPosition();
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(position + scrollDelta);
|
| - m_scrolls++;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(1, m_scrolls);
|
| - }
|
| -private:
|
| - IntPoint m_initialScroll;
|
| - IntSize m_scrollAmount;
|
| - int m_scrolls;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestScrollMultipleRedraw, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// This test verifies that properties on the layer tree host are commited to the impl side.
|
| -class CCLayerTreeHostTestCommit : public CCLayerTreeHostTest {
|
| -public:
|
| -
|
| - CCLayerTreeHostTestCommit() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(20, 20), IntSize(20, 20));
|
| - m_layerTreeHost->setBackgroundColor(SK_ColorGRAY);
|
| - m_layerTreeHost->setPageScaleFactorAndLimits(5, 5, 5);
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - EXPECT_EQ(IntSize(20, 20), impl->layoutViewportSize());
|
| - EXPECT_EQ(SK_ColorGRAY, impl->backgroundColor());
|
| - EXPECT_EQ(5, impl->pageScaleFactor());
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE { }
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestCommit, runTest)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Verifies that startPageScaleAnimation events propagate correctly from CCLayerTreeHost to
|
| -// CCLayerTreeHostImpl in the MT compositor.
|
| -class CCLayerTreeHostTestStartPageScaleAnimation : public CCLayerTreeHostTest {
|
| -public:
|
| -
|
| - CCLayerTreeHostTestStartPageScaleAnimation()
|
| - : m_animationRequested(false)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setScrollable(true);
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(IntPoint());
|
| - postSetNeedsRedrawToMainThread();
|
| - }
|
| -
|
| - void requestStartPageScaleAnimation()
|
| - {
|
| - layerTreeHost()->startPageScaleAnimation(IntSize(), false, 1.25, 0);
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - impl->rootLayer()->setScrollable(true);
|
| - impl->rootLayer()->setScrollPosition(IntPoint());
|
| - impl->setPageScaleFactorAndLimits(impl->pageScaleFactor(), 0.5, 2);
|
| -
|
| - // We request animation only once.
|
| - if (!m_animationRequested) {
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCLayerTreeHostTestStartPageScaleAnimation::requestStartPageScaleAnimation));
|
| - m_animationRequested = true;
|
| - }
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float scale) OVERRIDE
|
| - {
|
| - IntPoint position = m_layerTreeHost->rootLayer()->scrollPosition();
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(position + scrollDelta);
|
| - m_layerTreeHost->setPageScaleFactorAndLimits(scale, 0.5, 2);
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - impl->processScrollDeltas();
|
| - // We get one commit before the first draw, and the animation doesn't happen until the second draw.
|
| - if (impl->sourceFrameNumber() == 1) {
|
| - EXPECT_EQ(1.25, impl->pageScaleFactor());
|
| - endTest();
|
| - } else
|
| - postSetNeedsRedrawToMainThread();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - bool m_animationRequested;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestStartPageScaleAnimation, runTest)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestSetVisible : public CCLayerTreeHostTest {
|
| -public:
|
| -
|
| - CCLayerTreeHostTestSetVisible()
|
| - : m_numDraws(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetVisibleToMainThread(false);
|
| - postSetNeedsRedrawToMainThread(); // This is suppressed while we're invisible.
|
| - postSetVisibleToMainThread(true); // Triggers the redraw.
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - EXPECT_TRUE(impl->visible());
|
| - ++m_numDraws;
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(1, m_numDraws);
|
| - }
|
| -
|
| -private:
|
| - int m_numDraws;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetVisible, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class TestOpacityChangeLayerDelegate : public ContentLayerChromiumClient {
|
| -public:
|
| - TestOpacityChangeLayerDelegate(CCLayerTreeHostTest* test)
|
| - : m_test(test)
|
| - {
|
| - }
|
| -
|
| - virtual void paintContents(SkCanvas*, const IntRect&, FloatRect&) OVERRIDE
|
| - {
|
| - // Set layer opacity to 0.
|
| - m_test->layerTreeHost()->rootLayer()->setOpacity(0);
|
| - }
|
| -
|
| -private:
|
| - CCLayerTreeHostTest* m_test;
|
| -};
|
| -
|
| -class ContentLayerChromiumWithUpdateTracking : public ContentLayerChromium {
|
| -public:
|
| - static scoped_refptr<ContentLayerChromiumWithUpdateTracking> create(ContentLayerChromiumClient* client) { return make_scoped_refptr(new ContentLayerChromiumWithUpdateTracking(client)); }
|
| -
|
| - int paintContentsCount() { return m_paintContentsCount; }
|
| - void resetPaintContentsCount() { m_paintContentsCount = 0; }
|
| -
|
| - virtual void update(CCTextureUpdateQueue& queue, const CCOcclusionTracker* occlusion, CCRenderingStats& stats) OVERRIDE
|
| - {
|
| - ContentLayerChromium::update(queue, occlusion, stats);
|
| - m_paintContentsCount++;
|
| - }
|
| -
|
| -private:
|
| - explicit ContentLayerChromiumWithUpdateTracking(ContentLayerChromiumClient* client)
|
| - : ContentLayerChromium(client)
|
| - , m_paintContentsCount(0)
|
| - {
|
| - setAnchorPoint(FloatPoint(0, 0));
|
| - setBounds(IntSize(10, 10));
|
| - setIsDrawable(true);
|
| - }
|
| - virtual ~ContentLayerChromiumWithUpdateTracking()
|
| - {
|
| - }
|
| -
|
| - int m_paintContentsCount;
|
| -};
|
| -
|
| -// Layer opacity change during paint should not prevent compositor resources from being updated during commit.
|
| -class CCLayerTreeHostTestOpacityChange : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestOpacityChange()
|
| - : m_testOpacityChangeDelegate(this)
|
| - , m_updateCheckLayer(ContentLayerChromiumWithUpdateTracking::create(&m_testOpacityChangeDelegate))
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_updateCheckLayer);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - // update() should have been called once.
|
| - EXPECT_EQ(1, m_updateCheckLayer->paintContentsCount());
|
| -
|
| - // clear m_updateCheckLayer so CCLayerTreeHost dies.
|
| - m_updateCheckLayer = NULL;
|
| - }
|
| -
|
| -private:
|
| - TestOpacityChangeLayerDelegate m_testOpacityChangeDelegate;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_updateCheckLayer;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestOpacityChange, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class MockContentLayerChromiumClient : public ContentLayerChromiumClient {
|
| -public:
|
| - bool drawsContent() const { return true; }
|
| - MOCK_CONST_METHOD0(preserves3D, bool());
|
| - void paintContents(SkCanvas*, const IntRect&, FloatRect&) OVERRIDE { }
|
| - void notifySyncRequired() { }
|
| -};
|
| -
|
| -class NoScaleContentLayerChromium : public ContentLayerChromium {
|
| -public:
|
| - static scoped_refptr<NoScaleContentLayerChromium> create(ContentLayerChromiumClient* client) { return make_scoped_refptr(new NoScaleContentLayerChromium(client)); }
|
| -
|
| - virtual bool needsContentsScale() const OVERRIDE { return false; }
|
| -
|
| -private:
|
| - explicit NoScaleContentLayerChromium(ContentLayerChromiumClient* client)
|
| - : ContentLayerChromium(client) { }
|
| - virtual ~NoScaleContentLayerChromium() { }
|
| -};
|
| -
|
| -class CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers : public CCLayerTreeHostTest {
|
| -public:
|
| -
|
| - CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
|
| - : m_rootLayer(NoScaleContentLayerChromium::create(&m_client))
|
| - , m_childLayer(ContentLayerChromium::create(&m_client))
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(40, 40), IntSize(60, 60));
|
| - m_layerTreeHost->setDeviceScaleFactor(1.5);
|
| - EXPECT_EQ(IntSize(40, 40), m_layerTreeHost->layoutViewportSize());
|
| - EXPECT_EQ(IntSize(60, 60), m_layerTreeHost->deviceViewportSize());
|
| -
|
| - m_rootLayer->addChild(m_childLayer);
|
| -
|
| - m_rootLayer->setIsDrawable(true);
|
| - m_rootLayer->setBounds(IntSize(30, 30));
|
| - m_rootLayer->setAnchorPoint(FloatPoint(0, 0));
|
| -
|
| - m_childLayer->setIsDrawable(true);
|
| - m_childLayer->setPosition(IntPoint(2, 2));
|
| - m_childLayer->setBounds(IntSize(10, 10));
|
| - m_childLayer->setAnchorPoint(FloatPoint(0, 0));
|
| -
|
| - m_layerTreeHost->setRootLayer(m_rootLayer);
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - // Get access to protected methods.
|
| - MockLayerTreeHostImpl* mockImpl = static_cast<MockLayerTreeHostImpl*>(impl);
|
| -
|
| - // Should only do one commit.
|
| - EXPECT_EQ(0, impl->sourceFrameNumber());
|
| - // Device scale factor should come over to impl.
|
| - EXPECT_NEAR(impl->deviceScaleFactor(), 1.5, 0.00001);
|
| -
|
| - // Both layers are on impl.
|
| - ASSERT_EQ(1u, impl->rootLayer()->children().size());
|
| -
|
| - // Device viewport is scaled.
|
| - EXPECT_EQ(IntSize(40, 40), impl->layoutViewportSize());
|
| - EXPECT_EQ(IntSize(60, 60), impl->deviceViewportSize());
|
| -
|
| - CCLayerImpl* root = impl->rootLayer();
|
| - CCLayerImpl* child = impl->rootLayer()->children()[0];
|
| -
|
| - // Positions remain in layout pixels.
|
| - EXPECT_EQ(IntPoint(0, 0), root->position());
|
| - EXPECT_EQ(IntPoint(2, 2), child->position());
|
| -
|
| - // Compute all the layer transforms for the frame.
|
| - MockLayerTreeHostImpl::CCLayerList renderSurfaceLayerList;
|
| - mockImpl->calculateRenderSurfaceLayerList(renderSurfaceLayerList);
|
| -
|
| - // Both layers should be drawing into the root render surface.
|
| - ASSERT_EQ(1u, renderSurfaceLayerList.size());
|
| - ASSERT_EQ(root->renderSurface(), renderSurfaceLayerList[0]->renderSurface());
|
| - ASSERT_EQ(2u, root->renderSurface()->layerList().size());
|
| -
|
| - // The root render surface is the size of the viewport.
|
| - EXPECT_RECT_EQ(IntRect(0, 0, 60, 60), root->renderSurface()->contentRect());
|
| -
|
| - // The content bounds of the child should be scaled.
|
| - IntSize childBoundsScaled = child->bounds();
|
| - childBoundsScaled.scale(1.5);
|
| - EXPECT_EQ(childBoundsScaled, child->contentBounds());
|
| -
|
| - WebTransformationMatrix scaleTransform;
|
| - scaleTransform.scale(impl->deviceScaleFactor());
|
| -
|
| - // The root layer is scaled by 2x.
|
| - WebTransformationMatrix rootScreenSpaceTransform = scaleTransform;
|
| - WebTransformationMatrix rootDrawTransform = scaleTransform;
|
| -
|
| - EXPECT_EQ(rootDrawTransform, root->drawTransform());
|
| - EXPECT_EQ(rootScreenSpaceTransform, root->screenSpaceTransform());
|
| -
|
| - // The child is at position 2,2, which is transformed to 3,3 after the scale
|
| - WebTransformationMatrix childScreenSpaceTransform;
|
| - childScreenSpaceTransform.translate(3, 3);
|
| - WebTransformationMatrix childDrawTransform = childScreenSpaceTransform;
|
| -
|
| - EXPECT_EQ(childDrawTransform, child->drawTransform());
|
| - EXPECT_EQ(childScreenSpaceTransform, child->screenSpaceTransform());
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - m_rootLayer = NULL;
|
| - m_childLayer = NULL;
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<NoScaleContentLayerChromium> m_rootLayer;
|
| - scoped_refptr<ContentLayerChromium> m_childLayer;
|
| -};
|
| -
|
| -// Test is flaky - http://crbug.com/148490
|
| -TEST_F(CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers, DISABLED_runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// Verify atomicity of commits and reuse of textures.
|
| -class CCLayerTreeHostTestAtomicCommit : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAtomicCommit()
|
| - : m_layer(ContentLayerChromiumWithUpdateTracking::create(&m_client))
|
| - {
|
| - // Make sure partial texture updates are turned off.
|
| - m_settings.maxPartialTextureUpdates = 0;
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_layer);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - postSetNeedsRedrawToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->context()->context3D());
|
| -
|
| - switch (impl->sourceFrameNumber()) {
|
| - case 0:
|
| - // Number of textures should be one.
|
| - ASSERT_EQ(1, context->numTextures());
|
| - // Number of textures used for commit should be one.
|
| - EXPECT_EQ(1, context->numUsedTextures());
|
| - // Verify that used texture is correct.
|
| - EXPECT_TRUE(context->usedTexture(context->texture(0)));
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - case 1:
|
| - // Number of textures should be two as the first texture
|
| - // is used by impl thread and cannot by used for update.
|
| - ASSERT_EQ(2, context->numTextures());
|
| - // Number of textures used for commit should still be one.
|
| - EXPECT_EQ(1, context->numUsedTextures());
|
| - // First texture should not have been used.
|
| - EXPECT_FALSE(context->usedTexture(context->texture(0)));
|
| - // New texture should have been used.
|
| - EXPECT_TRUE(context->usedTexture(context->texture(1)));
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->context()->context3D());
|
| -
|
| - // Number of textures used for draw should always be one.
|
| - EXPECT_EQ(1, context->numUsedTextures());
|
| -
|
| - if (impl->sourceFrameNumber() < 1) {
|
| - context->resetUsedTextures();
|
| - postSetNeedsAnimateAndCommitToMainThread();
|
| - postSetNeedsRedrawToMainThread();
|
| - } else
|
| - endTest();
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - m_layer->setNeedsDisplay();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_layer;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestAtomicCommit, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -static void setLayerPropertiesForTesting(LayerChromium* layer, LayerChromium* parent, const WebTransformationMatrix& transform, const FloatPoint& anchor, const FloatPoint& position, const IntSize& bounds, bool opaque)
|
| -{
|
| - layer->removeAllChildren();
|
| - if (parent)
|
| - parent->addChild(layer);
|
| - layer->setTransform(transform);
|
| - layer->setAnchorPoint(anchor);
|
| - layer->setPosition(position);
|
| - layer->setBounds(bounds);
|
| - layer->setContentsOpaque(opaque);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestAtomicCommitWithPartialUpdate : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestAtomicCommitWithPartialUpdate()
|
| - : m_parent(ContentLayerChromiumWithUpdateTracking::create(&m_client))
|
| - , m_child(ContentLayerChromiumWithUpdateTracking::create(&m_client))
|
| - , m_numCommits(0)
|
| - {
|
| - // Allow one partial texture update.
|
| - m_settings.maxPartialTextureUpdates = 1;
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_parent);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 20), IntSize(10, 20));
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - setLayerPropertiesForTesting(m_parent.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 20), true);
|
| - setLayerPropertiesForTesting(m_child.get(), m_parent.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(0, 10), IntSize(10, 10), false);
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - postSetNeedsRedrawToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->context()->context3D());
|
| -
|
| - switch (impl->sourceFrameNumber()) {
|
| - case 0:
|
| - // Number of textures should be two.
|
| - ASSERT_EQ(2, context->numTextures());
|
| - // Number of textures used for commit should be two.
|
| - EXPECT_EQ(2, context->numUsedTextures());
|
| - // Verify that used textures are correct.
|
| - EXPECT_TRUE(context->usedTexture(context->texture(0)));
|
| - EXPECT_TRUE(context->usedTexture(context->texture(1)));
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - case 1:
|
| - // Number of textures used for commit should still be two.
|
| - EXPECT_EQ(2, context->numUsedTextures());
|
| - // First two textures should not have been used.
|
| - EXPECT_FALSE(context->usedTexture(context->texture(0)));
|
| - EXPECT_FALSE(context->usedTexture(context->texture(1)));
|
| - // New textures should have been used.
|
| - EXPECT_TRUE(context->usedTexture(context->texture(2)));
|
| - EXPECT_TRUE(context->usedTexture(context->texture(3)));
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - case 2:
|
| - // Number of textures used for commit should still be two.
|
| - EXPECT_EQ(2, context->numUsedTextures());
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - case 3:
|
| - // No textures should be used for commit.
|
| - EXPECT_EQ(0, context->numUsedTextures());
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - case 4:
|
| - // Number of textures used for commit should be one.
|
| - EXPECT_EQ(1, context->numUsedTextures());
|
| -
|
| - context->resetUsedTextures();
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->context()->context3D());
|
| -
|
| - // Number of textures used for drawing should two except for frame 4
|
| - // where the viewport only contains one layer.
|
| - if (impl->sourceFrameNumber() == 3)
|
| - EXPECT_EQ(1, context->numUsedTextures());
|
| - else
|
| - EXPECT_EQ(2, context->numUsedTextures());
|
| -
|
| - if (impl->sourceFrameNumber() < 4) {
|
| - context->resetUsedTextures();
|
| - postSetNeedsAnimateAndCommitToMainThread();
|
| - postSetNeedsRedrawToMainThread();
|
| - } else
|
| - endTest();
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - switch (m_numCommits++) {
|
| - case 0:
|
| - case 1:
|
| - m_parent->setNeedsDisplay();
|
| - m_child->setNeedsDisplay();
|
| - break;
|
| - case 2:
|
| - // Damage part of layers.
|
| - m_parent->setNeedsDisplayRect(FloatRect(0, 0, 5, 5));
|
| - m_child->setNeedsDisplayRect(FloatRect(0, 0, 5, 5));
|
| - break;
|
| - case 3:
|
| - m_child->setNeedsDisplay();
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - break;
|
| - case 4:
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 20), IntSize(10, 20));
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_parent;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_child;
|
| - int m_numCommits;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestAtomicCommitWithPartialUpdate, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class TestLayerChromium : public LayerChromium {
|
| -public:
|
| - static scoped_refptr<TestLayerChromium> create() { return make_scoped_refptr(new TestLayerChromium()); }
|
| -
|
| - virtual void update(CCTextureUpdateQueue&, const CCOcclusionTracker* occlusion, CCRenderingStats&) OVERRIDE
|
| - {
|
| - // Gain access to internals of the CCOcclusionTracker.
|
| - const TestCCOcclusionTracker* testOcclusion = static_cast<const TestCCOcclusionTracker*>(occlusion);
|
| - m_occludedScreenSpace = testOcclusion ? testOcclusion->occlusionInScreenSpace() : Region();
|
| - }
|
| -
|
| - virtual bool drawsContent() const OVERRIDE { return true; }
|
| -
|
| - const Region& occludedScreenSpace() const { return m_occludedScreenSpace; }
|
| - void clearOccludedScreenSpace() { m_occludedScreenSpace = Region(); }
|
| -
|
| -private:
|
| - TestLayerChromium() : LayerChromium() { }
|
| - virtual ~TestLayerChromium() { }
|
| -
|
| - Region m_occludedScreenSpace;
|
| -};
|
| -
|
| -static void setTestLayerPropertiesForTesting(TestLayerChromium* layer, LayerChromium* parent, const WebTransformationMatrix& transform, const FloatPoint& anchor, const FloatPoint& position, const IntSize& bounds, bool opaque)
|
| -{
|
| - setLayerPropertiesForTesting(layer, parent, transform, anchor, position, bounds, opaque);
|
| - layer->clearOccludedScreenSpace();
|
| -}
|
| -
|
| -class CCLayerTreeHostTestLayerOcclusion : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestLayerOcclusion() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - scoped_refptr<TestLayerChromium> rootLayer = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> child = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> child2 = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> grandChild = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> mask = TestLayerChromium::create();
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - WebTransformationMatrix childTransform;
|
| - childTransform.translate(250, 250);
|
| - childTransform.rotate(90);
|
| - childTransform.translate(-250, -250);
|
| -
|
| - child->setMasksToBounds(true);
|
| -
|
| - // See CCLayerTreeHostCommonTest.layerAddsSelfToOccludedRegionWithRotatedSurface for a nice visual of these layers and how they end up
|
| - // positioned on the screen.
|
| -
|
| - // The child layer is rotated and the grandChild is opaque, but clipped to the child and rootLayer
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), false);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - ASSERT_TRUE(m_layerTreeHost->initializeRendererIfNeeded());
|
| - CCTextureUpdateQueue queue;
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer is opaque, then it adds to the occlusion seen by the rootLayer.
|
| - setLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 30, 170, 170), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // Add a second child to the root layer and the regions should merge
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(70, 20), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 30, 170, 170), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 20, 170, 180), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(2u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // Move the second child to be sure.
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 30, 170, 170), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 30, 190, 170), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(2u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer has a mask on it, then it shouldn't contribute to occlusion on stuff below it
|
| - setLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| - setLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - child->setMaskLayer(mask.get());
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer with a mask is below child2, then child2 should contribute to occlusion on everything, and child shouldn't contribute to the rootLayer
|
| - setLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| - setLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| -
|
| - child->setMaskLayer(mask.get());
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 40, 190, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(2u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer has a non-opaque drawOpacity, then it shouldn't contribute to occlusion on stuff below it
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| -
|
| - child->setMaskLayer(0);
|
| - child->setOpacity(0.5);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer with non-opaque drawOpacity is below child2, then child2 should contribute to occlusion on everything, and child shouldn't contribute to the rootLayer
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| -
|
| - child->setMaskLayer(0);
|
| - child->setOpacity(0.5);
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 40, 190, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(2u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestLayerOcclusion)
|
| -
|
| -class CCLayerTreeHostTestLayerOcclusionWithFilters : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestLayerOcclusionWithFilters() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - scoped_refptr<TestLayerChromium> rootLayer = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> child = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> child2 = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> grandChild = TestLayerChromium::create();
|
| - scoped_refptr<TestLayerChromium> mask = TestLayerChromium::create();
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - WebTransformationMatrix childTransform;
|
| - childTransform.translate(250, 250);
|
| - childTransform.rotate(90);
|
| - childTransform.translate(-250, -250);
|
| -
|
| - child->setMasksToBounds(true);
|
| -
|
| - // If the child layer has a filter that changes alpha values, and is below child2, then child2 should contribute to occlusion on everything,
|
| - // and child shouldn't contribute to the rootLayer
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| -
|
| - {
|
| - WebFilterOperations filters;
|
| - filters.append(WebFilterOperation::createOpacityFilter(0.5));
|
| - child->setFilters(filters);
|
| - }
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - ASSERT_TRUE(m_layerTreeHost->initializeRendererIfNeeded());
|
| - CCTextureUpdateQueue queue;
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 40, 190, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(2u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // If the child layer has a filter that moves pixels/changes alpha, and is below child2, then child should not inherit occlusion from outside its subtree,
|
| - // and should not contribute to the rootLayer
|
| - setTestLayerPropertiesForTesting(rootLayer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - setTestLayerPropertiesForTesting(child.get(), rootLayer.get(), childTransform, FloatPoint(0, 0), FloatPoint(30, 30), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(grandChild.get(), child.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 10), IntSize(500, 500), true);
|
| - setTestLayerPropertiesForTesting(child2.get(), rootLayer.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(10, 70), IntSize(500, 500), true);
|
| -
|
| - {
|
| - WebFilterOperations filters;
|
| - filters.append(WebFilterOperation::createBlurFilter(10));
|
| - child->setFilters(filters);
|
| - }
|
| -
|
| - m_layerTreeHost->setRootLayer(rootLayer);
|
| - m_layerTreeHost->setViewportSize(rootLayer->bounds(), rootLayer->bounds());
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - EXPECT_RECT_EQ(IntRect(), child2->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, child2->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(), grandChild->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(0u, grandChild->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(30, 40, 170, 160), child->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, child->occludedScreenSpace().rects().size());
|
| - EXPECT_RECT_EQ(IntRect(10, 70, 190, 130), rootLayer->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, rootLayer->occludedScreenSpace().rects().size());
|
| -
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - CCLayerTreeHost::setNeedsFilterContext(false);
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestLayerOcclusionWithFilters)
|
| -
|
| -class CCLayerTreeHostTestManySurfaces : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestManySurfaces() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - // We create enough RenderSurfaces that it will trigger Vector reallocation while computing occlusion.
|
| - Region occluded;
|
| - const WebTransformationMatrix identityMatrix;
|
| - std::vector<scoped_refptr<TestLayerChromium> > layers;
|
| - std::vector<scoped_refptr<TestLayerChromium> > children;
|
| - int numSurfaces = 20;
|
| - scoped_refptr<TestLayerChromium> replica = TestLayerChromium::create();
|
| -
|
| - for (int i = 0; i < numSurfaces; ++i) {
|
| - layers.push_back(TestLayerChromium::create());
|
| - if (!i) {
|
| - setTestLayerPropertiesForTesting(layers.back().get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(200, 200), true);
|
| - layers.back()->createRenderSurface();
|
| - } else {
|
| - setTestLayerPropertiesForTesting(layers.back().get(), layers[layers.size()-2].get(), identityMatrix, FloatPoint(0, 0), FloatPoint(1, 1), IntSize(200-i, 200-i), true);
|
| - layers.back()->setMasksToBounds(true);
|
| - layers.back()->setReplicaLayer(replica.get()); // Make it have a RenderSurface
|
| - }
|
| - }
|
| -
|
| - for (int i = 1; i < numSurfaces; ++i) {
|
| - children.push_back(TestLayerChromium::create());
|
| - setTestLayerPropertiesForTesting(children.back().get(), layers[i].get(), identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(500, 500), false);
|
| - }
|
| -
|
| - m_layerTreeHost->setRootLayer(layers[0].get());
|
| - m_layerTreeHost->setViewportSize(layers[0]->bounds(), layers[0]->bounds());
|
| - ASSERT_TRUE(m_layerTreeHost->initializeRendererIfNeeded());
|
| - CCTextureUpdateQueue queue;
|
| - m_layerTreeHost->updateLayers(queue, std::numeric_limits<size_t>::max());
|
| - m_layerTreeHost->commitComplete();
|
| -
|
| - for (int i = 0; i < numSurfaces-1; ++i) {
|
| - IntRect expectedOcclusion(i+1, i+1, 200-i-1, 200-i-1);
|
| -
|
| - EXPECT_RECT_EQ(expectedOcclusion, layers[i]->occludedScreenSpace().bounds());
|
| - EXPECT_EQ(1u, layers[i]->occludedScreenSpace().rects().size());
|
| - }
|
| -
|
| - // Kill the layerTreeHost immediately.
|
| - m_layerTreeHost->setRootLayer(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestManySurfaces)
|
| -
|
| -// A loseContext(1) should lead to a didRecreateOutputSurface(true)
|
| -class CCLayerTreeHostTestSetSingleLostContext : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetSingleLostContext()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - m_layerTreeHost->loseContext(1);
|
| - }
|
| -
|
| - virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE
|
| - {
|
| - EXPECT_TRUE(succeeded);
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetSingleLostContext, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -// A loseContext(10) should lead to a didRecreateOutputSurface(false), and
|
| -// a finishAllRendering() should not hang.
|
| -class CCLayerTreeHostTestSetRepeatedLostContext : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSetRepeatedLostContext()
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - m_layerTreeHost->loseContext(10);
|
| - }
|
| -
|
| - virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE
|
| - {
|
| - EXPECT_FALSE(succeeded);
|
| - m_layerTreeHost->finishAllRendering();
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestSetRepeatedLostContext, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestFractionalScroll : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestFractionalScroll()
|
| - : m_scrollAmount(1.75, 0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setScrollable(true);
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - CCLayerImpl* root = impl->rootLayer();
|
| - root->setMaxScrollPosition(IntSize(100, 100));
|
| -
|
| - // Check that a fractional scroll delta is correctly accumulated over multiple commits.
|
| - if (!impl->sourceFrameNumber()) {
|
| - EXPECT_EQ(root->scrollPosition(), IntPoint(0, 0));
|
| - EXPECT_EQ(root->scrollDelta(), FloatSize(0, 0));
|
| - postSetNeedsCommitToMainThread();
|
| - } else if (impl->sourceFrameNumber() == 1) {
|
| - EXPECT_EQ(root->scrollPosition(), flooredIntPoint(m_scrollAmount));
|
| - EXPECT_EQ(root->scrollDelta(), FloatSize(fmod(m_scrollAmount.width(), 1), 0));
|
| - postSetNeedsCommitToMainThread();
|
| - } else if (impl->sourceFrameNumber() == 2) {
|
| - EXPECT_EQ(root->scrollPosition(), flooredIntPoint(m_scrollAmount + m_scrollAmount));
|
| - EXPECT_EQ(root->scrollDelta(), FloatSize(fmod(2 * m_scrollAmount.width(), 1), 0));
|
| - endTest();
|
| - }
|
| - root->scrollBy(m_scrollAmount);
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float scale) OVERRIDE
|
| - {
|
| - IntPoint position = m_layerTreeHost->rootLayer()->scrollPosition();
|
| - m_layerTreeHost->rootLayer()->setScrollPosition(position + scrollDelta);
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -private:
|
| - FloatSize m_scrollAmount;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestFractionalScroll, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestFinishAllRendering : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestFinishAllRendering()
|
| - : m_once(false)
|
| - , m_mutex()
|
| - , m_drawCount(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setNeedsRedraw();
|
| - }
|
| -
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - if (m_once)
|
| - return;
|
| - m_once = true;
|
| - m_layerTreeHost->setNeedsRedraw();
|
| - m_layerTreeHost->acquireLayerTextures();
|
| - {
|
| - Locker<Mutex> lock(m_mutex);
|
| - m_drawCount = 0;
|
| - }
|
| - m_layerTreeHost->finishAllRendering();
|
| - {
|
| - Locker<Mutex> lock(m_mutex);
|
| - EXPECT_EQ(0, m_drawCount);
|
| - }
|
| - endTest();
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - Locker<Mutex> lock(m_mutex);
|
| - ++m_drawCount;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -private:
|
| -
|
| - bool m_once;
|
| - Mutex m_mutex;
|
| - int m_drawCount;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestFinishAllRendering)
|
| -
|
| -// Layers added to tree with existing active animations should have the animation
|
| -// correctly recognized.
|
| -class CCLayerTreeHostTestLayerAddedWithAnimation : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestLayerAddedWithAnimation()
|
| - : m_addedAnimation(false)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - EXPECT_FALSE(m_addedAnimation);
|
| -
|
| - scoped_refptr<LayerChromium> layer = LayerChromium::create();
|
| - layer->setLayerAnimationDelegate(this);
|
| -
|
| - // Any valid CCAnimationCurve will do here.
|
| - scoped_ptr<CCAnimationCurve> curve(CCEaseTimingFunction::create());
|
| - scoped_ptr<CCActiveAnimation> animation(CCActiveAnimation::create(curve.Pass(), 1, 1, CCActiveAnimation::Opacity));
|
| - layer->layerAnimationController()->addAnimation(animation.Pass());
|
| -
|
| - // We add the animation *before* attaching the layer to the tree.
|
| - m_layerTreeHost->rootLayer()->addChild(layer);
|
| - EXPECT_TRUE(m_addedAnimation);
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void didAddAnimation() OVERRIDE
|
| - {
|
| - m_addedAnimation = true;
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE { }
|
| -
|
| -private:
|
| - bool m_addedAnimation;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestLayerAddedWithAnimation)
|
| -
|
| -class CCLayerTreeHostTestScrollChildLayer : public CCLayerTreeHostTest, public WebLayerScrollClient {
|
| -public:
|
| - CCLayerTreeHostTestScrollChildLayer()
|
| - : m_scrollAmount(2, 1)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - m_layerTreeHost->rootLayer()->setBounds(IntSize(10, 10));
|
| -
|
| - m_rootScrollLayer = ContentLayerChromium::create(&m_mockDelegate);
|
| - m_rootScrollLayer->setBounds(IntSize(10, 10));
|
| -
|
| - m_rootScrollLayer->setPosition(FloatPoint(0, 0));
|
| - m_rootScrollLayer->setAnchorPoint(FloatPoint(0, 0));
|
| -
|
| - m_rootScrollLayer->setIsDrawable(true);
|
| - m_rootScrollLayer->setScrollable(true);
|
| - m_rootScrollLayer->setMaxScrollPosition(IntSize(100, 100));
|
| - m_layerTreeHost->rootLayer()->addChild(m_rootScrollLayer);
|
| - m_childLayer = ContentLayerChromium::create(&m_mockDelegate);
|
| - m_childLayer->setLayerScrollClient(this);
|
| - m_childLayer->setBounds(IntSize(50, 50));
|
| - m_childLayer->setIsDrawable(true);
|
| - m_childLayer->setScrollable(true);
|
| - m_childLayer->setMaxScrollPosition(IntSize(100, 100));
|
| -
|
| - m_childLayer->setPosition(FloatPoint(0, 0));
|
| - m_childLayer->setAnchorPoint(FloatPoint(0, 0));
|
| -
|
| - m_rootScrollLayer->addChild(m_childLayer);
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void didScroll() OVERRIDE
|
| - {
|
| - m_finalScrollPosition = m_childLayer->scrollPosition();
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float) OVERRIDE
|
| - {
|
| - IntPoint position = m_rootScrollLayer->scrollPosition();
|
| - m_rootScrollLayer->setScrollPosition(position + scrollDelta);
|
| - }
|
| -
|
| - virtual void beginCommitOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - EXPECT_EQ(m_rootScrollLayer->scrollPosition(), IntPoint());
|
| - if (!m_layerTreeHost->commitNumber())
|
| - EXPECT_EQ(m_childLayer->scrollPosition(), IntPoint());
|
| - else
|
| - EXPECT_EQ(m_childLayer->scrollPosition(), IntPoint() + m_scrollAmount);
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - if (impl->sourceAnimationFrameNumber() == 1) {
|
| - EXPECT_EQ(impl->scrollBegin(IntPoint(5, 5), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollStarted);
|
| - impl->scrollBy(IntPoint(), m_scrollAmount);
|
| - impl->scrollEnd();
|
| - } else if (impl->sourceAnimationFrameNumber() == 2)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(IntPoint(m_scrollAmount), m_finalScrollPosition);
|
| - }
|
| -
|
| -private:
|
| - const IntSize m_scrollAmount;
|
| - IntPoint m_finalScrollPosition;
|
| - MockContentLayerChromiumClient m_mockDelegate;
|
| - scoped_refptr<LayerChromium> m_childLayer;
|
| - scoped_refptr<LayerChromium> m_rootScrollLayer;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestScrollChildLayer, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestCompositeAndReadbackCleanup : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestCompositeAndReadbackCleanup() { }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - LayerChromium* rootLayer = m_layerTreeHost->rootLayer();
|
| -
|
| - OwnArrayPtr<char> pixels(adoptArrayPtr(new char[4]));
|
| - m_layerTreeHost->compositeAndReadback(static_cast<void*>(pixels.get()), IntRect(0, 0, 1, 1));
|
| - EXPECT_FALSE(rootLayer->renderSurface());
|
| -
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestCompositeAndReadbackCleanup)
|
| -
|
| -class CCLayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit()
|
| - : m_rootLayer(ContentLayerChromiumWithUpdateTracking::create(&m_mockDelegate))
|
| - , m_surfaceLayer1(ContentLayerChromiumWithUpdateTracking::create(&m_mockDelegate))
|
| - , m_replicaLayer1(ContentLayerChromiumWithUpdateTracking::create(&m_mockDelegate))
|
| - , m_surfaceLayer2(ContentLayerChromiumWithUpdateTracking::create(&m_mockDelegate))
|
| - , m_replicaLayer2(ContentLayerChromiumWithUpdateTracking::create(&m_mockDelegate))
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(100, 100), IntSize(100, 100));
|
| -
|
| - m_rootLayer->setBounds(IntSize(100, 100));
|
| - m_surfaceLayer1->setBounds(IntSize(100, 100));
|
| - m_surfaceLayer1->setForceRenderSurface(true);
|
| - m_surfaceLayer1->setOpacity(0.5);
|
| - m_surfaceLayer2->setBounds(IntSize(100, 100));
|
| - m_surfaceLayer2->setForceRenderSurface(true);
|
| - m_surfaceLayer2->setOpacity(0.5);
|
| -
|
| - m_surfaceLayer1->setReplicaLayer(m_replicaLayer1.get());
|
| - m_surfaceLayer2->setReplicaLayer(m_replicaLayer2.get());
|
| -
|
| - m_rootLayer->addChild(m_surfaceLayer1);
|
| - m_surfaceLayer1->addChild(m_surfaceLayer2);
|
| - m_layerTreeHost->setRootLayer(m_rootLayer);
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* hostImpl) OVERRIDE
|
| - {
|
| - CCRenderer* renderer = hostImpl->renderer();
|
| - CCRenderPass::Id surface1RenderPassId = hostImpl->rootLayer()->children()[0]->renderSurface()->renderPassId();
|
| - CCRenderPass::Id surface2RenderPassId = hostImpl->rootLayer()->children()[0]->children()[0]->renderSurface()->renderPassId();
|
| -
|
| - switch (hostImpl->sourceFrameNumber()) {
|
| - case 0:
|
| - EXPECT_TRUE(renderer->haveCachedResourcesForRenderPassId(surface1RenderPassId));
|
| - EXPECT_TRUE(renderer->haveCachedResourcesForRenderPassId(surface2RenderPassId));
|
| -
|
| - // Reduce the memory limit to only fit the root layer and one render surface. This
|
| - // prevents any contents drawing into surfaces from being allocated.
|
| - hostImpl->setMemoryAllocationLimitBytes(100 * 100 * 4 * 2);
|
| - break;
|
| - case 1:
|
| - EXPECT_FALSE(renderer->haveCachedResourcesForRenderPassId(surface1RenderPassId));
|
| - EXPECT_FALSE(renderer->haveCachedResourcesForRenderPassId(surface2RenderPassId));
|
| -
|
| - endTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - EXPECT_EQ(2, m_rootLayer->paintContentsCount());
|
| - EXPECT_EQ(2, m_surfaceLayer1->paintContentsCount());
|
| - EXPECT_EQ(2, m_surfaceLayer2->paintContentsCount());
|
| -
|
| - // Clear layer references so CCLayerTreeHost dies.
|
| - m_rootLayer = NULL;
|
| - m_surfaceLayer1 = NULL;
|
| - m_replicaLayer1 = NULL;
|
| - m_surfaceLayer2 = NULL;
|
| - m_replicaLayer2 = NULL;
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_mockDelegate;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_rootLayer;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_surfaceLayer1;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_replicaLayer1;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_surfaceLayer2;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_replicaLayer2;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit)
|
| -
|
| -
|
| -class EvictionTrackingTexture : public LayerTextureUpdater::Texture {
|
| -public:
|
| - static PassOwnPtr<EvictionTrackingTexture> create(scoped_ptr<CCPrioritizedTexture> texture) { return adoptPtr(new EvictionTrackingTexture(texture.Pass())); }
|
| - virtual ~EvictionTrackingTexture() { }
|
| -
|
| - virtual void updateRect(CCResourceProvider* resourceProvider, const IntRect&, const IntSize&) OVERRIDE
|
| - {
|
| - ASSERT_TRUE(!texture()->haveBackingTexture() || resourceProvider->numResources() > 0);
|
| - texture()->acquireBackingTexture(resourceProvider);
|
| - m_updated = true;
|
| - }
|
| - void resetUpdated() { m_updated = false; }
|
| - bool updated() const { return m_updated; }
|
| -
|
| -private:
|
| - explicit EvictionTrackingTexture(scoped_ptr<CCPrioritizedTexture> texture)
|
| - : LayerTextureUpdater::Texture(texture.Pass())
|
| - , m_updated(false)
|
| - { }
|
| - bool m_updated;
|
| -};
|
| -
|
| -class EvictionTestLayer : public LayerChromium {
|
| -public:
|
| - static scoped_refptr<EvictionTestLayer> create() { return make_scoped_refptr(new EvictionTestLayer()); }
|
| -
|
| - virtual void update(CCTextureUpdateQueue&, const CCOcclusionTracker*, CCRenderingStats&) OVERRIDE;
|
| - virtual bool drawsContent() const OVERRIDE { return true; }
|
| -
|
| - virtual scoped_ptr<CCLayerImpl> createCCLayerImpl() OVERRIDE;
|
| - virtual void pushPropertiesTo(CCLayerImpl*) OVERRIDE;
|
| - virtual void setTexturePriorities(const CCPriorityCalculator&) OVERRIDE;
|
| -
|
| - void resetUpdated()
|
| - {
|
| - if (m_texture.get())
|
| - m_texture->resetUpdated();
|
| - }
|
| - bool updated() const { return m_texture.get() ? m_texture->updated() : false; }
|
| -
|
| -private:
|
| - EvictionTestLayer() : LayerChromium() { }
|
| - virtual ~EvictionTestLayer() { }
|
| -
|
| - void createTextureIfNeeded()
|
| - {
|
| - if (m_texture.get())
|
| - return;
|
| - m_texture = EvictionTrackingTexture::create(CCPrioritizedTexture::create(layerTreeHost()->contentsTextureManager()));
|
| - m_texture->texture()->setDimensions(IntSize(10, 10), cc::GraphicsContext3D::RGBA);
|
| - }
|
| -
|
| - OwnPtr<EvictionTrackingTexture> m_texture;
|
| -};
|
| -
|
| -class EvictionTestLayerImpl : public CCLayerImpl {
|
| -public:
|
| - static scoped_ptr<EvictionTestLayerImpl> create(int id)
|
| - {
|
| - return make_scoped_ptr(new EvictionTestLayerImpl(id));
|
| - }
|
| - virtual ~EvictionTestLayerImpl() { }
|
| -
|
| - virtual void appendQuads(CCQuadSink& quadSink, CCAppendQuadsData&) OVERRIDE
|
| - {
|
| - ASSERT_TRUE(m_hasTexture);
|
| - ASSERT_NE(0u, layerTreeHostImpl()->resourceProvider()->numResources());
|
| - }
|
| -
|
| - void setHasTexture(bool hasTexture) { m_hasTexture = hasTexture; }
|
| -
|
| -private:
|
| - explicit EvictionTestLayerImpl(int id)
|
| - : CCLayerImpl(id)
|
| - , m_hasTexture(false) { }
|
| -
|
| - bool m_hasTexture;
|
| -};
|
| -
|
| -void EvictionTestLayer::setTexturePriorities(const CCPriorityCalculator&)
|
| -{
|
| - createTextureIfNeeded();
|
| - if (!m_texture.get())
|
| - return;
|
| - m_texture->texture()->setRequestPriority(CCPriorityCalculator::uiPriority(true));
|
| -}
|
| -
|
| -void EvictionTestLayer::update(CCTextureUpdateQueue& queue, const CCOcclusionTracker*, CCRenderingStats&)
|
| -{
|
| - createTextureIfNeeded();
|
| - if (!m_texture.get())
|
| - return;
|
| - IntRect fullRect(0, 0, 10, 10);
|
| - TextureUploader::Parameters parameters = { m_texture.get(), fullRect, IntSize() };
|
| - queue.appendFullUpload(parameters);
|
| -}
|
| -
|
| -scoped_ptr<CCLayerImpl> EvictionTestLayer::createCCLayerImpl()
|
| -{
|
| - return EvictionTestLayerImpl::create(m_layerId).PassAs<CCLayerImpl>();
|
| -}
|
| -
|
| -void EvictionTestLayer::pushPropertiesTo(CCLayerImpl* layerImpl)
|
| -{
|
| - LayerChromium::pushPropertiesTo(layerImpl);
|
| -
|
| - EvictionTestLayerImpl* testLayerImpl = static_cast<EvictionTestLayerImpl*>(layerImpl);
|
| - testLayerImpl->setHasTexture(m_texture->texture()->haveBackingTexture());
|
| -}
|
| -
|
| -class CCLayerTreeHostTestEvictTextures : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestEvictTextures()
|
| - : m_layer(EvictionTestLayer::create())
|
| - , m_implForEvictTextures(0)
|
| - , m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_layer);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 20), IntSize(10, 20));
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 20), true);
|
| - }
|
| -
|
| - class EvictTexturesTask : public WebKit::WebThread::Task {
|
| - public:
|
| - EvictTexturesTask(CCLayerTreeHostTestEvictTextures* test) : m_test(test) { }
|
| - virtual ~EvictTexturesTask() { }
|
| - virtual void run() OVERRIDE
|
| - {
|
| - ASSERT(m_test->m_implForEvictTextures);
|
| - m_test->m_implForEvictTextures->releaseContentsTextures();
|
| - }
|
| -
|
| - private:
|
| - CCLayerTreeHostTestEvictTextures* m_test;
|
| - };
|
| -
|
| - void postEvictTextures()
|
| - {
|
| - ASSERT(webThread());
|
| - webThread()->postTask(new EvictTexturesTask(this));
|
| - }
|
| -
|
| - // Commit 1: Just commit and draw normally, then post an eviction at the end
|
| - // that will trigger a commit.
|
| - // Commit 2: Triggered by the eviction, let it go through and then set
|
| - // needsCommit.
|
| - // Commit 3: Triggered by the setNeedsCommit. In layout(), post an eviction
|
| - // task, which will be handled before the commit. Don't set needsCommit, it
|
| - // should have been posted. A frame should not be drawn (note,
|
| - // didCommitAndDrawFrame may be called anyway).
|
| - // Commit 4: Triggered by the eviction, let it go through and then set
|
| - // needsCommit.
|
| - // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
|
| - // layout(), a frame should not be drawn but a commit will be posted.
|
| - // Commit 6: Triggered by the eviction, post an eviction task in
|
| - // layout(), which will be a noop, letting the commit (which recreates the
|
| - // textures) go through and draw a frame, then end the test.
|
| - //
|
| - // Commits 1+2 test the eviction recovery path where eviction happens outside
|
| - // of the beginFrame/commit pair.
|
| - // Commits 3+4 test the eviction recovery path where eviction happens inside
|
| - // the beginFrame/commit pair.
|
| - // Commits 5+6 test the path where an eviction happens during the eviction
|
| - // recovery path.
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - switch (m_numCommits) {
|
| - case 1:
|
| - EXPECT_TRUE(m_layer->updated());
|
| - postEvictTextures();
|
| - break;
|
| - case 2:
|
| - EXPECT_TRUE(m_layer->updated());
|
| - m_layerTreeHost->setNeedsCommit();
|
| - break;
|
| - case 3:
|
| - break;
|
| - case 4:
|
| - EXPECT_TRUE(m_layer->updated());
|
| - m_layerTreeHost->setNeedsCommit();
|
| - break;
|
| - case 5:
|
| - break;
|
| - case 6:
|
| - EXPECT_TRUE(m_layer->updated());
|
| - endTest();
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_implForEvictTextures = impl;
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - ++m_numCommits;
|
| - switch (m_numCommits) {
|
| - case 1:
|
| - case 2:
|
| - break;
|
| - case 3:
|
| - postEvictTextures();
|
| - break;
|
| - case 4:
|
| - // We couldn't check in didCommitAndDrawFrame on commit 3, so check here.
|
| - EXPECT_FALSE(m_layer->updated());
|
| - break;
|
| - case 5:
|
| - postEvictTextures();
|
| - break;
|
| - case 6:
|
| - // We couldn't check in didCommitAndDrawFrame on commit 5, so check here.
|
| - EXPECT_FALSE(m_layer->updated());
|
| - postEvictTextures();
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - m_layer->resetUpdated();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<EvictionTestLayer> m_layer;
|
| - CCLayerTreeHostImpl* m_implForEvictTextures;
|
| - int m_numCommits;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestEvictTextures, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestLostContextAfterEvictTextures : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestLostContextAfterEvictTextures()
|
| - : m_layer(EvictionTestLayer::create())
|
| - , m_implForEvictTextures(0)
|
| - , m_numCommits(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_layer);
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 20), IntSize(10, 20));
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 20), true);
|
| - }
|
| -
|
| - class EvictTexturesTask : public WebKit::WebThread::Task {
|
| - public:
|
| - EvictTexturesTask(CCLayerTreeHostTestLostContextAfterEvictTextures* test) : m_test(test) { }
|
| - virtual ~EvictTexturesTask() { }
|
| - virtual void run() OVERRIDE
|
| - {
|
| - m_test->evictTexturesOnImplThread();
|
| - }
|
| -
|
| - private:
|
| - CCLayerTreeHostTestLostContextAfterEvictTextures* m_test;
|
| - };
|
| -
|
| - void postEvictTextures()
|
| - {
|
| - if (webThread())
|
| - webThread()->postTask(new EvictTexturesTask(this));
|
| - else {
|
| - DebugScopedSetImplThread impl;
|
| - evictTexturesOnImplThread();
|
| - }
|
| - }
|
| -
|
| - void evictTexturesOnImplThread()
|
| - {
|
| - ASSERT(m_implForEvictTextures);
|
| - m_implForEvictTextures->releaseContentsTextures();
|
| - }
|
| -
|
| - // Commit 1: Just commit and draw normally, then at the end, set ourselves
|
| - // invisible (to prevent a commit that would recreate textures after
|
| - // eviction, before the context recovery), and post a task that will evict
|
| - // textures, then cause the context to be lost, and then set ourselves
|
| - // visible again (to allow commits, since that's what causes context
|
| - // recovery in single thread).
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - ++m_numCommits;
|
| - switch (m_numCommits) {
|
| - case 1:
|
| - EXPECT_TRUE(m_layer->updated());
|
| - m_layerTreeHost->setVisible(false);
|
| - postEvictTextures();
|
| - m_layerTreeHost->loseContext(1);
|
| - m_layerTreeHost->setVisible(true);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_implForEvictTextures = impl;
|
| - }
|
| -
|
| - virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE
|
| - {
|
| - EXPECT_TRUE(succeeded);
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<EvictionTestLayer> m_layer;
|
| - CCLayerTreeHostImpl* m_implForEvictTextures;
|
| - int m_numCommits;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestLostContextAfterEvictTextures)
|
| -
|
| -class CompositorFakeWebGraphicsContext3DWithEndQueryCausingLostContext : public WebKit::CompositorFakeWebGraphicsContext3D {
|
| -public:
|
| - static PassOwnPtr<CompositorFakeWebGraphicsContext3DWithEndQueryCausingLostContext> create(Attributes attrs)
|
| - {
|
| - return adoptPtr(new CompositorFakeWebGraphicsContext3DWithEndQueryCausingLostContext(attrs));
|
| - }
|
| -
|
| - virtual void setContextLostCallback(WebGraphicsContextLostCallback* callback) { m_contextLostCallback = callback; }
|
| - virtual bool isContextLost() { return m_isContextLost; }
|
| -
|
| - virtual void beginQueryEXT(GC3Denum, WebGLId) { }
|
| - virtual void endQueryEXT(GC3Denum)
|
| - {
|
| - // Lose context.
|
| - if (!m_isContextLost) {
|
| - m_contextLostCallback->onContextLost();
|
| - m_isContextLost = true;
|
| - }
|
| - }
|
| - virtual void getQueryObjectuivEXT(WebGLId, GC3Denum pname, GC3Duint* params)
|
| - {
|
| - // Context is lost. We need to behave as if result is available.
|
| - if (pname == Extensions3DChromium::QUERY_RESULT_AVAILABLE_EXT)
|
| - *params = 1;
|
| - }
|
| -
|
| -private:
|
| - explicit CompositorFakeWebGraphicsContext3DWithEndQueryCausingLostContext(Attributes attrs)
|
| - : CompositorFakeWebGraphicsContext3D(attrs)
|
| - , m_contextLostCallback(0)
|
| - , m_isContextLost(false) { }
|
| -
|
| - WebGraphicsContextLostCallback* m_contextLostCallback;
|
| - bool m_isContextLost;
|
| -};
|
| -
|
| -class CCLayerTreeHostTestLostContextWhileUpdatingResources : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestLostContextWhileUpdatingResources()
|
| - : m_parent(ContentLayerChromiumWithUpdateTracking::create(&m_client))
|
| - , m_numChildren(50)
|
| - {
|
| - for (int i = 0; i < m_numChildren; i++)
|
| - m_children.push_back(ContentLayerChromiumWithUpdateTracking::create(&m_client));
|
| - }
|
| -
|
| - virtual scoped_ptr<WebKit::WebCompositorOutputSurface> createOutputSurface()
|
| - {
|
| - return FakeWebCompositorOutputSurface::create(CompositorFakeWebGraphicsContext3DWithEndQueryCausingLostContext::create(WebGraphicsContext3D::Attributes())).PassAs<WebKit::WebCompositorOutputSurface>();
|
| - }
|
| -
|
| - virtual void beginTest()
|
| - {
|
| - m_layerTreeHost->setRootLayer(m_parent);
|
| - m_layerTreeHost->setViewportSize(IntSize(m_numChildren, 1), IntSize(m_numChildren, 1));
|
| -
|
| - WebTransformationMatrix identityMatrix;
|
| - setLayerPropertiesForTesting(m_parent.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(m_numChildren, 1), true);
|
| - for (int i = 0; i < m_numChildren; i++)
|
| - setLayerPropertiesForTesting(m_children[i].get(), m_parent.get(), identityMatrix, FloatPoint(0, 0), FloatPoint(i, 0), IntSize(1, 1), false);
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl)
|
| - {
|
| - endTest();
|
| - }
|
| -
|
| - virtual void layout()
|
| - {
|
| - m_parent->setNeedsDisplay();
|
| - for (int i = 0; i < m_numChildren; i++)
|
| - m_children[i]->setNeedsDisplay();
|
| - }
|
| -
|
| - virtual void afterTest()
|
| - {
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_client;
|
| - scoped_refptr<ContentLayerChromiumWithUpdateTracking> m_parent;
|
| - int m_numChildren;
|
| - std::vector<scoped_refptr<ContentLayerChromiumWithUpdateTracking> > m_children;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestLostContextWhileUpdatingResources, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestContinuousCommit : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestContinuousCommit()
|
| - : m_numCommitComplete(0)
|
| - , m_numDrawLayers(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - m_layerTreeHost->rootLayer()->setBounds(IntSize(10, 10));
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void didCommit() OVERRIDE
|
| - {
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - if (m_numDrawLayers == 1)
|
| - m_numCommitComplete++;
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_numDrawLayers++;
|
| - if (m_numDrawLayers == 2)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - // Check that we didn't commit twice between first and second draw.
|
| - EXPECT_EQ(1, m_numCommitComplete);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommitComplete;
|
| - int m_numDrawLayers;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestContinuousCommit, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestContinuousInvalidate : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestContinuousInvalidate()
|
| - : m_numCommitComplete(0)
|
| - , m_numDrawLayers(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - m_layerTreeHost->rootLayer()->setBounds(IntSize(10, 10));
|
| -
|
| - m_contentLayer = ContentLayerChromium::create(&m_mockDelegate);
|
| - m_contentLayer->setBounds(IntSize(10, 10));
|
| - m_contentLayer->setPosition(FloatPoint(0, 0));
|
| - m_contentLayer->setAnchorPoint(FloatPoint(0, 0));
|
| - m_contentLayer->setIsDrawable(true);
|
| - m_layerTreeHost->rootLayer()->addChild(m_contentLayer);
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void didCommit() OVERRIDE
|
| - {
|
| - m_contentLayer->setNeedsDisplay();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - if (m_numDrawLayers == 1)
|
| - m_numCommitComplete++;
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_numDrawLayers++;
|
| - if (m_numDrawLayers == 2)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - // Check that we didn't commit twice between first and second draw.
|
| - EXPECT_EQ(1, m_numCommitComplete);
|
| -
|
| - // Clear layer references so CCLayerTreeHost dies.
|
| - m_contentLayer = NULL;
|
| - }
|
| -
|
| -private:
|
| - MockContentLayerChromiumClient m_mockDelegate;
|
| - scoped_refptr<LayerChromium> m_contentLayer;
|
| - int m_numCommitComplete;
|
| - int m_numDrawLayers;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestContinuousInvalidate, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -class CCLayerTreeHostTestContinuousAnimate : public CCLayerTreeHostTest {
|
| -public:
|
| - CCLayerTreeHostTestContinuousAnimate()
|
| - : m_numCommitComplete(0)
|
| - , m_numDrawLayers(0)
|
| - {
|
| - }
|
| -
|
| - virtual void beginTest() OVERRIDE
|
| - {
|
| - m_layerTreeHost->setViewportSize(IntSize(10, 10), IntSize(10, 10));
|
| - m_layerTreeHost->rootLayer()->setBounds(IntSize(10, 10));
|
| -
|
| - postSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - virtual void animate(double) OVERRIDE
|
| - {
|
| - m_layerTreeHost->setNeedsAnimate();
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - m_layerTreeHost->rootLayer()->setNeedsDisplay();
|
| - }
|
| -
|
| - virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl*) OVERRIDE
|
| - {
|
| - if (m_numDrawLayers == 1)
|
| - m_numCommitComplete++;
|
| - }
|
| -
|
| - virtual void drawLayersOnCCThread(CCLayerTreeHostImpl* impl) OVERRIDE
|
| - {
|
| - m_numDrawLayers++;
|
| - if (m_numDrawLayers == 2)
|
| - endTest();
|
| - }
|
| -
|
| - virtual void afterTest() OVERRIDE
|
| - {
|
| - // Check that we didn't commit twice between first and second draw.
|
| - EXPECT_EQ(1, m_numCommitComplete);
|
| - }
|
| -
|
| -private:
|
| - int m_numCommitComplete;
|
| - int m_numDrawLayers;
|
| -};
|
| -
|
| -TEST_F(CCLayerTreeHostTestContinuousAnimate, runMultiThread)
|
| -{
|
| - runTest(true);
|
| -}
|
| -
|
| -} // namespace
|
|
|