Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(487)

Side by Side Diff: cc/resources/resource_provider_unittest.cc

Issue 411643002: Early wait on texture resource sync points in gl_renderer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move WaitOnResourceSyncPoints to gl_renderer. Add mailbox test for gl_renderer. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 10
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), 657 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES),
658 list[3].mailbox_holder.texture_target); 658 list[3].mailbox_holder.texture_target);
659 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); 659 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
660 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); 660 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
661 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); 661 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3));
662 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); 662 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4));
663 resource_provider_->ReceiveFromChild(child_id, list); 663 resource_provider_->ReceiveFromChild(child_id, list);
664 EXPECT_NE(list[0].mailbox_holder.sync_point, 664 EXPECT_NE(list[0].mailbox_holder.sync_point,
665 context3d_->last_waited_sync_point()); 665 context3d_->last_waited_sync_point());
666 { 666 {
667 resource_provider_->WaitSyncPointIfNeeded(list[0].id);
667 ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(), 668 ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(),
668 list[0].id); 669 list[0].id);
669 } 670 }
670 EXPECT_EQ(list[0].mailbox_holder.sync_point, 671 EXPECT_EQ(list[0].mailbox_holder.sync_point,
671 context3d_->last_waited_sync_point()); 672 context3d_->last_waited_sync_point());
672 resource_provider_->DeclareUsedResourcesFromChild(child_id, 673 resource_provider_->DeclareUsedResourcesFromChild(child_id,
673 resource_ids_to_transfer); 674 resource_ids_to_transfer);
674 } 675 }
675 676
676 EXPECT_EQ(4u, resource_provider_->num_resources()); 677 EXPECT_EQ(4u, resource_provider_->num_resources());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 EXPECT_FALSE(returned_to_child[3].lost); 747 EXPECT_FALSE(returned_to_child[3].lost);
747 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); 748 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child);
748 returned_to_child.clear(); 749 returned_to_child.clear();
749 } 750 }
750 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); 751 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1));
751 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); 752 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2));
752 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); 753 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3));
753 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); 754 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4));
754 755
755 { 756 {
757 child_resource_provider_->WaitSyncPointIfNeeded(id1);
756 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), 758 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(),
757 id1); 759 id1);
758 ASSERT_NE(0U, lock.texture_id()); 760 ASSERT_NE(0U, lock.texture_id());
759 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); 761 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id());
760 child_context_->GetPixels(size, format, result); 762 child_context_->GetPixels(size, format, result);
761 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); 763 EXPECT_EQ(0, memcmp(data1, result, pixel_size));
762 } 764 }
763 { 765 {
766 child_resource_provider_->WaitSyncPointIfNeeded(id2);
764 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), 767 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(),
765 id2); 768 id2);
766 ASSERT_NE(0U, lock.texture_id()); 769 ASSERT_NE(0U, lock.texture_id());
767 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); 770 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id());
768 child_context_->GetPixels(size, format, result); 771 child_context_->GetPixels(size, format, result);
769 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); 772 EXPECT_EQ(0, memcmp(data2, result, pixel_size));
770 } 773 }
771 { 774 {
775 child_resource_provider_->WaitSyncPointIfNeeded(id3);
772 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), 776 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(),
773 id3); 777 id3);
774 ASSERT_NE(0U, lock.texture_id()); 778 ASSERT_NE(0U, lock.texture_id());
775 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); 779 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id());
776 } 780 }
777 { 781 {
778 // Transfer resources to the parent again. 782 // Transfer resources to the parent again.
779 ResourceProvider::ResourceIdArray resource_ids_to_transfer; 783 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
780 resource_ids_to_transfer.push_back(id1); 784 resource_ids_to_transfer.push_back(id1);
781 resource_ids_to_transfer.push_back(id2); 785 resource_ids_to_transfer.push_back(id2);
(...skipping 1729 matching lines...) Expand 10 before | Expand all | Expand 10 after
2511 TextureMailbox mailbox(gpu_mailbox, target, sync_point); 2515 TextureMailbox mailbox(gpu_mailbox, target, sync_point);
2512 2516
2513 ResourceProvider::ResourceId id = 2517 ResourceProvider::ResourceId id =
2514 resource_provider->CreateResourceFromTextureMailbox( 2518 resource_provider->CreateResourceFromTextureMailbox(
2515 mailbox, callback.Pass()); 2519 mailbox, callback.Pass());
2516 EXPECT_NE(0u, id); 2520 EXPECT_NE(0u, id);
2517 2521
2518 Mock::VerifyAndClearExpectations(context); 2522 Mock::VerifyAndClearExpectations(context);
2519 2523
2520 { 2524 {
2525 // Mailbox sync point WaitSyncPoint before using the texture.
2526 EXPECT_CALL(*context, waitSyncPoint(sync_point));
2527 resource_provider->WaitSyncPointIfNeeded(id);
2528 Mock::VerifyAndClearExpectations(context);
2529
2521 // Using the texture does a consume of the mailbox. 2530 // Using the texture does a consume of the mailbox.
2522 EXPECT_CALL(*context, bindTexture(target, texture_id)); 2531 EXPECT_CALL(*context, bindTexture(target, texture_id));
2523 EXPECT_CALL(*context, waitSyncPoint(sync_point));
2524 EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _)); 2532 EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _));
2525 2533
2526 EXPECT_CALL(*context, insertSyncPoint()).Times(0); 2534 EXPECT_CALL(*context, insertSyncPoint()).Times(0);
2527 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); 2535 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
2528 2536
2529 ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id); 2537 ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id);
2530 Mock::VerifyAndClearExpectations(context); 2538 Mock::VerifyAndClearExpectations(context);
2531 2539
2532 // When done with it, a sync point should be inserted, but no produce is 2540 // When done with it, a sync point should be inserted, but no produce is
2533 // necessary. 2541 // necessary.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2575 TextureMailbox mailbox(gpu_mailbox, target, sync_point); 2583 TextureMailbox mailbox(gpu_mailbox, target, sync_point);
2576 2584
2577 ResourceProvider::ResourceId id = 2585 ResourceProvider::ResourceId id =
2578 resource_provider->CreateResourceFromTextureMailbox( 2586 resource_provider->CreateResourceFromTextureMailbox(
2579 mailbox, callback.Pass()); 2587 mailbox, callback.Pass());
2580 EXPECT_NE(0u, id); 2588 EXPECT_NE(0u, id);
2581 2589
2582 Mock::VerifyAndClearExpectations(context); 2590 Mock::VerifyAndClearExpectations(context);
2583 2591
2584 { 2592 {
2593 // Mailbox sync point WaitSyncPoint before using the texture.
2594 EXPECT_CALL(*context, waitSyncPoint(sync_point));
2595 resource_provider->WaitSyncPointIfNeeded(id);
2596 Mock::VerifyAndClearExpectations(context);
2597
2585 // Using the texture does a consume of the mailbox. 2598 // Using the texture does a consume of the mailbox.
2586 EXPECT_CALL(*context, bindTexture(target, texture_id)); 2599 EXPECT_CALL(*context, bindTexture(target, texture_id));
2587 EXPECT_CALL(*context, waitSyncPoint(sync_point));
2588 EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _)); 2600 EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _));
2589 2601
2590 EXPECT_CALL(*context, insertSyncPoint()).Times(0); 2602 EXPECT_CALL(*context, insertSyncPoint()).Times(0);
2591 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); 2603 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
2592 2604
2593 ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id); 2605 ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id);
2594 Mock::VerifyAndClearExpectations(context); 2606 Mock::VerifyAndClearExpectations(context);
2595 2607
2596 // When done with it, a sync point should be inserted, but no produce is 2608 // When done with it, a sync point should be inserted, but no produce is
2597 // necessary. 2609 // necessary.
2598 EXPECT_CALL(*context, bindTexture(_, _)).Times(0); 2610 EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
2599 EXPECT_CALL(*context, insertSyncPoint()); 2611 EXPECT_CALL(*context, insertSyncPoint());
2600 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); 2612 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
2601 2613
2602 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); 2614 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
2603 EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0); 2615 EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
2604 } 2616 }
2605 } 2617 }
2606 2618
2619 TEST_P(ResourceProviderTest,
2620 TextureMailbox_WaitSyncPointIfNeeded_WithSyncPoint) {
2621 // Mailboxing is only supported for GL textures.
2622 if (GetParam() != ResourceProvider::GLTexture)
2623 return;
2624
2625 scoped_ptr<TextureStateTrackingContext> context_owned(
2626 new TextureStateTrackingContext);
2627 TextureStateTrackingContext* context = context_owned.get();
2628
2629 FakeOutputSurfaceClient output_surface_client;
2630 scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
2631 context_owned.PassAs<TestWebGraphicsContext3D>()));
2632 CHECK(output_surface->BindToClient(&output_surface_client));
2633
2634 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
2635 output_surface.get(), shared_bitmap_manager_.get(), 0, false, 1, false));
2636
2637 uint32 sync_point = 30;
2638 unsigned target = GL_TEXTURE_2D;
2639
2640 EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
2641 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
2642 EXPECT_CALL(*context, insertSyncPoint()).Times(0);
2643 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
2644 EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
2645
2646 gpu::Mailbox gpu_mailbox;
2647 memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
2648 scoped_ptr<SingleReleaseCallback> callback =
2649 SingleReleaseCallback::Create(base::Bind(&EmptyReleaseCallback));
2650
2651 TextureMailbox mailbox(gpu_mailbox, target, sync_point);
2652
2653 ResourceProvider::ResourceId id =
2654 resource_provider->CreateResourceFromTextureMailbox(mailbox,
2655 callback.Pass());
2656 EXPECT_NE(0u, id);
2657
2658 Mock::VerifyAndClearExpectations(context);
2659
2660 {
2661 // First call to WaitSyncPointIfNeeded should call waitSyncPoint.
2662 EXPECT_CALL(*context, waitSyncPoint(sync_point));
2663 resource_provider->WaitSyncPointIfNeeded(id);
2664 Mock::VerifyAndClearExpectations(context);
2665
2666 // Subsequent calls to WaitSyncPointIfNeeded shouldn't call waitSyncPoint.
2667 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
2668 resource_provider->WaitSyncPointIfNeeded(id);
2669 Mock::VerifyAndClearExpectations(context);
2670 }
2671 }
2672
2673 TEST_P(ResourceProviderTest, TextureMailbox_WaitSyncPointIfNeeded_NoSyncPoint) {
2674 // Mailboxing is only supported for GL textures.
2675 if (GetParam() != ResourceProvider::GLTexture)
2676 return;
2677
2678 scoped_ptr<TextureStateTrackingContext> context_owned(
2679 new TextureStateTrackingContext);
2680 TextureStateTrackingContext* context = context_owned.get();
2681
2682 FakeOutputSurfaceClient output_surface_client;
2683 scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
2684 context_owned.PassAs<TestWebGraphicsContext3D>()));
2685 CHECK(output_surface->BindToClient(&output_surface_client));
2686
2687 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
2688 output_surface.get(), shared_bitmap_manager_.get(), 0, false, 1, false));
2689
2690 uint32 sync_point = 0;
2691 unsigned target = GL_TEXTURE_2D;
2692
2693 EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
2694 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
2695 EXPECT_CALL(*context, insertSyncPoint()).Times(0);
2696 EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
2697 EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
2698
2699 gpu::Mailbox gpu_mailbox;
2700 memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
2701 scoped_ptr<SingleReleaseCallback> callback =
2702 SingleReleaseCallback::Create(base::Bind(&EmptyReleaseCallback));
2703
2704 TextureMailbox mailbox(gpu_mailbox, target, sync_point);
2705
2706 ResourceProvider::ResourceId id =
2707 resource_provider->CreateResourceFromTextureMailbox(mailbox,
2708 callback.Pass());
2709 EXPECT_NE(0u, id);
2710
2711 Mock::VerifyAndClearExpectations(context);
2712
2713 {
2714 // WaitSyncPointIfNeeded with sync_point == 0 shouldn't call waitSyncPoint.
2715 EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
2716 resource_provider->WaitSyncPointIfNeeded(id);
2717 Mock::VerifyAndClearExpectations(context);
2718 }
2719 }
2720
2607 class AllocationTrackingContext3D : public TestWebGraphicsContext3D { 2721 class AllocationTrackingContext3D : public TestWebGraphicsContext3D {
2608 public: 2722 public:
2609 MOCK_METHOD0(NextTextureId, GLuint()); 2723 MOCK_METHOD0(NextTextureId, GLuint());
2610 MOCK_METHOD1(RetireTextureId, void(GLuint id)); 2724 MOCK_METHOD1(RetireTextureId, void(GLuint id));
2611 MOCK_METHOD2(bindTexture, void(GLenum target, GLuint texture)); 2725 MOCK_METHOD2(bindTexture, void(GLenum target, GLuint texture));
2612 MOCK_METHOD5(texStorage2DEXT, 2726 MOCK_METHOD5(texStorage2DEXT,
2613 void(GLenum target, 2727 void(GLenum target,
2614 GLint levels, 2728 GLint levels,
2615 GLuint internalformat, 2729 GLuint internalformat,
2616 GLint width, 2730 GLint width,
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
3405 resource_provider->AllocateForTesting(id); 3519 resource_provider->AllocateForTesting(id);
3406 Mock::VerifyAndClearExpectations(context); 3520 Mock::VerifyAndClearExpectations(context);
3407 3521
3408 DCHECK_EQ(10u, context->PeekTextureId()); 3522 DCHECK_EQ(10u, context->PeekTextureId());
3409 resource_provider->DeleteResource(id); 3523 resource_provider->DeleteResource(id);
3410 } 3524 }
3411 } 3525 }
3412 3526
3413 } // namespace 3527 } // namespace
3414 } // namespace cc 3528 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698