Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/synchronization/lock.h" | 9 #include "base/synchronization/lock.h" |
| 10 #include "cc/animation/timing_function.h" | 10 #include "cc/animation/timing_function.h" |
| (...skipping 2546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2557 | 2557 |
| 2558 virtual void AfterTest() OVERRIDE {} | 2558 virtual void AfterTest() OVERRIDE {} |
| 2559 | 2559 |
| 2560 int io_surface_id_; | 2560 int io_surface_id_; |
| 2561 MockIOSurfaceWebGraphicsContext3D* mock_context_; | 2561 MockIOSurfaceWebGraphicsContext3D* mock_context_; |
| 2562 gfx::Size io_surface_size_; | 2562 gfx::Size io_surface_size_; |
| 2563 }; | 2563 }; |
| 2564 | 2564 |
| 2565 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestIOSurfaceDrawing); | 2565 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestIOSurfaceDrawing); |
| 2566 | 2566 |
| 2567 class LayerTreeHostTestAsyncReadback : public LayerTreeHostTest { | |
| 2568 protected: | |
| 2569 virtual void SetupTree() OVERRIDE { | |
| 2570 root = FakeContentLayer::Create(&client_); | |
| 2571 root->SetBounds(gfx::Size(20, 20)); | |
| 2572 | |
| 2573 child = FakeContentLayer::Create(&client_); | |
| 2574 child->SetBounds(gfx::Size(10, 10)); | |
| 2575 root->AddChild(child); | |
| 2576 | |
| 2577 layer_tree_host()->SetRootLayer(root); | |
| 2578 LayerTreeHostTest::SetupTree(); | |
| 2579 } | |
| 2580 | |
| 2581 virtual void BeginTest() OVERRIDE { | |
| 2582 PostSetNeedsCommitToMainThread(); | |
| 2583 } | |
| 2584 | |
| 2585 virtual void DidCommitAndDrawFrame() { | |
| 2586 int frame = layer_tree_host()->commit_number(); | |
| 2587 switch (frame) { | |
| 2588 case 1: | |
| 2589 child->RequestCopyAsBitmap(base::Bind( | |
| 2590 &LayerTreeHostTestAsyncReadback::BitmapCallback, | |
| 2591 base::Unretained(this))); | |
| 2592 EXPECT_EQ(0u, callbacks_.size()); | |
| 2593 break; | |
| 2594 case 2: | |
| 2595 // Flush the message loops and make sure the callbacks run. | |
| 2596 layer_tree_host()->SetNeedsCommit(); | |
| 2597 break; | |
| 2598 case 3: | |
| 2599 ASSERT_EQ(1u, callbacks_.size()); | |
| 2600 EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[0].ToString()); | |
| 2601 | |
| 2602 child->RequestCopyAsBitmap(base::Bind( | |
| 2603 &LayerTreeHostTestAsyncReadback::BitmapCallback, | |
| 2604 base::Unretained(this))); | |
| 2605 root->RequestCopyAsBitmap(base::Bind( | |
| 2606 &LayerTreeHostTestAsyncReadback::BitmapCallback, | |
| 2607 base::Unretained(this))); | |
| 2608 child->RequestCopyAsBitmap(base::Bind( | |
| 2609 &LayerTreeHostTestAsyncReadback::BitmapCallback, | |
| 2610 base::Unretained(this))); | |
| 2611 EXPECT_EQ(1u, callbacks_.size()); | |
| 2612 break; | |
| 2613 case 4: | |
| 2614 // Flush the message loops and make sure the callbacks run. | |
| 2615 layer_tree_host()->SetNeedsCommit(); | |
| 2616 break; | |
| 2617 case 5: | |
| 2618 ASSERT_EQ(4u, callbacks_.size()); | |
| 2619 // The child was copied to a bitmap and passed back twice. | |
| 2620 EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[1].ToString()); | |
| 2621 EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[2].ToString()); | |
| 2622 // The root was copied to a bitmap and passed back also. | |
| 2623 EXPECT_EQ(gfx::Size(20, 20).ToString(), callbacks_[3].ToString()); | |
| 2624 EndTest(); | |
| 2625 break; | |
| 2626 } | |
| 2627 } | |
| 2628 | |
| 2629 void BitmapCallback(scoped_ptr<SkBitmap> bitmap) { | |
| 2630 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | |
| 2631 EXPECT_TRUE(bitmap); | |
| 2632 callbacks_.push_back(gfx::Size(bitmap->width(), bitmap->height())); | |
| 2633 } | |
| 2634 | |
| 2635 virtual void AfterTest() {} | |
| 2636 | |
| 2637 virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { | |
| 2638 if (use_gl_renderer_) | |
| 2639 return FakeOutputSurface::Create3d().PassAs<OutputSurface>(); | |
| 2640 return FakeOutputSurface::CreateSoftware( | |
| 2641 make_scoped_ptr(new SoftwareOutputDevice)).PassAs<OutputSurface>(); | |
| 2642 } | |
| 2643 | |
| 2644 bool use_gl_renderer_; | |
| 2645 std::vector<gfx::Size> callbacks_; | |
| 2646 FakeContentLayerClient client_; | |
| 2647 scoped_refptr<FakeContentLayer> root; | |
| 2648 scoped_refptr<FakeContentLayer> child; | |
| 2649 }; | |
| 2650 | |
| 2651 TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunSingleThread) { | |
| 2652 use_gl_renderer_ = true; | |
| 2653 RunTest(false); | |
| 2654 } | |
| 2655 | |
| 2656 TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunMultiThread) { | |
| 2657 use_gl_renderer_ = true; | |
| 2658 RunTest(true); | |
| 2659 } | |
| 2660 | |
| 2661 TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunSingleThread) { | |
| 2662 use_gl_renderer_ = false; | |
| 2663 RunTest(false); | |
| 2664 } | |
| 2665 | |
| 2666 TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunMultiThread) { | |
| 2667 use_gl_renderer_ = false; | |
| 2668 RunTest(true); | |
| 2669 } | |
| 2670 | |
| 2671 class LayerTreeHostTestAsyncReadbackLayerDestroyed : public LayerTreeHostTest { | |
| 2672 protected: | |
| 2673 virtual void SetupTree() OVERRIDE { | |
| 2674 root = FakeContentLayer::Create(&client_); | |
| 2675 root->SetBounds(gfx::Size(20, 20)); | |
| 2676 | |
| 2677 main_destroyed = FakeContentLayer::Create(&client_); | |
| 2678 main_destroyed->SetBounds(gfx::Size(15, 15)); | |
| 2679 root->AddChild(main_destroyed); | |
| 2680 | |
| 2681 impl_destroyed = FakeContentLayer::Create(&client_); | |
| 2682 impl_destroyed->SetBounds(gfx::Size(10, 10)); | |
| 2683 root->AddChild(impl_destroyed); | |
| 2684 | |
| 2685 layer_tree_host()->SetRootLayer(root); | |
| 2686 LayerTreeHostTest::SetupTree(); | |
| 2687 } | |
| 2688 | |
| 2689 virtual void BeginTest() OVERRIDE { | |
| 2690 callback_count_ = 0; | |
| 2691 PostSetNeedsCommitToMainThread(); | |
| 2692 } | |
| 2693 | |
| 2694 virtual void DidCommit() { | |
| 2695 int frame = layer_tree_host()->commit_number(); | |
| 2696 switch (frame) { | |
| 2697 case 1: | |
| 2698 main_destroyed->RequestCopyAsBitmap(base::Bind( | |
| 2699 &LayerTreeHostTestAsyncReadbackLayerDestroyed::BitmapCallback, | |
| 2700 base::Unretained(this))); | |
| 2701 impl_destroyed->RequestCopyAsBitmap(base::Bind( | |
| 2702 &LayerTreeHostTestAsyncReadbackLayerDestroyed::BitmapCallback, | |
| 2703 base::Unretained(this))); | |
| 2704 EXPECT_EQ(0, callback_count_); | |
| 2705 | |
| 2706 // Destroy the main thread layer right away. | |
| 2707 main_destroyed->RemoveFromParent(); | |
| 2708 main_destroyed = NULL; | |
| 2709 | |
| 2710 // Should callback with a NULL bitmap. | |
| 2711 EXPECT_EQ(1, callback_count_); | |
| 2712 | |
| 2713 // Prevent drawing so we can't make a copy of the impl_destroyed layer. | |
| 2714 layer_tree_host()->SetViewportSize(gfx::Size()); | |
| 2715 break; | |
| 2716 case 2: | |
| 2717 // Flush the message loops and make sure the callbacks run. | |
| 2718 layer_tree_host()->SetNeedsCommit(); | |
| 2719 break; | |
| 2720 case 3: | |
| 2721 // No drawing means no readback yet. | |
| 2722 EXPECT_EQ(1, callback_count_); | |
| 2723 | |
| 2724 // Destroy the impl thread layer. | |
| 2725 impl_destroyed->RemoveFromParent(); | |
| 2726 impl_destroyed = NULL; | |
| 2727 | |
| 2728 // No callback yet because it's on the impl side. | |
| 2729 EXPECT_EQ(1, callback_count_); | |
| 2730 break; | |
| 2731 case 4: | |
| 2732 // Flush the message loops and make sure the callbacks run. | |
| 2733 layer_tree_host()->SetNeedsCommit(); | |
| 2734 break; | |
| 2735 case 5: | |
| 2736 // We should get another callback with a NULL bitmap. | |
| 2737 EXPECT_EQ(2, callback_count_); | |
| 2738 EndTest(); | |
| 2739 break; | |
| 2740 } | |
| 2741 } | |
| 2742 | |
| 2743 void BitmapCallback(scoped_ptr<SkBitmap> bitmap) { | |
| 2744 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | |
| 2745 EXPECT_FALSE(bitmap); | |
| 2746 ++callback_count_; | |
| 2747 } | |
| 2748 | |
| 2749 virtual void AfterTest() {} | |
| 2750 | |
| 2751 int callback_count_; | |
| 2752 FakeContentLayerClient client_; | |
| 2753 scoped_refptr<FakeContentLayer> root; | |
|
piman
2013/04/26 00:15:02
nit: trailing _ on fields, here and below
danakj
2013/04/26 01:00:06
Done.
| |
| 2754 scoped_refptr<FakeContentLayer> main_destroyed; | |
| 2755 scoped_refptr<FakeContentLayer> impl_destroyed; | |
| 2756 }; | |
| 2757 | |
| 2758 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestAsyncReadbackLayerDestroyed); | |
| 2759 | |
| 2567 } // namespace | 2760 } // namespace |
| 2568 } // namespace cc | 2761 } // namespace cc |
| OLD | NEW |