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