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
3 // found in the LICENSE file.
5 #include "cc/trees/quad_culler.h"
9 #include "cc/base/math_util.h"
10 #include "cc/debug/overdraw_metrics.h"
11 #include "cc/layers/append_quads_data.h"
12 #include "cc/layers/render_surface_impl.h"
13 #include "cc/layers/tiled_layer_impl.h"
14 #include "cc/quads/tile_draw_quad.h"
15 #include "cc/resources/layer_tiling_data.h"
16 #include "cc/test/fake_impl_proxy.h"
17 #include "cc/test/fake_layer_tree_host_impl.h"
18 #include "cc/trees/occlusion_tracker.h"
19 #include "cc/trees/single_thread_proxy.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "ui/gfx/transform.h"
27 class TestOcclusionTrackerImpl
: public OcclusionTrackerImpl
{
29 TestOcclusionTrackerImpl(gfx::Rect scissor_rect_in_screen
,
30 bool record_metrics_for_frame
= true)
31 : OcclusionTrackerImpl(scissor_rect_in_screen
, record_metrics_for_frame
),
32 scissor_rect_in_screen_(scissor_rect_in_screen
) {}
35 virtual gfx::Rect
LayerScissorRectInTargetSurface(
36 const LayerImpl
* layer
) const {
37 return scissor_rect_in_screen_
;
41 gfx::Rect scissor_rect_in_screen_
;
43 DISALLOW_COPY_AND_ASSIGN(TestOcclusionTrackerImpl
);
46 typedef LayerIterator
<LayerImpl
,
49 LayerIteratorActions::FrontToBack
> LayerIteratorType
;
51 class QuadCullerTest
: public testing::Test
{
54 : host_impl_(&proxy_
),
57 scoped_ptr
<TiledLayerImpl
> MakeLayer(
58 TiledLayerImpl
* parent
,
59 const gfx::Transform
& draw_transform
,
63 gfx::Rect layer_opaque_rect
,
64 LayerImplList
& surface_layer_list
) {
65 scoped_ptr
<TiledLayerImpl
> layer
=
66 TiledLayerImpl::Create(host_impl_
.active_tree(), layer_id_
++);
67 scoped_ptr
<LayerTilingData
> tiler
= LayerTilingData::Create(
68 gfx::Size(100, 100), LayerTilingData::NO_BORDER_TEXELS
);
69 tiler
->SetBounds(layer_rect
.size());
70 layer
->SetTilingData(*tiler
);
71 layer
->set_skips_draw(false);
72 layer
->draw_properties().target_space_transform
= draw_transform
;
73 layer
->draw_properties().screen_space_transform
= draw_transform
;
74 layer
->draw_properties().visible_content_rect
= layer_rect
;
75 layer
->draw_properties().opacity
= opacity
;
76 layer
->SetContentsOpaque(opaque
);
77 layer
->SetBounds(layer_rect
.size());
78 layer
->SetContentBounds(layer_rect
.size());
80 ResourceProvider::ResourceId resource_id
= 1;
81 for (int i
= 0; i
< tiler
->num_tiles_x(); ++i
) {
82 for (int j
= 0; j
< tiler
->num_tiles_y(); ++j
) {
83 gfx::Rect tile_opaque_rect
=
85 ? tiler
->tile_bounds(i
, j
)
86 : gfx::IntersectRects(tiler
->tile_bounds(i
, j
), layer_opaque_rect
);
87 layer
->PushTileProperties(i
, j
, resource_id
++, tile_opaque_rect
, false);
91 gfx::Rect rect_in_target
= MathUtil::MapClippedRect(
92 layer
->draw_transform(), layer
->visible_content_rect());
94 layer
->CreateRenderSurface();
95 layer
->render_surface()->SetContentRect(rect_in_target
);
96 surface_layer_list
.push_back(layer
.get());
97 layer
->render_surface()->layer_list().push_back(layer
.get());
99 layer
->draw_properties().render_target
= parent
->render_target();
100 parent
->render_surface()->layer_list().push_back(layer
.get());
101 rect_in_target
.Union(MathUtil::MapClippedRect(
102 parent
->draw_transform(), parent
->visible_content_rect()));
103 parent
->render_surface()->SetContentRect(rect_in_target
);
105 layer
->draw_properties().drawable_content_rect
= rect_in_target
;
110 void AppendQuads(QuadList
* quad_list
,
111 SharedQuadStateList
* shared_state_list
,
112 TiledLayerImpl
* layer
,
113 LayerIteratorType
* it
,
114 OcclusionTrackerImpl
* occlusion_tracker
) {
115 occlusion_tracker
->EnterLayer(*it
, false);
116 QuadCuller
quad_culler(
117 quad_list
, shared_state_list
, layer
, *occlusion_tracker
, false, false);
118 AppendQuadsData data
;
119 layer
->AppendQuads(&quad_culler
, &data
);
120 occlusion_tracker
->LeaveLayer(*it
);
125 FakeImplProxy proxy_
;
126 FakeLayerTreeHostImpl host_impl_
;
129 DISALLOW_COPY_AND_ASSIGN(QuadCullerTest
);
132 #define DECLARE_AND_INITIALIZE_TEST_QUADS() \
133 QuadList quad_list; \
134 SharedQuadStateList shared_state_list; \
135 LayerImplList render_surface_layer_list; \
136 gfx::Transform child_transform; \
137 gfx::Size root_size = gfx::Size(300, 300); \
138 gfx::Rect root_rect = gfx::Rect(root_size); \
139 gfx::Size child_size = gfx::Size(200, 200); \
140 gfx::Rect child_rect = gfx::Rect(child_size);
142 TEST_F(QuadCullerTest
, VerifyNoCulling
) {
143 DECLARE_AND_INITIALIZE_TEST_QUADS();
145 scoped_ptr
<TiledLayerImpl
> root_layer
=
152 render_surface_layer_list
);
153 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
159 render_surface_layer_list
);
160 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
161 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
163 AppendQuads(&quad_list
,
168 AppendQuads(&quad_list
,
173 EXPECT_EQ(quad_list
.size(), 13u);
175 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
176 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
180 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
183 TEST_F(QuadCullerTest
, VerifyCullChildLinesUpTopLeft
) {
184 DECLARE_AND_INITIALIZE_TEST_QUADS();
186 scoped_ptr
<TiledLayerImpl
> root_layer
=
193 render_surface_layer_list
);
194 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
200 render_surface_layer_list
);
201 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
202 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
204 AppendQuads(&quad_list
,
209 AppendQuads(&quad_list
,
214 EXPECT_EQ(quad_list
.size(), 9u);
216 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
218 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
219 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
224 TEST_F(QuadCullerTest
, VerifyCullWhenChildOpacityNotOne
) {
225 DECLARE_AND_INITIALIZE_TEST_QUADS();
227 scoped_ptr
<TiledLayerImpl
> root_layer
=
234 render_surface_layer_list
);
235 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
241 render_surface_layer_list
);
242 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
243 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
245 AppendQuads(&quad_list
,
250 AppendQuads(&quad_list
,
255 EXPECT_EQ(quad_list
.size(), 13u);
257 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
258 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
262 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
265 TEST_F(QuadCullerTest
, VerifyCullWhenChildOpaqueFlagFalse
) {
266 DECLARE_AND_INITIALIZE_TEST_QUADS();
268 scoped_ptr
<TiledLayerImpl
> root_layer
=
275 render_surface_layer_list
);
276 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
282 render_surface_layer_list
);
283 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
284 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
286 AppendQuads(&quad_list
,
291 AppendQuads(&quad_list
,
296 EXPECT_EQ(quad_list
.size(), 13u);
298 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
299 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
303 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
306 TEST_F(QuadCullerTest
, VerifyCullCenterTileOnly
) {
307 DECLARE_AND_INITIALIZE_TEST_QUADS();
309 child_transform
.Translate(50, 50);
310 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
316 render_surface_layer_list
);
317 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
323 render_surface_layer_list
);
324 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
325 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
327 AppendQuads(&quad_list
,
332 AppendQuads(&quad_list
,
337 ASSERT_EQ(quad_list
.size(), 12u);
339 gfx::Rect quad_visible_rect1
= quad_list
[5]->visible_rect
;
340 EXPECT_EQ(quad_visible_rect1
.height(), 50);
342 gfx::Rect quad_visible_rect3
= quad_list
[7]->visible_rect
;
343 EXPECT_EQ(quad_visible_rect3
.width(), 50);
345 // Next index is 8, not 9, since centre quad culled.
346 gfx::Rect quad_visible_rect4
= quad_list
[8]->visible_rect
;
347 EXPECT_EQ(quad_visible_rect4
.width(), 50);
348 EXPECT_EQ(quad_visible_rect4
.x(), 250);
350 gfx::Rect quad_visible_rect6
= quad_list
[10]->visible_rect
;
351 EXPECT_EQ(quad_visible_rect6
.height(), 50);
352 EXPECT_EQ(quad_visible_rect6
.y(), 250);
355 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 100000, 1);
357 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
358 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
363 TEST_F(QuadCullerTest
, VerifyCullCenterTileNonIntegralSize1
) {
364 DECLARE_AND_INITIALIZE_TEST_QUADS();
366 child_transform
.Translate(100, 100);
368 // Make the root layer's quad have extent (99.1, 99.1) -> (200.9, 200.9) to
369 // make sure it doesn't get culled due to transform rounding.
370 gfx::Transform root_transform
;
371 root_transform
.Translate(99.1, 99.1);
372 root_transform
.Scale(1.018, 1.018);
374 root_rect
= child_rect
= gfx::Rect(0, 0, 100, 100);
376 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
382 render_surface_layer_list
);
383 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
389 render_surface_layer_list
);
390 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
391 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
393 AppendQuads(&quad_list
,
398 AppendQuads(&quad_list
,
403 EXPECT_EQ(quad_list
.size(), 2u);
406 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 20363, 1);
408 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
410 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
413 TEST_F(QuadCullerTest
, VerifyCullCenterTileNonIntegralSize2
) {
414 DECLARE_AND_INITIALIZE_TEST_QUADS();
416 // Make the child's quad slightly smaller than, and centred over, the root
417 // layer tile. Verify the child does not cause the quad below to be culled
419 child_transform
.Translate(100.1, 100.1);
420 child_transform
.Scale(0.982, 0.982);
422 gfx::Transform root_transform
;
423 root_transform
.Translate(100, 100);
425 root_rect
= child_rect
= gfx::Rect(0, 0, 100, 100);
427 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
433 render_surface_layer_list
);
434 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
440 render_surface_layer_list
);
441 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
442 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
444 AppendQuads(&quad_list
,
449 AppendQuads(&quad_list
,
454 EXPECT_EQ(quad_list
.size(), 2u);
457 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 19643, 1);
459 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
461 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
464 TEST_F(QuadCullerTest
, VerifyCullChildLinesUpBottomRight
) {
465 DECLARE_AND_INITIALIZE_TEST_QUADS();
467 child_transform
.Translate(100, 100);
468 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
474 render_surface_layer_list
);
475 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
481 render_surface_layer_list
);
482 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
483 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
485 AppendQuads(&quad_list
,
490 AppendQuads(&quad_list
,
495 EXPECT_EQ(quad_list
.size(), 9u);
497 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
499 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
500 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
505 TEST_F(QuadCullerTest
, VerifyCullSubRegion
) {
506 DECLARE_AND_INITIALIZE_TEST_QUADS();
508 child_transform
.Translate(50, 50);
509 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
515 render_surface_layer_list
);
516 gfx::Rect
child_opaque_rect(child_rect
.x() + child_rect
.width() / 4,
517 child_rect
.y() + child_rect
.height() / 4,
518 child_rect
.width() / 2,
519 child_rect
.height() / 2);
520 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
526 render_surface_layer_list
);
527 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
528 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
530 AppendQuads(&quad_list
,
535 AppendQuads(&quad_list
,
540 EXPECT_EQ(quad_list
.size(), 12u);
542 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
543 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
546 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
551 TEST_F(QuadCullerTest
, VerifyCullSubRegion2
) {
552 DECLARE_AND_INITIALIZE_TEST_QUADS();
554 child_transform
.Translate(50, 10);
555 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
561 render_surface_layer_list
);
562 gfx::Rect
child_opaque_rect(child_rect
.x() + child_rect
.width() / 4,
563 child_rect
.y() + child_rect
.height() / 4,
564 child_rect
.width() / 2,
565 child_rect
.height() * 3 / 4);
566 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
572 render_surface_layer_list
);
573 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
574 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
576 AppendQuads(&quad_list
,
581 AppendQuads(&quad_list
,
586 EXPECT_EQ(quad_list
.size(), 12u);
588 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
589 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
592 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
597 TEST_F(QuadCullerTest
, VerifyCullSubRegionCheckOvercull
) {
598 DECLARE_AND_INITIALIZE_TEST_QUADS();
600 child_transform
.Translate(50, 49);
601 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
607 render_surface_layer_list
);
608 gfx::Rect
child_opaque_rect(child_rect
.x() + child_rect
.width() / 4,
609 child_rect
.y() + child_rect
.height() / 4,
610 child_rect
.width() / 2,
611 child_rect
.height() / 2);
612 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
618 render_surface_layer_list
);
619 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
620 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
622 AppendQuads(&quad_list
,
627 AppendQuads(&quad_list
,
632 EXPECT_EQ(quad_list
.size(), 13u);
634 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
635 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(),
638 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
643 TEST_F(QuadCullerTest
, VerifyNonAxisAlignedQuadsDontOcclude
) {
644 DECLARE_AND_INITIALIZE_TEST_QUADS();
646 // Use a small rotation so as to not disturb the geometry significantly.
647 child_transform
.Rotate(1);
649 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
655 render_surface_layer_list
);
656 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
662 render_surface_layer_list
);
663 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
664 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
666 AppendQuads(&quad_list
,
671 AppendQuads(&quad_list
,
676 EXPECT_EQ(quad_list
.size(), 13u);
678 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 130000, 1);
680 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
682 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
685 // This test requires some explanation: here we are rotating the quads to be
686 // culled. The 2x2 tile child layer remains in the top-left corner, unrotated,
687 // but the 3x3 tile parent layer is rotated by 1 degree. Of the four tiles the
688 // child would normally occlude, three will move (slightly) out from under the
689 // child layer, and one moves further under the child. Only this last tile
691 TEST_F(QuadCullerTest
, VerifyNonAxisAlignedQuadsSafelyCulled
) {
692 DECLARE_AND_INITIALIZE_TEST_QUADS();
694 // Use a small rotation so as to not disturb the geometry significantly.
695 gfx::Transform parent_transform
;
696 parent_transform
.Rotate(1);
698 scoped_ptr
<TiledLayerImpl
> root_layer
= MakeLayer(NULL
,
704 render_surface_layer_list
);
705 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
711 render_surface_layer_list
);
712 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
713 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
715 AppendQuads(&quad_list
,
720 AppendQuads(&quad_list
,
725 EXPECT_EQ(quad_list
.size(), 12u);
727 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 100600, 1);
729 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
730 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
735 TEST_F(QuadCullerTest
, VerifyCullOutsideScissorOverTile
) {
736 DECLARE_AND_INITIALIZE_TEST_QUADS();
737 scoped_ptr
<TiledLayerImpl
> root_layer
=
744 render_surface_layer_list
);
745 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
751 render_surface_layer_list
);
752 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(200, 100, 100, 100));
753 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
755 AppendQuads(&quad_list
,
760 AppendQuads(&quad_list
,
765 EXPECT_EQ(quad_list
.size(), 1u);
767 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 10000, 1);
769 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
770 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
775 TEST_F(QuadCullerTest
, VerifyCullOutsideScissorOverCulledTile
) {
776 DECLARE_AND_INITIALIZE_TEST_QUADS();
777 scoped_ptr
<TiledLayerImpl
> root_layer
=
784 render_surface_layer_list
);
785 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
791 render_surface_layer_list
);
792 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(100, 100, 100, 100));
793 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
795 AppendQuads(&quad_list
,
800 AppendQuads(&quad_list
,
805 EXPECT_EQ(quad_list
.size(), 1u);
807 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 10000, 1);
809 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
810 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
815 TEST_F(QuadCullerTest
, VerifyCullOutsideScissorOverPartialTiles
) {
816 DECLARE_AND_INITIALIZE_TEST_QUADS();
817 scoped_ptr
<TiledLayerImpl
> root_layer
=
824 render_surface_layer_list
);
825 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
831 render_surface_layer_list
);
832 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(50, 50, 200, 200));
833 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
835 AppendQuads(&quad_list
,
840 AppendQuads(&quad_list
,
845 EXPECT_EQ(quad_list
.size(), 9u);
847 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 40000, 1);
849 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
850 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
855 TEST_F(QuadCullerTest
, VerifyCullOutsideScissorOverNoTiles
) {
856 DECLARE_AND_INITIALIZE_TEST_QUADS();
857 scoped_ptr
<TiledLayerImpl
> root_layer
=
864 render_surface_layer_list
);
865 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
871 render_surface_layer_list
);
872 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(500, 500, 100, 100));
873 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
875 AppendQuads(&quad_list
,
880 AppendQuads(&quad_list
,
885 EXPECT_EQ(quad_list
.size(), 0u);
887 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 0, 1);
889 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
890 EXPECT_NEAR(occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(),
895 TEST_F(QuadCullerTest
, VerifyWithoutMetrics
) {
896 DECLARE_AND_INITIALIZE_TEST_QUADS();
897 scoped_ptr
<TiledLayerImpl
> root_layer
=
904 render_surface_layer_list
);
905 scoped_ptr
<TiledLayerImpl
> child_layer
= MakeLayer(root_layer
.get(),
911 render_surface_layer_list
);
912 TestOcclusionTrackerImpl
occlusion_tracker(gfx::Rect(50, 50, 200, 200),
914 LayerIteratorType it
= LayerIteratorType::Begin(&render_surface_layer_list
);
916 AppendQuads(&quad_list
,
921 AppendQuads(&quad_list
,
926 EXPECT_EQ(quad_list
.size(), 9u);
928 occlusion_tracker
.overdraw_metrics()->pixels_drawn_opaque(), 0, 1);
930 occlusion_tracker
.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
932 occlusion_tracker
.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);