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 |