| 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/texture_layer.h" | 5 #include "cc/texture_layer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "cc/layer_tree_host.h" | 10 #include "cc/layer_tree_host.h" |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); | 189 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); |
| 190 } | 190 } |
| 191 | 191 |
| 192 class MockMailboxCallback { | 192 class MockMailboxCallback { |
| 193 public: | 193 public: |
| 194 MOCK_METHOD2(Release, void(const std::string& mailbox, unsigned syncPoint)); | 194 MOCK_METHOD2(Release, void(const std::string& mailbox, unsigned syncPoint)); |
| 195 }; | 195 }; |
| 196 | 196 |
| 197 struct CommonMailboxObjects { | 197 struct CommonMailboxObjects { |
| 198 CommonMailboxObjects() | 198 CommonMailboxObjects() |
| 199 : m_mailbox1(64, '1') | 199 : m_mailboxName1(64, '1') |
| 200 , m_mailbox2(64, '2') | 200 , m_mailboxName2(64, '2') |
| 201 { | 201 { |
| 202 m_releaseMailbox1 = base::Bind(&MockMailboxCallback::Release, | 202 m_releaseMailbox1 = base::Bind(&MockMailboxCallback::Release, |
| 203 base::Unretained(&m_mockCallback), | 203 base::Unretained(&m_mockCallback), |
| 204 m_mailbox1); | 204 m_mailboxName1); |
| 205 m_releaseMailbox2 = base::Bind(&MockMailboxCallback::Release, | 205 m_releaseMailbox2 = base::Bind(&MockMailboxCallback::Release, |
| 206 base::Unretained(&m_mockCallback), | 206 base::Unretained(&m_mockCallback), |
| 207 m_mailbox2); | 207 m_mailboxName2); |
| 208 |
| 209 m_mailbox1 = TextureMailbox(m_mailboxName1, m_releaseMailbox1); |
| 210 m_mailbox2 = TextureMailbox(m_mailboxName2, m_releaseMailbox2); |
| 208 } | 211 } |
| 209 | 212 |
| 210 std::string m_mailbox1; | 213 std::string m_mailboxName1; |
| 211 std::string m_mailbox2; | 214 std::string m_mailboxName2; |
| 212 MockMailboxCallback m_mockCallback; | 215 MockMailboxCallback m_mockCallback; |
| 213 TextureLayer::MailboxCallback m_releaseMailbox1; | 216 TextureMailbox::ReleaseCallback m_releaseMailbox1; |
| 214 TextureLayer::MailboxCallback m_releaseMailbox2; | 217 TextureMailbox::ReleaseCallback m_releaseMailbox2; |
| 218 TextureMailbox m_mailbox1; |
| 219 TextureMailbox m_mailbox2; |
| 215 }; | 220 }; |
| 216 | 221 |
| 217 class TextureLayerWithMailboxTest : public TextureLayerTest { | 222 class TextureLayerWithMailboxTest : public TextureLayerTest { |
| 218 protected: | 223 protected: |
| 219 virtual void TearDown() | 224 virtual void TearDown() |
| 220 { | 225 { |
| 221 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 226 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 222 EXPECT_CALL(m_testData.m_mockCallback, | 227 EXPECT_CALL(m_testData.m_mockCallback, |
| 223 Release(m_testData.m_mailbox1, _)).Times(1); | 228 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 224 TextureLayerTest::TearDown(); | 229 TextureLayerTest::TearDown(); |
| 225 } | 230 } |
| 226 | 231 |
| 227 CommonMailboxObjects m_testData; | 232 CommonMailboxObjects m_testData; |
| 228 }; | 233 }; |
| 229 | 234 |
| 230 TEST_F(TextureLayerWithMailboxTest, replaceMailboxOnMainThreadBeforeCommit) | 235 TEST_F(TextureLayerWithMailboxTest, replaceMailboxOnMainThreadBeforeCommit) |
| 231 { | 236 { |
| 232 scoped_refptr<TextureLayer> testLayer = TextureLayer::createForMailbox(); | 237 scoped_refptr<TextureLayer> testLayer = TextureLayer::createForMailbox(); |
| 233 ASSERT_TRUE(testLayer); | 238 ASSERT_TRUE(testLayer); |
| 234 | 239 |
| 235 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); | 240 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); |
| 236 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AnyNumber()); | 241 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AnyNumber()); |
| 237 m_layerTreeHost->setRootLayer(testLayer); | 242 m_layerTreeHost->setRootLayer(testLayer); |
| 238 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); | 243 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); |
| 239 | 244 |
| 240 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); | 245 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); |
| 241 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); | 246 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); |
| 242 testLayer->setTextureMailbox(m_testData.m_mailbox1, | 247 testLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 243 m_testData.m_releaseMailbox1); | |
| 244 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); | 248 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); |
| 245 | 249 |
| 246 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); | 250 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); |
| 247 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); | 251 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); |
| 248 EXPECT_CALL(m_testData.m_mockCallback, | 252 EXPECT_CALL(m_testData.m_mockCallback, |
| 249 Release(m_testData.m_mailbox1, _)).Times(1); | 253 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 250 testLayer->setTextureMailbox(m_testData.m_mailbox2, | 254 testLayer->setTextureMailbox(m_testData.m_mailbox2); |
| 251 m_testData.m_releaseMailbox2); | |
| 252 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); | 255 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); |
| 253 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 256 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 254 | 257 |
| 255 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); | 258 EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0); |
| 256 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); | 259 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); |
| 257 EXPECT_CALL(m_testData.m_mockCallback, | 260 EXPECT_CALL(m_testData.m_mockCallback, |
| 258 Release(m_testData.m_mailbox2, _)).Times(1); | 261 Release(m_testData.m_mailboxName2, _)).Times(1); |
| 259 testLayer->setTextureMailbox(std::string(), | 262 testLayer->setTextureMailbox(TextureMailbox()); |
| 260 TextureLayer::MailboxCallback()); | |
| 261 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); | 263 Mock::VerifyAndClearExpectations(m_layerTreeHost.get()); |
| 262 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 264 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 263 | 265 |
| 264 // Test destructor. | 266 // Test destructor. |
| 265 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); | 267 EXPECT_CALL(*m_layerTreeHost, setNeedsCommit()).Times(AtLeast(1)); |
| 266 testLayer->setTextureMailbox(m_testData.m_mailbox1, | 268 testLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 267 m_testData.m_releaseMailbox1); | |
| 268 } | 269 } |
| 269 | 270 |
| 270 class TextureLayerImplWithMailboxThreadedCallback : public ThreadedTest { | 271 class TextureLayerImplWithMailboxThreadedCallback : public ThreadedTest { |
| 271 public: | 272 public: |
| 272 TextureLayerImplWithMailboxThreadedCallback() | 273 TextureLayerImplWithMailboxThreadedCallback() |
| 273 : m_resetMailbox(false) | 274 : m_resetMailbox(false) |
| 274 { | 275 { |
| 275 } | 276 } |
| 276 | 277 |
| 277 // Make sure callback is received on main and doesn't block the impl thread. | 278 // Make sure callback is received on main and doesn't block the impl thread. |
| 278 void releaseCallback(unsigned syncPoint) { | 279 void releaseCallback(unsigned syncPoint) { |
| 279 EXPECT_EQ(true, proxy()->isMainThread()); | 280 EXPECT_EQ(true, proxy()->isMainThread()); |
| 280 endTest(); | 281 endTest(); |
| 281 } | 282 } |
| 282 | 283 |
| 283 virtual void beginTest() OVERRIDE | 284 virtual void beginTest() OVERRIDE |
| 284 { | 285 { |
| 285 m_layer = TextureLayer::createForMailbox(); | 286 m_layer = TextureLayer::createForMailbox(); |
| 286 m_layer->setIsDrawable(true); | 287 m_layer->setIsDrawable(true); |
| 287 m_layerTreeHost->setRootLayer(m_layer); | 288 m_layerTreeHost->setRootLayer(m_layer); |
| 288 m_layer->setTextureMailbox( | 289 TextureMailbox mailbox( |
| 289 std::string(64, '1'), | 290 std::string(64, '1'), |
| 290 base::Bind( | 291 base::Bind( |
| 291 &TextureLayerImplWithMailboxThreadedCallback::releaseCallback, | 292 &TextureLayerImplWithMailboxThreadedCallback::releaseCallback, |
| 292 base::Unretained(this))); | 293 base::Unretained(this))); |
| 294 m_layer->setTextureMailbox(mailbox); |
| 293 postSetNeedsCommitToMainThread(); | 295 postSetNeedsCommitToMainThread(); |
| 294 } | 296 } |
| 295 | 297 |
| 296 virtual void didCommit() OVERRIDE | 298 virtual void didCommit() OVERRIDE |
| 297 { | 299 { |
| 298 if (m_resetMailbox) | 300 if (m_resetMailbox) |
| 299 return; | 301 return; |
| 300 | 302 |
| 301 m_layer->setTextureMailbox(std::string(), | 303 m_layer->setTextureMailbox(TextureMailbox()); |
| 302 TextureLayer::MailboxCallback()); | |
| 303 m_resetMailbox = true; | 304 m_resetMailbox = true; |
| 304 } | 305 } |
| 305 | 306 |
| 306 virtual void afterTest() OVERRIDE | 307 virtual void afterTest() OVERRIDE |
| 307 { | 308 { |
| 308 } | 309 } |
| 309 | 310 |
| 310 private: | 311 private: |
| 311 bool m_resetMailbox; | 312 bool m_resetMailbox; |
| 312 scoped_refptr<TextureLayer> m_layer; | 313 scoped_refptr<TextureLayer> m_layer; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 327 }; | 328 }; |
| 328 | 329 |
| 329 TEST_F(TextureLayerImplWithMailboxTest, testImplLayerCallbacks) | 330 TEST_F(TextureLayerImplWithMailboxTest, testImplLayerCallbacks) |
| 330 { | 331 { |
| 331 scoped_ptr<TextureLayerImpl> implLayer; | 332 scoped_ptr<TextureLayerImpl> implLayer; |
| 332 implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); | 333 implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); |
| 333 ASSERT_TRUE(implLayer); | 334 ASSERT_TRUE(implLayer); |
| 334 | 335 |
| 335 // Test setting identical mailbox. | 336 // Test setting identical mailbox. |
| 336 EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); | 337 EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); |
| 337 implLayer->setTextureMailbox(m_testData.m_mailbox1, | 338 implLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 338 m_testData.m_releaseMailbox1); | 339 implLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 339 implLayer->setTextureMailbox(m_testData.m_mailbox1, | |
| 340 m_testData.m_releaseMailbox1); | |
| 341 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 340 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 342 | 341 |
| 343 // Test multiple commits without a draw. | 342 // Test multiple commits without a draw. |
| 344 EXPECT_CALL(m_testData.m_mockCallback, | 343 EXPECT_CALL(m_testData.m_mockCallback, |
| 345 Release(m_testData.m_mailbox1, _)).Times(1); | 344 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 346 implLayer->setTextureMailbox(m_testData.m_mailbox2, | 345 implLayer->setTextureMailbox(m_testData.m_mailbox2); |
| 347 m_testData.m_releaseMailbox2); | |
| 348 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 346 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 349 | 347 |
| 350 // Test resetting the mailbox. | 348 // Test resetting the mailbox. |
| 351 EXPECT_CALL(m_testData.m_mockCallback, | 349 EXPECT_CALL(m_testData.m_mockCallback, |
| 352 Release(m_testData.m_mailbox2, _)).Times(1); | 350 Release(m_testData.m_mailboxName2, _)).Times(1); |
| 353 implLayer->setTextureMailbox(std::string(), | 351 implLayer->setTextureMailbox(TextureMailbox()); |
| 354 TextureLayer::MailboxCallback()); | |
| 355 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 352 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 356 | 353 |
| 357 // Test destructor. | 354 // Test destructor. |
| 358 EXPECT_CALL(m_testData.m_mockCallback, | 355 EXPECT_CALL(m_testData.m_mockCallback, |
| 359 Release(m_testData.m_mailbox1, _)).Times(1); | 356 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 360 implLayer->setTextureMailbox(m_testData.m_mailbox1, | 357 implLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 361 m_testData.m_releaseMailbox1); | |
| 362 } | 358 } |
| 363 | 359 |
| 364 TEST_F(TextureLayerImplWithMailboxTest, testDestructorCallbackOnCreatedResource) | 360 TEST_F(TextureLayerImplWithMailboxTest, testDestructorCallbackOnCreatedResource) |
| 365 { | 361 { |
| 366 scoped_ptr<TextureLayerImpl> implLayer; | 362 scoped_ptr<TextureLayerImpl> implLayer; |
| 367 implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); | 363 implLayer = TextureLayerImpl::create(m_hostImpl.activeTree(), 1, true); |
| 368 ASSERT_TRUE(implLayer); | 364 ASSERT_TRUE(implLayer); |
| 369 | 365 |
| 370 EXPECT_CALL(m_testData.m_mockCallback, | 366 EXPECT_CALL(m_testData.m_mockCallback, |
| 371 Release(m_testData.m_mailbox1, _)).Times(1); | 367 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 372 implLayer->setTextureMailbox(m_testData.m_mailbox1, | 368 implLayer->setTextureMailbox(m_testData.m_mailbox1); |
| 373 m_testData.m_releaseMailbox1); | |
| 374 implLayer->willDraw(m_hostImpl.activeTree()->resource_provider()); | 369 implLayer->willDraw(m_hostImpl.activeTree()->resource_provider()); |
| 375 implLayer->didDraw(m_hostImpl.activeTree()->resource_provider()); | 370 implLayer->didDraw(m_hostImpl.activeTree()->resource_provider()); |
| 376 implLayer->setTextureMailbox(std::string(), | 371 implLayer->setTextureMailbox(TextureMailbox()); |
| 377 TextureLayer::MailboxCallback()); | |
| 378 } | 372 } |
| 379 | 373 |
| 380 TEST_F(TextureLayerImplWithMailboxTest, testCallbackOnInUseResource) | 374 TEST_F(TextureLayerImplWithMailboxTest, testCallbackOnInUseResource) |
| 381 { | 375 { |
| 382 ResourceProvider *provider = m_hostImpl.activeTree()->resource_provider(); | 376 ResourceProvider *provider = m_hostImpl.activeTree()->resource_provider(); |
| 383 ResourceProvider::ResourceId id = | 377 ResourceProvider::ResourceId id = |
| 384 provider->createResourceFromTextureMailbox( | 378 provider->createResourceFromTextureMailbox(m_testData.m_mailbox1); |
| 385 m_testData.m_mailbox1, | |
| 386 m_testData.m_releaseMailbox1); | |
| 387 provider->allocateForTesting(id); | 379 provider->allocateForTesting(id); |
| 388 | 380 |
| 389 // Transfer some resources to the parent. | 381 // Transfer some resources to the parent. |
| 390 ResourceProvider::ResourceIdArray resourceIdsToTransfer; | 382 ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
| 391 resourceIdsToTransfer.push_back(id); | 383 resourceIdsToTransfer.push_back(id); |
| 392 TransferableResourceList list; | 384 TransferableResourceList list; |
| 393 provider->prepareSendToParent(resourceIdsToTransfer, &list); | 385 provider->prepareSendToParent(resourceIdsToTransfer, &list); |
| 394 EXPECT_TRUE(provider->inUseByConsumer(id)); | 386 EXPECT_TRUE(provider->inUseByConsumer(id)); |
| 395 EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); | 387 EXPECT_CALL(m_testData.m_mockCallback, Release(_, _)).Times(0); |
| 396 provider->deleteResource(id); | 388 provider->deleteResource(id); |
| 397 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); | 389 Mock::VerifyAndClearExpectations(&m_testData.m_mockCallback); |
| 398 EXPECT_CALL(m_testData.m_mockCallback, | 390 EXPECT_CALL(m_testData.m_mockCallback, |
| 399 Release(m_testData.m_mailbox1, _)).Times(1); | 391 Release(m_testData.m_mailboxName1, _)).Times(1); |
| 400 provider->receiveFromParent(list); | 392 provider->receiveFromParent(list); |
| 401 } | 393 } |
| 402 | 394 |
| 403 } // namespace | 395 } // namespace |
| 404 } // namespace cc | 396 } // namespace cc |
| OLD | NEW |