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 "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "CCResourceProvider.h" | 7 #include "CCResourceProvider.h" |
8 | 8 |
9 #include "CCGraphicsContext.h" | 9 #include "CCGraphicsContext.h" |
10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread | 10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread |
11 #include "Extensions3DChromium.h" | 11 #include "Extensions3DChromium.h" |
12 #include "cc/test/compositor_fake_web_graphics_context_3d.h" | 12 #include "cc/test/compositor_fake_web_graphics_context_3d.h" |
13 #include "cc/test/fake_web_compositor_output_surface.h" | 13 #include "cc/test/fake_web_compositor_output_surface.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include <public/WebGraphicsContext3D.h> | 15 #include <public/WebGraphicsContext3D.h> |
16 #include <wtf/HashMap.h> | 16 #include <wtf/HashMap.h> |
17 #include <wtf/OwnPtr.h> | 17 #include <wtf/OwnPtr.h> |
| 18 #include <wtf/Deque.h> |
18 | 19 |
19 using namespace cc; | 20 using namespace cc; |
20 using namespace WebKit; | 21 using namespace WebKit; |
21 | 22 |
22 namespace { | 23 namespace { |
23 | 24 |
24 size_t textureSize(const IntSize& size, WGC3Denum format) | 25 size_t textureSize(const IntSize& size, WGC3Denum format) |
25 { | 26 { |
26 unsigned int componentsPerPixel = 4; | 27 unsigned int componentsPerPixel = 4; |
27 unsigned int bytesPerComponent = 1; | 28 unsigned int bytesPerComponent = 1; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 { | 295 { |
295 EXPECT_EQ(count, static_cast<int>(m_resourceProvider->numResources())); | 296 EXPECT_EQ(count, static_cast<int>(m_resourceProvider->numResources())); |
296 if (GetParam() == CCResourceProvider::GLTexture) | 297 if (GetParam() == CCResourceProvider::GLTexture) |
297 EXPECT_EQ(count, context()->textureCount()); | 298 EXPECT_EQ(count, context()->textureCount()); |
298 } | 299 } |
299 | 300 |
300 protected: | 301 protected: |
301 DebugScopedSetImplThread implThread; | 302 DebugScopedSetImplThread implThread; |
302 OwnPtr<ContextSharedData> m_sharedData; | 303 OwnPtr<ContextSharedData> m_sharedData; |
303 scoped_ptr<CCGraphicsContext> m_context; | 304 scoped_ptr<CCGraphicsContext> m_context; |
304 OwnPtr<CCResourceProvider> m_resourceProvider; | 305 scoped_ptr<CCResourceProvider> m_resourceProvider; |
305 }; | 306 }; |
306 | 307 |
307 TEST_P(CCResourceProviderTest, Basic) | 308 TEST_P(CCResourceProviderTest, Basic) |
308 { | 309 { |
309 IntSize size(1, 1); | 310 IntSize size(1, 1); |
310 WGC3Denum format = GraphicsContext3D::RGBA; | 311 WGC3Denum format = GraphicsContext3D::RGBA; |
311 int pool = 1; | 312 int pool = 1; |
312 size_t pixelSize = textureSize(size, format); | 313 size_t pixelSize = textureSize(size, format); |
313 ASSERT_EQ(4U, pixelSize); | 314 ASSERT_EQ(4U, pixelSize); |
314 | 315 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 m_resourceProvider->deleteResource(id); | 410 m_resourceProvider->deleteResource(id); |
410 } | 411 } |
411 | 412 |
412 TEST_P(CCResourceProviderTest, TransferResources) | 413 TEST_P(CCResourceProviderTest, TransferResources) |
413 { | 414 { |
414 // Resource transfer is only supported with GL textures for now. | 415 // Resource transfer is only supported with GL textures for now. |
415 if (GetParam() != CCResourceProvider::GLTexture) | 416 if (GetParam() != CCResourceProvider::GLTexture) |
416 return; | 417 return; |
417 | 418 |
418 scoped_ptr<CCGraphicsContext> childContext(FakeWebCompositorOutputSurface::c
reate(ResourceProviderContext::create(m_sharedData.get()))); | 419 scoped_ptr<CCGraphicsContext> childContext(FakeWebCompositorOutputSurface::c
reate(ResourceProviderContext::create(m_sharedData.get()))); |
419 OwnPtr<CCResourceProvider> childResourceProvider(CCResourceProvider::create(
childContext.get())); | 420 scoped_ptr<CCResourceProvider> childResourceProvider(CCResourceProvider::cre
ate(childContext.get())); |
420 | 421 |
421 IntSize size(1, 1); | 422 IntSize size(1, 1); |
422 WGC3Denum format = GraphicsContext3D::RGBA; | 423 WGC3Denum format = GraphicsContext3D::RGBA; |
423 int pool = 1; | 424 int pool = 1; |
424 size_t pixelSize = textureSize(size, format); | 425 size_t pixelSize = textureSize(size, format); |
425 ASSERT_EQ(4U, pixelSize); | 426 ASSERT_EQ(4U, pixelSize); |
426 | 427 |
427 CCResourceProvider::ResourceId id1 = childResourceProvider->createResource(p
ool, size, format, CCResourceProvider::TextureUsageAny); | 428 CCResourceProvider::ResourceId id1 = childResourceProvider->createResource(p
ool, size, format, CCResourceProvider::TextureUsageAny); |
428 uint8_t data1[4] = {1, 2, 3, 4}; | 429 uint8_t data1[4] = {1, 2, 3, 4}; |
429 IntRect rect(IntPoint(), size); | 430 IntRect rect(IntPoint(), size); |
430 childResourceProvider->upload(id1, data1, rect, rect, IntSize()); | 431 childResourceProvider->upload(id1, data1, rect, rect, IntSize()); |
431 | 432 |
432 CCResourceProvider::ResourceId id2 = childResourceProvider->createResource(p
ool, size, format, CCResourceProvider::TextureUsageAny); | 433 CCResourceProvider::ResourceId id2 = childResourceProvider->createResource(p
ool, size, format, CCResourceProvider::TextureUsageAny); |
433 uint8_t data2[4] = {5, 5, 5, 5}; | 434 uint8_t data2[4] = {5, 5, 5, 5}; |
434 childResourceProvider->upload(id2, data2, rect, rect, IntSize()); | 435 childResourceProvider->upload(id2, data2, rect, rect, IntSize()); |
435 | 436 |
436 int childPool = 2; | 437 int childPool = 2; |
437 int childId = m_resourceProvider->createChild(childPool); | 438 int childId = m_resourceProvider->createChild(childPool); |
438 | 439 |
439 { | 440 { |
440 // Transfer some resources to the parent. | 441 // Transfer some resources to the parent. |
441 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 442 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
442 resourceIdsToTransfer.append(id1); | 443 resourceIdsToTransfer.push_back(id1); |
443 resourceIdsToTransfer.append(id2); | 444 resourceIdsToTransfer.push_back(id2); |
444 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); | 445 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); |
445 EXPECT_NE(0u, list.syncPoint); | 446 EXPECT_NE(0u, list.syncPoint); |
446 EXPECT_EQ(2u, list.resources.size()); | 447 EXPECT_EQ(2u, list.resources.size()); |
447 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1)); | 448 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1)); |
448 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2)); | 449 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2)); |
449 m_resourceProvider->receiveFromChild(childId, list); | 450 m_resourceProvider->receiveFromChild(childId, list); |
450 } | 451 } |
451 | 452 |
452 EXPECT_EQ(2u, m_resourceProvider->numResources()); | 453 EXPECT_EQ(2u, m_resourceProvider->numResources()); |
453 EXPECT_EQ(2u, m_resourceProvider->mailboxCount()); | 454 EXPECT_EQ(2u, m_resourceProvider->mailboxCount()); |
454 CCResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->getChild
ToParentMap(childId); | 455 CCResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->getChild
ToParentMap(childId); |
455 CCResourceProvider::ResourceId mappedId1 = resourceMap[id1]; | 456 CCResourceProvider::ResourceId mappedId1 = resourceMap[id1]; |
456 CCResourceProvider::ResourceId mappedId2 = resourceMap[id2]; | 457 CCResourceProvider::ResourceId mappedId2 = resourceMap[id2]; |
457 EXPECT_NE(0u, mappedId1); | 458 EXPECT_NE(0u, mappedId1); |
458 EXPECT_NE(0u, mappedId2); | 459 EXPECT_NE(0u, mappedId2); |
459 EXPECT_FALSE(m_resourceProvider->inUseByConsumer(id1)); | 460 EXPECT_FALSE(m_resourceProvider->inUseByConsumer(id1)); |
460 EXPECT_FALSE(m_resourceProvider->inUseByConsumer(id2)); | 461 EXPECT_FALSE(m_resourceProvider->inUseByConsumer(id2)); |
461 | 462 |
462 uint8_t result[4] = {0}; | 463 uint8_t result[4] = {0}; |
463 getResourcePixels(mappedId1, size, format, result); | 464 getResourcePixels(mappedId1, size, format, result); |
464 EXPECT_EQ(0, memcmp(data1, result, pixelSize)); | 465 EXPECT_EQ(0, memcmp(data1, result, pixelSize)); |
465 | 466 |
466 getResourcePixels(mappedId2, size, format, result); | 467 getResourcePixels(mappedId2, size, format, result); |
467 EXPECT_EQ(0, memcmp(data2, result, pixelSize)); | 468 EXPECT_EQ(0, memcmp(data2, result, pixelSize)); |
468 | 469 |
469 { | 470 { |
470 // Check that transfering again the same resource from the child to the | 471 // Check that transfering again the same resource from the child to the |
471 // parent is a noop. | 472 // parent is a noop. |
472 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 473 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
473 resourceIdsToTransfer.append(id1); | 474 resourceIdsToTransfer.push_back(id1); |
474 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); | 475 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); |
475 EXPECT_EQ(0u, list.syncPoint); | 476 EXPECT_EQ(0u, list.syncPoint); |
476 EXPECT_EQ(0u, list.resources.size()); | 477 EXPECT_EQ(0u, list.resources.size()); |
477 } | 478 } |
478 | 479 |
479 { | 480 { |
480 // Transfer resources back from the parent to the child. | 481 // Transfer resources back from the parent to the child. |
481 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 482 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
482 resourceIdsToTransfer.append(mappedId1); | 483 resourceIdsToTransfer.push_back(mappedId1); |
483 resourceIdsToTransfer.append(mappedId2); | 484 resourceIdsToTransfer.push_back(mappedId2); |
484 CCResourceProvider::TransferableResourceList list = m_resourceProvider->
prepareSendToChild(childId, resourceIdsToTransfer); | 485 CCResourceProvider::TransferableResourceList list = m_resourceProvider->
prepareSendToChild(childId, resourceIdsToTransfer); |
485 EXPECT_NE(0u, list.syncPoint); | 486 EXPECT_NE(0u, list.syncPoint); |
486 EXPECT_EQ(2u, list.resources.size()); | 487 EXPECT_EQ(2u, list.resources.size()); |
487 childResourceProvider->receiveFromParent(list); | 488 childResourceProvider->receiveFromParent(list); |
488 } | 489 } |
489 EXPECT_EQ(0u, m_resourceProvider->mailboxCount()); | 490 EXPECT_EQ(0u, m_resourceProvider->mailboxCount()); |
490 EXPECT_EQ(2u, childResourceProvider->mailboxCount()); | 491 EXPECT_EQ(2u, childResourceProvider->mailboxCount()); |
491 EXPECT_FALSE(childResourceProvider->inUseByConsumer(id1)); | 492 EXPECT_FALSE(childResourceProvider->inUseByConsumer(id1)); |
492 EXPECT_FALSE(childResourceProvider->inUseByConsumer(id2)); | 493 EXPECT_FALSE(childResourceProvider->inUseByConsumer(id2)); |
493 | 494 |
494 ResourceProviderContext* childContext3D = static_cast<ResourceProviderContex
t*>(childContext->context3D()); | 495 ResourceProviderContext* childContext3D = static_cast<ResourceProviderContex
t*>(childContext->context3D()); |
495 { | 496 { |
496 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), i
d1); | 497 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), i
d1); |
497 ASSERT_NE(0U, lock.textureId()); | 498 ASSERT_NE(0U, lock.textureId()); |
498 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureI
d()); | 499 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureI
d()); |
499 childContext3D->getPixels(size, format, result); | 500 childContext3D->getPixels(size, format, result); |
500 EXPECT_EQ(0, memcmp(data1, result, pixelSize)); | 501 EXPECT_EQ(0, memcmp(data1, result, pixelSize)); |
501 } | 502 } |
502 { | 503 { |
503 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), i
d2); | 504 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), i
d2); |
504 ASSERT_NE(0U, lock.textureId()); | 505 ASSERT_NE(0U, lock.textureId()); |
505 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureI
d()); | 506 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureI
d()); |
506 childContext3D->getPixels(size, format, result); | 507 childContext3D->getPixels(size, format, result); |
507 EXPECT_EQ(0, memcmp(data2, result, pixelSize)); | 508 EXPECT_EQ(0, memcmp(data2, result, pixelSize)); |
508 } | 509 } |
509 | 510 |
510 { | 511 { |
511 // Transfer resources to the parent again. | 512 // Transfer resources to the parent again. |
512 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 513 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
513 resourceIdsToTransfer.append(id1); | 514 resourceIdsToTransfer.push_back(id1); |
514 resourceIdsToTransfer.append(id2); | 515 resourceIdsToTransfer.push_back(id2); |
515 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); | 516 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); |
516 EXPECT_NE(0u, list.syncPoint); | 517 EXPECT_NE(0u, list.syncPoint); |
517 EXPECT_EQ(2u, list.resources.size()); | 518 EXPECT_EQ(2u, list.resources.size()); |
518 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1)); | 519 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1)); |
519 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2)); | 520 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2)); |
520 m_resourceProvider->receiveFromChild(childId, list); | 521 m_resourceProvider->receiveFromChild(childId, list); |
521 } | 522 } |
522 | 523 |
523 EXPECT_EQ(2u, m_resourceProvider->numResources()); | 524 EXPECT_EQ(2u, m_resourceProvider->numResources()); |
524 m_resourceProvider->destroyChild(childId); | 525 m_resourceProvider->destroyChild(childId); |
525 EXPECT_EQ(0u, m_resourceProvider->numResources()); | 526 EXPECT_EQ(0u, m_resourceProvider->numResources()); |
526 EXPECT_EQ(0u, m_resourceProvider->mailboxCount()); | 527 EXPECT_EQ(0u, m_resourceProvider->mailboxCount()); |
527 } | 528 } |
528 | 529 |
529 TEST_P(CCResourceProviderTest, DeleteTransferredResources) | 530 TEST_P(CCResourceProviderTest, DeleteTransferredResources) |
530 { | 531 { |
531 // Resource transfer is only supported with GL textures for now. | 532 // Resource transfer is only supported with GL textures for now. |
532 if (GetParam() != CCResourceProvider::GLTexture) | 533 if (GetParam() != CCResourceProvider::GLTexture) |
533 return; | 534 return; |
534 | 535 |
535 scoped_ptr<CCGraphicsContext> childContext(FakeWebCompositorOutputSurface::c
reate(ResourceProviderContext::create(m_sharedData.get()))); | 536 scoped_ptr<CCGraphicsContext> childContext(FakeWebCompositorOutputSurface::c
reate(ResourceProviderContext::create(m_sharedData.get()))); |
536 OwnPtr<CCResourceProvider> childResourceProvider(CCResourceProvider::create(
childContext.get())); | 537 scoped_ptr<CCResourceProvider> childResourceProvider(CCResourceProvider::cre
ate(childContext.get())); |
537 | 538 |
538 IntSize size(1, 1); | 539 IntSize size(1, 1); |
539 WGC3Denum format = GraphicsContext3D::RGBA; | 540 WGC3Denum format = GraphicsContext3D::RGBA; |
540 int pool = 1; | 541 int pool = 1; |
541 size_t pixelSize = textureSize(size, format); | 542 size_t pixelSize = textureSize(size, format); |
542 ASSERT_EQ(4U, pixelSize); | 543 ASSERT_EQ(4U, pixelSize); |
543 | 544 |
544 CCResourceProvider::ResourceId id = childResourceProvider->createResource(po
ol, size, format, CCResourceProvider::TextureUsageAny); | 545 CCResourceProvider::ResourceId id = childResourceProvider->createResource(po
ol, size, format, CCResourceProvider::TextureUsageAny); |
545 uint8_t data[4] = {1, 2, 3, 4}; | 546 uint8_t data[4] = {1, 2, 3, 4}; |
546 IntRect rect(IntPoint(), size); | 547 IntRect rect(IntPoint(), size); |
547 childResourceProvider->upload(id, data, rect, rect, IntSize()); | 548 childResourceProvider->upload(id, data, rect, rect, IntSize()); |
548 | 549 |
549 int childPool = 2; | 550 int childPool = 2; |
550 int childId = m_resourceProvider->createChild(childPool); | 551 int childId = m_resourceProvider->createChild(childPool); |
551 | 552 |
552 { | 553 { |
553 // Transfer some resource to the parent. | 554 // Transfer some resource to the parent. |
554 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 555 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
555 resourceIdsToTransfer.append(id); | 556 resourceIdsToTransfer.push_back(id); |
556 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); | 557 CCResourceProvider::TransferableResourceList list = childResourceProvide
r->prepareSendToParent(resourceIdsToTransfer); |
557 EXPECT_NE(0u, list.syncPoint); | 558 EXPECT_NE(0u, list.syncPoint); |
558 EXPECT_EQ(1u, list.resources.size()); | 559 EXPECT_EQ(1u, list.resources.size()); |
559 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id)); | 560 EXPECT_TRUE(childResourceProvider->inUseByConsumer(id)); |
560 m_resourceProvider->receiveFromChild(childId, list); | 561 m_resourceProvider->receiveFromChild(childId, list); |
561 } | 562 } |
562 | 563 |
563 // Delete textures in the child, while they are transfered. | 564 // Delete textures in the child, while they are transfered. |
564 childResourceProvider->deleteResource(id); | 565 childResourceProvider->deleteResource(id); |
565 EXPECT_EQ(1u, childResourceProvider->numResources()); | 566 EXPECT_EQ(1u, childResourceProvider->numResources()); |
566 | 567 |
567 { | 568 { |
568 // Transfer resources back from the parent to the child. | 569 // Transfer resources back from the parent to the child. |
569 CCResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->getC
hildToParentMap(childId); | 570 CCResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->getC
hildToParentMap(childId); |
570 CCResourceProvider::ResourceId mappedId = resourceMap[id]; | 571 CCResourceProvider::ResourceId mappedId = resourceMap[id]; |
571 EXPECT_NE(0u, mappedId); | 572 EXPECT_NE(0u, mappedId); |
572 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; | 573 CCResourceProvider::ResourceIdArray resourceIdsToTransfer; |
573 resourceIdsToTransfer.append(mappedId); | 574 resourceIdsToTransfer.push_back(mappedId); |
574 CCResourceProvider::TransferableResourceList list = m_resourceProvider->
prepareSendToChild(childId, resourceIdsToTransfer); | 575 CCResourceProvider::TransferableResourceList list = m_resourceProvider->
prepareSendToChild(childId, resourceIdsToTransfer); |
575 EXPECT_NE(0u, list.syncPoint); | 576 EXPECT_NE(0u, list.syncPoint); |
576 EXPECT_EQ(1u, list.resources.size()); | 577 EXPECT_EQ(1u, list.resources.size()); |
577 childResourceProvider->receiveFromParent(list); | 578 childResourceProvider->receiveFromParent(list); |
578 } | 579 } |
579 EXPECT_EQ(0u, childResourceProvider->numResources()); | 580 EXPECT_EQ(0u, childResourceProvider->numResources()); |
580 } | 581 } |
581 | 582 |
582 INSTANTIATE_TEST_CASE_P(CCResourceProviderTests, | 583 INSTANTIATE_TEST_CASE_P(CCResourceProviderTests, |
583 CCResourceProviderTest, | 584 CCResourceProviderTest, |
584 ::testing::Values(CCResourceProvider::GLTexture, | 585 ::testing::Values(CCResourceProvider::GLTexture, |
585 CCResourceProvider::Bitmap)); | 586 CCResourceProvider::Bitmap)); |
586 | 587 |
587 } // namespace | 588 } // namespace |
OLD | NEW |