| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/picture_layer_impl.h" | 5 #include "cc/picture_layer_impl.h" |
| 6 | 6 |
| 7 #include "cc/layer_tree_impl.h" | 7 #include "cc/layer_tree_impl.h" |
| 8 #include "cc/picture_layer.h" |
| 8 #include "cc/test/fake_content_layer_client.h" | 9 #include "cc/test/fake_content_layer_client.h" |
| 9 #include "cc/test/fake_impl_proxy.h" | 10 #include "cc/test/fake_impl_proxy.h" |
| 10 #include "cc/test/fake_layer_tree_host_impl.h" | 11 #include "cc/test/fake_layer_tree_host_impl.h" |
| 11 #include "cc/test/fake_output_surface.h" | 12 #include "cc/test/fake_output_surface.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "ui/gfx/rect_conversions.h" | 14 #include "ui/gfx/rect_conversions.h" |
| 14 | 15 |
| 15 namespace cc { | 16 namespace cc { |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 44 LayerTreeImpl* treeImpl, | 45 LayerTreeImpl* treeImpl, |
| 45 int id, | 46 int id, |
| 46 scoped_refptr<PicturePileImpl> pile) | 47 scoped_refptr<PicturePileImpl> pile) |
| 47 : PictureLayerImpl(treeImpl, id) { | 48 : PictureLayerImpl(treeImpl, id) { |
| 48 pile_ = pile; | 49 pile_ = pile; |
| 49 setBounds(pile_->size()); | 50 setBounds(pile_->size()); |
| 50 CreateTilingSet(); | 51 CreateTilingSet(); |
| 51 } | 52 } |
| 52 }; | 53 }; |
| 53 | 54 |
| 55 class ImplSidePaintingSettings : public LayerTreeSettings { |
| 56 public: |
| 57 ImplSidePaintingSettings() { |
| 58 implSidePainting = true; |
| 59 } |
| 60 }; |
| 61 |
| 54 class TestablePicturePileImpl : public PicturePileImpl { | 62 class TestablePicturePileImpl : public PicturePileImpl { |
| 55 public: | 63 public: |
| 56 static scoped_refptr<TestablePicturePileImpl> CreateFilledPile( | 64 static scoped_refptr<TestablePicturePileImpl> CreateFilledPile( |
| 57 gfx::Size tile_size, | 65 gfx::Size tile_size, |
| 58 gfx::Size layer_bounds) { | 66 gfx::Size layer_bounds) { |
| 59 scoped_refptr<TestablePicturePileImpl> pile(new TestablePicturePileImpl()); | 67 scoped_refptr<TestablePicturePileImpl> pile(new TestablePicturePileImpl()); |
| 60 pile->tiling().SetTotalSize(layer_bounds); | 68 pile->tiling().SetTotalSize(layer_bounds); |
| 61 pile->tiling().SetMaxTextureSize(tile_size); | 69 pile->tiling().SetMaxTextureSize(tile_size); |
| 70 pile->ApplyLayerTreeSettings(ImplSidePaintingSettings()); |
| 62 for (int x = 0; x < pile->tiling().num_tiles_x(); ++x) { | 71 for (int x = 0; x < pile->tiling().num_tiles_x(); ++x) { |
| 63 for (int y = 0; y < pile->tiling().num_tiles_y(); ++y) | 72 for (int y = 0; y < pile->tiling().num_tiles_y(); ++y) |
| 64 pile->AddRecordingAt(x, y); | 73 pile->AddRecordingAt(x, y); |
| 65 } | 74 } |
| 66 pile->UpdateRecordedRegion(); | 75 pile->UpdateRecordedRegion(); |
| 67 return pile; | 76 return pile; |
| 68 } | 77 } |
| 69 | 78 |
| 70 static scoped_refptr<TestablePicturePileImpl> CreateEmptyPile( | 79 static scoped_refptr<TestablePicturePileImpl> CreateEmptyPile( |
| 71 gfx::Size tile_size, | 80 gfx::Size tile_size, |
| 72 gfx::Size layer_bounds) { | 81 gfx::Size layer_bounds) { |
| 73 scoped_refptr<TestablePicturePileImpl> pile(new TestablePicturePileImpl()); | 82 scoped_refptr<TestablePicturePileImpl> pile(new TestablePicturePileImpl()); |
| 74 pile->tiling().SetTotalSize(layer_bounds); | 83 pile->tiling().SetTotalSize(layer_bounds); |
| 75 pile->tiling().SetMaxTextureSize(tile_size); | 84 pile->tiling().SetMaxTextureSize(tile_size); |
| 85 pile->ApplyLayerTreeSettings(ImplSidePaintingSettings()); |
| 76 pile->UpdateRecordedRegion(); | 86 pile->UpdateRecordedRegion(); |
| 77 return pile; | 87 return pile; |
| 78 } | 88 } |
| 79 | 89 |
| 80 TilingData& tiling() { return tiling_; } | 90 TilingData& tiling() { return tiling_; } |
| 81 | 91 |
| 82 void AddRecordingAt(int x, int y) { | 92 void AddRecordingAt(int x, int y) { |
| 83 EXPECT_GE(x, 0); | 93 EXPECT_GE(x, 0); |
| 84 EXPECT_GE(y, 0); | 94 EXPECT_GE(y, 0); |
| 85 EXPECT_LT(x, tiling_.num_tiles_x()); | 95 EXPECT_LT(x, tiling_.num_tiles_x()); |
| 86 EXPECT_LT(y, tiling_.num_tiles_y()); | 96 EXPECT_LT(y, tiling_.num_tiles_y()); |
| 87 | 97 |
| 88 if (HasRecordingAt(x, y)) | 98 if (HasRecordingAt(x, y)) |
| 89 return; | 99 return; |
| 90 gfx::Rect bounds(tiling().TileBounds(x, y)); | 100 gfx::Rect bounds(tiling().TileBounds(x, y)); |
| 91 scoped_refptr<Picture> picture(Picture::Create(bounds)); | 101 scoped_refptr<Picture> picture(Picture::Create(bounds)); |
| 92 FakeContentLayerClient client; | 102 picture->Record(&client_, NULL, tile_grid_info_); |
| 93 picture->Record(&client, NULL); | |
| 94 picture_list_map_[std::pair<int, int>(x, y)].push_back(picture); | 103 picture_list_map_[std::pair<int, int>(x, y)].push_back(picture); |
| 95 EXPECT_TRUE(HasRecordingAt(x, y)); | 104 EXPECT_TRUE(HasRecordingAt(x, y)); |
| 96 | 105 |
| 97 UpdateRecordedRegion(); | 106 UpdateRecordedRegion(); |
| 98 } | 107 } |
| 99 | 108 |
| 100 void RemoveRecordingAt(int x, int y) { | 109 void RemoveRecordingAt(int x, int y) { |
| 101 EXPECT_GE(x, 0); | 110 EXPECT_GE(x, 0); |
| 102 EXPECT_GE(y, 0); | 111 EXPECT_GE(y, 0); |
| 103 EXPECT_LT(x, tiling_.num_tiles_x()); | 112 EXPECT_LT(x, tiling_.num_tiles_x()); |
| 104 EXPECT_LT(y, tiling_.num_tiles_y()); | 113 EXPECT_LT(y, tiling_.num_tiles_y()); |
| 105 | 114 |
| 106 if (!HasRecordingAt(x, y)) | 115 if (!HasRecordingAt(x, y)) |
| 107 return; | 116 return; |
| 108 picture_list_map_.erase(std::pair<int, int>(x, y)); | 117 picture_list_map_.erase(std::pair<int, int>(x, y)); |
| 109 EXPECT_FALSE(HasRecordingAt(x, y)); | 118 EXPECT_FALSE(HasRecordingAt(x, y)); |
| 110 | 119 |
| 111 UpdateRecordedRegion(); | 120 UpdateRecordedRegion(); |
| 112 } | 121 } |
| 113 | 122 |
| 123 void addDrawRect(const gfx::Rect& rect) { |
| 124 client_.addDrawRect(rect); |
| 125 } |
| 126 |
| 114 protected: | 127 protected: |
| 115 virtual ~TestablePicturePileImpl() { | 128 virtual ~TestablePicturePileImpl() { |
| 116 } | 129 } |
| 130 |
| 131 FakeContentLayerClient client_; |
| 117 }; | 132 }; |
| 118 | 133 |
| 119 class ImplSidePaintingSettings : public LayerTreeSettings { | 134 class MockCanvas : public SkCanvas { |
| 120 public: | 135 public: |
| 121 ImplSidePaintingSettings() { | 136 explicit MockCanvas(SkDevice* device) : SkCanvas(device) { } |
| 122 implSidePainting = true; | 137 |
| 138 virtual void drawRect(const SkRect& rect, const SkPaint& paint) { |
| 139 // Capture calls before SkCanvas quickReject kicks in |
| 140 rects_.push_back(rect); |
| 123 } | 141 } |
| 142 |
| 143 std::vector<SkRect> rects_; |
| 124 }; | 144 }; |
| 125 | 145 |
| 126 class PictureLayerImplTest : public testing::Test { | 146 class PictureLayerImplTest : public testing::Test { |
| 127 public: | 147 public: |
| 128 PictureLayerImplTest() | 148 PictureLayerImplTest() |
| 129 : host_impl_(ImplSidePaintingSettings(), &proxy_), | 149 : host_impl_(ImplSidePaintingSettings(), &proxy_), |
| 130 id_(7) { | 150 id_(7) { |
| 131 host_impl_.initializeRenderer(createFakeOutputSurface()); | 151 host_impl_.initializeRenderer(createFakeOutputSurface()); |
| 132 } | 152 } |
| 133 | 153 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 gfx::Size result_bounds; | 207 gfx::Size result_bounds; |
| 188 pending_layer_->calculateContentsScale( | 208 pending_layer_->calculateContentsScale( |
| 189 scale, animating_transform, | 209 scale, animating_transform, |
| 190 &result_scale_x, &result_scale_y, &result_bounds); | 210 &result_scale_x, &result_scale_y, &result_bounds); |
| 191 active_layer_->calculateContentsScale( | 211 active_layer_->calculateContentsScale( |
| 192 scale, animating_transform, | 212 scale, animating_transform, |
| 193 &result_scale_x, &result_scale_y, &result_bounds); | 213 &result_scale_x, &result_scale_y, &result_bounds); |
| 194 } | 214 } |
| 195 | 215 |
| 196 protected: | 216 protected: |
| 217 void TestTileGridAlignmentCommon() { |
| 218 // Layer to span 4 raster tiles in x and in y |
| 219 ImplSidePaintingSettings settings; |
| 220 gfx::Size layer_size( |
| 221 settings.defaultTileSize.width() * 7 / 2, |
| 222 settings.defaultTileSize.height() * 7 / 2); |
| 223 |
| 224 scoped_refptr<TestablePicturePileImpl> pending_pile = |
| 225 TestablePicturePileImpl::CreateFilledPile(layer_size, layer_size); |
| 226 scoped_refptr<TestablePicturePileImpl> active_pile = |
| 227 TestablePicturePileImpl::CreateFilledPile(layer_size, layer_size); |
| 228 |
| 229 SetupTrees(pending_pile, active_pile); |
| 230 |
| 231 host_impl_.activeTree()->SetPageScaleFactorAndLimits(1.f, 1.f, 1.f); |
| 232 float result_scale_x, result_scale_y; |
| 233 gfx::Size result_bounds; |
| 234 active_layer_->calculateContentsScale( |
| 235 1.f, false, &result_scale_x, &result_scale_y, &result_bounds); |
| 236 |
| 237 // Add 1x1 rects at the centers of each tile, then re-record pile contents |
| 238 std::vector<Tile*> tiles = |
| 239 active_layer_->tilings().tiling_at(0)->AllTilesForTesting(); |
| 240 EXPECT_EQ(16, tiles.size()); |
| 241 std::vector<SkRect> rects; |
| 242 std::vector<Tile*>::const_iterator tile_iter; |
| 243 for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
| 244 gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint(); |
| 245 gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1); |
| 246 active_pile->addDrawRect(rect); |
| 247 rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1)); |
| 248 } |
| 249 // Force re-record with newly injected content |
| 250 active_pile->RemoveRecordingAt(0, 0); |
| 251 active_pile->AddRecordingAt(0, 0); |
| 252 |
| 253 SkBitmap store; |
| 254 store.setConfig(SkBitmap::kNo_Config, 1000, 1000); |
| 255 SkDevice device(store); |
| 256 int64 pixelsRasterized; |
| 257 |
| 258 std::vector<SkRect>::const_iterator rect_iter = rects.begin(); |
| 259 for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
| 260 MockCanvas mock_canvas(&device); |
| 261 active_pile->Raster(&mock_canvas, (*tile_iter)->content_rect(), |
| 262 1.0f, &pixelsRasterized); |
| 263 |
| 264 // This test verifies that when drawing the contents of a specific tile |
| 265 // at content scale 1.0, the playback canvas never receives content from |
| 266 // neighboring tiles which indicates that the tile grid embedded in |
| 267 // SkPicture is perfectly aligned with the compositor's tiles. |
| 268 // Note: There are two rects: the initial clear and the explicitly |
| 269 // recorded rect. We only care about the second one. |
| 270 EXPECT_EQ(2, mock_canvas.rects_.size()); |
| 271 EXPECT_EQ(*rect_iter, mock_canvas.rects_[1]); |
| 272 rect_iter++; |
| 273 } |
| 274 } |
| 275 |
| 197 FakeImplProxy proxy_; | 276 FakeImplProxy proxy_; |
| 198 FakeLayerTreeHostImpl host_impl_; | 277 FakeLayerTreeHostImpl host_impl_; |
| 199 int id_; | 278 int id_; |
| 200 TestablePictureLayerImpl* pending_layer_; | 279 TestablePictureLayerImpl* pending_layer_; |
| 201 TestablePictureLayerImpl* active_layer_; | 280 TestablePictureLayerImpl* active_layer_; |
| 202 | 281 |
| 203 DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest); | 282 DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest); |
| 204 }; | 283 }; |
| 205 | 284 |
| 285 TEST_F(PictureLayerImplTest, tileGridAlignment) { |
| 286 host_impl_.setDeviceScaleFactor(1.f); |
| 287 TestTileGridAlignmentCommon(); |
| 288 } |
| 289 |
| 290 TEST_F(PictureLayerImplTest, tileGridAlignmentHiDPI) { |
| 291 host_impl_.setDeviceScaleFactor(2.f); |
| 292 TestTileGridAlignmentCommon(); |
| 293 } |
| 294 |
| 206 TEST_F(PictureLayerImplTest, cloneNoInvalidation) { | 295 TEST_F(PictureLayerImplTest, cloneNoInvalidation) { |
| 207 gfx::Size tile_size(100, 100); | 296 gfx::Size tile_size(100, 100); |
| 208 gfx::Size layer_bounds(400, 400); | 297 gfx::Size layer_bounds(400, 400); |
| 209 | 298 |
| 210 scoped_refptr<TestablePicturePileImpl> pending_pile = | 299 scoped_refptr<TestablePicturePileImpl> pending_pile = |
| 211 TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 300 TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| 212 scoped_refptr<TestablePicturePileImpl> active_pile = | 301 scoped_refptr<TestablePicturePileImpl> active_pile = |
| 213 TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 302 TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| 214 | 303 |
| 215 SetupTrees(pending_pile, active_pile); | 304 SetupTrees(pending_pile, active_pile); |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); | 692 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| 604 ASSERT_EQ(3u, active_layer_->tilings().num_tilings()); | 693 ASSERT_EQ(3u, active_layer_->tilings().num_tilings()); |
| 605 used_tilings.clear(); | 694 used_tilings.clear(); |
| 606 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); | 695 active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| 607 ASSERT_EQ(2u, active_layer_->tilings().num_tilings()); | 696 ASSERT_EQ(2u, active_layer_->tilings().num_tilings()); |
| 608 | 697 |
| 609 } | 698 } |
| 610 | 699 |
| 611 } // namespace | 700 } // namespace |
| 612 } // namespace cc | 701 } // namespace cc |
| OLD | NEW |