diff options
Diffstat (limited to 'cc/texture_layer_unittest.cc')
-rw-r--r-- | cc/texture_layer_unittest.cc | 217 |
1 files changed, 216 insertions, 1 deletions
diff --git a/cc/texture_layer_unittest.cc b/cc/texture_layer_unittest.cc index c58ae90..85d90b2 100644 --- a/cc/texture_layer_unittest.cc +++ b/cc/texture_layer_unittest.cc @@ -4,11 +4,16 @@ #include "cc/texture_layer.h" +#include <string> + +#include "base/callback.h" #include "cc/layer_tree_host.h" +#include "cc/layer_tree_impl.h" #include "cc/single_thread_proxy.h" #include "cc/test/fake_impl_proxy.h" #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/fake_layer_tree_host_impl.h" +#include "cc/test/layer_tree_test_common.h" #include "cc/texture_layer_impl.h" #include "cc/thread.h" #include "testing/gmock/include/gmock/gmock.h" @@ -100,7 +105,7 @@ TEST_F(TextureLayerTest, syncImplWhenDrawing) scoped_refptr<TextureLayer> testLayer = TextureLayer::create(0); ASSERT_TRUE(testLayer); scoped_ptr<TextureLayerImpl> implLayer; - implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1); + implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, false); ASSERT_TRUE(implLayer); EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AnyNumber()); @@ -184,5 +189,215 @@ TEST_F(TextureLayerTest, syncImplWhenRemovingFromTree) Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); } +class MockMailboxCallback { +public: + MOCK_METHOD2(Release, void(const std::string& mailbox, unsigned syncPoint)); +}; + +struct CommonMailboxObjects { + CommonMailboxObjects() + : m_mailbox1(64, '1') + , m_mailbox2(64, '2') + { + m_releaseMailbox1 = base::Bind(&MockMailboxCallback::Release, + base::Unretained(&m_mockCallback), + m_mailbox1); + m_releaseMailbox2 = base::Bind(&MockMailboxCallback::Release, + base::Unretained(&m_mockCallback), + m_mailbox2); + } + + std::string m_mailbox1; + std::string m_mailbox2; + MockMailboxCallback m_mockCallback; + TextureLayer::MailboxCallback m_releaseMailbox1; + TextureLayer::MailboxCallback m_releaseMailbox2; +}; + +class TextureLayerWithMailboxTest : public TextureLayerTest { +protected: + virtual void TearDown() + { + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + TextureLayerTest::TearDown(); + } + + CommonMailboxObjects m_testData; +}; + +TEST_F(TextureLayerWithMailboxTest, replaceMailboxOnMainThreadBeforeCommit) +{ + scoped_refptr<TextureLayer> testLayer = TextureLayer::createForMailbox(); + ASSERT_TRUE(testLayer); + + EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); + EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AnyNumber()); + m_layerTreeHost->setRootLayer(testLayer); + Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); + + EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); + EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); + testLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); + Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); + + EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); + EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + testLayer->setTextureMailbox(m_testData.m_mailbox2, + m_testData.m_releaseMailbox2); + Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + + EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); + EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox2, _)).Times(1); + testLayer->setTextureMailbox(std::string(), + TextureLayer::MailboxCallback()); + Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + + // Test destructor. + EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); + testLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); +} + +class TextureLayerImplWithMailboxThreadedCallback : public ThreadedTest { +public: + TextureLayerImplWithMailboxThreadedCallback() + : m_resetMailbox(false) + { + } + + // Make sure callback is received on main and doesn't block the impl thread. + void releaseCallback(unsigned syncPoint) { + EXPECT_EQ(true, proxy()->isMainThread()); + endTest(); + } + + virtual void beginTest() OVERRIDE + { + m_layer = TextureLayer::createForMailbox(); + m_layer->setIsDrawable(true); + m_layerTreeHost->setRootLayer(m_layer); + m_layer->setTextureMailbox( + std::string(64, '1'), + base::Bind( + &TextureLayerImplWithMailboxThreadedCallback::releaseCallback, + base::Unretained(this))); + postSetNeedsCommitToMainThread(); + } + + virtual void didCommit() OVERRIDE + { + if (m_resetMailbox) + return; + + m_layer->setTextureMailbox(std::string(), + TextureLayer::MailboxCallback()); + m_resetMailbox = true; + } + + virtual void afterTest() OVERRIDE + { + } + +private: + bool m_resetMailbox; + scoped_refptr<TextureLayer> m_layer; +}; + +SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerImplWithMailboxThreadedCallback); + +class TextureLayerImplWithMailboxTest : public TextureLayerTest { +protected: + virtual void SetUp() + { + TextureLayerTest::SetUp(); + m_layerTreeHost.reset(new MockLayerImplTreeHost); + EXPECT_TRUE(m_hostImpl.initializeRenderer(createFakeOutputSurface())); + } + + CommonMailboxObjects m_testData; +}; + +TEST_F(TextureLayerImplWithMailboxTest, testImplLayerCallbacks) +{ + scoped_ptr<TextureLayerImpl> implLayer; + implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); + ASSERT_TRUE(implLayer); + + // Test setting identical mailbox. + EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); + implLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); + implLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + + // Test multiple commits without a draw. + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + implLayer->setTextureMailbox(m_testData.m_mailbox2, + m_testData.m_releaseMailbox2); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + + // Test resetting the mailbox. + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox2, _)).Times(1); + implLayer->setTextureMailbox(std::string(), + TextureLayer::MailboxCallback()); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + + // Test destructor. + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + implLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); +} + +TEST_F(TextureLayerImplWithMailboxTest, testDestructorCallbackOnCreatedResource) +{ + scoped_ptr<TextureLayerImpl> implLayer; + implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); + ASSERT_TRUE(implLayer); + + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + implLayer->setTextureMailbox(m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); + implLayer->willDraw(m_hostImpl.activeTree()->resource_provider()); + implLayer->didDraw(m_hostImpl.activeTree()->resource_provider()); + implLayer->setTextureMailbox(std::string(), + TextureLayer::MailboxCallback()); +} + +TEST_F(TextureLayerImplWithMailboxTest, testCallbackOnInUseResource) +{ + ResourceProvider *provider = m_hostImpl.activeTree()->resource_provider(); + ResourceProvider::ResourceId id = + provider->createResourceFromTextureMailbox( + m_testData.m_mailbox1, + m_testData.m_releaseMailbox1); + + // Transfer some resources to the parent. + ResourceProvider::ResourceIdArray resourceIdsToTransfer; + resourceIdsToTransfer.push_back(id); + TransferableResourceList list; + provider->prepareSendToParent(resourceIdsToTransfer, &list); + EXPECT_TRUE(provider->inUseByConsumer(id)); + EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); + provider->deleteResource(id); + Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); + EXPECT_CALL(m_testData.m_mockCallback, + Release(m_testData.m_mailbox1, _)).Times(1); + provider->receiveFromParent(list); +} + } // namespace } // namespace cc |