| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layers/texture_layer.h" | 5 #include "cc/layers/texture_layer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); | 336 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); |
| 337 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 337 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 338 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 338 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 339 | 339 |
| 340 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 340 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 341 EXPECT_CALL(test_data_.mock_callback_, | 341 EXPECT_CALL(test_data_.mock_callback_, |
| 342 Release(test_data_.mailbox_name2_, | 342 Release(test_data_.mailbox_name2_, |
| 343 test_data_.sync_point2_, | 343 test_data_.sync_point2_, |
| 344 false)) | 344 false)) |
| 345 .Times(1); | 345 .Times(1); |
| 346 test_layer->SetTextureMailbox(TextureMailbox(), | 346 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 347 scoped_ptr<SingleReleaseCallback>()); | |
| 348 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 347 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 349 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 348 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 350 | 349 |
| 351 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 350 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 352 test_layer->SetTextureMailbox( | 351 test_layer->SetTextureMailbox( |
| 353 test_data_.mailbox3_, | 352 test_data_.mailbox3_, |
| 354 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); | 353 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); |
| 355 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 354 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 356 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 355 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 357 | 356 |
| 358 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 357 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 359 EXPECT_CALL(test_data_.mock_callback_, | 358 EXPECT_CALL(test_data_.mock_callback_, |
| 360 Release2(test_data_.shared_memory_.get(), | 359 Release2(test_data_.shared_memory_.get(), |
| 361 0, false)) | 360 0, false)) |
| 362 .Times(1); | 361 .Times(1); |
| 363 test_layer->SetTextureMailbox(TextureMailbox(), | 362 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 364 scoped_ptr<SingleReleaseCallback>()); | |
| 365 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 363 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 366 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 364 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 367 | 365 |
| 368 // Test destructor. | 366 // Test destructor. |
| 369 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 367 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 370 test_layer->SetTextureMailbox( | 368 test_layer->SetTextureMailbox( |
| 371 test_data_.mailbox1_, | 369 test_data_.mailbox1_, |
| 372 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 370 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
| 373 } | 371 } |
| 374 | 372 |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 EXPECT_EQ(2, callback_count_); | 764 EXPECT_EQ(2, callback_count_); |
| 767 // Case #3: change mailbox when the layer doesn't draw. The old | 765 // Case #3: change mailbox when the layer doesn't draw. The old |
| 768 // mailbox should be released during the next commit. | 766 // mailbox should be released during the next commit. |
| 769 layer_->SetBounds(gfx::Size()); | 767 layer_->SetBounds(gfx::Size()); |
| 770 SetMailbox('4'); | 768 SetMailbox('4'); |
| 771 break; | 769 break; |
| 772 case 3: | 770 case 3: |
| 773 EXPECT_EQ(3, callback_count_); | 771 EXPECT_EQ(3, callback_count_); |
| 774 // Case #4: release mailbox that was committed but never drawn. The | 772 // Case #4: release mailbox that was committed but never drawn. The |
| 775 // old mailbox should be released during the next commit. | 773 // old mailbox should be released during the next commit. |
| 776 layer_->SetTextureMailbox(TextureMailbox(), | 774 layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
| 777 scoped_ptr<SingleReleaseCallback>()); | |
| 778 break; | 775 break; |
| 779 case 4: | 776 case 4: |
| 780 if (layer_tree_host()->settings().impl_side_painting) { | 777 if (layer_tree_host()->settings().impl_side_painting) { |
| 781 // With impl painting, the texture mailbox will still be on the impl | 778 // With impl painting, the texture mailbox will still be on the impl |
| 782 // thread when the commit finishes, because the layer is not drawble | 779 // thread when the commit finishes, because the layer is not drawble |
| 783 // when it has no texture mailbox, and thus does not block the commit | 780 // when it has no texture mailbox, and thus does not block the commit |
| 784 // on activation. So, we wait for activation. | 781 // on activation. So, we wait for activation. |
| 785 // TODO(danakj): fix this. crbug.com/277953 | 782 // TODO(danakj): fix this. crbug.com/277953 |
| 786 layer_tree_host()->SetNeedsCommit(); | 783 layer_tree_host()->SetNeedsCommit(); |
| 787 break; | 784 break; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 806 // block the commit on activation anymore. So, we wait for activation. | 803 // block the commit on activation anymore. So, we wait for activation. |
| 807 // TODO(danakj): fix this. crbug.com/277953 | 804 // TODO(danakj): fix this. crbug.com/277953 |
| 808 layer_tree_host()->SetNeedsCommit(); | 805 layer_tree_host()->SetNeedsCommit(); |
| 809 break; | 806 break; |
| 810 } else { | 807 } else { |
| 811 ++commit_count_; | 808 ++commit_count_; |
| 812 } | 809 } |
| 813 case 8: | 810 case 8: |
| 814 EXPECT_EQ(4, callback_count_); | 811 EXPECT_EQ(4, callback_count_); |
| 815 // Resetting the mailbox will call the callback now. | 812 // Resetting the mailbox will call the callback now. |
| 816 layer_->SetTextureMailbox(TextureMailbox(), | 813 layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
| 817 scoped_ptr<SingleReleaseCallback>()); | |
| 818 EXPECT_EQ(5, callback_count_); | 814 EXPECT_EQ(5, callback_count_); |
| 819 EndTest(); | 815 EndTest(); |
| 820 break; | 816 break; |
| 821 default: | 817 default: |
| 822 NOTREACHED(); | 818 NOTREACHED(); |
| 823 break; | 819 break; |
| 824 } | 820 } |
| 825 } | 821 } |
| 826 | 822 |
| 827 virtual void AfterTest() override {} | 823 virtual void AfterTest() override {} |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 964 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 969 impl_layer->SetTextureMailbox( | 965 impl_layer->SetTextureMailbox( |
| 970 test_data_.mailbox1_, | 966 test_data_.mailbox1_, |
| 971 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 967 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 972 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 968 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
| 973 } | 969 } |
| 974 | 970 |
| 975 { | 971 { |
| 976 scoped_ptr<TextureLayerImpl> impl_layer = | 972 scoped_ptr<TextureLayerImpl> impl_layer = |
| 977 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 973 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 978 impl_layer->SetTextureMailbox(TextureMailbox(), | 974 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 979 scoped_ptr<SingleReleaseCallbackImpl>()); | |
| 980 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 975 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
| 981 } | 976 } |
| 982 | 977 |
| 983 { | 978 { |
| 984 // Software resource. | 979 // Software resource. |
| 985 scoped_ptr<TextureLayerImpl> impl_layer = | 980 scoped_ptr<TextureLayerImpl> impl_layer = |
| 986 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 981 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 987 impl_layer->SetTextureMailbox( | 982 impl_layer->SetTextureMailbox( |
| 988 test_data_.mailbox3_, | 983 test_data_.mailbox3_, |
| 989 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_)); | 984 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_)); |
| 990 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 985 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
| 991 } | 986 } |
| 992 | 987 |
| 993 // Software mode. | 988 // Software mode. |
| 994 { | 989 { |
| 995 scoped_ptr<TextureLayerImpl> impl_layer = | 990 scoped_ptr<TextureLayerImpl> impl_layer = |
| 996 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 991 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 997 impl_layer->SetTextureMailbox( | 992 impl_layer->SetTextureMailbox( |
| 998 test_data_.mailbox1_, | 993 test_data_.mailbox1_, |
| 999 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 994 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 1000 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | 995 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); |
| 1001 } | 996 } |
| 1002 | 997 |
| 1003 { | 998 { |
| 1004 scoped_ptr<TextureLayerImpl> impl_layer = | 999 scoped_ptr<TextureLayerImpl> impl_layer = |
| 1005 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 1000 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 1006 impl_layer->SetTextureMailbox(TextureMailbox(), | 1001 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 1007 scoped_ptr<SingleReleaseCallbackImpl>()); | |
| 1008 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | 1002 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); |
| 1009 } | 1003 } |
| 1010 | 1004 |
| 1011 { | 1005 { |
| 1012 // Software resource. | 1006 // Software resource. |
| 1013 scoped_ptr<TextureLayerImpl> impl_layer = | 1007 scoped_ptr<TextureLayerImpl> impl_layer = |
| 1014 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 1008 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 1015 impl_layer->SetTextureMailbox( | 1009 impl_layer->SetTextureMailbox( |
| 1016 test_data_.mailbox3_, | 1010 test_data_.mailbox3_, |
| 1017 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_)); | 1011 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 | 1059 |
| 1066 EXPECT_CALL(test_data_.mock_callback_, | 1060 EXPECT_CALL(test_data_.mock_callback_, |
| 1067 ReleaseImpl(test_data_.mailbox_name2_, _, false, _)).Times(1); | 1061 ReleaseImpl(test_data_.mailbox_name2_, _, false, _)).Times(1); |
| 1068 pending_layer->PushPropertiesTo(active_layer.get()); | 1062 pending_layer->PushPropertiesTo(active_layer.get()); |
| 1069 active_layer->DidBecomeActive(); | 1063 active_layer->DidBecomeActive(); |
| 1070 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 1064 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 1071 | 1065 |
| 1072 // Test resetting the mailbox. | 1066 // Test resetting the mailbox. |
| 1073 EXPECT_CALL(test_data_.mock_callback_, | 1067 EXPECT_CALL(test_data_.mock_callback_, |
| 1074 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); | 1068 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); |
| 1075 pending_layer->SetTextureMailbox(TextureMailbox(), | 1069 pending_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 1076 scoped_ptr<SingleReleaseCallbackImpl>()); | |
| 1077 pending_layer->PushPropertiesTo(active_layer.get()); | 1070 pending_layer->PushPropertiesTo(active_layer.get()); |
| 1078 active_layer->DidBecomeActive(); | 1071 active_layer->DidBecomeActive(); |
| 1079 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 1072 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 1080 | 1073 |
| 1081 // Test destructor. | 1074 // Test destructor. |
| 1082 EXPECT_CALL( | 1075 EXPECT_CALL( |
| 1083 test_data_.mock_callback_, | 1076 test_data_.mock_callback_, |
| 1084 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_point1_, false, _)) | 1077 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_point1_, false, _)) |
| 1085 .Times(1); | 1078 .Times(1); |
| 1086 pending_layer->SetTextureMailbox( | 1079 pending_layer->SetTextureMailbox( |
| 1087 test_data_.mailbox1_, | 1080 test_data_.mailbox1_, |
| 1088 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 1081 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 1089 } | 1082 } |
| 1090 | 1083 |
| 1091 TEST_F(TextureLayerImplWithMailboxTest, | 1084 TEST_F(TextureLayerImplWithMailboxTest, |
| 1092 TestDestructorCallbackOnCreatedResource) { | 1085 TestDestructorCallbackOnCreatedResource) { |
| 1093 scoped_ptr<TextureLayerImpl> impl_layer; | 1086 scoped_ptr<TextureLayerImpl> impl_layer; |
| 1094 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 1087 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 1095 ASSERT_TRUE(impl_layer); | 1088 ASSERT_TRUE(impl_layer); |
| 1096 | 1089 |
| 1097 EXPECT_CALL(test_data_.mock_callback_, | 1090 EXPECT_CALL(test_data_.mock_callback_, |
| 1098 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); | 1091 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); |
| 1099 impl_layer->SetTextureMailbox( | 1092 impl_layer->SetTextureMailbox( |
| 1100 test_data_.mailbox1_, | 1093 test_data_.mailbox1_, |
| 1101 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 1094 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 1102 impl_layer->DidBecomeActive(); | 1095 impl_layer->DidBecomeActive(); |
| 1103 EXPECT_TRUE(impl_layer->WillDraw( | 1096 EXPECT_TRUE(impl_layer->WillDraw( |
| 1104 DRAW_MODE_HARDWARE, host_impl_.active_tree()->resource_provider())); | 1097 DRAW_MODE_HARDWARE, host_impl_.active_tree()->resource_provider())); |
| 1105 impl_layer->DidDraw(host_impl_.active_tree()->resource_provider()); | 1098 impl_layer->DidDraw(host_impl_.active_tree()->resource_provider()); |
| 1106 impl_layer->SetTextureMailbox(TextureMailbox(), | 1099 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 1107 scoped_ptr<SingleReleaseCallbackImpl>()); | |
| 1108 } | 1100 } |
| 1109 | 1101 |
| 1110 TEST_F(TextureLayerImplWithMailboxTest, TestCallbackOnInUseResource) { | 1102 TEST_F(TextureLayerImplWithMailboxTest, TestCallbackOnInUseResource) { |
| 1111 ResourceProvider* provider = host_impl_.active_tree()->resource_provider(); | 1103 ResourceProvider* provider = host_impl_.active_tree()->resource_provider(); |
| 1112 ResourceProvider::ResourceId id = provider->CreateResourceFromTextureMailbox( | 1104 ResourceProvider::ResourceId id = provider->CreateResourceFromTextureMailbox( |
| 1113 test_data_.mailbox1_, | 1105 test_data_.mailbox1_, |
| 1114 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 1106 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 1115 provider->AllocateForTesting(id); | 1107 provider->AllocateForTesting(id); |
| 1116 | 1108 |
| 1117 // Transfer some resources to the parent. | 1109 // Transfer some resources to the parent. |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1582 int callback_count_; | 1574 int callback_count_; |
| 1583 scoped_refptr<Layer> root_; | 1575 scoped_refptr<Layer> root_; |
| 1584 scoped_refptr<TextureLayer> layer_; | 1576 scoped_refptr<TextureLayer> layer_; |
| 1585 }; | 1577 }; |
| 1586 | 1578 |
| 1587 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 1579 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 1588 TextureLayerWithMailboxImplThreadDeleted); | 1580 TextureLayerWithMailboxImplThreadDeleted); |
| 1589 | 1581 |
| 1590 } // namespace | 1582 } // namespace |
| 1591 } // namespace cc | 1583 } // namespace cc |
| OLD | NEW |