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/layers/tiled_layer_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_tiling_data.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_test_common.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TiledLayerImplTest : public testing::Test {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TiledLayerImplTest() : host_impl_(&proxy_, &shared_bitmap_manager_) {}
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TiledLayerImpl> CreateLayerNoTiles(
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& tile_size,
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& layer_size,
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTilingData::BorderTexelOption border_texels) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TiledLayerImpl::Create(host_impl_.active_tree(), 1);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTilingData> tiler =
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTilingData::Create(tile_size, border_texels);
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    tiler->SetTilingSize(layer_size);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetTilingData(*tiler);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->set_skips_draw(false);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().visible_content_rect =
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(layer_size);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().opacity = 1;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetBounds(layer_size);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetContentBounds(layer_size);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->CreateRenderSurface();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().render_target = layer.get();
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return layer.Pass();
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a default tiled layer with textures for all tiles and a default
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // visibility of the entire layer size.
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TiledLayerImpl> CreateLayer(
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& tile_size,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& layer_size,
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      LayerTilingData::BorderTexelOption border_texels) {
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        CreateLayerNoTiles(tile_size, layer_size, border_texels);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId resource_id = 1;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for (int i = 0; i < layer->TilingForTesting()->num_tiles_x(); ++i) {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (int j = 0; j < layer->TilingForTesting()->num_tiles_y(); ++j)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        layer->PushTileProperties(i, j, resource_id++, false);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer.Pass();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void GetQuads(RenderPass* render_pass,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const gfx::Size& tile_size,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const gfx::Size& layer_size,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                LayerTilingData::BorderTexelOption border_texel_option,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const gfx::Rect& visible_content_rect) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLayer(tile_size, layer_size, border_texel_option);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().visible_content_rect = visible_content_rect;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetBounds(layer_size);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass, occlusion_tracker, &data);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeImplProxy proxy_;
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TiledLayerImplTest, EmptyQuadList) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size tile_size(90, 90);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_tiles_x = 8;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_tiles_y = 4;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size(tile_size.width() * num_tiles_x,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       tile_size.height() * num_tiles_y);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify default layer does creates quads
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL));
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer->DidDraw(NULL);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned num_tiles = num_tiles_x * num_tiles_y;
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(render_pass->quad_list.size(), num_tiles);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Layer with empty visible layer rect produces no quads
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().visible_content_rect = gfx::Rect();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_FALSE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Layer with non-intersecting visible layer rect produces no quads
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect outside_bounds(-100, -100, 50, 50);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->draw_properties().visible_content_rect = outside_bounds;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL));
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    layer->DidDraw(NULL);
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(render_pass->quad_list.size(), 0u);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Layer with skips draw produces no quads
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TiledLayerImpl> layer =
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->set_skips_draw(true);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(render_pass->quad_list.size(), 0u);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TiledLayerImplTest, Checkerboarding) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size tile_size(10, 10);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_tiles_x = 2;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_tiles_y = 2;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size(tile_size.width() * num_tiles_x,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       tile_size.height() * num_tiles_y);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TiledLayerImpl> layer =
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No checkerboarding
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(render_pass->quad_list.size(), 4u);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0u, data.num_missing_tiles);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (QuadList::Iterator iter = render_pass->quad_list.begin();
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         iter != render_pass->quad_list.end();
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++iter)
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(iter->material, DrawQuad::TILED_CONTENT);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < num_tiles_x; ++i)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int j = 0; j < num_tiles_y; ++j)
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      layer->PushTileProperties(i, j, 0, false);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All checkerboarding
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_LT(0u, data.num_missing_tiles);
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(render_pass->quad_list.size(), 4u);
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (QuadList::Iterator iter = render_pass->quad_list.begin();
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         iter != render_pass->quad_list.end();
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++iter)
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_NE(iter->material, DrawQuad::TILED_CONTENT);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test with both border texels and without.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define WITH_AND_WITHOUT_BORDER_TEST(text_fixture_name)                        \
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_F(TiledLayerImplBorderTest, text_fixture_name##NoBorders) {             \
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    text_fixture_name(LayerTilingData::NO_BORDER_TEXELS);                      \
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }                                                                            \
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_F(TiledLayerImplBorderTest, text_fixture_name##HasBorders) {            \
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    text_fixture_name(LayerTilingData::HAS_BORDER_TEXELS);                     \
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TiledLayerImplBorderTest : public TiledLayerImplTest {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CoverageVisibleRectOnTileBoundaries(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTilingData::BorderTexelOption borders) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size layer_size(1000, 1000);
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetQuads(render_pass.get(),
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             gfx::Size(100, 100),
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             layer_size,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             borders,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             gfx::Rect(layer_size));
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list,
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                 gfx::Rect(layer_size));
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CoverageVisibleRectIntersectsTiles(
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTilingData::BorderTexelOption borders) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This rect intersects the middle 3x3 of the 5x5 tiles.
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point top_left(65, 73);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point bottom_right(182, 198);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect visible_content_rect = gfx::BoundingRect(top_left, bottom_right);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size layer_size(250, 250);
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetQuads(render_pass.get(),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             gfx::Size(50, 50),
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             gfx::Size(250, 250),
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             LayerTilingData::NO_BORDER_TEXELS,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             visible_content_rect);
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list,
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                 visible_content_rect);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CoverageVisibleRectIntersectsBounds(
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTilingData::BorderTexelOption borders) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size layer_size(220, 210);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect visible_content_rect(layer_size);
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetQuads(render_pass.get(),
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             gfx::Size(100, 100),
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             layer_size,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             LayerTilingData::NO_BORDER_TEXELS,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             visible_content_rect);
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list,
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                 visible_content_rect);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WITH_AND_WITHOUT_BORDER_TEST(CoverageVisibleRectOnTileBoundaries);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WITH_AND_WITHOUT_BORDER_TEST(CoverageVisibleRectIntersectsTiles);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WITH_AND_WITHOUT_BORDER_TEST(CoverageVisibleRectIntersectsBounds);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TiledLayerImplTest, TextureInfoForLayerNoBorders) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size tile_size(50, 50);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size(250, 250);
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetQuads(render_pass.get(),
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           tile_size,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           layer_size,
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           LayerTilingData::NO_BORDER_TEXELS,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           gfx::Rect(layer_size));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t i = 0;
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (QuadList::Iterator iter = render_pass->quad_list.begin();
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter != render_pass->quad_list.end();
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++iter) {
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const TileDrawQuad* quad = TileDrawQuad::MaterialCast(&*iter);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0u, quad->resource_id) << LayerTestCommon::quad_string << i;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(gfx::RectF(gfx::PointF(), tile_size), quad->tex_coord_rect)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << LayerTestCommon::quad_string << i;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(tile_size, quad->texture_size) << LayerTestCommon::quad_string
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             << i;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(TiledLayerImplTest, GPUMemoryUsage) {
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Size tile_size(20, 30);
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int num_tiles_x = 12;
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int num_tiles_y = 32;
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Size layer_size(tile_size.width() * num_tiles_x,
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       tile_size.height() * num_tiles_y);
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TiledLayerImpl> layer = CreateLayerNoTiles(
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(layer->GPUMemoryUsageInBytes(), 0u);
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ResourceProvider::ResourceId resource_id = 1;
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(0, 1, resource_id++, false);
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(2, 3, resource_id++, false);
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(2, 0, resource_id++, false);
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      layer->GPUMemoryUsageInBytes(),
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<size_t>(3 * 4 * tile_size.width() * tile_size.height()));
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ResourceProvider::ResourceId empty_resource(0);
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(0, 1, empty_resource, false);
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(2, 3, empty_resource, false);
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer->PushTileProperties(2, 0, empty_resource, false);
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(layer->GPUMemoryUsageInBytes(), 0u);
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TiledLayerImplTest, EmptyMask) {
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size tile_size(20, 20);
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size layer_size(0, 0);
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TiledLayerImpl> layer =
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS);
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, layer->ContentsResourceId());
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, layer->TilingForTesting()->num_tiles_x());
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, layer->TilingForTesting()->num_tiles_y());
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(TiledLayerImplTest, Occlusion) {
3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Size tile_size(100, 100);
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Size layer_bounds(1000, 1000);
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Size viewport_size(1000, 1000);
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LayerTestCommon::LayerImplTest impl;
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TiledLayerImpl* tiled_layer = impl.AddChildToRoot<TiledLayerImpl>();
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  tiled_layer->SetBounds(layer_bounds);
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  tiled_layer->SetContentBounds(layer_bounds);
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  tiled_layer->SetDrawsContent(true);
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  tiled_layer->set_skips_draw(false);
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<LayerTilingData> tiler =
3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      LayerTilingData::Create(tile_size, LayerTilingData::NO_BORDER_TEXELS);
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  tiler->SetTilingSize(layer_bounds);
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  tiled_layer->SetTilingData(*tiler);
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceProvider::ResourceId resource_id = 1;
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (int i = 0; i < tiled_layer->TilingForTesting()->num_tiles_x(); ++i) {
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    for (int j = 0; j < tiled_layer->TilingForTesting()->num_tiles_y(); ++j)
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tiled_layer->PushTileProperties(i, j, resource_id++, false);
3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  impl.CalcDrawProps(viewport_size);
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SCOPED_TRACE("No occlusion");
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    gfx::Rect occluded;
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    impl.AppendQuadsWithOcclusion(tiled_layer, occluded);
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                 gfx::Rect(layer_bounds));
3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(100u, impl.quad_list().size());
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SCOPED_TRACE("Full occlusion");
3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    gfx::Rect occluded(tiled_layer->visible_content_rect());
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    impl.AppendQuadsWithOcclusion(tiled_layer, occluded);
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
3650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(impl.quad_list().size(), 0u);
3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SCOPED_TRACE("Partial occlusion");
3700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    gfx::Rect occluded(150, 0, 200, 1000);
3710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    impl.AppendQuadsWithOcclusion(tiled_layer, occluded);
3720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    size_t partially_occluded_count = 0;
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerTestCommon::VerifyQuadsAreOccluded(
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        impl.quad_list(), occluded, &partially_occluded_count);
3760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // The layer outputs one quad, which is partially occluded.
3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(100u - 10u, impl.quad_list().size());
3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(10u + 10u, partially_occluded_count);
3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
384