diff options
Diffstat (limited to 'chromium/cc/layers/tiled_layer_impl_unittest.cc')
-rw-r--r-- | chromium/cc/layers/tiled_layer_impl_unittest.cc | 168 |
1 files changed, 127 insertions, 41 deletions
diff --git a/chromium/cc/layers/tiled_layer_impl_unittest.cc b/chromium/cc/layers/tiled_layer_impl_unittest.cc index 801cbf4dc27..7fa7d0f7b51 100644 --- a/chromium/cc/layers/tiled_layer_impl_unittest.cc +++ b/chromium/cc/layers/tiled_layer_impl_unittest.cc @@ -20,17 +20,17 @@ namespace { class TiledLayerImplTest : public testing::Test { public: - TiledLayerImplTest() : host_impl_(&proxy_) {} + TiledLayerImplTest() : host_impl_(&proxy_, &shared_bitmap_manager_) {} scoped_ptr<TiledLayerImpl> CreateLayerNoTiles( - gfx::Size tile_size, - gfx::Size layer_size, + const gfx::Size& tile_size, + const gfx::Size& layer_size, LayerTilingData::BorderTexelOption border_texels) { scoped_ptr<TiledLayerImpl> layer = TiledLayerImpl::Create(host_impl_.active_tree(), 1); scoped_ptr<LayerTilingData> tiler = LayerTilingData::Create(tile_size, border_texels); - tiler->SetBounds(layer_size); + tiler->SetTilingRect(gfx::Rect(layer_size)); layer->SetTilingData(*tiler); layer->set_skips_draw(false); layer->draw_properties().visible_content_rect = @@ -46,14 +46,12 @@ class TiledLayerImplTest : public testing::Test { // Create a default tiled layer with textures for all tiles and a default // visibility of the entire layer size. scoped_ptr<TiledLayerImpl> CreateLayer( - gfx::Size tile_size, - gfx::Size layer_size, + const gfx::Size& tile_size, + const gfx::Size& layer_size, LayerTilingData::BorderTexelOption border_texels) { scoped_ptr<TiledLayerImpl> layer = CreateLayerNoTiles(tile_size, layer_size, border_texels); - layer->SetDrawsContent(true); - ResourceProvider::ResourceId resource_id = 1; for (int i = 0; i < layer->TilingForTesting()->num_tiles_x(); ++i) { for (int j = 0; j < layer->TilingForTesting()->num_tiles_y(); ++j) { @@ -67,24 +65,25 @@ class TiledLayerImplTest : public testing::Test { return layer.Pass(); } - void GetQuads(QuadList* quads, - SharedQuadStateList* shared_states, - gfx::Size tile_size, - gfx::Size layer_size, + void GetQuads(RenderPass* render_pass, + const gfx::Size& tile_size, + const gfx::Size& layer_size, LayerTilingData::BorderTexelOption border_texel_option, - gfx::Rect visible_content_rect) { + const gfx::Rect& visible_content_rect) { scoped_ptr<TiledLayerImpl> layer = CreateLayer(tile_size, layer_size, border_texel_option); layer->draw_properties().visible_content_rect = visible_content_rect; layer->SetBounds(layer_size); - MockQuadCuller quad_culler(quads, shared_states); + MockOcclusionTracker<LayerImpl> occlusion_tracker; + MockQuadCuller quad_culler(render_pass, &occlusion_tracker); AppendQuadsData data; layer->AppendQuads(&quad_culler, &data); } protected: FakeImplProxy proxy_; + TestSharedBitmapManager shared_bitmap_manager_; FakeLayerTreeHostImpl host_impl_; }; @@ -99,7 +98,10 @@ TEST_F(TiledLayerImplTest, EmptyQuadList) { { scoped_ptr<TiledLayerImpl> layer = CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS); - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + AppendQuadsData data; EXPECT_TRUE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL)); layer->AppendQuads(&quad_culler, &data); @@ -114,7 +116,10 @@ TEST_F(TiledLayerImplTest, EmptyQuadList) { CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS); layer->draw_properties().visible_content_rect = gfx::Rect(); - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + EXPECT_FALSE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL)); } @@ -126,7 +131,10 @@ TEST_F(TiledLayerImplTest, EmptyQuadList) { gfx::Rect outside_bounds(-100, -100, 50, 50); layer->draw_properties().visible_content_rect = outside_bounds; - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + AppendQuadsData data; EXPECT_TRUE(layer->WillDraw(DRAW_MODE_HARDWARE, NULL)); layer->AppendQuads(&quad_culler, &data); @@ -140,7 +148,10 @@ TEST_F(TiledLayerImplTest, EmptyQuadList) { CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS); layer->set_skips_draw(true); - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + AppendQuadsData data; layer->AppendQuads(&quad_culler, &data); EXPECT_EQ(quad_culler.quad_list().size(), 0u); @@ -159,7 +170,10 @@ TEST_F(TiledLayerImplTest, Checkerboarding) { // No checkerboarding { - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + AppendQuadsData data; layer->AppendQuads(&quad_culler, &data); EXPECT_EQ(quad_culler.quad_list().size(), 4u); @@ -175,7 +189,10 @@ TEST_F(TiledLayerImplTest, Checkerboarding) { // All checkerboarding { - MockQuadCuller quad_culler; + MockOcclusionTracker<LayerImpl> occlusion_tracker; + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + MockQuadCuller quad_culler(render_pass.get(), &occlusion_tracker); + AppendQuadsData data; layer->AppendQuads(&quad_culler, &data); EXPECT_LT(0u, data.num_missing_tiles); @@ -199,15 +216,14 @@ class TiledLayerImplBorderTest : public TiledLayerImplTest { void CoverageVisibleRectOnTileBoundaries( LayerTilingData::BorderTexelOption borders) { gfx::Size layer_size(1000, 1000); - QuadList quads; - SharedQuadStateList shared_states; - GetQuads(&quads, - &shared_states, + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + GetQuads(render_pass.get(), gfx::Size(100, 100), layer_size, borders, gfx::Rect(layer_size)); - LayerTestCommon::VerifyQuadsExactlyCoverRect(quads, gfx::Rect(layer_size)); + LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list, + gfx::Rect(layer_size)); } void CoverageVisibleRectIntersectsTiles( @@ -218,30 +234,28 @@ class TiledLayerImplBorderTest : public TiledLayerImplTest { gfx::Rect visible_content_rect = gfx::BoundingRect(top_left, bottom_right); gfx::Size layer_size(250, 250); - QuadList quads; - SharedQuadStateList shared_states; - GetQuads(&quads, - &shared_states, + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + GetQuads(render_pass.get(), gfx::Size(50, 50), gfx::Size(250, 250), LayerTilingData::NO_BORDER_TEXELS, visible_content_rect); - LayerTestCommon::VerifyQuadsExactlyCoverRect(quads, visible_content_rect); + LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list, + visible_content_rect); } void CoverageVisibleRectIntersectsBounds( LayerTilingData::BorderTexelOption borders) { gfx::Size layer_size(220, 210); gfx::Rect visible_content_rect(layer_size); - QuadList quads; - SharedQuadStateList shared_states; - GetQuads(&quads, - &shared_states, + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + GetQuads(render_pass.get(), gfx::Size(100, 100), layer_size, LayerTilingData::NO_BORDER_TEXELS, visible_content_rect); - LayerTestCommon::VerifyQuadsExactlyCoverRect(quads, visible_content_rect); + LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list, + visible_content_rect); } }; WITH_AND_WITHOUT_BORDER_TEST(CoverageVisibleRectOnTileBoundaries); @@ -253,17 +267,16 @@ WITH_AND_WITHOUT_BORDER_TEST(CoverageVisibleRectIntersectsBounds); TEST_F(TiledLayerImplTest, TextureInfoForLayerNoBorders) { gfx::Size tile_size(50, 50); gfx::Size layer_size(250, 250); - QuadList quads; - SharedQuadStateList shared_states; - GetQuads(&quads, - &shared_states, + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); + GetQuads(render_pass.get(), tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS, gfx::Rect(layer_size)); - for (size_t i = 0; i < quads.size(); ++i) { - const TileDrawQuad* quad = TileDrawQuad::MaterialCast(quads[i]); + for (size_t i = 0; i < render_pass->quad_list.size(); ++i) { + const TileDrawQuad* quad = + TileDrawQuad::MaterialCast(render_pass->quad_list[i]); EXPECT_NE(0u, quad->resource_id) << LayerTestCommon::quad_string << i; EXPECT_EQ(gfx::RectF(gfx::PointF(), tile_size), quad->tex_coord_rect) @@ -304,5 +317,78 @@ TEST_F(TiledLayerImplTest, GPUMemoryUsage) { EXPECT_EQ(layer->GPUMemoryUsageInBytes(), 0u); } +TEST_F(TiledLayerImplTest, EmptyMask) { + gfx::Size tile_size(20, 20); + gfx::Size layer_size(0, 0); + scoped_ptr<TiledLayerImpl> layer = + CreateLayer(tile_size, layer_size, LayerTilingData::NO_BORDER_TEXELS); + + EXPECT_EQ(0u, layer->ContentsResourceId()); + EXPECT_EQ(0, layer->TilingForTesting()->num_tiles_x()); + EXPECT_EQ(0, layer->TilingForTesting()->num_tiles_y()); +} + +TEST_F(TiledLayerImplTest, Occlusion) { + gfx::Size tile_size(100, 100); + gfx::Size layer_bounds(1000, 1000); + gfx::Size viewport_size(1000, 1000); + + LayerTestCommon::LayerImplTest impl; + + TiledLayerImpl* tiled_layer = impl.AddChildToRoot<TiledLayerImpl>(); + tiled_layer->SetBounds(layer_bounds); + tiled_layer->SetContentBounds(layer_bounds); + tiled_layer->SetDrawsContent(true); + tiled_layer->set_skips_draw(false); + + scoped_ptr<LayerTilingData> tiler = + LayerTilingData::Create(tile_size, LayerTilingData::NO_BORDER_TEXELS); + tiler->SetTilingRect(gfx::Rect(layer_bounds)); + tiled_layer->SetTilingData(*tiler); + + ResourceProvider::ResourceId resource_id = 1; + for (int i = 0; i < tiled_layer->TilingForTesting()->num_tiles_x(); ++i) { + for (int j = 0; j < tiled_layer->TilingForTesting()->num_tiles_y(); ++j) + tiled_layer->PushTileProperties(i, j, resource_id++, gfx::Rect(), false); + } + + impl.CalcDrawProps(viewport_size); + + { + SCOPED_TRACE("No occlusion"); + gfx::Rect occluded; + impl.AppendQuadsWithOcclusion(tiled_layer, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), + gfx::Rect(layer_bounds)); + EXPECT_EQ(100u, impl.quad_list().size()); + } + + { + SCOPED_TRACE("Full occlusion"); + gfx::Rect occluded(tiled_layer->visible_content_rect()); + impl.AppendQuadsWithOcclusion(tiled_layer, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect()); + EXPECT_EQ(impl.quad_list().size(), 0u); + } + + { + SCOPED_TRACE("Partial occlusion"); + gfx::Rect occluded(150, 0, 200, 1000); + impl.AppendQuadsWithOcclusion(tiled_layer, occluded); + + size_t partially_occluded_count = 0; + LayerTestCommon::VerifyQuadsCoverRectWithOcclusion( + impl.quad_list(), + gfx::Rect(layer_bounds), + occluded, + &partially_occluded_count); + // The layer outputs one quad, which is partially occluded. + EXPECT_EQ(100u - 10u, impl.quad_list().size()); + EXPECT_EQ(10u + 10u, partially_occluded_count); + } +} + } // namespace } // namespace cc |