Chromium Code Reviews| Index: cc/trees/occlusion_tracker_perftest.cc |
| diff --git a/cc/trees/occlusion_tracker_perftest.cc b/cc/trees/occlusion_tracker_perftest.cc |
| index 32b85a4775ea1f6b9f0ff2fa28e2f6386bc145d4..191ba64ca56d363412ffdf1b232c8e6324bad184 100644 |
| --- a/cc/trees/occlusion_tracker_perftest.cc |
| +++ b/cc/trees/occlusion_tracker_perftest.cc |
| @@ -14,6 +14,7 @@ |
| #include "cc/test/lap_timer.h" |
| #include "cc/trees/layer_tree_host_impl.h" |
| #include "cc/trees/layer_tree_impl.h" |
| +#include "cc/trees/single_thread_proxy.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/perf/perf_test.h" |
| @@ -64,7 +65,6 @@ class OcclusionTrackerPerfTest : public testing::Test { |
| scoped_ptr<LayerTreeHostImpl> host_impl_; |
| }; |
| -// Simulates a page with several large, transformed and animated layers. |
| TEST_F(OcclusionTrackerPerfTest, UnoccludedContentRect_FullyOccluded) { |
| SetTestName("unoccluded_content_rect_fully_occluded"); |
| @@ -72,6 +72,8 @@ TEST_F(OcclusionTrackerPerfTest, UnoccludedContentRect_FullyOccluded) { |
| OcclusionTrackerBase<LayerImpl, LayerImpl::RenderSurfaceType> tracker( |
| viewport_rect, false); |
| + DebugScopedSetImplThread impl(&proxy_); |
|
enne (OOO)
2014/02/13 23:55:07
Should the occlusion tracker test do this?
danakj
2014/02/14 00:00:53
Sure, done.
|
| + |
| CreateHost(); |
| host_impl_->SetViewportSize(viewport_rect.size()); |
| @@ -137,5 +139,85 @@ TEST_F(OcclusionTrackerPerfTest, UnoccludedContentRect_FullyOccluded) { |
| PrintResults(); |
| } |
| +TEST_F(OcclusionTrackerPerfTest, UnoccludedContentRect_10OpaqueLayers) { |
| + static const int kNumOpaqueLayers = 10; |
| + SetTestName("unoccluded_content_rect_10_opaque_layers"); |
| + |
| + gfx::Rect viewport_rect(768, 1038); |
| + OcclusionTrackerBase<LayerImpl, LayerImpl::RenderSurfaceType> tracker( |
| + viewport_rect, false); |
| + |
| + DebugScopedSetImplThread impl(&proxy_); |
| + |
| + CreateHost(); |
| + host_impl_->SetViewportSize(viewport_rect.size()); |
| + |
| + for (int i = 0; i < kNumOpaqueLayers; ++i) { |
| + scoped_ptr<SolidColorLayerImpl> opaque_layer = |
| + SolidColorLayerImpl::Create(active_tree(), 2 + i); |
| + opaque_layer->SetBackgroundColor(SK_ColorRED); |
| + opaque_layer->SetContentsOpaque(true); |
| + opaque_layer->SetDrawsContent(true); |
| + opaque_layer->SetBounds( |
| + gfx::Size(viewport_rect.width() / 2, viewport_rect.height() / 2)); |
| + opaque_layer->SetContentBounds( |
| + gfx::Size(viewport_rect.width() / 2, viewport_rect.height() / 2)); |
| + opaque_layer->SetPosition(gfx::Point(i, i)); |
| + active_tree()->root_layer()->AddChild(opaque_layer.PassAs<LayerImpl>()); |
| + } |
| + |
| + active_tree()->UpdateDrawProperties(); |
| + const LayerImplList& rsll = active_tree()->RenderSurfaceLayerList(); |
| + ASSERT_EQ(1u, rsll.size()); |
| + EXPECT_EQ(static_cast<size_t>(kNumOpaqueLayers), |
| + rsll[0]->render_surface()->layer_list().size()); |
| + |
| + typedef LayerIterator<LayerImpl, |
|
enne (OOO)
2014/02/13 23:55:07
This seems like baking in logic from the occlusion
danakj
2014/02/14 00:00:53
This is the tree walk in LayerTreeHostImpl. Then I
enne (OOO)
2014/02/14 00:03:38
Hrm, ok. Do you think it'd be worth leaving a com
danakj
2014/02/14 00:05:29
Not really, because this is just how we walk a lay
enne (OOO)
2014/02/14 00:07:18
Ok ok.
|
| + LayerImpl::LayerListType, |
| + LayerImpl::RenderSurfaceType, |
| + LayerIteratorActions::FrontToBack> IteratorType; |
| + IteratorType begin = IteratorType::Begin(&rsll); |
| + IteratorType end = IteratorType::End(&rsll); |
| + |
| + // The opaque_layers add occlusion. |
| + for (int i = 0; i < kNumOpaqueLayers - 1; ++i) { |
| + LayerIteratorPosition<LayerImpl> pos = begin; |
| + tracker.EnterLayer(pos); |
| + tracker.LeaveLayer(pos); |
| + ++begin; |
| + } |
| + LayerIteratorPosition<LayerImpl> pos = begin; |
| + tracker.EnterLayer(pos); |
| + tracker.LeaveLayer(pos); |
| + |
| + gfx::Transform transform_to_target; |
| + transform_to_target.Translate(0, 96); |
| + bool impl_draw_transform_is_unknown = false; |
| + |
| + do { |
| + for (int x = 0; x < viewport_rect.width(); x += 256) { |
| + for (int y = 0; y < viewport_rect.height(); y += 256) { |
| + gfx::Rect query_content_rect(x, y, 256, 256); |
| + gfx::Rect unoccluded = |
| + tracker.UnoccludedContentRect(pos.target_render_surface_layer, |
| + query_content_rect, |
| + transform_to_target, |
| + impl_draw_transform_is_unknown); |
| + } |
| + } |
| + |
| + timer_.NextLap(); |
| + } while (!timer_.HasTimeLimitExpired()); |
| + |
| + ++begin; |
| + LayerIteratorPosition<LayerImpl> next = begin; |
| + EXPECT_EQ(active_tree()->root_layer(), next.current_layer); |
| + |
| + ++begin; |
| + EXPECT_EQ(end, begin); |
| + |
| + PrintResults(); |
| +} |
| + |
| } // namespace |
| } // namespace cc |