1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/tiled_layer_impl.h"
7 #include "cc/append_quads_data.h"
8 #include "cc/layer_tiling_data.h"
9 #include "cc/single_thread_proxy.h"
10 #include "cc/test/fake_impl_proxy.h"
11 #include "cc/test/fake_layer_tree_host_impl.h"
12 #include "cc/test/layer_test_common.h"
13 #include "cc/test/mock_quad_culler.h"
14 #include "cc/tile_draw_quad.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
21 class TiledLayerImplTest
: public testing::Test
25 : m_hostImpl(&m_proxy
)
29 // Create a default tiled layer with textures for all tiles and a default
30 // visibility of the entire layer size.
31 scoped_ptr
<TiledLayerImpl
> createLayer(const gfx::Size
& tileSize
, const gfx::Size
& layerSize
, LayerTilingData::BorderTexelOption borderTexels
)
33 scoped_ptr
<TiledLayerImpl
> layer
= TiledLayerImpl::create(m_hostImpl
.activeTree(), 1);
34 scoped_ptr
<LayerTilingData
> tiler
= LayerTilingData::create(tileSize
, borderTexels
);
35 tiler
->setBounds(layerSize
);
36 layer
->setTilingData(*tiler
);
37 layer
->setSkipsDraw(false);
38 layer
->drawProperties().visible_content_rect
= gfx::Rect(gfx::Point(), layerSize
);
39 layer
->drawProperties().opacity
= 1;
40 layer
->setBounds(layerSize
);
41 layer
->setContentBounds(layerSize
);
42 layer
->createRenderSurface();
43 layer
->drawProperties().render_target
= layer
.get();
45 ResourceProvider::ResourceId resourceId
= 1;
46 for (int i
= 0; i
< tiler
->numTilesX(); ++i
)
47 for (int j
= 0; j
< tiler
->numTilesY(); ++j
)
48 layer
->pushTileProperties(i
, j
, resourceId
++, gfx::Rect(0, 0, 1, 1), false);
53 void getQuads(QuadList
& quads
, SharedQuadStateList
& sharedStates
, gfx::Size tileSize
, const gfx::Size
& layerSize
, LayerTilingData::BorderTexelOption borderTexelOption
, const gfx::Rect
& visibleContentRect
)
55 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, borderTexelOption
);
56 layer
->drawProperties().visible_content_rect
= visibleContentRect
;
57 layer
->setBounds(layerSize
);
59 MockQuadCuller
quadCuller(quads
, sharedStates
);
61 layer
->appendQuads(quadCuller
, data
);
65 FakeImplProxy m_proxy
;
66 FakeLayerTreeHostImpl m_hostImpl
;
69 TEST_F(TiledLayerImplTest
, emptyQuadList
)
71 const gfx::Size
tileSize(90, 90);
72 const int numTilesX
= 8;
73 const int numTilesY
= 4;
74 const gfx::Size
layerSize(tileSize
.width() * numTilesX
, tileSize
.height() * numTilesY
);
76 // Verify default layer does creates quads
78 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, LayerTilingData::NoBorderTexels
);
79 MockQuadCuller quadCuller
;
81 layer
->appendQuads(quadCuller
, data
);
82 const unsigned numTiles
= numTilesX
* numTilesY
;
83 EXPECT_EQ(quadCuller
.quadList().size(), numTiles
);
86 // Layer with empty visible layer rect produces no quads
88 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, LayerTilingData::NoBorderTexels
);
89 layer
->drawProperties().visible_content_rect
= gfx::Rect();
91 MockQuadCuller quadCuller
;
93 layer
->appendQuads(quadCuller
, data
);
94 EXPECT_EQ(quadCuller
.quadList().size(), 0u);
97 // Layer with non-intersecting visible layer rect produces no quads
99 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, LayerTilingData::NoBorderTexels
);
101 gfx::Rect
outsideBounds(gfx::Point(-100, -100), gfx::Size(50, 50));
102 layer
->drawProperties().visible_content_rect
= outsideBounds
;
104 MockQuadCuller quadCuller
;
105 AppendQuadsData data
;
106 layer
->appendQuads(quadCuller
, data
);
107 EXPECT_EQ(quadCuller
.quadList().size(), 0u);
110 // Layer with skips draw produces no quads
112 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, LayerTilingData::NoBorderTexels
);
113 layer
->setSkipsDraw(true);
115 MockQuadCuller quadCuller
;
116 AppendQuadsData data
;
117 layer
->appendQuads(quadCuller
, data
);
118 EXPECT_EQ(quadCuller
.quadList().size(), 0u);
122 TEST_F(TiledLayerImplTest
, checkerboarding
)
124 const gfx::Size
tileSize(10, 10);
125 const int numTilesX
= 2;
126 const int numTilesY
= 2;
127 const gfx::Size
layerSize(tileSize
.width() * numTilesX
, tileSize
.height() * numTilesY
);
129 scoped_ptr
<TiledLayerImpl
> layer
= createLayer(tileSize
, layerSize
, LayerTilingData::NoBorderTexels
);
131 // No checkerboarding
133 MockQuadCuller quadCuller
;
134 AppendQuadsData data
;
135 layer
->appendQuads(quadCuller
, data
);
136 EXPECT_EQ(quadCuller
.quadList().size(), 4u);
137 EXPECT_EQ(0u, data
.numMissingTiles
);
139 for (size_t i
= 0; i
< quadCuller
.quadList().size(); ++i
)
140 EXPECT_EQ(quadCuller
.quadList()[i
]->material
, DrawQuad::TILED_CONTENT
);
143 for (int i
= 0; i
< numTilesX
; ++i
)
144 for (int j
= 0; j
< numTilesY
; ++j
)
145 layer
->pushTileProperties(i
, j
, 0, gfx::Rect(), false);
147 // All checkerboarding
149 MockQuadCuller quadCuller
;
150 AppendQuadsData data
;
151 layer
->appendQuads(quadCuller
, data
);
152 EXPECT_LT(0u, data
.numMissingTiles
);
153 EXPECT_EQ(quadCuller
.quadList().size(), 4u);
154 for (size_t i
= 0; i
< quadCuller
.quadList().size(); ++i
)
155 EXPECT_NE(quadCuller
.quadList()[i
]->material
, DrawQuad::TILED_CONTENT
);
159 // Test with both border texels and without.
160 #define WITH_AND_WITHOUT_BORDER_TEST(testFixtureName) \
161 TEST_F(TiledLayerImplBorderTest, testFixtureName##NoBorders) \
163 testFixtureName(LayerTilingData::NoBorderTexels); \
165 TEST_F(TiledLayerImplBorderTest, testFixtureName##HasBorders) \
167 testFixtureName(LayerTilingData::HasBorderTexels); \
170 class TiledLayerImplBorderTest
: public TiledLayerImplTest
173 void coverageVisibleRectOnTileBoundaries(LayerTilingData::BorderTexelOption borders
)
175 gfx::Size
layerSize(1000, 1000);
177 SharedQuadStateList sharedStates
;
178 getQuads(quads
, sharedStates
, gfx::Size(100, 100), layerSize
, borders
, gfx::Rect(gfx::Point(), layerSize
));
179 LayerTestCommon::verifyQuadsExactlyCoverRect(quads
, gfx::Rect(gfx::Point(), layerSize
));
182 void coverageVisibleRectIntersectsTiles(LayerTilingData::BorderTexelOption borders
)
184 // This rect intersects the middle 3x3 of the 5x5 tiles.
185 gfx::Point
topLeft(65, 73);
186 gfx::Point
bottomRight(182, 198);
187 gfx::Rect visibleContentRect
= gfx::BoundingRect(topLeft
, bottomRight
);
189 gfx::Size
layerSize(250, 250);
191 SharedQuadStateList sharedStates
;
192 getQuads(quads
, sharedStates
, gfx::Size(50, 50), gfx::Size(250, 250), LayerTilingData::NoBorderTexels
, visibleContentRect
);
193 LayerTestCommon::verifyQuadsExactlyCoverRect(quads
, visibleContentRect
);
196 void coverageVisibleRectIntersectsBounds(LayerTilingData::BorderTexelOption borders
)
198 gfx::Size
layerSize(220, 210);
199 gfx::Rect
visibleContentRect(gfx::Point(), layerSize
);
201 SharedQuadStateList sharedStates
;
202 getQuads(quads
, sharedStates
, gfx::Size(100, 100), layerSize
, LayerTilingData::NoBorderTexels
, visibleContentRect
);
203 LayerTestCommon::verifyQuadsExactlyCoverRect(quads
, visibleContentRect
);
206 WITH_AND_WITHOUT_BORDER_TEST(coverageVisibleRectOnTileBoundaries
);
208 WITH_AND_WITHOUT_BORDER_TEST(coverageVisibleRectIntersectsTiles
);
210 WITH_AND_WITHOUT_BORDER_TEST(coverageVisibleRectIntersectsBounds
);
212 TEST_F(TiledLayerImplTest
, textureInfoForLayerNoBorders
)
214 gfx::Size
tileSize(50, 50);
215 gfx::Size
layerSize(250, 250);
217 SharedQuadStateList sharedStates
;
218 getQuads(quads
, sharedStates
, tileSize
, layerSize
, LayerTilingData::NoBorderTexels
, gfx::Rect(gfx::Point(), layerSize
));
220 for (size_t i
= 0; i
< quads
.size(); ++i
) {
221 const TileDrawQuad
* quad
= TileDrawQuad::MaterialCast(quads
[i
]);
223 EXPECT_NE(0u, quad
->resource_id
) << LayerTestCommon::quadString
<< i
;
224 EXPECT_EQ(gfx::RectF(gfx::PointF(), tileSize
), quad
->tex_coord_rect
) << LayerTestCommon::quadString
<< i
;
225 EXPECT_EQ(tileSize
, quad
->texture_size
) << LayerTestCommon::quadString
<< i
;
226 EXPECT_EQ(gfx::Rect(0, 0, 1, 1), quad
->opaque_rect
) << LayerTestCommon::quadString
<< i
;