diff options
author | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 17:16:51 +0000 |
---|---|---|
committer | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 17:16:51 +0000 |
commit | a574ec775db7c734c8f5927295d4ca9fea284dc5 (patch) | |
tree | 6e7bfba2bc7dc39647fe7bdd75b8069e657ba9e8 /cc/layers/texture_layer_unittest.cc | |
parent | 1694a12439a6de8c75f6caa0a5eb72bde47c838f (diff) | |
download | chromium_src-a574ec775db7c734c8f5927295d4ca9fea284dc5.zip chromium_src-a574ec775db7c734c8f5927295d4ca9fea284dc5.tar.gz chromium_src-a574ec775db7c734c8f5927295d4ca9fea284dc5.tar.bz2 |
Revert 261380 "cc: Remove TextureLayer::SetTextureId and Texture..."
[Reason for revert: failure in WindowUtilTest.RecreateLayers
in test suite wm_core_unittests
on bot Linux ChromiumOS Tests (dbg)(1) Build]
> cc: Remove TextureLayer::SetTextureId and TextureLayer::WillModifyTexture
>
> These are not used anymore except for clearing the client-provided texture, so
> this removes 1 of 4 TextureLayer paths, and simplifies externally-exposed state.
>
> BUG=337922
>
> Review URL: https://codereview.chromium.org/213743005
TBR=piman@chromium.org
Review URL: https://codereview.chromium.org/224153003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261460 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layers/texture_layer_unittest.cc')
-rw-r--r-- | cc/layers/texture_layer_unittest.cc | 321 |
1 files changed, 121 insertions, 200 deletions
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index e385f1b2..e037693 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc @@ -37,7 +37,6 @@ using ::testing::Mock; using ::testing::_; using ::testing::AtLeast; using ::testing::AnyNumber; -using ::testing::InvokeWithoutArgs; namespace cc { namespace { @@ -62,93 +61,6 @@ class MockLayerTreeHost : public LayerTreeHost { MOCK_METHOD0(StopRateLimiter, void()); }; -class FakeTextureLayerClient : public TextureLayerClient { - public: - FakeTextureLayerClient() : texture_(0), mailbox_changed_(true) {} - - virtual unsigned PrepareTexture() OVERRIDE { return texture_; } - - virtual bool PrepareTextureMailbox( - TextureMailbox* mailbox, - scoped_ptr<SingleReleaseCallback>* release_callback, - bool use_shared_memory) OVERRIDE { - if (!mailbox_changed_) - return false; - - *mailbox = mailbox_; - *release_callback = release_callback_.Pass(); - mailbox_changed_ = false; - return true; - } - - void set_texture(unsigned texture) { texture_ = texture; } - - void set_mailbox(const TextureMailbox& mailbox, - scoped_ptr<SingleReleaseCallback> release_callback) { - mailbox_ = mailbox; - release_callback_ = release_callback.Pass(); - mailbox_changed_ = true; - } - - private: - unsigned texture_; - TextureMailbox mailbox_; - scoped_ptr<SingleReleaseCallback> release_callback_; - bool mailbox_changed_; - DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); -}; - -class MockMailboxCallback { - public: - MOCK_METHOD3(Release, - void(const gpu::Mailbox& mailbox, - uint32 sync_point, - bool lost_resource)); - MOCK_METHOD3(Release2, - void(base::SharedMemory* shared_memory, - uint32 sync_point, - bool lost_resource)); -}; - -struct CommonMailboxObjects { - CommonMailboxObjects() - : mailbox_name1_(MailboxFromChar('1')), - mailbox_name2_(MailboxFromChar('2')), - sync_point1_(1), - sync_point2_(2), - shared_memory_(new base::SharedMemory) { - release_mailbox1_ = base::Bind(&MockMailboxCallback::Release, - base::Unretained(&mock_callback_), - mailbox_name1_); - release_mailbox2_ = base::Bind(&MockMailboxCallback::Release, - base::Unretained(&mock_callback_), - mailbox_name2_); - const uint32 arbitrary_target1 = GL_TEXTURE_2D; - const uint32 arbitrary_target2 = GL_TEXTURE_EXTERNAL_OES; - mailbox1_ = TextureMailbox(mailbox_name1_, arbitrary_target1, sync_point1_); - mailbox2_ = TextureMailbox(mailbox_name2_, arbitrary_target2, sync_point2_); - gfx::Size size(128, 128); - EXPECT_TRUE(shared_memory_->CreateAndMapAnonymous(4 * size.GetArea())); - release_mailbox3_ = base::Bind(&MockMailboxCallback::Release2, - base::Unretained(&mock_callback_), - shared_memory_.get()); - mailbox3_ = TextureMailbox(shared_memory_.get(), size); - } - - gpu::Mailbox mailbox_name1_; - gpu::Mailbox mailbox_name2_; - MockMailboxCallback mock_callback_; - ReleaseCallback release_mailbox1_; - ReleaseCallback release_mailbox2_; - ReleaseCallback release_mailbox3_; - TextureMailbox mailbox1_; - TextureMailbox mailbox2_; - TextureMailbox mailbox3_; - uint32 sync_point1_; - uint32 sync_point2_; - scoped_ptr<base::SharedMemory> shared_memory_; -}; - class TextureLayerTest : public testing::Test { public: TextureLayerTest() @@ -159,9 +71,6 @@ class TextureLayerTest : public testing::Test { protected: virtual void SetUp() { layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_)); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); - layer_tree_host_->SetViewportSize(gfx::Size(10, 10)); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); } virtual void TearDown() { @@ -180,155 +89,96 @@ class TextureLayerTest : public testing::Test { FakeLayerTreeHostImpl host_impl_; }; -TEST_F(TextureLayerTest, SyncImplWhenClearingTexture) { - scoped_ptr<TestWebGraphicsContext3D> context( - TestWebGraphicsContext3D::Create()); - FakeTextureLayerClient client; - scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(&client); +TEST_F(TextureLayerTest, SyncImplWhenChangingTextureId) { + scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(NULL); ASSERT_TRUE(test_layer.get()); - test_layer->SetIsDrawable(true); - test_layer->SetBounds(gfx::Size(10, 10)); - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AnyNumber()); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); layer_tree_host_->SetRootLayer(test_layer); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get()); - // Clearing the texture before we gave one should not sync. EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); - test_layer->ClearTexture(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - // Give a texture to the layer through the client. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); - client.set_texture(context->createTexture()); - test_layer->SetNeedsDisplay(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Force a commit. - layer_tree_host_->Composite(base::TimeTicks()); - - // Clearing the texture should sync. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->ClearTexture(); + test_layer->SetTextureId(1); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // But only once. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); - test_layer->ClearTexture(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - // Force a commit to give another texture. - EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); - test_layer->SetNeedsDisplay(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - layer_tree_host_->Composite(base::TimeTicks()); - - // Make undrawable and commit. + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->SetIsDrawable(false); + test_layer->SetTextureId(2); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - layer_tree_host_->Composite(base::TimeTicks()); - // Clearing textures should not sync. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->ClearTexture(); + test_layer->SetTextureId(0); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); } -TEST_F(TextureLayerTest, SyncImplWhenClearingMailbox) { - CommonMailboxObjects mailboxes; - FakeTextureLayerClient client; - scoped_refptr<TextureLayer> test_layer = - TextureLayer::CreateForMailbox(&client); +TEST_F(TextureLayerTest, SyncImplWhenDrawing) { + gfx::RectF dirty_rect(0.f, 0.f, 1.f, 1.f); + + scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(NULL); ASSERT_TRUE(test_layer.get()); - test_layer->SetIsDrawable(true); - test_layer->SetBounds(gfx::Size(10, 10)); - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); + scoped_ptr<TextureLayerImpl> impl_layer; + impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); + ASSERT_TRUE(impl_layer); + + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AnyNumber()); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); layer_tree_host_->SetRootLayer(test_layer); + test_layer->SetTextureId(1); + test_layer->SetIsDrawable(true); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get()); - // Clearing the mailbox before we gave one should not sync. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->ClearTexture(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - // Give a mailbox to the layer through the client. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - client.set_mailbox( - mailboxes.mailbox1_, - SingleReleaseCallback::Create(mailboxes.release_mailbox1_)); - EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); - test_layer->SetNeedsDisplay(); + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(1); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); + test_layer->WillModifyTexture(); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Force a commit. - layer_tree_host_->Composite(base::TimeTicks()); - // Clearing the mailbox should not sync. EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->ClearTexture(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - // Commit will return mailbox1. - EXPECT_CALL(mailboxes.mock_callback_, - Release(mailboxes.mailbox_name1_, _, false)); - layer_tree_host_->Composite(base::TimeTicks()); + EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(1); + test_layer->SetNeedsDisplayRect(dirty_rect); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Force a commit to give another mailbox. EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - client.set_mailbox( - mailboxes.mailbox2_, - SingleReleaseCallback::Create(mailboxes.release_mailbox2_)); - EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); - test_layer->SetNeedsDisplay(); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - layer_tree_host_->Composite(base::TimeTicks()); - - // Make undrawable and commit. - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + test_layer->PushPropertiesTo(impl_layer.get()); // fake commit test_layer->SetIsDrawable(false); - layer_tree_host_->Composite(base::TimeTicks()); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Clearing textures should not sync. - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); - test_layer->ClearTexture(); + // Verify that non-drawable layers don't signal the compositor, + // except for the first draw after last commit, which must acquire + // the texture. + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(1); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); + test_layer->WillModifyTexture(); + test_layer->SetNeedsDisplayRect(dirty_rect); + test_layer->PushPropertiesTo(impl_layer.get()); // fake commit Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Commit will return the mailbox. - EXPECT_CALL(mailboxes.mock_callback_, - Release(mailboxes.mailbox_name2_, _, false)); - layer_tree_host_->Composite(base::TimeTicks()); + // Second draw with layer in non-drawable state: no texture + // acquisition. + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); + test_layer->WillModifyTexture(); + test_layer->SetNeedsDisplayRect(dirty_rect); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); } TEST_F(TextureLayerTest, SyncImplWhenRemovingFromTree) { - scoped_ptr<TestWebGraphicsContext3D> context( - TestWebGraphicsContext3D::Create()); scoped_refptr<Layer> root_layer = Layer::Create(); ASSERT_TRUE(root_layer.get()); scoped_refptr<Layer> child_layer = Layer::Create(); ASSERT_TRUE(child_layer.get()); root_layer->AddChild(child_layer); - FakeTextureLayerClient client; - scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(&client); - test_layer->SetIsDrawable(true); - test_layer->SetBounds(gfx::Size(10, 10)); + scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(NULL); ASSERT_TRUE(test_layer.get()); + test_layer->SetTextureId(0); child_layer->AddChild(test_layer); - EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AnyNumber()); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); layer_tree_host_->SetRootLayer(root_layer); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); @@ -343,14 +193,10 @@ TEST_F(TextureLayerTest, SyncImplWhenRemovingFromTree) { child_layer->AddChild(test_layer); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Give a texture to the layer through the client. EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); - EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); - client.set_texture(context->createTexture()); - test_layer->SetNeedsDisplay(); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + test_layer->SetTextureId(1); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - // Force a commit. - layer_tree_host_->Composite(base::TimeTicks()); EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); @@ -371,6 +217,10 @@ TEST_F(TextureLayerTest, CheckPropertyChangeCausesCorrectBehavior) { 0.5f, 0.5f, 0.5f, 0.5f)); EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPremultipliedAlpha(false)); EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendBackgroundColor(true)); + EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTextureId(1)); + + // Calling SetTextureId can call AcquireLayerTextures. + EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AnyNumber()); } TEST_F(TextureLayerTest, VisibleContentOpaqueRegion) { @@ -400,6 +250,27 @@ TEST_F(TextureLayerTest, VisibleContentOpaqueRegion) { layer->VisibleContentOpaqueRegion().ToString()); } +class FakeTextureLayerClient : public TextureLayerClient { + public: + FakeTextureLayerClient() {} + + virtual unsigned PrepareTexture() OVERRIDE { + return 0; + } + + virtual bool PrepareTextureMailbox( + TextureMailbox* mailbox, + scoped_ptr<SingleReleaseCallback>* release_callback, + bool use_shared_memory) OVERRIDE { + *mailbox = TextureMailbox(); + *release_callback = scoped_ptr<SingleReleaseCallback>(); + return true; + } + + private: + DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); +}; + TEST_F(TextureLayerTest, RateLimiter) { FakeTextureLayerClient client; scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox( @@ -445,11 +316,61 @@ TEST_F(TextureLayerTest, RateLimiter) { // Stop rate limiter when we're removed from the tree. EXPECT_CALL(*layer_tree_host_, StopRateLimiter()); - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); layer_tree_host_->SetRootLayer(NULL); Mock::VerifyAndClearExpectations(layer_tree_host_.get()); } +class MockMailboxCallback { + public: + MOCK_METHOD3(Release, + void(const gpu::Mailbox& mailbox, + uint32 sync_point, + bool lost_resource)); + MOCK_METHOD3(Release2, + void(base::SharedMemory* shared_memory, + uint32 sync_point, + bool lost_resource)); +}; + +struct CommonMailboxObjects { + CommonMailboxObjects() + : mailbox_name1_(MailboxFromChar('1')), + mailbox_name2_(MailboxFromChar('2')), + sync_point1_(1), + sync_point2_(2), + shared_memory_(new base::SharedMemory) { + release_mailbox1_ = base::Bind(&MockMailboxCallback::Release, + base::Unretained(&mock_callback_), + mailbox_name1_); + release_mailbox2_ = base::Bind(&MockMailboxCallback::Release, + base::Unretained(&mock_callback_), + mailbox_name2_); + const uint32 arbitrary_target1 = 1; + const uint32 arbitrary_target2 = 2; + mailbox1_ = TextureMailbox(mailbox_name1_, arbitrary_target1, sync_point1_); + mailbox2_ = TextureMailbox(mailbox_name2_, arbitrary_target2, sync_point2_); + gfx::Size size(128, 128); + EXPECT_TRUE(shared_memory_->CreateAndMapAnonymous(4 * size.GetArea())); + release_mailbox3_ = base::Bind(&MockMailboxCallback::Release2, + base::Unretained(&mock_callback_), + shared_memory_.get()); + mailbox3_ = TextureMailbox(shared_memory_.get(), size); + } + + gpu::Mailbox mailbox_name1_; + gpu::Mailbox mailbox_name2_; + MockMailboxCallback mock_callback_; + ReleaseCallback release_mailbox1_; + ReleaseCallback release_mailbox2_; + ReleaseCallback release_mailbox3_; + TextureMailbox mailbox1_; + TextureMailbox mailbox2_; + TextureMailbox mailbox3_; + uint32 sync_point1_; + uint32 sync_point2_; + scoped_ptr<base::SharedMemory> shared_memory_; +}; + class TestMailboxHolder : public TextureLayer::TextureMailboxHolder { public: using TextureLayer::TextureMailboxHolder::Create; |