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