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_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 8646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8657 // Really we just need at least one client notification each time | 8657 // Really we just need at least one client notification each time |
8658 // we go from having a valid output surface to not having a valid output | 8658 // we go from having a valid output surface to not having a valid output |
8659 // surface. | 8659 // surface. |
8660 EXPECT_EQ(0, num_lost_surfaces_); | 8660 EXPECT_EQ(0, num_lost_surfaces_); |
8661 host_impl_->DidLoseOutputSurface(); | 8661 host_impl_->DidLoseOutputSurface(); |
8662 EXPECT_EQ(1, num_lost_surfaces_); | 8662 EXPECT_EQ(1, num_lost_surfaces_); |
8663 host_impl_->DidLoseOutputSurface(); | 8663 host_impl_->DidLoseOutputSurface(); |
8664 EXPECT_LE(1, num_lost_surfaces_); | 8664 EXPECT_LE(1, num_lost_surfaces_); |
8665 } | 8665 } |
8666 | 8666 |
| 8667 size_t CountRenderPassesWithId(const RenderPassList& list, RenderPassId id) { |
| 8668 return std::count_if(list.begin(), list.end(), |
| 8669 [id](const RenderPass* p) { return p->id == id; }); |
| 8670 } |
| 8671 |
8667 TEST_F(LayerTreeHostImplTest, RemoveUnreferencedRenderPass) { | 8672 TEST_F(LayerTreeHostImplTest, RemoveUnreferencedRenderPass) { |
8668 LayerTreeHostImpl::FrameData frame; | 8673 LayerTreeHostImpl::FrameData frame; |
8669 frame.render_passes.push_back(RenderPass::Create()); | 8674 frame.render_passes.push_back(RenderPass::Create()); |
8670 RenderPass* pass3 = frame.render_passes.back(); | 8675 RenderPass* pass3 = frame.render_passes.back(); |
8671 frame.render_passes.push_back(RenderPass::Create()); | 8676 frame.render_passes.push_back(RenderPass::Create()); |
8672 RenderPass* pass2 = frame.render_passes.back(); | 8677 RenderPass* pass2 = frame.render_passes.back(); |
8673 frame.render_passes.push_back(RenderPass::Create()); | 8678 frame.render_passes.push_back(RenderPass::Create()); |
8674 RenderPass* pass1 = frame.render_passes.back(); | 8679 RenderPass* pass1 = frame.render_passes.back(); |
8675 | 8680 |
8676 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8681 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8677 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8682 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8678 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8683 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8679 | 8684 |
8680 frame.render_passes_by_id[pass1->id] = pass1; | |
8681 frame.render_passes_by_id[pass2->id] = pass2; | |
8682 frame.render_passes_by_id[pass3->id] = pass3; | |
8683 | |
8684 // Add a quad to each pass so they aren't empty. | 8685 // Add a quad to each pass so they aren't empty. |
8685 SolidColorDrawQuad* color_quad; | 8686 SolidColorDrawQuad* color_quad; |
8686 color_quad = pass1->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 8687 color_quad = pass1->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
8687 color_quad->material = DrawQuad::SOLID_COLOR; | 8688 color_quad->material = DrawQuad::SOLID_COLOR; |
8688 color_quad = pass2->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 8689 color_quad = pass2->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
8689 color_quad->material = DrawQuad::SOLID_COLOR; | 8690 color_quad->material = DrawQuad::SOLID_COLOR; |
8690 color_quad = pass3->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 8691 color_quad = pass3->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
8691 color_quad->material = DrawQuad::SOLID_COLOR; | 8692 color_quad->material = DrawQuad::SOLID_COLOR; |
8692 | 8693 |
8693 // pass3 is referenced by pass2. | 8694 // pass3 is referenced by pass2. |
8694 RenderPassDrawQuad* rpdq = | 8695 RenderPassDrawQuad* rpdq = |
8695 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); | 8696 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
8696 rpdq->material = DrawQuad::RENDER_PASS; | 8697 rpdq->material = DrawQuad::RENDER_PASS; |
8697 rpdq->render_pass_id = pass3->id; | 8698 rpdq->render_pass_id = pass3->id; |
8698 | 8699 |
8699 // But pass2 is not referenced by pass1. So pass2 and pass3 should be culled. | 8700 // But pass2 is not referenced by pass1. So pass2 and pass3 should be culled. |
8700 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); | 8701 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); |
8701 EXPECT_EQ(1u, frame.render_passes_by_id.size()); | |
8702 EXPECT_TRUE(frame.render_passes_by_id[RenderPassId(1, 0)]); | |
8703 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(2, 0)]); | |
8704 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(3, 0)]); | |
8705 EXPECT_EQ(1u, frame.render_passes.size()); | 8702 EXPECT_EQ(1u, frame.render_passes.size()); |
| 8703 EXPECT_EQ(1u, |
| 8704 CountRenderPassesWithId(frame.render_passes, RenderPassId(1, 0))); |
| 8705 EXPECT_EQ(0u, |
| 8706 CountRenderPassesWithId(frame.render_passes, RenderPassId(2, 0))); |
| 8707 EXPECT_EQ(0u, |
| 8708 CountRenderPassesWithId(frame.render_passes, RenderPassId(3, 0))); |
8706 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); | 8709 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); |
8707 } | 8710 } |
8708 | 8711 |
8709 TEST_F(LayerTreeHostImplTest, RemoveEmptyRenderPass) { | 8712 TEST_F(LayerTreeHostImplTest, RemoveEmptyRenderPass) { |
8710 LayerTreeHostImpl::FrameData frame; | 8713 LayerTreeHostImpl::FrameData frame; |
8711 frame.render_passes.push_back(RenderPass::Create()); | 8714 frame.render_passes.push_back(RenderPass::Create()); |
8712 RenderPass* pass3 = frame.render_passes.back(); | 8715 RenderPass* pass3 = frame.render_passes.back(); |
8713 frame.render_passes.push_back(RenderPass::Create()); | 8716 frame.render_passes.push_back(RenderPass::Create()); |
8714 RenderPass* pass2 = frame.render_passes.back(); | 8717 RenderPass* pass2 = frame.render_passes.back(); |
8715 frame.render_passes.push_back(RenderPass::Create()); | 8718 frame.render_passes.push_back(RenderPass::Create()); |
8716 RenderPass* pass1 = frame.render_passes.back(); | 8719 RenderPass* pass1 = frame.render_passes.back(); |
8717 | 8720 |
8718 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8721 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8719 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8722 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8720 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8723 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8721 | 8724 |
8722 frame.render_passes_by_id[pass1->id] = pass1; | |
8723 frame.render_passes_by_id[pass2->id] = pass2; | |
8724 frame.render_passes_by_id[pass3->id] = pass3; | |
8725 | |
8726 // pass1 is not empty, but pass2 and pass3 are. | 8725 // pass1 is not empty, but pass2 and pass3 are. |
8727 SolidColorDrawQuad* color_quad; | 8726 SolidColorDrawQuad* color_quad; |
8728 color_quad = pass1->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 8727 color_quad = pass1->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
8729 color_quad->material = DrawQuad::SOLID_COLOR; | 8728 color_quad->material = DrawQuad::SOLID_COLOR; |
8730 | 8729 |
8731 // pass3 is referenced by pass2. | 8730 // pass3 is referenced by pass2. |
8732 RenderPassDrawQuad* rpdq = | 8731 RenderPassDrawQuad* rpdq = |
8733 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); | 8732 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
8734 rpdq->material = DrawQuad::RENDER_PASS; | 8733 rpdq->material = DrawQuad::RENDER_PASS; |
8735 rpdq->render_pass_id = pass3->id; | 8734 rpdq->render_pass_id = pass3->id; |
8736 | 8735 |
8737 // pass2 is referenced by pass1. | 8736 // pass2 is referenced by pass1. |
8738 rpdq = pass1->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); | 8737 rpdq = pass1->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
8739 rpdq->material = DrawQuad::RENDER_PASS; | 8738 rpdq->material = DrawQuad::RENDER_PASS; |
8740 rpdq->render_pass_id = pass2->id; | 8739 rpdq->render_pass_id = pass2->id; |
8741 | 8740 |
8742 // Since pass3 is empty it should be removed. Then pass2 is empty too, and | 8741 // Since pass3 is empty it should be removed. Then pass2 is empty too, and |
8743 // should be removed. | 8742 // should be removed. |
8744 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); | 8743 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); |
8745 EXPECT_EQ(1u, frame.render_passes_by_id.size()); | |
8746 EXPECT_TRUE(frame.render_passes_by_id[RenderPassId(1, 0)]); | |
8747 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(2, 0)]); | |
8748 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(3, 0)]); | |
8749 EXPECT_EQ(1u, frame.render_passes.size()); | 8744 EXPECT_EQ(1u, frame.render_passes.size()); |
| 8745 EXPECT_EQ(1u, |
| 8746 CountRenderPassesWithId(frame.render_passes, RenderPassId(1, 0))); |
| 8747 EXPECT_EQ(0u, |
| 8748 CountRenderPassesWithId(frame.render_passes, RenderPassId(2, 0))); |
| 8749 EXPECT_EQ(0u, |
| 8750 CountRenderPassesWithId(frame.render_passes, RenderPassId(3, 0))); |
8750 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); | 8751 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); |
8751 // The RenderPassDrawQuad should be removed from pass1. | 8752 // The RenderPassDrawQuad should be removed from pass1. |
8752 EXPECT_EQ(1u, pass1->quad_list.size()); | 8753 EXPECT_EQ(1u, pass1->quad_list.size()); |
8753 EXPECT_EQ(DrawQuad::SOLID_COLOR, pass1->quad_list.ElementAt(0)->material); | 8754 EXPECT_EQ(DrawQuad::SOLID_COLOR, pass1->quad_list.ElementAt(0)->material); |
8754 } | 8755 } |
8755 | 8756 |
8756 TEST_F(LayerTreeHostImplTest, DoNotRemoveEmptyRootRenderPass) { | 8757 TEST_F(LayerTreeHostImplTest, DoNotRemoveEmptyRootRenderPass) { |
8757 LayerTreeHostImpl::FrameData frame; | 8758 LayerTreeHostImpl::FrameData frame; |
8758 frame.render_passes.push_back(RenderPass::Create()); | 8759 frame.render_passes.push_back(RenderPass::Create()); |
8759 RenderPass* pass3 = frame.render_passes.back(); | 8760 RenderPass* pass3 = frame.render_passes.back(); |
8760 frame.render_passes.push_back(RenderPass::Create()); | 8761 frame.render_passes.push_back(RenderPass::Create()); |
8761 RenderPass* pass2 = frame.render_passes.back(); | 8762 RenderPass* pass2 = frame.render_passes.back(); |
8762 frame.render_passes.push_back(RenderPass::Create()); | 8763 frame.render_passes.push_back(RenderPass::Create()); |
8763 RenderPass* pass1 = frame.render_passes.back(); | 8764 RenderPass* pass1 = frame.render_passes.back(); |
8764 | 8765 |
8765 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8766 pass1->SetNew(RenderPassId(1, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8766 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8767 pass2->SetNew(RenderPassId(2, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8767 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); | 8768 pass3->SetNew(RenderPassId(3, 0), gfx::Rect(), gfx::Rect(), gfx::Transform()); |
8768 | 8769 |
8769 frame.render_passes_by_id[pass1->id] = pass1; | |
8770 frame.render_passes_by_id[pass2->id] = pass2; | |
8771 frame.render_passes_by_id[pass3->id] = pass3; | |
8772 | |
8773 // pass3 is referenced by pass2. | 8770 // pass3 is referenced by pass2. |
8774 RenderPassDrawQuad* rpdq = | 8771 RenderPassDrawQuad* rpdq = |
8775 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); | 8772 pass2->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
8776 rpdq->material = DrawQuad::RENDER_PASS; | 8773 rpdq->material = DrawQuad::RENDER_PASS; |
8777 rpdq->render_pass_id = pass3->id; | 8774 rpdq->render_pass_id = pass3->id; |
8778 | 8775 |
8779 // pass2 is referenced by pass1. | 8776 // pass2 is referenced by pass1. |
8780 rpdq = pass1->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); | 8777 rpdq = pass1->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
8781 rpdq->material = DrawQuad::RENDER_PASS; | 8778 rpdq->material = DrawQuad::RENDER_PASS; |
8782 rpdq->render_pass_id = pass2->id; | 8779 rpdq->render_pass_id = pass2->id; |
8783 | 8780 |
8784 // Since pass3 is empty it should be removed. Then pass2 is empty too, and | 8781 // Since pass3 is empty it should be removed. Then pass2 is empty too, and |
8785 // should be removed. Then pass1 is empty too, but it's the root so it should | 8782 // should be removed. Then pass1 is empty too, but it's the root so it should |
8786 // not be removed. | 8783 // not be removed. |
8787 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); | 8784 FakeLayerTreeHostImpl::RemoveRenderPasses(&frame); |
8788 EXPECT_EQ(1u, frame.render_passes_by_id.size()); | |
8789 EXPECT_TRUE(frame.render_passes_by_id[RenderPassId(1, 0)]); | |
8790 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(2, 0)]); | |
8791 EXPECT_FALSE(frame.render_passes_by_id[RenderPassId(3, 0)]); | |
8792 EXPECT_EQ(1u, frame.render_passes.size()); | 8785 EXPECT_EQ(1u, frame.render_passes.size()); |
| 8786 EXPECT_EQ(1u, |
| 8787 CountRenderPassesWithId(frame.render_passes, RenderPassId(1, 0))); |
| 8788 EXPECT_EQ(0u, |
| 8789 CountRenderPassesWithId(frame.render_passes, RenderPassId(2, 0))); |
| 8790 EXPECT_EQ(0u, |
| 8791 CountRenderPassesWithId(frame.render_passes, RenderPassId(3, 0))); |
8793 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); | 8792 EXPECT_EQ(RenderPassId(1, 0), frame.render_passes[0]->id); |
8794 // The RenderPassDrawQuad should be removed from pass1. | 8793 // The RenderPassDrawQuad should be removed from pass1. |
8795 EXPECT_EQ(0u, pass1->quad_list.size()); | 8794 EXPECT_EQ(0u, pass1->quad_list.size()); |
8796 } | 8795 } |
8797 | 8796 |
8798 class FakeVideoFrameController : public VideoFrameController { | 8797 class FakeVideoFrameController : public VideoFrameController { |
8799 public: | 8798 public: |
8800 void OnBeginFrame(const BeginFrameArgs& args) override { | 8799 void OnBeginFrame(const BeginFrameArgs& args) override { |
8801 begin_frame_args_ = args; | 8800 begin_frame_args_ = args; |
8802 did_draw_frame_ = false; | 8801 did_draw_frame_ = false; |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9018 host_impl_->active_tree()->SetPageScaleOnActiveTree(2.f); | 9017 host_impl_->active_tree()->SetPageScaleOnActiveTree(2.f); |
9019 DrawFrame(); | 9018 DrawFrame(); |
9020 in_subtree_of_page_scale_layer = host_impl_->active_tree()->LayerById(100); | 9019 in_subtree_of_page_scale_layer = host_impl_->active_tree()->LayerById(100); |
9021 node = host_impl_->active_tree()->property_trees()->transform_tree.Node( | 9020 node = host_impl_->active_tree()->property_trees()->transform_tree.Node( |
9022 in_subtree_of_page_scale_layer->transform_tree_index()); | 9021 in_subtree_of_page_scale_layer->transform_tree_index()); |
9023 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(2.f, 2.f)); | 9022 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(2.f, 2.f)); |
9024 } | 9023 } |
9025 | 9024 |
9026 } // namespace | 9025 } // namespace |
9027 } // namespace cc | 9026 } // namespace cc |
OLD | NEW |