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/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 visible_geometry_rect, | 258 visible_geometry_rect, |
259 color, | 259 color, |
260 width); | 260 width); |
261 } | 261 } |
262 } | 262 } |
263 | 263 |
264 // Keep track of the tilings that were used so that tilings that are | 264 // Keep track of the tilings that were used so that tilings that are |
265 // unused can be considered for removal. | 265 // unused can be considered for removal. |
266 std::vector<PictureLayerTiling*> seen_tilings; | 266 std::vector<PictureLayerTiling*> seen_tilings; |
267 | 267 |
268 // Ignore missing tiles outside of viewport for tile priority. This is | |
269 // normally the same as draw viewport but can be independently overriden by | |
270 // clients like Android WebView with SetExternalDrawConstraints to control. | |
271 gfx::Rect scaled_viewport_for_tile_priority = gfx::ScaleToEnclosingRect( | |
272 GetViewportForTilePriorityInContentSpace(), max_contents_scale); | |
273 // Optmization to avoid Contains checks. | |
274 bool viewport_for_tile_priority_contains_visible_rect = | |
boliu
2014/08/20 03:00:06
This is always true for chrome, so I thought it's
| |
275 scaled_viewport_for_tile_priority.Contains(scaled_visible_content_rect); | |
276 | |
268 size_t missing_tile_count = 0u; | 277 size_t missing_tile_count = 0u; |
269 size_t on_demand_missing_tile_count = 0u; | 278 size_t on_demand_missing_tile_count = 0u; |
270 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), | 279 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), |
271 max_contents_scale, | 280 max_contents_scale, |
272 scaled_visible_content_rect, | 281 scaled_visible_content_rect, |
273 ideal_contents_scale_); | 282 ideal_contents_scale_); |
274 iter; | 283 iter; |
275 ++iter) { | 284 ++iter) { |
276 gfx::Rect geometry_rect = iter.geometry_rect(); | 285 gfx::Rect geometry_rect = iter.geometry_rect(); |
277 gfx::Rect visible_geometry_rect = occlusion_tracker.UnoccludedContentRect( | 286 gfx::Rect visible_geometry_rect = occlusion_tracker.UnoccludedContentRect( |
278 geometry_rect, scaled_draw_transform); | 287 geometry_rect, scaled_draw_transform); |
279 if (visible_geometry_rect.IsEmpty()) | 288 if (visible_geometry_rect.IsEmpty()) |
280 continue; | 289 continue; |
281 | 290 |
282 append_quads_data->visible_content_area += | 291 append_quads_data->visible_content_area += |
283 visible_geometry_rect.width() * visible_geometry_rect.height(); | 292 visible_geometry_rect.width() * visible_geometry_rect.height(); |
284 | 293 |
285 if (*iter && iter->IsReadyToDraw()) { | 294 if (*iter && iter->IsReadyToDraw()) { |
286 const ManagedTileState::TileVersion& tile_version = | 295 const ManagedTileState::TileVersion& tile_version = |
287 iter->GetTileVersionForDrawing(); | 296 iter->GetTileVersionForDrawing(); |
288 switch (tile_version.mode()) { | 297 switch (tile_version.mode()) { |
289 case ManagedTileState::TileVersion::RESOURCE_MODE: { | 298 case ManagedTileState::TileVersion::RESOURCE_MODE: { |
290 gfx::RectF texture_rect = iter.texture_rect(); | 299 gfx::RectF texture_rect = iter.texture_rect(); |
291 gfx::Rect opaque_rect = iter->opaque_rect(); | 300 gfx::Rect opaque_rect = iter->opaque_rect(); |
292 opaque_rect.Intersect(geometry_rect); | 301 opaque_rect.Intersect(geometry_rect); |
293 | 302 |
294 if (iter->contents_scale() != ideal_contents_scale_) | 303 if (iter->contents_scale() != ideal_contents_scale_ && |
304 !viewport_for_tile_priority_contains_visible_rect && | |
danakj
2014/08/20 14:27:48
Shouldn't this be
viewport_for_tile_prio_contains
boliu
2014/08/20 15:26:14
Yep. Renamed the var to "skip_viewport_for_tile_p
| |
305 geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { | |
295 append_quads_data->num_incomplete_tiles++; | 306 append_quads_data->num_incomplete_tiles++; |
307 } | |
296 | 308 |
297 TileDrawQuad* quad = | 309 TileDrawQuad* quad = |
298 render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 310 render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
299 quad->SetNew(shared_quad_state, | 311 quad->SetNew(shared_quad_state, |
300 geometry_rect, | 312 geometry_rect, |
301 opaque_rect, | 313 opaque_rect, |
302 visible_geometry_rect, | 314 visible_geometry_rect, |
303 tile_version.get_resource_id(), | 315 tile_version.get_resource_id(), |
304 texture_rect, | 316 texture_rect, |
305 iter.texture_size(), | 317 iter.texture_size(), |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
358 SkColor color = SafeOpaqueBackgroundColor(); | 370 SkColor color = SafeOpaqueBackgroundColor(); |
359 SolidColorDrawQuad* quad = | 371 SolidColorDrawQuad* quad = |
360 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 372 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
361 quad->SetNew(shared_quad_state, | 373 quad->SetNew(shared_quad_state, |
362 geometry_rect, | 374 geometry_rect, |
363 visible_geometry_rect, | 375 visible_geometry_rect, |
364 color, | 376 color, |
365 false); | 377 false); |
366 } | 378 } |
367 | 379 |
368 append_quads_data->num_missing_tiles++; | 380 if (!viewport_for_tile_priority_contains_visible_rect && |
381 geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { | |
382 append_quads_data->num_missing_tiles++; | |
383 ++missing_tile_count; | |
384 } | |
369 append_quads_data->approximated_visible_content_area += | 385 append_quads_data->approximated_visible_content_area += |
370 visible_geometry_rect.width() * visible_geometry_rect.height(); | 386 visible_geometry_rect.width() * visible_geometry_rect.height(); |
371 ++missing_tile_count; | |
372 continue; | 387 continue; |
373 } | 388 } |
374 | 389 |
375 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { | 390 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { |
376 append_quads_data->approximated_visible_content_area += | 391 append_quads_data->approximated_visible_content_area += |
377 visible_geometry_rect.width() * visible_geometry_rect.height(); | 392 visible_geometry_rect.width() * visible_geometry_rect.height(); |
378 } | 393 } |
379 | 394 |
380 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) | 395 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) |
381 seen_tilings.push_back(iter.CurrentTiling()); | 396 seen_tilings.push_back(iter.CurrentTiling()); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
466 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | 481 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
467 if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTime( | 482 if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTime( |
468 current_frame_time_in_seconds)) { | 483 current_frame_time_in_seconds)) { |
469 tiling_needs_update = true; | 484 tiling_needs_update = true; |
470 break; | 485 break; |
471 } | 486 } |
472 } | 487 } |
473 if (!tiling_needs_update) | 488 if (!tiling_needs_update) |
474 return; | 489 return; |
475 | 490 |
491 gfx::Rect visible_rect_in_content_space( | |
492 GetViewportForTilePriorityInContentSpace()); | |
493 visible_rect_in_content_space.Intersect(visible_content_rect()); | |
494 gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect( | |
495 visible_rect_in_content_space, 1.f / contents_scale_x()); | |
496 WhichTree tree = | |
497 layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; | |
498 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | |
499 tilings_->tiling_at(i)->UpdateTilePriorities(tree, | |
500 visible_layer_rect, | |
501 ideal_contents_scale_, | |
502 current_frame_time_in_seconds, | |
503 occlusion_tracker, | |
504 render_target(), | |
505 draw_transform()); | |
506 } | |
507 | |
508 // Tile priorities were modified. | |
509 layer_tree_impl()->DidModifyTilePriorities(); | |
510 } | |
511 | |
512 gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const { | |
476 // If visible_rect_for_tile_priority_ is empty or | 513 // If visible_rect_for_tile_priority_ is empty or |
477 // viewport_rect_for_tile_priority_ is set to be different from the device | 514 // viewport_rect_for_tile_priority_ is set to be different from the device |
478 // viewport, try to inverse project the viewport into layer space and use | 515 // viewport, try to inverse project the viewport into layer space and use |
479 // that. Otherwise just use visible_rect_for_tile_priority_ | 516 // that. Otherwise just use visible_rect_for_tile_priority_ |
480 gfx::Rect visible_rect_in_content_space = visible_rect_for_tile_priority_; | 517 gfx::Rect visible_rect_in_content_space = visible_rect_for_tile_priority_; |
481 | 518 |
482 if (visible_rect_in_content_space.IsEmpty() || | 519 if (visible_rect_in_content_space.IsEmpty() || |
483 layer_tree_impl()->DeviceViewport() != viewport_rect_for_tile_priority_) { | 520 layer_tree_impl()->DeviceViewport() != viewport_rect_for_tile_priority_) { |
484 gfx::Transform view_to_layer(gfx::Transform::kSkipInitialization); | 521 gfx::Transform view_to_layer(gfx::Transform::kSkipInitialization); |
485 | 522 |
486 if (screen_space_transform_for_tile_priority_.GetInverse(&view_to_layer)) { | 523 if (screen_space_transform_for_tile_priority_.GetInverse(&view_to_layer)) { |
487 // Transform from view space to content space. | 524 // Transform from view space to content space. |
488 visible_rect_in_content_space = | 525 visible_rect_in_content_space = |
489 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 526 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
490 view_to_layer, viewport_rect_for_tile_priority_)); | 527 view_to_layer, viewport_rect_for_tile_priority_)); |
491 | 528 |
492 visible_rect_in_content_space.Intersect(gfx::Rect(content_bounds())); | 529 visible_rect_in_content_space.Intersect(gfx::Rect(content_bounds())); |
493 } | 530 } |
494 } | 531 } |
495 | 532 |
496 gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect( | 533 return visible_rect_in_content_space; |
497 visible_rect_in_content_space, 1.f / contents_scale_x()); | |
498 WhichTree tree = | |
499 layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; | |
500 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | |
501 tilings_->tiling_at(i)->UpdateTilePriorities(tree, | |
502 visible_layer_rect, | |
503 ideal_contents_scale_, | |
504 current_frame_time_in_seconds, | |
505 occlusion_tracker, | |
506 render_target(), | |
507 draw_transform()); | |
508 } | |
509 | |
510 // Tile priorities were modified. | |
511 layer_tree_impl()->DidModifyTilePriorities(); | |
512 } | 534 } |
513 | 535 |
514 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { | 536 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { |
515 if (layer_tree_impl()->IsActiveTree()) { | 537 if (layer_tree_impl()->IsActiveTree()) { |
516 gfx::RectF layer_damage_rect = | 538 gfx::RectF layer_damage_rect = |
517 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); | 539 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); |
518 AddDamageRect(layer_damage_rect); | 540 AddDamageRect(layer_damage_rect); |
519 } | 541 } |
520 } | 542 } |
521 | 543 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
759 // The goal of this function is to find the minimum set of tiles that need to | 781 // The goal of this function is to find the minimum set of tiles that need to |
760 // be ready to draw in order to activate without flashing content from a | 782 // be ready to draw in order to activate without flashing content from a |
761 // higher res on the active tree to a lower res on the pending tree. | 783 // higher res on the active tree to a lower res on the pending tree. |
762 | 784 |
763 // First, early out for layers with no visible content. | 785 // First, early out for layers with no visible content. |
764 if (visible_content_rect().IsEmpty()) | 786 if (visible_content_rect().IsEmpty()) |
765 return; | 787 return; |
766 | 788 |
767 gfx::Rect rect(visible_content_rect()); | 789 gfx::Rect rect(visible_content_rect()); |
768 | 790 |
791 // Only mark tiles inside the viewport for tile priority as requried for | |
792 // activation. This viewport is normally the same as the draw viewport but | |
793 // can be independently overriden by clients like Android WebView with | |
794 // SetExternalDrawConstraints to control. | |
795 rect.Intersect(GetViewportForTilePriorityInContentSpace()); | |
796 | |
769 float min_acceptable_scale = | 797 float min_acceptable_scale = |
770 std::min(raster_contents_scale_, ideal_contents_scale_); | 798 std::min(raster_contents_scale_, ideal_contents_scale_); |
771 | 799 |
772 if (PictureLayerImpl* twin = twin_layer_) { | 800 if (PictureLayerImpl* twin = twin_layer_) { |
773 float twin_min_acceptable_scale = | 801 float twin_min_acceptable_scale = |
774 std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_); | 802 std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_); |
775 // Ignore 0 scale in case CalculateContentsScale() has never been | 803 // Ignore 0 scale in case CalculateContentsScale() has never been |
776 // called for active twin. | 804 // called for active twin. |
777 if (twin_min_acceptable_scale != 0.0f) { | 805 if (twin_min_acceptable_scale != 0.0f) { |
778 min_acceptable_scale = | 806 min_acceptable_scale = |
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1697 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); | 1725 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); |
1698 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; | 1726 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; |
1699 return tiling_range.end - 1 - current_tiling_range_offset; | 1727 return tiling_range.end - 1 - current_tiling_range_offset; |
1700 } | 1728 } |
1701 } | 1729 } |
1702 NOTREACHED(); | 1730 NOTREACHED(); |
1703 return 0; | 1731 return 0; |
1704 } | 1732 } |
1705 | 1733 |
1706 } // namespace cc | 1734 } // namespace cc |
OLD | NEW |