| Index: cc/CCThreadedTest.cpp
|
| diff --git a/cc/CCThreadedTest.cpp b/cc/CCThreadedTest.cpp
|
| deleted file mode 100644
|
| index 690c73686a36086dece4529bbe4d1925e77ac9dd..0000000000000000000000000000000000000000
|
| --- a/cc/CCThreadedTest.cpp
|
| +++ /dev/null
|
| @@ -1,567 +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 "CCThreadedTest.h"
|
| -
|
| -#include "CCActiveAnimation.h"
|
| -#include "CCAnimationTestCommon.h"
|
| -#include "CCInputHandler.h"
|
| -#include "CCLayerAnimationController.h"
|
| -#include "CCLayerImpl.h"
|
| -#include "CCLayerTreeHostImpl.h"
|
| -#include "CCOcclusionTrackerTestCommon.h"
|
| -#include "CCScopedThreadProxy.h"
|
| -#include "CCSingleThreadProxy.h"
|
| -#include "CCTextureUpdateQueue.h"
|
| -#include "CCThreadTask.h"
|
| -#include "CCTiledLayerTestCommon.h"
|
| -#include "CCTimingFunction.h"
|
| -#include "ContentLayerChromium.h"
|
| -#include "FakeWebCompositorOutputSurface.h"
|
| -#include "FakeWebGraphicsContext3D.h"
|
| -#include "LayerChromium.h"
|
| -#include "base/stl_util.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include <public/Platform.h>
|
| -#include <public/WebCompositorSupport.h>
|
| -#include <public/WebFilterOperation.h>
|
| -#include <public/WebFilterOperations.h>
|
| -#include <public/WebThread.h>
|
| -#include <wtf/Locker.h>
|
| -
|
| -using namespace cc;
|
| -using namespace WebKit;
|
| -
|
| -namespace WebKitTests {
|
| -
|
| -PassOwnPtr<CompositorFakeWebGraphicsContext3DWithTextureTracking> CompositorFakeWebGraphicsContext3DWithTextureTracking::create(Attributes attrs)
|
| -{
|
| - return adoptPtr(new CompositorFakeWebGraphicsContext3DWithTextureTracking(attrs));
|
| -}
|
| -
|
| -WebGLId CompositorFakeWebGraphicsContext3DWithTextureTracking::createTexture()
|
| -{
|
| - WebGLId texture = m_textures.size() + 1;
|
| - m_textures.append(texture);
|
| - return texture;
|
| -}
|
| -
|
| -void CompositorFakeWebGraphicsContext3DWithTextureTracking::deleteTexture(WebGLId texture)
|
| -{
|
| - for (size_t i = 0; i < m_textures.size(); i++) {
|
| - if (m_textures[i] == texture) {
|
| - m_textures.remove(i);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void CompositorFakeWebGraphicsContext3DWithTextureTracking::bindTexture(WGC3Denum /* target */, WebGLId texture)
|
| -{
|
| - m_usedTextures.insert(texture);
|
| -}
|
| -
|
| -int CompositorFakeWebGraphicsContext3DWithTextureTracking::numTextures() const { return static_cast<int>(m_textures.size()); }
|
| -int CompositorFakeWebGraphicsContext3DWithTextureTracking::texture(int i) const { return m_textures[i]; }
|
| -void CompositorFakeWebGraphicsContext3DWithTextureTracking::resetTextures() { m_textures.clear(); }
|
| -
|
| -int CompositorFakeWebGraphicsContext3DWithTextureTracking::numUsedTextures() const { return static_cast<int>(m_usedTextures.size()); }
|
| -bool CompositorFakeWebGraphicsContext3DWithTextureTracking::usedTexture(int texture) const
|
| -{
|
| - return ContainsKey(m_usedTextures, texture);
|
| -}
|
| -
|
| -void CompositorFakeWebGraphicsContext3DWithTextureTracking::resetUsedTextures() { m_usedTextures.clear(); }
|
| -
|
| -CompositorFakeWebGraphicsContext3DWithTextureTracking::CompositorFakeWebGraphicsContext3DWithTextureTracking(Attributes attrs) : CompositorFakeWebGraphicsContext3D(attrs)
|
| -{
|
| -}
|
| -
|
| -CompositorFakeWebGraphicsContext3DWithTextureTracking::~CompositorFakeWebGraphicsContext3DWithTextureTracking()
|
| -{
|
| -}
|
| -
|
| -bool TestHooks::prepareToDrawOnCCThread(cc::CCLayerTreeHostImpl*)
|
| -{
|
| - return true;
|
| -}
|
| -
|
| -scoped_ptr<WebCompositorOutputSurface> TestHooks::createOutputSurface()
|
| -{
|
| - return FakeWebCompositorOutputSurface::create(CompositorFakeWebGraphicsContext3DWithTextureTracking::create(WebGraphicsContext3D::Attributes())).PassAs<WebCompositorOutputSurface>();
|
| -}
|
| -
|
| -scoped_ptr<MockLayerTreeHostImpl> MockLayerTreeHostImpl::create(TestHooks* testHooks, const CCLayerTreeSettings& settings, CCLayerTreeHostImplClient* client)
|
| -{
|
| - return make_scoped_ptr(new MockLayerTreeHostImpl(testHooks, settings, client));
|
| -}
|
| -
|
| -void MockLayerTreeHostImpl::beginCommit()
|
| -{
|
| - CCLayerTreeHostImpl::beginCommit();
|
| - m_testHooks->beginCommitOnCCThread(this);
|
| -}
|
| -
|
| -void MockLayerTreeHostImpl::commitComplete()
|
| -{
|
| - CCLayerTreeHostImpl::commitComplete();
|
| - m_testHooks->commitCompleteOnCCThread(this);
|
| -}
|
| -
|
| -bool MockLayerTreeHostImpl::prepareToDraw(FrameData& frame)
|
| -{
|
| - bool result = CCLayerTreeHostImpl::prepareToDraw(frame);
|
| - if (!m_testHooks->prepareToDrawOnCCThread(this))
|
| - result = false;
|
| - return result;
|
| -}
|
| -
|
| -void MockLayerTreeHostImpl::drawLayers(const FrameData& frame)
|
| -{
|
| - CCLayerTreeHostImpl::drawLayers(frame);
|
| - m_testHooks->drawLayersOnCCThread(this);
|
| -}
|
| -
|
| -void MockLayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTime)
|
| -{
|
| - m_testHooks->willAnimateLayers(this, monotonicTime);
|
| - CCLayerTreeHostImpl::animateLayers(monotonicTime, wallClockTime);
|
| - m_testHooks->animateLayers(this, monotonicTime);
|
| -}
|
| -
|
| -base::TimeDelta MockLayerTreeHostImpl::lowFrequencyAnimationInterval() const
|
| -{
|
| - return base::TimeDelta::FromMilliseconds(16);
|
| -}
|
| -
|
| -MockLayerTreeHostImpl::MockLayerTreeHostImpl(TestHooks* testHooks, const CCLayerTreeSettings& settings, CCLayerTreeHostImplClient* client)
|
| - : CCLayerTreeHostImpl(settings, client)
|
| - , m_testHooks(testHooks)
|
| -{
|
| -}
|
| -
|
| -// Adapts CCLayerTreeHost for test. Injects MockLayerTreeHostImpl.
|
| -class MockLayerTreeHost : public cc::CCLayerTreeHost {
|
| -public:
|
| - static scoped_ptr<MockLayerTreeHost> create(TestHooks* testHooks, cc::CCLayerTreeHostClient* client, scoped_refptr<cc::LayerChromium> rootLayer, const cc::CCLayerTreeSettings& settings)
|
| - {
|
| - scoped_ptr<MockLayerTreeHost> layerTreeHost(new MockLayerTreeHost(testHooks, client, settings));
|
| - bool success = layerTreeHost->initialize();
|
| - EXPECT_TRUE(success);
|
| - layerTreeHost->setRootLayer(rootLayer);
|
| -
|
| - // LayerTreeHostImpl won't draw if it has 1x1 viewport.
|
| - layerTreeHost->setViewportSize(IntSize(1, 1), IntSize(1, 1));
|
| -
|
| - layerTreeHost->rootLayer()->setLayerAnimationDelegate(testHooks);
|
| -
|
| - return layerTreeHost.Pass();
|
| - }
|
| -
|
| - virtual scoped_ptr<cc::CCLayerTreeHostImpl> createLayerTreeHostImpl(cc::CCLayerTreeHostImplClient* client)
|
| - {
|
| - return MockLayerTreeHostImpl::create(m_testHooks, settings(), client).PassAs<cc::CCLayerTreeHostImpl>();
|
| - }
|
| -
|
| - virtual void didAddAnimation() OVERRIDE
|
| - {
|
| - CCLayerTreeHost::didAddAnimation();
|
| - m_testHooks->didAddAnimation();
|
| - }
|
| -
|
| -private:
|
| - MockLayerTreeHost(TestHooks* testHooks, cc::CCLayerTreeHostClient* client, const cc::CCLayerTreeSettings& settings)
|
| - : CCLayerTreeHost(client, settings)
|
| - , m_testHooks(testHooks)
|
| - {
|
| - }
|
| -
|
| - TestHooks* m_testHooks;
|
| -};
|
| -
|
| -// Implementation of CCLayerTreeHost callback interface.
|
| -class MockLayerTreeHostClient : public MockCCLayerTreeHostClient {
|
| -public:
|
| - static PassOwnPtr<MockLayerTreeHostClient> create(TestHooks* testHooks)
|
| - {
|
| - return adoptPtr(new MockLayerTreeHostClient(testHooks));
|
| - }
|
| -
|
| - virtual void willBeginFrame() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void didBeginFrame() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void animate(double monotonicTime) OVERRIDE
|
| - {
|
| - m_testHooks->animate(monotonicTime);
|
| - }
|
| -
|
| - virtual void layout() OVERRIDE
|
| - {
|
| - m_testHooks->layout();
|
| - }
|
| -
|
| - virtual void applyScrollAndScale(const IntSize& scrollDelta, float scale) OVERRIDE
|
| - {
|
| - m_testHooks->applyScrollAndScale(scrollDelta, scale);
|
| - }
|
| -
|
| - virtual scoped_ptr<WebCompositorOutputSurface> createOutputSurface() OVERRIDE
|
| - {
|
| - return m_testHooks->createOutputSurface();
|
| - }
|
| -
|
| - virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE
|
| - {
|
| - m_testHooks->didRecreateOutputSurface(succeeded);
|
| - }
|
| -
|
| - virtual scoped_ptr<CCInputHandler> createInputHandler() OVERRIDE
|
| - {
|
| - return scoped_ptr<CCInputHandler>();
|
| - }
|
| -
|
| - virtual void willCommit() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void didCommit() OVERRIDE
|
| - {
|
| - m_testHooks->didCommit();
|
| - }
|
| -
|
| - virtual void didCommitAndDrawFrame() OVERRIDE
|
| - {
|
| - m_testHooks->didCommitAndDrawFrame();
|
| - }
|
| -
|
| - virtual void didCompleteSwapBuffers() OVERRIDE
|
| - {
|
| - }
|
| -
|
| - virtual void scheduleComposite() OVERRIDE
|
| - {
|
| - m_testHooks->scheduleComposite();
|
| - }
|
| -
|
| -private:
|
| - explicit MockLayerTreeHostClient(TestHooks* testHooks) : m_testHooks(testHooks) { }
|
| -
|
| - TestHooks* m_testHooks;
|
| -};
|
| -
|
| -class TimeoutTask : public WebThread::Task {
|
| -public:
|
| - explicit TimeoutTask(CCThreadedTest* test)
|
| - : m_test(test)
|
| - {
|
| - }
|
| -
|
| - void clearTest()
|
| - {
|
| - m_test = 0;
|
| - }
|
| -
|
| - virtual ~TimeoutTask()
|
| - {
|
| - if (m_test)
|
| - m_test->clearTimeout();
|
| - }
|
| -
|
| - virtual void run()
|
| - {
|
| - if (m_test)
|
| - m_test->timeout();
|
| - }
|
| -
|
| -private:
|
| - CCThreadedTest* m_test;
|
| -};
|
| -
|
| -class BeginTask : public WebThread::Task {
|
| -public:
|
| - explicit BeginTask(CCThreadedTest* test)
|
| - : m_test(test)
|
| - {
|
| - }
|
| -
|
| - virtual ~BeginTask() { }
|
| - virtual void run()
|
| - {
|
| - m_test->doBeginTest();
|
| - }
|
| -private:
|
| - CCThreadedTest* m_test;
|
| -};
|
| -
|
| -CCThreadedTest::CCThreadedTest()
|
| - : m_beginning(false)
|
| - , m_endWhenBeginReturns(false)
|
| - , m_timedOut(false)
|
| - , m_finished(false)
|
| - , m_scheduled(false)
|
| - , m_started(false)
|
| -{
|
| -}
|
| -
|
| -CCThreadedTest::~CCThreadedTest()
|
| -{
|
| -}
|
| -
|
| -void CCThreadedTest::endTest()
|
| -{
|
| - m_finished = true;
|
| -
|
| - // For the case where we endTest during beginTest(), set a flag to indicate that
|
| - // the test should end the second beginTest regains control.
|
| - if (m_beginning)
|
| - m_endWhenBeginReturns = true;
|
| - else
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::realEndTest));
|
| -}
|
| -
|
| -void CCThreadedTest::endTestAfterDelay(int delayMilliseconds)
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::endTest));
|
| -}
|
| -
|
| -void CCThreadedTest::postSetNeedsAnimateToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchSetNeedsAnimate));
|
| -}
|
| -
|
| -void CCThreadedTest::postAddAnimationToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchAddAnimation));
|
| -}
|
| -
|
| -void CCThreadedTest::postAddInstantAnimationToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchAddInstantAnimation));
|
| -}
|
| -
|
| -void CCThreadedTest::postSetNeedsCommitToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchSetNeedsCommit));
|
| -}
|
| -
|
| -void CCThreadedTest::postAcquireLayerTextures()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchAcquireLayerTextures));
|
| -}
|
| -
|
| -void CCThreadedTest::postSetNeedsRedrawToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchSetNeedsRedraw));
|
| -}
|
| -
|
| -void CCThreadedTest::postSetNeedsAnimateAndCommitToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchSetNeedsAnimateAndCommit));
|
| -}
|
| -
|
| -void CCThreadedTest::postSetVisibleToMainThread(bool visible)
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchSetVisible, visible));
|
| -}
|
| -
|
| -void CCThreadedTest::postDidAddAnimationToMainThread()
|
| -{
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchDidAddAnimation));
|
| -}
|
| -
|
| -void CCThreadedTest::doBeginTest()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| - m_client = MockLayerTreeHostClient::create(this);
|
| -
|
| - scoped_refptr<LayerChromium> rootLayer = LayerChromium::create();
|
| - m_layerTreeHost = MockLayerTreeHost::create(this, m_client.get(), rootLayer, m_settings);
|
| - ASSERT_TRUE(m_layerTreeHost.get());
|
| - rootLayer->setLayerTreeHost(m_layerTreeHost.get());
|
| - m_layerTreeHost->setSurfaceReady();
|
| -
|
| - m_started = true;
|
| - m_beginning = true;
|
| - beginTest();
|
| - m_beginning = false;
|
| - if (m_endWhenBeginReturns)
|
| - realEndTest();
|
| -}
|
| -
|
| -void CCThreadedTest::timeout()
|
| -{
|
| - m_timedOut = true;
|
| - endTest();
|
| -}
|
| -
|
| -void CCThreadedTest::scheduleComposite()
|
| -{
|
| - if (!m_started || m_scheduled || m_finished)
|
| - return;
|
| - m_scheduled = true;
|
| - m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadedTest::dispatchComposite));
|
| -}
|
| -
|
| -void CCThreadedTest::realEndTest()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| - WebKit::Platform::current()->currentThread()->exitRunLoop();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchSetNeedsAnimate()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->setNeedsAnimate();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchAddInstantAnimation()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer())
|
| - addOpacityTransitionToLayer(*m_layerTreeHost->rootLayer(), 0, 0, 0.5, false);
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchAddAnimation()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer())
|
| - addOpacityTransitionToLayer(*m_layerTreeHost->rootLayer(), 10, 0, 0.5, true);
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchSetNeedsAnimateAndCommit()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get()) {
|
| - m_layerTreeHost->setNeedsAnimate();
|
| - m_layerTreeHost->setNeedsCommit();
|
| - }
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchSetNeedsCommit()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->setNeedsCommit();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchAcquireLayerTextures()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->acquireLayerTextures();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchSetNeedsRedraw()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->setNeedsRedraw();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchSetVisible(bool visible)
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->setVisible(visible);
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchComposite()
|
| -{
|
| - m_scheduled = false;
|
| - if (m_layerTreeHost.get() && !m_finished)
|
| - m_layerTreeHost->composite();
|
| -}
|
| -
|
| -void CCThreadedTest::dispatchDidAddAnimation()
|
| -{
|
| - ASSERT(CCProxy::isMainThread());
|
| -
|
| - if (m_finished)
|
| - return;
|
| -
|
| - if (m_layerTreeHost.get())
|
| - m_layerTreeHost->didAddAnimation();
|
| -}
|
| -
|
| -void CCThreadedTest::runTest(bool threaded)
|
| -{
|
| - // For these tests, we will enable threaded animations.
|
| - Platform::current()->compositorSupport()->setAcceleratedAnimationEnabled(true);
|
| -
|
| - if (threaded) {
|
| - m_webThread = adoptPtr(WebKit::Platform::current()->createThread("CCThreadedTest"));
|
| - Platform::current()->compositorSupport()->initialize(m_webThread.get());
|
| - } else
|
| - Platform::current()->compositorSupport()->initialize(0);
|
| -
|
| - ASSERT(CCProxy::isMainThread());
|
| - m_mainThreadProxy = CCScopedThreadProxy::create(CCProxy::mainThread());
|
| -
|
| - initializeSettings(m_settings);
|
| -
|
| - m_beginTask = new BeginTask(this);
|
| - WebKit::Platform::current()->currentThread()->postDelayedTask(m_beginTask, 0); // postDelayedTask takes ownership of the task
|
| - m_timeoutTask = new TimeoutTask(this);
|
| - WebKit::Platform::current()->currentThread()->postDelayedTask(m_timeoutTask, 5000);
|
| - WebKit::Platform::current()->currentThread()->enterRunLoop();
|
| -
|
| - if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer())
|
| - m_layerTreeHost->rootLayer()->setLayerTreeHost(0);
|
| - m_layerTreeHost.reset();
|
| -
|
| - if (m_timeoutTask)
|
| - m_timeoutTask->clearTest();
|
| -
|
| - ASSERT_FALSE(m_layerTreeHost.get());
|
| - m_client.clear();
|
| - if (m_timedOut) {
|
| - FAIL() << "Test timed out";
|
| - Platform::current()->compositorSupport()->shutdown();
|
| - return;
|
| - }
|
| - afterTest();
|
| - Platform::current()->compositorSupport()->shutdown();
|
| -}
|
| -
|
| -} // namespace WebKitTests
|
|
|