12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/quad_culler.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/overdraw_metrics.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/tiled_layer_impl.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_tiling_data.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/occlusion_tracker.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOcclusionTrackerImpl : public OcclusionTrackerImpl { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl(gfx::Rect scissor_rect_in_screen, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool record_metrics_for_frame = true) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : OcclusionTrackerImpl(scissor_rect_in_screen, record_metrics_for_frame), 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scissor_rect_in_screen_(scissor_rect_in_screen) {} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect LayerScissorRectInTargetSurface( 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerImpl* layer) const { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scissor_rect_in_screen_; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect scissor_rect_in_screen_; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestOcclusionTrackerImpl); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef LayerIterator<LayerImpl, 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::FrontToBack> LayerIteratorType; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuadCullerTest : public testing::Test { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCullerTest() 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : host_impl_(&proxy_), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_id_(1) {} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> MakeLayer( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TiledLayerImpl* parent, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& draw_transform, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect layer_rect, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float opacity, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool opaque, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect layer_opaque_rect, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList& surface_layer_list) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> layer = 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TiledLayerImpl::Create(host_impl_.active_tree(), layer_id_++); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTilingData> tiler = LayerTilingData::Create( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(100, 100), LayerTilingData::NO_BORDER_TEXELS); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiler->SetBounds(layer_rect.size()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetTilingData(*tiler); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->set_skips_draw(false); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().target_space_transform = draw_transform; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().screen_space_transform = draw_transform; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().visible_content_rect = layer_rect; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().opacity = opacity; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentsOpaque(opaque); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetBounds(layer_rect.size()); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentBounds(layer_rect.size()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id = 1; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < tiler->num_tiles_x(); ++i) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int j = 0; j < tiler->num_tiles_y(); ++j) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect tile_opaque_rect = 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opaque 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ? tiler->tile_bounds(i, j) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : gfx::IntersectRects(tiler->tile_bounds(i, j), layer_opaque_rect); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->PushTileProperties(i, j, resource_id++, tile_opaque_rect, false); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect rect_in_target = MathUtil::MapClippedRect( 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_transform(), layer->visible_content_rect()); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parent) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->CreateRenderSurface(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->SetContentRect(rect_in_target); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_layer_list.push_back(layer.get()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->layer_list().push_back(layer.get()); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().render_target = parent->render_target(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->render_surface()->layer_list().push_back(layer.get()); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect_in_target.Union(MathUtil::MapClippedRect( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->draw_transform(), parent->visible_content_rect())); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->render_surface()->SetContentRect(rect_in_target); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->draw_properties().drawable_content_rect = rect_in_target; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer.Pass(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AppendQuads(QuadList* quad_list, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SharedQuadStateList* shared_state_list, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TiledLayerImpl* layer, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerIteratorType* it, 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OcclusionTrackerImpl* occlusion_tracker) { 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) occlusion_tracker->EnterLayer(*it, false); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quad_list, shared_state_list, layer, *occlusion_tracker, false, false); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData data; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->AppendQuads(&quad_culler, &data); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) occlusion_tracker->LeaveLayer(*it); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeImplProxy proxy_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostImpl host_impl_; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layer_id_; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuadCullerTest); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DECLARE_AND_INITIALIZE_TEST_QUADS() \ 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList quad_list; \ 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadStateList shared_state_list; \ 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList render_surface_layer_list; \ 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform child_transform; \ 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size root_size = gfx::Size(300, 300); \ 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect root_rect = gfx::Rect(root_size); \ 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size child_size = gfx::Size(200, 200); \ 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect child_rect = gfx::Rect(child_size); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyNoCulling) { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 13u); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40000, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullChildLinesUpTopLeft) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 9u); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40000, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullWhenChildOpacityNotOne) { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0.9f, 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 13u); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40000, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullWhenChildOpaqueFlagFalse) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 13u); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40000, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullCenterTileOnly) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(50, 50); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(quad_list.size(), 12u); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect quad_visible_rect1 = quad_list[5]->visible_rect; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect1.height(), 50); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect quad_visible_rect3 = quad_list[7]->visible_rect; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect3.width(), 50); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Next index is 8, not 9, since centre quad culled. 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect quad_visible_rect4 = quad_list[8]->visible_rect; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect4.width(), 50); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect4.x(), 250); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect quad_visible_rect6 = quad_list[10]->visible_rect; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect6.height(), 50); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_visible_rect6.y(), 250); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 100000, 1); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30000, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullCenterTileNonIntegralSize1) { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(100, 100); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the root layer's quad have extent (99.1, 99.1) -> (200.9, 200.9) to 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // make sure it doesn't get culled due to transform rounding. 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform root_transform; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_transform.Translate(99.1, 99.1); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_transform.Scale(1.018, 1.018); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect = child_rect = gfx::Rect(0, 0, 100, 100); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_transform, 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 2u); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 20363, 1); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullCenterTileNonIntegralSize2) { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the child's quad slightly smaller than, and centred over, the root 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer tile. Verify the child does not cause the quad below to be culled 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // due to rounding. 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(100.1, 100.1); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Scale(0.982, 0.982); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform root_transform; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_transform.Translate(100, 100); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect = child_rect = gfx::Rect(0, 0, 100, 100); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_transform, 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 2u); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 19643, 1); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullChildLinesUpBottomRight) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(100, 100); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 9u); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40000, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullSubRegion) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(50, 50); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect child_opaque_rect(child_rect.x() + child_rect.width() / 4, 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.y() + child_rect.height() / 4, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.width() / 2, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.height() / 2); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_opaque_rect, 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 12u); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30000, 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10000, 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullSubRegion2) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(50, 10); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect child_opaque_rect(child_rect.x() + child_rect.width() / 4, 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.y() + child_rect.height() / 4, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.width() / 2, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.height() * 3 / 4); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_opaque_rect, 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 12u); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25000, 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15000, 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullSubRegionCheckOvercull) { 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Translate(50, 49); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect child_opaque_rect(child_rect.x() + child_rect.width() / 4, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.y() + child_rect.height() / 4, 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.width() / 2, 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect.height() / 2); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_opaque_rect, 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 13u); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30000, 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10000, 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyNonAxisAlignedQuadsDontOcclude) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use a small rotation so as to not disturb the geometry significantly. 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform.Rotate(1); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_transform, 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 13u); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 130000, 1); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test requires some explanation: here we are rotating the quads to be 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// culled. The 2x2 tile child layer remains in the top-left corner, unrotated, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but the 3x3 tile parent layer is rotated by 1 degree. Of the four tiles the 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// child would normally occlude, three will move (slightly) out from under the 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// child layer, and one moves further under the child. Only this last tile 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should be culled. 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyNonAxisAlignedQuadsSafelyCulled) { 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use a small rotation so as to not disturb the geometry significantly. 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform parent_transform; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_transform.Rotate(1); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL, 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_transform, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000)); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 12u); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 100600, 1); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29400, 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullOutsideScissorOverTile) { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(200, 100, 100, 100)); 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 1u); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 10000, 1); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120000, 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullOutsideScissorOverCulledTile) { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(100, 100, 100, 100)); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 1u); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 10000, 1); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120000, 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullOutsideScissorOverPartialTiles) { 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(50, 50, 200, 200)); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 9u); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 40000, 1); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 90000, 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyCullOutsideScissorOverNoTiles) { 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(500, 500, 100, 100)); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 0u); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 0, 1); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 130000, 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuadCullerTest, VerifyWithoutMetrics) { 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_AND_INITIALIZE_TEST_QUADS(); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> root_layer = 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MakeLayer(NULL, 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_rect, 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(), 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(), 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_rect, 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(), 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer_list); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(50, 50, 200, 200), 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer.get(), 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuads(&quad_list, 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shared_state_list, 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer.get(), 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &it, 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &occlusion_tracker); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(quad_list.size(), 9u); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 0, 1); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR( 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 937