| 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 TextureMailbox mailbox_; | 108 TextureMailbox mailbox_; |
| 109 scoped_ptr<SingleReleaseCallback> release_callback_; | 109 scoped_ptr<SingleReleaseCallback> release_callback_; |
| 110 bool mailbox_changed_; | 110 bool mailbox_changed_; |
| 111 DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); | 111 DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 class MockMailboxCallback { | 114 class MockMailboxCallback { |
| 115 public: | 115 public: |
| 116 MOCK_METHOD3(Release, | 116 MOCK_METHOD3(Release, |
| 117 void(const gpu::Mailbox& mailbox, | 117 void(const gpu::Mailbox& mailbox, |
| 118 uint32 sync_point, | 118 const gpu::SyncToken& sync_token, |
| 119 bool lost_resource)); | 119 bool lost_resource)); |
| 120 MOCK_METHOD3(Release2, | 120 MOCK_METHOD3(Release2, |
| 121 void(SharedBitmap* shared_bitmap, | 121 void(SharedBitmap* shared_bitmap, |
| 122 uint32 sync_point, | 122 const gpu::SyncToken& sync_token, |
| 123 bool lost_resource)); | 123 bool lost_resource)); |
| 124 MOCK_METHOD4(ReleaseImpl, | 124 MOCK_METHOD4(ReleaseImpl, |
| 125 void(const gpu::Mailbox& mailbox, | 125 void(const gpu::Mailbox& mailbox, |
| 126 uint32 sync_point, | 126 const gpu::SyncToken& sync_token, |
| 127 bool lost_resource, | 127 bool lost_resource, |
| 128 BlockingTaskRunner* main_thread_task_runner)); | 128 BlockingTaskRunner* main_thread_task_runner)); |
| 129 MOCK_METHOD4(ReleaseImpl2, | 129 MOCK_METHOD4(ReleaseImpl2, |
| 130 void(SharedBitmap* shared_bitmap, | 130 void(SharedBitmap* shared_bitmap, |
| 131 uint32 sync_point, | 131 const gpu::SyncToken& sync_token, |
| 132 bool lost_resource, | 132 bool lost_resource, |
| 133 BlockingTaskRunner* main_thread_task_runner)); | 133 BlockingTaskRunner* main_thread_task_runner)); |
| 134 }; | 134 }; |
| 135 | 135 |
| 136 struct CommonMailboxObjects { | 136 struct CommonMailboxObjects { |
| 137 explicit CommonMailboxObjects(SharedBitmapManager* manager) | 137 explicit CommonMailboxObjects(SharedBitmapManager* manager) |
| 138 : mailbox_name1_(MailboxFromChar('1')), | 138 : mailbox_name1_(MailboxFromChar('1')), |
| 139 mailbox_name2_(MailboxFromChar('2')), | 139 mailbox_name2_(MailboxFromChar('2')), |
| 140 sync_point1_(1), | 140 sync_token1_(1), |
| 141 sync_point2_(2) { | 141 sync_token2_(2) { |
| 142 release_mailbox1_ = base::Bind(&MockMailboxCallback::Release, | 142 release_mailbox1_ = base::Bind(&MockMailboxCallback::Release, |
| 143 base::Unretained(&mock_callback_), | 143 base::Unretained(&mock_callback_), |
| 144 mailbox_name1_); | 144 mailbox_name1_); |
| 145 release_mailbox2_ = base::Bind(&MockMailboxCallback::Release, | 145 release_mailbox2_ = base::Bind(&MockMailboxCallback::Release, |
| 146 base::Unretained(&mock_callback_), | 146 base::Unretained(&mock_callback_), |
| 147 mailbox_name2_); | 147 mailbox_name2_); |
| 148 release_mailbox1_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl, | 148 release_mailbox1_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl, |
| 149 base::Unretained(&mock_callback_), | 149 base::Unretained(&mock_callback_), |
| 150 mailbox_name1_); | 150 mailbox_name1_); |
| 151 release_mailbox2_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl, | 151 release_mailbox2_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl, |
| 152 base::Unretained(&mock_callback_), | 152 base::Unretained(&mock_callback_), |
| 153 mailbox_name2_); | 153 mailbox_name2_); |
| 154 const uint32 arbitrary_target1 = GL_TEXTURE_2D; | 154 const uint32 arbitrary_target1 = GL_TEXTURE_2D; |
| 155 const uint32 arbitrary_target2 = GL_TEXTURE_EXTERNAL_OES; | 155 const uint32 arbitrary_target2 = GL_TEXTURE_EXTERNAL_OES; |
| 156 mailbox1_ = TextureMailbox(mailbox_name1_, arbitrary_target1, sync_point1_); | 156 mailbox1_ = TextureMailbox(mailbox_name1_, sync_token1_, arbitrary_target1); |
| 157 mailbox2_ = TextureMailbox(mailbox_name2_, arbitrary_target2, sync_point2_); | 157 mailbox2_ = TextureMailbox(mailbox_name2_, sync_token2_, arbitrary_target2); |
| 158 gfx::Size size(128, 128); | 158 gfx::Size size(128, 128); |
| 159 shared_bitmap_ = manager->AllocateSharedBitmap(size); | 159 shared_bitmap_ = manager->AllocateSharedBitmap(size); |
| 160 DCHECK(shared_bitmap_); | 160 DCHECK(shared_bitmap_); |
| 161 release_mailbox3_ = | 161 release_mailbox3_ = |
| 162 base::Bind(&MockMailboxCallback::Release2, | 162 base::Bind(&MockMailboxCallback::Release2, |
| 163 base::Unretained(&mock_callback_), shared_bitmap_.get()); | 163 base::Unretained(&mock_callback_), shared_bitmap_.get()); |
| 164 release_mailbox3_impl_ = | 164 release_mailbox3_impl_ = |
| 165 base::Bind(&MockMailboxCallback::ReleaseImpl2, | 165 base::Bind(&MockMailboxCallback::ReleaseImpl2, |
| 166 base::Unretained(&mock_callback_), shared_bitmap_.get()); | 166 base::Unretained(&mock_callback_), shared_bitmap_.get()); |
| 167 mailbox3_ = TextureMailbox(shared_bitmap_.get(), size); | 167 mailbox3_ = TextureMailbox(shared_bitmap_.get(), size); |
| 168 } | 168 } |
| 169 | 169 |
| 170 gpu::Mailbox mailbox_name1_; | 170 gpu::Mailbox mailbox_name1_; |
| 171 gpu::Mailbox mailbox_name2_; | 171 gpu::Mailbox mailbox_name2_; |
| 172 MockMailboxCallback mock_callback_; | 172 MockMailboxCallback mock_callback_; |
| 173 ReleaseCallback release_mailbox1_; | 173 ReleaseCallback release_mailbox1_; |
| 174 ReleaseCallback release_mailbox2_; | 174 ReleaseCallback release_mailbox2_; |
| 175 ReleaseCallback release_mailbox3_; | 175 ReleaseCallback release_mailbox3_; |
| 176 ReleaseCallbackImpl release_mailbox1_impl_; | 176 ReleaseCallbackImpl release_mailbox1_impl_; |
| 177 ReleaseCallbackImpl release_mailbox2_impl_; | 177 ReleaseCallbackImpl release_mailbox2_impl_; |
| 178 ReleaseCallbackImpl release_mailbox3_impl_; | 178 ReleaseCallbackImpl release_mailbox3_impl_; |
| 179 TextureMailbox mailbox1_; | 179 TextureMailbox mailbox1_; |
| 180 TextureMailbox mailbox2_; | 180 TextureMailbox mailbox2_; |
| 181 TextureMailbox mailbox3_; | 181 TextureMailbox mailbox3_; |
| 182 uint32 sync_point1_; | 182 gpu::SyncToken sync_token1_; |
| 183 uint32 sync_point2_; | 183 gpu::SyncToken sync_token2_; |
| 184 scoped_ptr<SharedBitmap> shared_bitmap_; | 184 scoped_ptr<SharedBitmap> shared_bitmap_; |
| 185 }; | 185 }; |
| 186 | 186 |
| 187 class TextureLayerTest : public testing::Test { | 187 class TextureLayerTest : public testing::Test { |
| 188 public: | 188 public: |
| 189 TextureLayerTest() | 189 TextureLayerTest() |
| 190 : fake_client_( | 190 : fake_client_( |
| 191 FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D)), | 191 FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D)), |
| 192 output_surface_(FakeOutputSurface::Create3d()), | 192 output_surface_(FakeOutputSurface::Create3d()), |
| 193 host_impl_(&task_runner_provider_, | 193 host_impl_(&task_runner_provider_, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 using TextureLayer::TextureMailboxHolder::Create; | 245 using TextureLayer::TextureMailboxHolder::Create; |
| 246 | 246 |
| 247 protected: | 247 protected: |
| 248 ~TestMailboxHolder() override {} | 248 ~TestMailboxHolder() override {} |
| 249 }; | 249 }; |
| 250 | 250 |
| 251 class TextureLayerWithMailboxTest : public TextureLayerTest { | 251 class TextureLayerWithMailboxTest : public TextureLayerTest { |
| 252 protected: | 252 protected: |
| 253 void TearDown() override { | 253 void TearDown() override { |
| 254 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 254 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 255 EXPECT_CALL(test_data_.mock_callback_, | 255 EXPECT_CALL( |
| 256 Release(test_data_.mailbox_name1_, | 256 test_data_.mock_callback_, |
| 257 test_data_.sync_point1_, | 257 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false)) |
| 258 false)).Times(1); | 258 .Times(1); |
| 259 TextureLayerTest::TearDown(); | 259 TextureLayerTest::TearDown(); |
| 260 } | 260 } |
| 261 }; | 261 }; |
| 262 | 262 |
| 263 TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) { | 263 TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) { |
| 264 scoped_refptr<TextureLayer> test_layer = | 264 scoped_refptr<TextureLayer> test_layer = |
| 265 TextureLayer::CreateForMailbox(layer_settings_, nullptr); | 265 TextureLayer::CreateForMailbox(layer_settings_, nullptr); |
| 266 ASSERT_TRUE(test_layer.get()); | 266 ASSERT_TRUE(test_layer.get()); |
| 267 | 267 |
| 268 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 268 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
| 269 layer_tree_host_->SetRootLayer(test_layer); | 269 layer_tree_host_->SetRootLayer(test_layer); |
| 270 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 270 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 271 | 271 |
| 272 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 272 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 273 test_layer->SetTextureMailbox( | 273 test_layer->SetTextureMailbox( |
| 274 test_data_.mailbox1_, | 274 test_data_.mailbox1_, |
| 275 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 275 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
| 276 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 276 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 277 | 277 |
| 278 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 278 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 279 EXPECT_CALL(test_data_.mock_callback_, | 279 EXPECT_CALL( |
| 280 Release(test_data_.mailbox_name1_, | 280 test_data_.mock_callback_, |
| 281 test_data_.sync_point1_, | 281 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false)) |
| 282 false)) | |
| 283 .Times(1); | 282 .Times(1); |
| 284 test_layer->SetTextureMailbox( | 283 test_layer->SetTextureMailbox( |
| 285 test_data_.mailbox2_, | 284 test_data_.mailbox2_, |
| 286 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); | 285 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); |
| 287 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 286 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 288 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 287 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 289 | 288 |
| 290 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 289 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 291 EXPECT_CALL(test_data_.mock_callback_, | 290 EXPECT_CALL( |
| 292 Release(test_data_.mailbox_name2_, | 291 test_data_.mock_callback_, |
| 293 test_data_.sync_point2_, | 292 Release(test_data_.mailbox_name2_, test_data_.sync_token2_, false)) |
| 294 false)) | |
| 295 .Times(1); | 293 .Times(1); |
| 296 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); | 294 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 297 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 295 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 298 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 296 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 299 | 297 |
| 300 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 298 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 301 test_layer->SetTextureMailbox( | 299 test_layer->SetTextureMailbox( |
| 302 test_data_.mailbox3_, | 300 test_data_.mailbox3_, |
| 303 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); | 301 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); |
| 304 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 302 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 305 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 303 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 306 | 304 |
| 307 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 305 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 308 EXPECT_CALL(test_data_.mock_callback_, | 306 EXPECT_CALL(test_data_.mock_callback_, |
| 309 Release2(test_data_.shared_bitmap_.get(), 0, false)).Times(1); | 307 Release2(test_data_.shared_bitmap_.get(), _, false)) |
| 308 .Times(1); |
| 310 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); | 309 test_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 311 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 310 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 312 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 311 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 313 | 312 |
| 314 // Test destructor. | 313 // Test destructor. |
| 315 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 314 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 316 test_layer->SetTextureMailbox( | 315 test_layer->SetTextureMailbox( |
| 317 test_data_.mailbox1_, | 316 test_data_.mailbox1_, |
| 318 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 317 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
| 319 } | 318 } |
| 320 | 319 |
| 321 TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) { | 320 TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) { |
| 322 scoped_refptr<TextureLayer> test_layer = | 321 scoped_refptr<TextureLayer> test_layer = |
| 323 TextureLayer::CreateForMailbox(layer_settings_, nullptr); | 322 TextureLayer::CreateForMailbox(layer_settings_, nullptr); |
| 324 ASSERT_TRUE(test_layer.get()); | 323 ASSERT_TRUE(test_layer.get()); |
| 325 | 324 |
| 326 // These use the same gpu::Mailbox, but different sync points. | 325 // These use the same gpu::Mailbox, but different sync points. |
| 327 TextureMailbox mailbox1(MailboxFromChar('a'), GL_TEXTURE_2D, 1); | 326 TextureMailbox mailbox1(MailboxFromChar('a'), gpu::SyncToken(1), |
| 328 TextureMailbox mailbox2(MailboxFromChar('a'), GL_TEXTURE_2D, 2); | 327 GL_TEXTURE_2D); |
| 328 TextureMailbox mailbox2(MailboxFromChar('a'), gpu::SyncToken(2), |
| 329 GL_TEXTURE_2D); |
| 329 | 330 |
| 330 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 331 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
| 331 layer_tree_host_->SetRootLayer(test_layer); | 332 layer_tree_host_->SetRootLayer(test_layer); |
| 332 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 333 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 333 | 334 |
| 334 // Set the mailbox the first time. It should cause a commit. | 335 // Set the mailbox the first time. It should cause a commit. |
| 335 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 336 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
| 336 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1); | 337 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1); |
| 337 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 338 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
| 338 | 339 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 scoped_ptr<SingleReleaseCallbackImpl> compositor2; | 422 scoped_ptr<SingleReleaseCallbackImpl> compositor2; |
| 422 main_thread_.message_loop()->task_runner()->PostTask( | 423 main_thread_.message_loop()->task_runner()->PostTask( |
| 423 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::CreateImplRef, | 424 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::CreateImplRef, |
| 424 base::Unretained(this), &compositor2)); | 425 base::Unretained(this), &compositor2)); |
| 425 | 426 |
| 426 Wait(main_thread_); | 427 Wait(main_thread_); |
| 427 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 428 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 428 | 429 |
| 429 // The compositors both destroy their impl trees before the main thread layer | 430 // The compositors both destroy their impl trees before the main thread layer |
| 430 // is destroyed. | 431 // is destroyed. |
| 431 compositor1->Run(100, false, main_thread_task_runner_.get()); | 432 compositor1->Run(gpu::SyncToken(100), false, main_thread_task_runner_.get()); |
| 432 compositor2->Run(200, false, main_thread_task_runner_.get()); | 433 compositor2->Run(gpu::SyncToken(200), false, main_thread_task_runner_.get()); |
| 433 | 434 |
| 434 Wait(main_thread_); | 435 Wait(main_thread_); |
| 435 | 436 |
| 436 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); | 437 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); |
| 437 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 438 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 438 | 439 |
| 439 // The main thread ref is the last one, so the mailbox is released back to the | 440 // The main thread ref is the last one, so the mailbox is released back to the |
| 440 // embedder, with the last sync point provided by the impl trees. | 441 // embedder, with the last sync point provided by the impl trees. |
| 441 EXPECT_CALL(test_data_.mock_callback_, | 442 EXPECT_CALL(test_data_.mock_callback_, |
| 442 Release(test_data_.mailbox_name1_, 200, false)).Times(1); | 443 Release(test_data_.mailbox_name1_, gpu::SyncToken(200), false)) |
| 444 .Times(1); |
| 443 | 445 |
| 444 main_thread_.message_loop()->task_runner()->PostTask( | 446 main_thread_.message_loop()->task_runner()->PostTask( |
| 445 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, | 447 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, |
| 446 base::Unretained(this))); | 448 base::Unretained(this))); |
| 447 Wait(main_thread_); | 449 Wait(main_thread_); |
| 448 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 450 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 449 } | 451 } |
| 450 | 452 |
| 451 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleaseBetween) { | 453 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleaseBetween) { |
| 452 scoped_refptr<TextureLayer> test_layer = | 454 scoped_refptr<TextureLayer> test_layer = |
| (...skipping 17 matching lines...) Expand all Loading... |
| 470 // reference to its impl tree. | 472 // reference to its impl tree. |
| 471 scoped_ptr<SingleReleaseCallbackImpl> compositor2; | 473 scoped_ptr<SingleReleaseCallbackImpl> compositor2; |
| 472 main_thread_.message_loop()->task_runner()->PostTask( | 474 main_thread_.message_loop()->task_runner()->PostTask( |
| 473 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::CreateImplRef, | 475 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::CreateImplRef, |
| 474 base::Unretained(this), &compositor2)); | 476 base::Unretained(this), &compositor2)); |
| 475 | 477 |
| 476 Wait(main_thread_); | 478 Wait(main_thread_); |
| 477 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 479 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 478 | 480 |
| 479 // One compositor destroys their impl tree. | 481 // One compositor destroys their impl tree. |
| 480 compositor1->Run(100, false, main_thread_task_runner_.get()); | 482 compositor1->Run(gpu::SyncToken(100), false, main_thread_task_runner_.get()); |
| 481 | 483 |
| 482 // Then the main thread reference is destroyed. | 484 // Then the main thread reference is destroyed. |
| 483 main_thread_.message_loop()->task_runner()->PostTask( | 485 main_thread_.message_loop()->task_runner()->PostTask( |
| 484 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, | 486 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, |
| 485 base::Unretained(this))); | 487 base::Unretained(this))); |
| 486 | 488 |
| 487 Wait(main_thread_); | 489 Wait(main_thread_); |
| 488 | 490 |
| 489 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); | 491 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); |
| 490 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 492 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 491 | 493 |
| 492 // The second impl reference is destroyed last, causing the mailbox to be | 494 // The second impl reference is destroyed last, causing the mailbox to be |
| 493 // released back to the embedder with the last sync point from the impl tree. | 495 // released back to the embedder with the last sync point from the impl tree. |
| 494 EXPECT_CALL(test_data_.mock_callback_, | 496 EXPECT_CALL(test_data_.mock_callback_, |
| 495 Release(test_data_.mailbox_name1_, 200, true)).Times(1); | 497 Release(test_data_.mailbox_name1_, gpu::SyncToken(200), true)) |
| 498 .Times(1); |
| 496 | 499 |
| 497 compositor2->Run(200, true, main_thread_task_runner_.get()); | 500 compositor2->Run(gpu::SyncToken(200), true, main_thread_task_runner_.get()); |
| 498 Wait(main_thread_); | 501 Wait(main_thread_); |
| 499 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 502 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 500 } | 503 } |
| 501 | 504 |
| 502 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleasedFirst) { | 505 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleasedFirst) { |
| 503 scoped_refptr<TextureLayer> test_layer = | 506 scoped_refptr<TextureLayer> test_layer = |
| 504 TextureLayer::CreateForMailbox(layer_settings_, nullptr); | 507 TextureLayer::CreateForMailbox(layer_settings_, nullptr); |
| 505 ASSERT_TRUE(test_layer.get()); | 508 ASSERT_TRUE(test_layer.get()); |
| 506 | 509 |
| 507 main_thread_.message_loop()->task_runner()->PostTask( | 510 main_thread_.message_loop()->task_runner()->PostTask( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 526 | 529 |
| 527 Wait(main_thread_); | 530 Wait(main_thread_); |
| 528 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 531 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 529 | 532 |
| 530 // The main thread reference is destroyed first. | 533 // The main thread reference is destroyed first. |
| 531 main_thread_.message_loop()->task_runner()->PostTask( | 534 main_thread_.message_loop()->task_runner()->PostTask( |
| 532 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, | 535 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, |
| 533 base::Unretained(this))); | 536 base::Unretained(this))); |
| 534 | 537 |
| 535 // One compositor destroys their impl tree. | 538 // One compositor destroys their impl tree. |
| 536 compositor2->Run(200, false, main_thread_task_runner_.get()); | 539 compositor2->Run(gpu::SyncToken(200), false, main_thread_task_runner_.get()); |
| 537 | 540 |
| 538 Wait(main_thread_); | 541 Wait(main_thread_); |
| 539 | 542 |
| 540 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); | 543 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0); |
| 541 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 544 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 542 | 545 |
| 543 // The second impl reference is destroyed last, causing the mailbox to be | 546 // The second impl reference is destroyed last, causing the mailbox to be |
| 544 // released back to the embedder with the last sync point from the impl tree. | 547 // released back to the embedder with the last sync point from the impl tree. |
| 545 EXPECT_CALL(test_data_.mock_callback_, | 548 EXPECT_CALL(test_data_.mock_callback_, |
| 546 Release(test_data_.mailbox_name1_, 100, true)).Times(1); | 549 Release(test_data_.mailbox_name1_, gpu::SyncToken(100), true)) |
| 550 .Times(1); |
| 547 | 551 |
| 548 compositor1->Run(100, true, main_thread_task_runner_.get()); | 552 compositor1->Run(gpu::SyncToken(100), true, main_thread_task_runner_.get()); |
| 549 Wait(main_thread_); | 553 Wait(main_thread_); |
| 550 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 554 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 551 } | 555 } |
| 552 | 556 |
| 553 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_SecondImplRefShortcut) { | 557 TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_SecondImplRefShortcut) { |
| 554 scoped_refptr<TextureLayer> test_layer = | 558 scoped_refptr<TextureLayer> test_layer = |
| 555 TextureLayer::CreateForMailbox(layer_settings_, nullptr); | 559 TextureLayer::CreateForMailbox(layer_settings_, nullptr); |
| 556 ASSERT_TRUE(test_layer.get()); | 560 ASSERT_TRUE(test_layer.get()); |
| 557 | 561 |
| 558 main_thread_.message_loop()->task_runner()->PostTask( | 562 main_thread_.message_loop()->task_runner()->PostTask( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 577 | 581 |
| 578 Wait(main_thread_); | 582 Wait(main_thread_); |
| 579 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 583 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 580 | 584 |
| 581 // The main thread reference is destroyed first. | 585 // The main thread reference is destroyed first. |
| 582 main_thread_.message_loop()->task_runner()->PostTask( | 586 main_thread_.message_loop()->task_runner()->PostTask( |
| 583 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, | 587 FROM_HERE, base::Bind(&TextureLayerMailboxHolderTest::ReleaseMainRef, |
| 584 base::Unretained(this))); | 588 base::Unretained(this))); |
| 585 | 589 |
| 586 EXPECT_CALL(test_data_.mock_callback_, | 590 EXPECT_CALL(test_data_.mock_callback_, |
| 587 Release(test_data_.mailbox_name1_, 200, true)).Times(1); | 591 Release(test_data_.mailbox_name1_, gpu::SyncToken(200), true)) |
| 592 .Times(1); |
| 588 | 593 |
| 589 bool manual_reset = false; | 594 bool manual_reset = false; |
| 590 bool initially_signaled = false; | 595 bool initially_signaled = false; |
| 591 base::WaitableEvent begin_capture(manual_reset, initially_signaled); | 596 base::WaitableEvent begin_capture(manual_reset, initially_signaled); |
| 592 base::WaitableEvent wait_for_capture(manual_reset, initially_signaled); | 597 base::WaitableEvent wait_for_capture(manual_reset, initially_signaled); |
| 593 base::WaitableEvent stop_capture(manual_reset, initially_signaled); | 598 base::WaitableEvent stop_capture(manual_reset, initially_signaled); |
| 594 | 599 |
| 595 // Post a task to start capturing tasks on the main thread. This will block | 600 // Post a task to start capturing tasks on the main thread. This will block |
| 596 // the main thread until we signal the |stop_capture| event. | 601 // the main thread until we signal the |stop_capture| event. |
| 597 main_thread_.message_loop()->task_runner()->PostTask( | 602 main_thread_.message_loop()->task_runner()->PostTask( |
| 598 FROM_HERE, | 603 FROM_HERE, |
| 599 base::Bind(&TextureLayerMailboxHolderTest::CapturePostTasksAndWait, | 604 base::Bind(&TextureLayerMailboxHolderTest::CapturePostTasksAndWait, |
| 600 base::Unretained(this), &begin_capture, &wait_for_capture, | 605 base::Unretained(this), &begin_capture, &wait_for_capture, |
| 601 &stop_capture)); | 606 &stop_capture)); |
| 602 | 607 |
| 603 // Before the main thread capturing starts, one compositor destroys their | 608 // Before the main thread capturing starts, one compositor destroys their |
| 604 // impl reference. Since capturing did not start, this gets post-tasked to | 609 // impl reference. Since capturing did not start, this gets post-tasked to |
| 605 // the main thread. | 610 // the main thread. |
| 606 compositor1->Run(100, false, main_thread_task_runner_.get()); | 611 compositor1->Run(gpu::SyncToken(100), false, main_thread_task_runner_.get()); |
| 607 | 612 |
| 608 // Start capturing on the main thread. | 613 // Start capturing on the main thread. |
| 609 begin_capture.Signal(); | 614 begin_capture.Signal(); |
| 610 wait_for_capture.Wait(); | 615 wait_for_capture.Wait(); |
| 611 | 616 |
| 612 // Meanwhile, the second compositor released its impl reference, but this task | 617 // Meanwhile, the second compositor released its impl reference, but this task |
| 613 // gets shortcutted directly to the main thread. This means the reference is | 618 // gets shortcutted directly to the main thread. This means the reference is |
| 614 // released before compositor1, whose reference will be released later when | 619 // released before compositor1, whose reference will be released later when |
| 615 // the post-task is serviced. But since it was destroyed _on the impl thread_ | 620 // the post-task is serviced. But since it was destroyed _on the impl thread_ |
| 616 // last, its sync point values should be used. | 621 // last, its sync point values should be used. |
| 617 compositor2->Run(200, true, main_thread_task_runner_.get()); | 622 compositor2->Run(gpu::SyncToken(200), true, main_thread_task_runner_.get()); |
| 618 | 623 |
| 619 stop_capture.Signal(); | 624 stop_capture.Signal(); |
| 620 Wait(main_thread_); | 625 Wait(main_thread_); |
| 621 | 626 |
| 622 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 627 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 623 } | 628 } |
| 624 | 629 |
| 625 class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { | 630 class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { |
| 626 public: | 631 public: |
| 627 TextureLayerImplWithMailboxThreadedCallback() | 632 TextureLayerImplWithMailboxThreadedCallback() |
| 628 : callback_count_(0), | 633 : callback_count_(0), |
| 629 commit_count_(0) {} | 634 commit_count_(0) {} |
| 630 | 635 |
| 631 // Make sure callback is received on main and doesn't block the impl thread. | 636 // Make sure callback is received on main and doesn't block the impl thread. |
| 632 void ReleaseCallback(uint32 sync_point, bool lost_resource) { | 637 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 633 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 638 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 634 EXPECT_FALSE(lost_resource); | 639 EXPECT_FALSE(lost_resource); |
| 635 ++callback_count_; | 640 ++callback_count_; |
| 636 } | 641 } |
| 637 | 642 |
| 638 void SetMailbox(char mailbox_char) { | 643 void SetMailbox(char mailbox_char) { |
| 639 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 644 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 640 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 645 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
| 641 base::Bind( | 646 base::Bind( |
| 642 &TextureLayerImplWithMailboxThreadedCallback::ReleaseCallback, | 647 &TextureLayerImplWithMailboxThreadedCallback::ReleaseCallback, |
| 643 base::Unretained(this))); | 648 base::Unretained(this))); |
| 644 layer_->SetTextureMailbox( | 649 layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), |
| 645 TextureMailbox(MailboxFromChar(mailbox_char), GL_TEXTURE_2D, 0), | 650 gpu::SyncToken(), GL_TEXTURE_2D), |
| 646 callback.Pass()); | 651 callback.Pass()); |
| 647 } | 652 } |
| 648 | 653 |
| 649 void BeginTest() override { | 654 void BeginTest() override { |
| 650 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 655 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 651 | 656 |
| 652 gfx::Size bounds(100, 100); | 657 gfx::Size bounds(100, 100); |
| 653 root_ = Layer::Create(layer_settings()); | 658 root_ = Layer::Create(layer_settings()); |
| 654 root_->SetBounds(bounds); | 659 root_->SetBounds(bounds); |
| 655 | 660 |
| 656 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); | 661 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 }; | 748 }; |
| 744 | 749 |
| 745 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 750 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 746 TextureLayerImplWithMailboxThreadedCallback); | 751 TextureLayerImplWithMailboxThreadedCallback); |
| 747 | 752 |
| 748 | 753 |
| 749 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { | 754 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { |
| 750 protected: | 755 protected: |
| 751 TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {} | 756 TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {} |
| 752 | 757 |
| 753 static void ReleaseCallback(uint32 sync_point, bool lost_resource) {} | 758 static void ReleaseCallback(const gpu::SyncToken& sync_token, |
| 759 bool lost_resource) {} |
| 754 | 760 |
| 755 void SetMailbox(char mailbox_char) { | 761 void SetMailbox(char mailbox_char) { |
| 756 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 762 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
| 757 base::Bind( | 763 base::Bind( |
| 758 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); | 764 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); |
| 759 layer_->SetTextureMailbox( | 765 layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), |
| 760 TextureMailbox(MailboxFromChar(mailbox_char), GL_TEXTURE_2D, 0), | 766 gpu::SyncToken(), GL_TEXTURE_2D), |
| 761 callback.Pass()); | 767 callback.Pass()); |
| 762 } | 768 } |
| 763 | 769 |
| 764 void BeginTest() override { | 770 void BeginTest() override { |
| 765 gfx::Size bounds(100, 100); | 771 gfx::Size bounds(100, 100); |
| 766 root_ = Layer::Create(layer_settings()); | 772 root_ = Layer::Create(layer_settings()); |
| 767 root_->SetBounds(bounds); | 773 root_->SetBounds(bounds); |
| 768 | 774 |
| 769 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); | 775 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); |
| 770 layer_->SetIsDrawable(true); | 776 layer_->SetIsDrawable(true); |
| 771 layer_->SetBounds(bounds); | 777 layer_->SetBounds(bounds); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 } | 856 } |
| 851 | 857 |
| 852 FakeLayerTreeHostClient fake_client_; | 858 FakeLayerTreeHostClient fake_client_; |
| 853 }; | 859 }; |
| 854 | 860 |
| 855 // Test conditions for results of TextureLayerImpl::WillDraw under | 861 // Test conditions for results of TextureLayerImpl::WillDraw under |
| 856 // different configurations of different mailbox, texture_id, and draw_mode. | 862 // different configurations of different mailbox, texture_id, and draw_mode. |
| 857 TEST_F(TextureLayerImplWithMailboxTest, TestWillDraw) { | 863 TEST_F(TextureLayerImplWithMailboxTest, TestWillDraw) { |
| 858 EXPECT_CALL( | 864 EXPECT_CALL( |
| 859 test_data_.mock_callback_, | 865 test_data_.mock_callback_, |
| 860 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_point1_, false, _)) | 866 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _)) |
| 861 .Times(AnyNumber()); | 867 .Times(AnyNumber()); |
| 862 EXPECT_CALL(test_data_.mock_callback_, | 868 EXPECT_CALL( |
| 863 ReleaseImpl2(test_data_.shared_bitmap_.get(), 0, false, _)) | 869 test_data_.mock_callback_, |
| 870 ReleaseImpl2(test_data_.shared_bitmap_.get(), gpu::SyncToken(), false, _)) |
| 864 .Times(AnyNumber()); | 871 .Times(AnyNumber()); |
| 865 // Hardware mode. | 872 // Hardware mode. |
| 866 { | 873 { |
| 867 scoped_ptr<TextureLayerImpl> impl_layer = | 874 scoped_ptr<TextureLayerImpl> impl_layer = |
| 868 TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 875 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| 869 impl_layer->SetTextureMailbox( | 876 impl_layer->SetTextureMailbox( |
| 870 test_data_.mailbox1_, | 877 test_data_.mailbox1_, |
| 871 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 878 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 872 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 879 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
| 873 } | 880 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 pending_layer->CreateLayerImpl(host_impl_.active_tree())); | 944 pending_layer->CreateLayerImpl(host_impl_.active_tree())); |
| 938 ASSERT_TRUE(active_layer); | 945 ASSERT_TRUE(active_layer); |
| 939 | 946 |
| 940 pending_layer->SetTextureMailbox( | 947 pending_layer->SetTextureMailbox( |
| 941 test_data_.mailbox1_, | 948 test_data_.mailbox1_, |
| 942 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 949 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 943 | 950 |
| 944 // Test multiple commits without an activation. | 951 // Test multiple commits without an activation. |
| 945 EXPECT_CALL( | 952 EXPECT_CALL( |
| 946 test_data_.mock_callback_, | 953 test_data_.mock_callback_, |
| 947 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_point1_, false, _)) | 954 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _)) |
| 948 .Times(1); | 955 .Times(1); |
| 949 pending_layer->SetTextureMailbox( | 956 pending_layer->SetTextureMailbox( |
| 950 test_data_.mailbox2_, | 957 test_data_.mailbox2_, |
| 951 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox2_impl_)); | 958 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox2_impl_)); |
| 952 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 959 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 953 | 960 |
| 954 // Test callback after activation. | 961 // Test callback after activation. |
| 955 pending_layer->PushPropertiesTo(active_layer.get()); | 962 pending_layer->PushPropertiesTo(active_layer.get()); |
| 956 active_layer->DidBecomeActive(); | 963 active_layer->DidBecomeActive(); |
| 957 | 964 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 971 EXPECT_CALL(test_data_.mock_callback_, | 978 EXPECT_CALL(test_data_.mock_callback_, |
| 972 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); | 979 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1); |
| 973 pending_layer->SetTextureMailbox(TextureMailbox(), nullptr); | 980 pending_layer->SetTextureMailbox(TextureMailbox(), nullptr); |
| 974 pending_layer->PushPropertiesTo(active_layer.get()); | 981 pending_layer->PushPropertiesTo(active_layer.get()); |
| 975 active_layer->DidBecomeActive(); | 982 active_layer->DidBecomeActive(); |
| 976 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 983 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
| 977 | 984 |
| 978 // Test destructor. | 985 // Test destructor. |
| 979 EXPECT_CALL( | 986 EXPECT_CALL( |
| 980 test_data_.mock_callback_, | 987 test_data_.mock_callback_, |
| 981 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_point1_, false, _)) | 988 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _)) |
| 982 .Times(1); | 989 .Times(1); |
| 983 pending_layer->SetTextureMailbox( | 990 pending_layer->SetTextureMailbox( |
| 984 test_data_.mailbox1_, | 991 test_data_.mailbox1_, |
| 985 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); | 992 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_)); |
| 986 } | 993 } |
| 987 | 994 |
| 988 TEST_F(TextureLayerImplWithMailboxTest, | 995 TEST_F(TextureLayerImplWithMailboxTest, |
| 989 TestDestructorCallbackOnCreatedResource) { | 996 TestDestructorCallbackOnCreatedResource) { |
| 990 scoped_ptr<TextureLayerImpl> impl_layer; | 997 scoped_ptr<TextureLayerImpl> impl_layer; |
| 991 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); | 998 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 bool PrepareTextureMailbox( | 1043 bool PrepareTextureMailbox( |
| 1037 TextureMailbox* texture_mailbox, | 1044 TextureMailbox* texture_mailbox, |
| 1038 scoped_ptr<SingleReleaseCallback>* release_callback, | 1045 scoped_ptr<SingleReleaseCallback>* release_callback, |
| 1039 bool use_shared_memory) override { | 1046 bool use_shared_memory) override { |
| 1040 if (layer_tree_host()->source_frame_number() == 1) { | 1047 if (layer_tree_host()->source_frame_number() == 1) { |
| 1041 // Once this has been committed, the mailbox will be released. | 1048 // Once this has been committed, the mailbox will be released. |
| 1042 *texture_mailbox = TextureMailbox(); | 1049 *texture_mailbox = TextureMailbox(); |
| 1043 return true; | 1050 return true; |
| 1044 } | 1051 } |
| 1045 | 1052 |
| 1046 *texture_mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); | 1053 *texture_mailbox = |
| 1054 TextureMailbox(MailboxFromChar('1'), gpu::SyncToken(), GL_TEXTURE_2D); |
| 1047 *release_callback = SingleReleaseCallback::Create( | 1055 *release_callback = SingleReleaseCallback::Create( |
| 1048 base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased, | 1056 base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased, |
| 1049 base::Unretained(this))); | 1057 base::Unretained(this))); |
| 1050 return true; | 1058 return true; |
| 1051 } | 1059 } |
| 1052 | 1060 |
| 1053 void MailboxReleased(uint32 sync_point, bool lost_resource) { | 1061 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 1054 // Source frame number during callback is the same as the source frame | 1062 // Source frame number during callback is the same as the source frame |
| 1055 // on which it was released. | 1063 // on which it was released. |
| 1056 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); | 1064 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); |
| 1057 EndTest(); | 1065 EndTest(); |
| 1058 } | 1066 } |
| 1059 | 1067 |
| 1060 void SetupTree() override { | 1068 void SetupTree() override { |
| 1061 scoped_refptr<Layer> root = Layer::Create(layer_settings()); | 1069 scoped_refptr<Layer> root = Layer::Create(layer_settings()); |
| 1062 root->SetBounds(gfx::Size(10, 10)); | 1070 root->SetBounds(gfx::Size(10, 10)); |
| 1063 root->SetIsDrawable(true); | 1071 root->SetIsDrawable(true); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 if (!mailbox_changed_) | 1146 if (!mailbox_changed_) |
| 1139 return false; | 1147 return false; |
| 1140 *mailbox = mailbox_; | 1148 *mailbox = mailbox_; |
| 1141 *release_callback = SingleReleaseCallback::Create( | 1149 *release_callback = SingleReleaseCallback::Create( |
| 1142 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased, | 1150 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased, |
| 1143 base::Unretained(this))); | 1151 base::Unretained(this))); |
| 1144 return true; | 1152 return true; |
| 1145 } | 1153 } |
| 1146 | 1154 |
| 1147 TextureMailbox MakeMailbox(char name) { | 1155 TextureMailbox MakeMailbox(char name) { |
| 1148 return TextureMailbox(MailboxFromChar(name), GL_TEXTURE_2D, 0); | 1156 return TextureMailbox(MailboxFromChar(name), gpu::SyncToken(), |
| 1157 GL_TEXTURE_2D); |
| 1149 } | 1158 } |
| 1150 | 1159 |
| 1151 void MailboxReleased(uint32 sync_point, bool lost_resource) { | 1160 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 1152 ++mailbox_returned_; | 1161 ++mailbox_returned_; |
| 1153 } | 1162 } |
| 1154 | 1163 |
| 1155 void SetupTree() override { | 1164 void SetupTree() override { |
| 1156 scoped_refptr<Layer> root = Layer::Create(layer_settings()); | 1165 scoped_refptr<Layer> root = Layer::Create(layer_settings()); |
| 1157 root->SetBounds(gfx::Size(10, 10)); | 1166 root->SetBounds(gfx::Size(10, 10)); |
| 1158 root->SetIsDrawable(true); | 1167 root->SetIsDrawable(true); |
| 1159 | 1168 |
| 1160 solid_layer_ = SolidColorLayer::Create(layer_settings()); | 1169 solid_layer_ = SolidColorLayer::Create(layer_settings()); |
| 1161 solid_layer_->SetBounds(gfx::Size(10, 10)); | 1170 solid_layer_->SetBounds(gfx::Size(10, 10)); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 // the mailbox back to TextureLayerClient. | 1270 // the mailbox back to TextureLayerClient. |
| 1262 class TextureLayerReleaseResourcesBase | 1271 class TextureLayerReleaseResourcesBase |
| 1263 : public LayerTreeTest, | 1272 : public LayerTreeTest, |
| 1264 public TextureLayerClient { | 1273 public TextureLayerClient { |
| 1265 public: | 1274 public: |
| 1266 // TextureLayerClient implementation. | 1275 // TextureLayerClient implementation. |
| 1267 bool PrepareTextureMailbox( | 1276 bool PrepareTextureMailbox( |
| 1268 TextureMailbox* mailbox, | 1277 TextureMailbox* mailbox, |
| 1269 scoped_ptr<SingleReleaseCallback>* release_callback, | 1278 scoped_ptr<SingleReleaseCallback>* release_callback, |
| 1270 bool use_shared_memory) override { | 1279 bool use_shared_memory) override { |
| 1271 *mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); | 1280 *mailbox = |
| 1281 TextureMailbox(MailboxFromChar('1'), gpu::SyncToken(), GL_TEXTURE_2D); |
| 1272 *release_callback = SingleReleaseCallback::Create( | 1282 *release_callback = SingleReleaseCallback::Create( |
| 1273 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased, | 1283 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased, |
| 1274 base::Unretained(this))); | 1284 base::Unretained(this))); |
| 1275 return true; | 1285 return true; |
| 1276 } | 1286 } |
| 1277 | 1287 |
| 1278 void MailboxReleased(unsigned sync_point, bool lost_resource) { | 1288 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 1279 mailbox_released_ = true; | 1289 mailbox_released_ = true; |
| 1280 } | 1290 } |
| 1281 | 1291 |
| 1282 void SetupTree() override { | 1292 void SetupTree() override { |
| 1283 LayerTreeTest::SetupTree(); | 1293 LayerTreeTest::SetupTree(); |
| 1284 | 1294 |
| 1285 scoped_refptr<TextureLayer> texture_layer = | 1295 scoped_refptr<TextureLayer> texture_layer = |
| 1286 TextureLayer::CreateForMailbox(layer_settings(), this); | 1296 TextureLayer::CreateForMailbox(layer_settings(), this); |
| 1287 texture_layer->SetBounds(gfx::Size(10, 10)); | 1297 texture_layer->SetBounds(gfx::Size(10, 10)); |
| 1288 texture_layer->SetIsDrawable(true); | 1298 texture_layer->SetIsDrawable(true); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 public: | 1330 public: |
| 1321 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { | 1331 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
| 1322 host_impl->active_tree()->root_layer()->children()[0]->ReleaseResources(); | 1332 host_impl->active_tree()->root_layer()->children()[0]->ReleaseResources(); |
| 1323 } | 1333 } |
| 1324 }; | 1334 }; |
| 1325 | 1335 |
| 1326 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate); | 1336 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate); |
| 1327 | 1337 |
| 1328 class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest { | 1338 class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest { |
| 1329 public: | 1339 public: |
| 1330 void ReleaseCallback(uint32 sync_point, bool lost_resource) { | 1340 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 1331 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 1341 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 1332 EXPECT_FALSE(lost_resource); | 1342 EXPECT_FALSE(lost_resource); |
| 1333 ++callback_count_; | 1343 ++callback_count_; |
| 1334 EndTest(); | 1344 EndTest(); |
| 1335 } | 1345 } |
| 1336 | 1346 |
| 1337 void SetMailbox(char mailbox_char) { | 1347 void SetMailbox(char mailbox_char) { |
| 1338 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 1348 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 1339 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 1349 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
| 1340 base::Bind( | 1350 base::Bind( |
| 1341 &TextureLayerWithMailboxMainThreadDeleted::ReleaseCallback, | 1351 &TextureLayerWithMailboxMainThreadDeleted::ReleaseCallback, |
| 1342 base::Unretained(this))); | 1352 base::Unretained(this))); |
| 1343 layer_->SetTextureMailbox( | 1353 layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), |
| 1344 TextureMailbox(MailboxFromChar(mailbox_char), GL_TEXTURE_2D, 0), | 1354 gpu::SyncToken(), GL_TEXTURE_2D), |
| 1345 callback.Pass()); | 1355 callback.Pass()); |
| 1346 } | 1356 } |
| 1347 | 1357 |
| 1348 void SetupTree() override { | 1358 void SetupTree() override { |
| 1349 gfx::Size bounds(100, 100); | 1359 gfx::Size bounds(100, 100); |
| 1350 root_ = Layer::Create(layer_settings()); | 1360 root_ = Layer::Create(layer_settings()); |
| 1351 root_->SetBounds(bounds); | 1361 root_->SetBounds(bounds); |
| 1352 | 1362 |
| 1353 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); | 1363 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); |
| 1354 layer_->SetIsDrawable(true); | 1364 layer_->SetIsDrawable(true); |
| 1355 layer_->SetBounds(bounds); | 1365 layer_->SetBounds(bounds); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 int callback_count_; | 1399 int callback_count_; |
| 1390 scoped_refptr<Layer> root_; | 1400 scoped_refptr<Layer> root_; |
| 1391 scoped_refptr<TextureLayer> layer_; | 1401 scoped_refptr<TextureLayer> layer_; |
| 1392 }; | 1402 }; |
| 1393 | 1403 |
| 1394 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 1404 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 1395 TextureLayerWithMailboxMainThreadDeleted); | 1405 TextureLayerWithMailboxMainThreadDeleted); |
| 1396 | 1406 |
| 1397 class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest { | 1407 class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest { |
| 1398 public: | 1408 public: |
| 1399 void ReleaseCallback(uint32 sync_point, bool lost_resource) { | 1409 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) { |
| 1400 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 1410 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 1401 EXPECT_FALSE(lost_resource); | 1411 EXPECT_FALSE(lost_resource); |
| 1402 ++callback_count_; | 1412 ++callback_count_; |
| 1403 EndTest(); | 1413 EndTest(); |
| 1404 } | 1414 } |
| 1405 | 1415 |
| 1406 void SetMailbox(char mailbox_char) { | 1416 void SetMailbox(char mailbox_char) { |
| 1407 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 1417 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
| 1408 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 1418 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
| 1409 base::Bind( | 1419 base::Bind( |
| 1410 &TextureLayerWithMailboxImplThreadDeleted::ReleaseCallback, | 1420 &TextureLayerWithMailboxImplThreadDeleted::ReleaseCallback, |
| 1411 base::Unretained(this))); | 1421 base::Unretained(this))); |
| 1412 layer_->SetTextureMailbox( | 1422 layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), |
| 1413 TextureMailbox(MailboxFromChar(mailbox_char), GL_TEXTURE_2D, 0), | 1423 gpu::SyncToken(), GL_TEXTURE_2D), |
| 1414 callback.Pass()); | 1424 callback.Pass()); |
| 1415 } | 1425 } |
| 1416 | 1426 |
| 1417 void SetupTree() override { | 1427 void SetupTree() override { |
| 1418 gfx::Size bounds(100, 100); | 1428 gfx::Size bounds(100, 100); |
| 1419 root_ = Layer::Create(layer_settings()); | 1429 root_ = Layer::Create(layer_settings()); |
| 1420 root_->SetBounds(bounds); | 1430 root_->SetBounds(bounds); |
| 1421 | 1431 |
| 1422 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); | 1432 layer_ = TextureLayer::CreateForMailbox(layer_settings(), nullptr); |
| 1423 layer_->SetIsDrawable(true); | 1433 layer_->SetIsDrawable(true); |
| 1424 layer_->SetBounds(bounds); | 1434 layer_->SetBounds(bounds); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 int callback_count_; | 1471 int callback_count_; |
| 1462 scoped_refptr<Layer> root_; | 1472 scoped_refptr<Layer> root_; |
| 1463 scoped_refptr<TextureLayer> layer_; | 1473 scoped_refptr<TextureLayer> layer_; |
| 1464 }; | 1474 }; |
| 1465 | 1475 |
| 1466 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 1476 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 1467 TextureLayerWithMailboxImplThreadDeleted); | 1477 TextureLayerWithMailboxImplThreadDeleted); |
| 1468 | 1478 |
| 1469 } // namespace | 1479 } // namespace |
| 1470 } // namespace cc | 1480 } // namespace cc |
| OLD | NEW |