| 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 |