Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 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/layers/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 color, | 226 color, |
| 227 width); | 227 width); |
| 228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>()); | 228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>()); |
| 229 } | 229 } |
| 230 } | 230 } |
| 231 | 231 |
| 232 // Keep track of the tilings that were used so that tilings that are | 232 // Keep track of the tilings that were used so that tilings that are |
| 233 // unused can be considered for removal. | 233 // unused can be considered for removal. |
| 234 std::vector<PictureLayerTiling*> seen_tilings; | 234 std::vector<PictureLayerTiling*> seen_tilings; |
| 235 | 235 |
| 236 bool had_checkerboard_quads = false; | 236 size_t missing_tile_count = 0u; |
| 237 size_t on_demand_missing_tile_count = 0u; | |
| 237 for (PictureLayerTilingSet::CoverageIterator iter( | 238 for (PictureLayerTilingSet::CoverageIterator iter( |
| 238 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); | 239 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); |
| 239 iter; | 240 iter; |
| 240 ++iter) { | 241 ++iter) { |
| 241 gfx::Rect geometry_rect = iter.geometry_rect(); | 242 gfx::Rect geometry_rect = iter.geometry_rect(); |
| 242 gfx::Rect visible_geometry_rect = | 243 gfx::Rect visible_geometry_rect = |
| 243 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); | 244 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); |
| 244 if (visible_geometry_rect.IsEmpty()) | 245 if (visible_geometry_rect.IsEmpty()) |
| 245 continue; | 246 continue; |
| 246 | 247 |
| 247 append_quads_data->visible_content_area += | 248 append_quads_data->visible_content_area += |
| 248 visible_geometry_rect.width() * visible_geometry_rect.height(); | 249 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 249 | 250 |
| 250 if (!*iter || !iter->IsReadyToDraw()) { | 251 scoped_ptr<DrawQuad> draw_quad; |
| 251 had_checkerboard_quads = true; | 252 if (*iter && iter->IsReadyToDraw()) { |
| 253 const ManagedTileState::TileVersion& tile_version = | |
| 254 iter->GetTileVersionForDrawing(); | |
| 255 switch (tile_version.mode()) { | |
| 256 case ManagedTileState::TileVersion::RESOURCE_MODE: { | |
| 257 gfx::RectF texture_rect = iter.texture_rect(); | |
| 258 gfx::Rect opaque_rect = iter->opaque_rect(); | |
| 259 opaque_rect.Intersect(geometry_rect); | |
| 260 | |
| 261 if (iter->contents_scale() != ideal_contents_scale_) | |
| 262 append_quads_data->had_incomplete_tile = true; | |
| 263 | |
| 264 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create(); | |
| 265 quad->SetNew(shared_quad_state, | |
| 266 geometry_rect, | |
| 267 opaque_rect, | |
| 268 visible_geometry_rect, | |
| 269 tile_version.get_resource_id(), | |
| 270 texture_rect, | |
| 271 iter.texture_size(), | |
| 272 tile_version.contents_swizzled()); | |
| 273 draw_quad = quad.PassAs<DrawQuad>(); | |
| 274 break; | |
| 275 } | |
| 276 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: { | |
| 277 if (!layer_tree_impl() | |
| 278 ->GetRendererCapabilities() | |
| 279 .allow_rasterize_on_demand) { | |
| 280 ++on_demand_missing_tile_count; | |
| 281 break; | |
| 282 } | |
| 283 | |
| 284 gfx::RectF texture_rect = iter.texture_rect(); | |
| 285 gfx::Rect opaque_rect = iter->opaque_rect(); | |
| 286 opaque_rect.Intersect(geometry_rect); | |
| 287 | |
| 288 ResourceProvider* resource_provider = | |
| 289 layer_tree_impl()->resource_provider(); | |
| 290 ResourceFormat format = | |
| 291 resource_provider->memory_efficient_texture_format(); | |
| 292 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create(); | |
| 293 quad->SetNew(shared_quad_state, | |
| 294 geometry_rect, | |
| 295 opaque_rect, | |
| 296 visible_geometry_rect, | |
| 297 texture_rect, | |
| 298 iter.texture_size(), | |
| 299 format, | |
| 300 iter->content_rect(), | |
| 301 iter->contents_scale(), | |
| 302 pile_); | |
| 303 draw_quad = quad.PassAs<DrawQuad>(); | |
| 304 break; | |
| 305 } | |
| 306 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: { | |
| 307 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | |
| 308 quad->SetNew(shared_quad_state, | |
| 309 geometry_rect, | |
| 310 visible_geometry_rect, | |
| 311 tile_version.get_solid_color(), | |
| 312 false); | |
| 313 draw_quad = quad.PassAs<DrawQuad>(); | |
| 314 break; | |
| 315 } | |
| 316 } | |
| 317 } | |
| 318 | |
| 319 if (!draw_quad) { | |
| 252 if (draw_checkerboard_for_missing_tiles()) { | 320 if (draw_checkerboard_for_missing_tiles()) { |
| 253 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); | 321 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); |
| 254 SkColor color = DebugColors::DefaultCheckerboardColor(); | 322 SkColor color = DebugColors::DefaultCheckerboardColor(); |
| 255 quad->SetNew( | 323 quad->SetNew( |
| 256 shared_quad_state, geometry_rect, visible_geometry_rect, color); | 324 shared_quad_state, geometry_rect, visible_geometry_rect, color); |
| 257 quad_sink->Append(quad.PassAs<DrawQuad>()); | 325 quad_sink->Append(quad.PassAs<DrawQuad>()); |
| 258 } else { | 326 } else { |
| 259 SkColor color = SafeOpaqueBackgroundColor(); | 327 SkColor color = SafeOpaqueBackgroundColor(); |
| 260 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | 328 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
| 261 quad->SetNew(shared_quad_state, | 329 quad->SetNew(shared_quad_state, |
| 262 geometry_rect, | 330 geometry_rect, |
| 263 visible_geometry_rect, | 331 visible_geometry_rect, |
| 264 color, | 332 color, |
| 265 false); | 333 false); |
| 266 quad_sink->Append(quad.PassAs<DrawQuad>()); | 334 quad_sink->Append(quad.PassAs<DrawQuad>()); |
| 267 } | 335 } |
| 268 | 336 |
| 269 append_quads_data->num_missing_tiles++; | 337 append_quads_data->num_missing_tiles++; |
| 270 append_quads_data->had_incomplete_tile = true; | 338 append_quads_data->had_incomplete_tile = true; |
| 271 append_quads_data->approximated_visible_content_area += | 339 append_quads_data->approximated_visible_content_area += |
| 272 visible_geometry_rect.width() * visible_geometry_rect.height(); | 340 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 341 ++missing_tile_count; | |
| 273 continue; | 342 continue; |
| 274 } | 343 } |
| 275 | 344 |
| 276 const ManagedTileState::TileVersion& tile_version = | |
| 277 iter->GetTileVersionForDrawing(); | |
| 278 scoped_ptr<DrawQuad> draw_quad; | |
| 279 switch (tile_version.mode()) { | |
| 280 case ManagedTileState::TileVersion::RESOURCE_MODE: { | |
| 281 gfx::RectF texture_rect = iter.texture_rect(); | |
| 282 gfx::Rect opaque_rect = iter->opaque_rect(); | |
| 283 opaque_rect.Intersect(geometry_rect); | |
| 284 | |
| 285 if (iter->contents_scale() != ideal_contents_scale_) | |
| 286 append_quads_data->had_incomplete_tile = true; | |
| 287 | |
| 288 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create(); | |
| 289 quad->SetNew(shared_quad_state, | |
| 290 geometry_rect, | |
| 291 opaque_rect, | |
| 292 visible_geometry_rect, | |
| 293 tile_version.get_resource_id(), | |
| 294 texture_rect, | |
| 295 iter.texture_size(), | |
| 296 tile_version.contents_swizzled()); | |
| 297 draw_quad = quad.PassAs<DrawQuad>(); | |
| 298 break; | |
| 299 } | |
| 300 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: { | |
| 301 gfx::RectF texture_rect = iter.texture_rect(); | |
| 302 gfx::Rect opaque_rect = iter->opaque_rect(); | |
| 303 opaque_rect.Intersect(geometry_rect); | |
| 304 | |
| 305 ResourceProvider* resource_provider = | |
| 306 layer_tree_impl()->resource_provider(); | |
| 307 ResourceFormat format = | |
| 308 resource_provider->memory_efficient_texture_format(); | |
| 309 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create(); | |
| 310 quad->SetNew(shared_quad_state, | |
| 311 geometry_rect, | |
| 312 opaque_rect, | |
| 313 visible_geometry_rect, | |
| 314 texture_rect, | |
| 315 iter.texture_size(), | |
| 316 format, | |
| 317 iter->content_rect(), | |
| 318 iter->contents_scale(), | |
| 319 pile_); | |
| 320 draw_quad = quad.PassAs<DrawQuad>(); | |
| 321 break; | |
| 322 } | |
| 323 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: { | |
| 324 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | |
| 325 quad->SetNew(shared_quad_state, | |
| 326 geometry_rect, | |
| 327 visible_geometry_rect, | |
| 328 tile_version.get_solid_color(), | |
| 329 false); | |
| 330 draw_quad = quad.PassAs<DrawQuad>(); | |
| 331 break; | |
| 332 } | |
| 333 } | |
| 334 | |
| 335 DCHECK(draw_quad); | |
| 336 quad_sink->Append(draw_quad.Pass()); | 345 quad_sink->Append(draw_quad.Pass()); |
| 337 | 346 |
| 338 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { | 347 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { |
| 339 append_quads_data->approximated_visible_content_area += | 348 append_quads_data->approximated_visible_content_area += |
| 340 visible_geometry_rect.width() * visible_geometry_rect.height(); | 349 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 341 } | 350 } |
| 342 | 351 |
| 343 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) | 352 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) |
| 344 seen_tilings.push_back(iter.CurrentTiling()); | 353 seen_tilings.push_back(iter.CurrentTiling()); |
| 345 } | 354 } |
| 346 | 355 |
| 347 if (had_checkerboard_quads) { | 356 if (missing_tile_count) { |
| 348 TRACE_EVENT_INSTANT0("cc", | 357 TRACE_EVENT_INSTANT2("cc", |
| 349 "PictureLayerImpl::AppendQuads checkerboard", | 358 "PictureLayerImpl::AppendQuads missing", |
|
vmpstr
2014/05/21 22:28:30
nit: I'd still prefer the word "checkerboard" sinc
reveman
2014/05/22 20:47:49
Done.
| |
| 350 TRACE_EVENT_SCOPE_THREAD); | 359 TRACE_EVENT_SCOPE_THREAD, |
| 360 "count", | |
| 361 missing_tile_count, | |
| 362 "on_demand_count", | |
| 363 on_demand_missing_tile_count); | |
| 351 } | 364 } |
| 352 | 365 |
| 353 // Aggressively remove any tilings that are not seen to save memory. Note | 366 // Aggressively remove any tilings that are not seen to save memory. Note |
| 354 // that this is at the expense of doing cause more frequent re-painting. A | 367 // that this is at the expense of doing cause more frequent re-painting. A |
| 355 // better scheme would be to maintain a tighter visible_content_rect for the | 368 // better scheme would be to maintain a tighter visible_content_rect for the |
| 356 // finer tilings. | 369 // finer tilings. |
| 357 CleanUpTilingsOnActiveLayer(seen_tilings); | 370 CleanUpTilingsOnActiveLayer(seen_tilings); |
| 358 } | 371 } |
| 359 | 372 |
| 360 void PictureLayerImpl::DidUnregisterLayer() { | 373 void PictureLayerImpl::DidUnregisterLayer() { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 contents_scale_x(), | 435 contents_scale_x(), |
| 423 current_frame_time_in_seconds); | 436 current_frame_time_in_seconds); |
| 424 | 437 |
| 425 if (layer_tree_impl()->IsPendingTree()) | 438 if (layer_tree_impl()->IsPendingTree()) |
| 426 MarkVisibleResourcesAsRequired(); | 439 MarkVisibleResourcesAsRequired(); |
| 427 | 440 |
| 428 // Tile priorities were modified. | 441 // Tile priorities were modified. |
| 429 layer_tree_impl()->DidModifyTilePriorities(); | 442 layer_tree_impl()->DidModifyTilePriorities(); |
| 430 } | 443 } |
| 431 | 444 |
| 432 void PictureLayerImpl::NotifyTileInitialized(const Tile* tile) { | 445 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { |
| 433 if (layer_tree_impl()->IsActiveTree()) { | 446 if (layer_tree_impl()->IsActiveTree()) { |
| 434 gfx::RectF layer_damage_rect = | 447 gfx::RectF layer_damage_rect = |
| 435 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); | 448 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); |
| 436 AddDamageRect(layer_damage_rect); | 449 AddDamageRect(layer_damage_rect); |
| 437 } | 450 } |
| 438 } | 451 } |
| 439 | 452 |
| 440 void PictureLayerImpl::DidBecomeActive() { | 453 void PictureLayerImpl::DidBecomeActive() { |
| 441 LayerImpl::DidBecomeActive(); | 454 LayerImpl::DidBecomeActive(); |
| 442 tilings_->DidBecomeActive(); | 455 tilings_->DidBecomeActive(); |
| (...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1349 } | 1362 } |
| 1350 | 1363 |
| 1351 WhichTree PictureLayerImpl::GetTree() const { | 1364 WhichTree PictureLayerImpl::GetTree() const { |
| 1352 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; | 1365 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; |
| 1353 } | 1366 } |
| 1354 | 1367 |
| 1355 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { | 1368 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { |
| 1356 return !layer_tree_impl()->IsRecycleTree(); | 1369 return !layer_tree_impl()->IsRecycleTree(); |
| 1357 } | 1370 } |
| 1358 | 1371 |
| 1372 bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const { | |
| 1373 if (!layer_tree_impl()->IsPendingTree()) | |
| 1374 return true; | |
| 1375 | |
| 1376 if (!tilings_) | |
| 1377 return true; | |
| 1378 | |
| 1379 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | |
| 1380 PictureLayerTiling* tiling = tilings_->tiling_at(i); | |
| 1381 if (tiling->resolution() != HIGH_RESOLUTION && | |
| 1382 tiling->resolution() != LOW_RESOLUTION) | |
| 1383 continue; | |
| 1384 | |
| 1385 gfx::Rect rect(visible_content_rect()); | |
| 1386 for (PictureLayerTiling::CoverageIterator iter( | |
| 1387 tiling, contents_scale_x(), rect); | |
|
reveman
2014/05/21 22:11:40
Using CoverageIterator here but maybe it would be
enne (OOO)
2014/05/21 22:19:32
I'm not sure it's worth adding yet another iterato
| |
| 1388 iter; | |
| 1389 ++iter) { | |
| 1390 const Tile* tile = *iter; | |
| 1391 // A null tile (i.e. missing recording) can just be skipped. | |
| 1392 if (!tile) | |
| 1393 continue; | |
| 1394 | |
| 1395 if (tile->required_for_activation() && !tile->IsReadyToDraw()) | |
| 1396 return false; | |
| 1397 } | |
| 1398 } | |
| 1399 | |
| 1400 return true; | |
| 1401 } | |
| 1402 | |
| 1359 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() | 1403 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() |
| 1360 : layer_(NULL) {} | 1404 : layer_(NULL) {} |
| 1361 | 1405 |
| 1362 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( | 1406 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( |
| 1363 PictureLayerImpl* layer, | 1407 PictureLayerImpl* layer, |
| 1364 bool prioritize_low_res) | 1408 bool prioritize_low_res) |
| 1365 : layer_(layer), current_stage_(0) { | 1409 : layer_(layer), current_stage_(0) { |
| 1366 DCHECK(layer_); | 1410 DCHECK(layer_); |
| 1367 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { | 1411 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { |
| 1368 current_stage_ = arraysize(stages_); | 1412 current_stage_ = arraysize(stages_); |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1572 return iterator_index_ < iterators_.size(); | 1616 return iterator_index_ < iterators_.size(); |
| 1573 } | 1617 } |
| 1574 | 1618 |
| 1575 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( | 1619 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( |
| 1576 PictureLayerTiling::TilingEvictionTileIterator* it) const { | 1620 PictureLayerTiling::TilingEvictionTileIterator* it) const { |
| 1577 return it->get_type() == iteration_stage_ && | 1621 return it->get_type() == iteration_stage_ && |
| 1578 (**it)->required_for_activation() == required_for_activation_; | 1622 (**it)->required_for_activation() == required_for_activation_; |
| 1579 } | 1623 } |
| 1580 | 1624 |
| 1581 } // namespace cc | 1625 } // namespace cc |
| OLD | NEW |