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/resources/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 | 70 |
| 71 PictureLayerTiling::PictureLayerTiling(float contents_scale, | 71 PictureLayerTiling::PictureLayerTiling(float contents_scale, |
| 72 const gfx::Size& layer_bounds, | 72 const gfx::Size& layer_bounds, |
| 73 PictureLayerTilingClient* client) | 73 PictureLayerTilingClient* client) |
| 74 : contents_scale_(contents_scale), | 74 : contents_scale_(contents_scale), |
| 75 layer_bounds_(layer_bounds), | 75 layer_bounds_(layer_bounds), |
| 76 resolution_(NON_IDEAL_RESOLUTION), | 76 resolution_(NON_IDEAL_RESOLUTION), |
| 77 client_(client), | 77 client_(client), |
| 78 tiling_data_(gfx::Size(), gfx::Size(), true), | 78 tiling_data_(gfx::Size(), gfx::Size(), true), |
| 79 last_impl_frame_time_in_seconds_(0.0), | 79 last_impl_frame_time_in_seconds_(0.0), |
| 80 has_visible_rect_tiles_(false), | |
| 81 has_skewport_rect_tiles_(false), | |
| 82 has_soon_border_rect_tiles_(false), | |
| 83 has_eventually_rect_tiles_(false), | |
| 80 eviction_tiles_cache_valid_(false), | 84 eviction_tiles_cache_valid_(false), |
| 81 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { | 85 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { |
| 82 gfx::Size content_bounds = | 86 gfx::Size content_bounds = |
| 83 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); | 87 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); |
| 84 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); | 88 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
| 85 | 89 |
| 86 DCHECK(!gfx::ToFlooredSize( | 90 DCHECK(!gfx::ToFlooredSize( |
| 87 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << | 91 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << |
| 88 "Tiling created with scale too small as contents become empty." << | 92 "Tiling created with scale too small as contents become empty." << |
| 89 " Layer bounds: " << layer_bounds.ToString() << | 93 " Layer bounds: " << layer_bounds.ToString() << |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 482 last_visible_rect_in_content_space_ = visible_rect_in_content_space; | 486 last_visible_rect_in_content_space_ = visible_rect_in_content_space; |
| 483 | 487 |
| 484 eviction_tiles_cache_valid_ = false; | 488 eviction_tiles_cache_valid_ = false; |
| 485 | 489 |
| 486 TilePriority now_priority(resolution_, TilePriority::NOW, 0); | 490 TilePriority now_priority(resolution_, TilePriority::NOW, 0); |
| 487 float content_to_screen_scale = | 491 float content_to_screen_scale = |
| 488 1.0f / (contents_scale_ * ideal_contents_scale); | 492 1.0f / (contents_scale_ * ideal_contents_scale); |
| 489 | 493 |
| 490 // Assign now priority to all visible tiles. | 494 // Assign now priority to all visible tiles. |
| 491 bool include_borders = true; | 495 bool include_borders = true; |
| 496 has_visible_rect_tiles_ = false; | |
| 492 for (TilingData::Iterator iter( | 497 for (TilingData::Iterator iter( |
| 493 &tiling_data_, visible_rect_in_content_space, include_borders); | 498 &tiling_data_, visible_rect_in_content_space, include_borders); |
| 494 iter; | 499 iter; |
| 495 ++iter) { | 500 ++iter) { |
| 496 TileMap::iterator find = tiles_.find(iter.index()); | 501 TileMap::iterator find = tiles_.find(iter.index()); |
| 497 if (find == tiles_.end()) | 502 if (find == tiles_.end()) |
| 498 continue; | 503 continue; |
| 504 has_visible_rect_tiles_ = true; | |
| 499 Tile* tile = find->second.get(); | 505 Tile* tile = find->second.get(); |
| 500 | 506 |
| 501 tile->SetPriority(tree, now_priority); | 507 tile->SetPriority(tree, now_priority); |
| 502 | 508 |
| 503 // Set whether tile is occluded or not. | 509 // Set whether tile is occluded or not. |
| 504 bool is_occluded = false; | 510 bool is_occluded = false; |
| 505 if (occlusion_tracker) { | 511 if (occlusion_tracker) { |
| 506 gfx::Rect tile_query_rect = ScaleToEnclosingRect( | 512 gfx::Rect tile_query_rect = ScaleToEnclosingRect( |
| 507 IntersectRects(tile->content_rect(), visible_rect_in_content_space), | 513 IntersectRects(tile->content_rect(), visible_rect_in_content_space), |
| 508 1.0f / contents_scale_); | 514 1.0f / contents_scale_); |
| 509 // TODO(vmpstr): Remove render_target and draw_transform from the | 515 // TODO(vmpstr): Remove render_target and draw_transform from the |
| 510 // parameters so they can be hidden from the tiling. | 516 // parameters so they can be hidden from the tiling. |
| 511 is_occluded = occlusion_tracker->Occluded( | 517 is_occluded = occlusion_tracker->Occluded( |
| 512 render_target, tile_query_rect, draw_transform); | 518 render_target, tile_query_rect, draw_transform); |
| 513 } | 519 } |
| 514 tile->set_is_occluded(tree, is_occluded); | 520 tile->set_is_occluded(tree, is_occluded); |
| 515 } | 521 } |
| 516 | 522 |
| 517 // Assign soon priority to skewport tiles. | 523 // Assign soon priority to skewport tiles. |
| 524 has_skewport_rect_tiles_ = false; | |
| 518 for (TilingData::DifferenceIterator iter( | 525 for (TilingData::DifferenceIterator iter( |
| 519 &tiling_data_, skewport, visible_rect_in_content_space); | 526 &tiling_data_, skewport, visible_rect_in_content_space); |
| 520 iter; | 527 iter; |
| 521 ++iter) { | 528 ++iter) { |
| 522 TileMap::iterator find = tiles_.find(iter.index()); | 529 TileMap::iterator find = tiles_.find(iter.index()); |
| 523 if (find == tiles_.end()) | 530 if (find == tiles_.end()) |
| 524 continue; | 531 continue; |
| 532 has_skewport_rect_tiles_ = true; | |
| 525 Tile* tile = find->second.get(); | 533 Tile* tile = find->second.get(); |
| 526 | 534 |
| 527 gfx::Rect tile_bounds = | 535 gfx::Rect tile_bounds = |
| 528 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 536 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
| 529 | 537 |
| 530 float distance_to_visible = | 538 float distance_to_visible = |
| 531 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * | 539 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * |
| 532 content_to_screen_scale; | 540 content_to_screen_scale; |
| 533 | 541 |
| 534 TilePriority priority(resolution_, TilePriority::SOON, distance_to_visible); | 542 TilePriority priority(resolution_, TilePriority::SOON, distance_to_visible); |
| 535 tile->SetPriority(tree, priority); | 543 tile->SetPriority(tree, priority); |
| 536 } | 544 } |
| 537 | 545 |
| 538 // Assign eventually priority to interest rect tiles. | 546 // Assign eventually priority to interest rect tiles. |
| 547 has_eventually_rect_tiles_ = false; | |
| 539 for (TilingData::DifferenceIterator iter( | 548 for (TilingData::DifferenceIterator iter( |
| 540 &tiling_data_, eventually_rect, skewport); | 549 &tiling_data_, eventually_rect, skewport); |
| 541 iter; | 550 iter; |
| 542 ++iter) { | 551 ++iter) { |
| 543 TileMap::iterator find = tiles_.find(iter.index()); | 552 TileMap::iterator find = tiles_.find(iter.index()); |
| 544 if (find == tiles_.end()) | 553 if (find == tiles_.end()) |
| 545 continue; | 554 continue; |
| 555 has_eventually_rect_tiles_ = true; | |
| 546 Tile* tile = find->second.get(); | 556 Tile* tile = find->second.get(); |
| 547 | 557 |
| 548 gfx::Rect tile_bounds = | 558 gfx::Rect tile_bounds = |
| 549 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 559 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
| 550 | 560 |
| 551 float distance_to_visible = | 561 float distance_to_visible = |
| 552 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * | 562 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * |
| 553 content_to_screen_scale; | 563 content_to_screen_scale; |
| 554 TilePriority priority( | 564 TilePriority priority( |
| 555 resolution_, TilePriority::EVENTUALLY, distance_to_visible); | 565 resolution_, TilePriority::EVENTUALLY, distance_to_visible); |
| 556 tile->SetPriority(tree, priority); | 566 tile->SetPriority(tree, priority); |
| 557 } | 567 } |
| 558 | 568 |
| 559 // Upgrade the priority on border tiles to be SOON. | 569 // Upgrade the priority on border tiles to be SOON. |
| 560 gfx::Rect soon_border_rect = visible_rect_in_content_space; | 570 gfx::Rect soon_border_rect = visible_rect_in_content_space; |
| 561 float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; | 571 float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; |
| 562 soon_border_rect.Inset(-border, -border, -border, -border); | 572 soon_border_rect.Inset(-border, -border, -border, -border); |
| 573 has_soon_border_rect_tiles_ = false; | |
| 563 for (TilingData::DifferenceIterator iter( | 574 for (TilingData::DifferenceIterator iter( |
| 564 &tiling_data_, soon_border_rect, skewport); | 575 &tiling_data_, soon_border_rect, skewport); |
| 565 iter; | 576 iter; |
| 566 ++iter) { | 577 ++iter) { |
| 567 TileMap::iterator find = tiles_.find(iter.index()); | 578 TileMap::iterator find = tiles_.find(iter.index()); |
| 568 if (find == tiles_.end()) | 579 if (find == tiles_.end()) |
| 569 continue; | 580 continue; |
| 581 has_soon_border_rect_tiles_ = true; | |
| 570 Tile* tile = find->second.get(); | 582 Tile* tile = find->second.get(); |
| 571 | 583 |
| 572 TilePriority priority(resolution_, | 584 TilePriority priority(resolution_, |
| 573 TilePriority::SOON, | 585 TilePriority::SOON, |
| 574 tile->priority(tree).distance_to_visible); | 586 tile->priority(tree).distance_to_visible); |
| 575 tile->SetPriority(tree, priority); | 587 tile->SetPriority(tree, priority); |
| 576 } | 588 } |
| 577 | 589 |
| 578 // Update iteration rects. | 590 // Update iteration rects. |
| 579 current_visible_rect_ = visible_rect_in_content_space; | 591 current_visible_rect_ = visible_rect_in_content_space; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 834 } | 846 } |
| 835 | 847 |
| 836 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() | 848 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() |
| 837 : tiling_(NULL), current_tile_(NULL) {} | 849 : tiling_(NULL), current_tile_(NULL) {} |
| 838 | 850 |
| 839 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( | 851 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( |
| 840 PictureLayerTiling* tiling, | 852 PictureLayerTiling* tiling, |
| 841 WhichTree tree) | 853 WhichTree tree) |
| 842 : tiling_(tiling), | 854 : tiling_(tiling), |
| 843 type_(TilePriority::NOW), | 855 type_(TilePriority::NOW), |
| 844 visible_rect_in_content_space_(tiling_->current_visible_rect_), | |
| 845 skewport_in_content_space_(tiling_->current_skewport_rect_), | |
| 846 eventually_rect_in_content_space_(tiling_->current_eventually_rect_), | |
| 847 soon_border_rect_in_content_space_(tiling_->current_soon_border_rect_), | |
| 848 tree_(tree), | 856 tree_(tree), |
| 849 current_tile_(NULL), | 857 current_tile_(NULL), |
| 850 visible_iterator_(&tiling->tiling_data_, | |
| 851 visible_rect_in_content_space_, | |
| 852 true /* include_borders */), | |
| 853 spiral_iterator_(&tiling->tiling_data_, | |
| 854 skewport_in_content_space_, | |
| 855 visible_rect_in_content_space_, | |
| 856 visible_rect_in_content_space_), | |
| 857 skewport_processed_(false) { | 858 skewport_processed_(false) { |
| 859 if (!tiling_->has_visible_rect_tiles_) { | |
| 860 AdvancePhase(); | |
| 861 return; | |
| 862 } | |
| 863 | |
| 864 visible_iterator_ = TilingData::Iterator(&tiling_->tiling_data_, | |
| 865 tiling_->current_visible_rect_, | |
| 866 true /* include_borders */); | |
| 858 if (!visible_iterator_) { | 867 if (!visible_iterator_) { |
| 859 AdvancePhase(); | 868 AdvancePhase(); |
| 860 return; | 869 return; |
| 861 } | 870 } |
| 862 | 871 |
| 863 current_tile_ = | 872 current_tile_ = |
| 864 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); | 873 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); |
| 865 if (!current_tile_ || !TileNeedsRaster(current_tile_)) | 874 if (!current_tile_ || !TileNeedsRaster(current_tile_)) |
| 866 ++(*this); | 875 ++(*this); |
| 867 } | 876 } |
| 868 | 877 |
| 869 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} | 878 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} |
| 870 | 879 |
| 871 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { | 880 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { |
| 872 DCHECK_LT(type_, TilePriority::EVENTUALLY); | 881 DCHECK_LT(type_, TilePriority::EVENTUALLY); |
| 873 | 882 |
| 874 do { | 883 do { |
| 875 if (type_ == TilePriority::SOON && !skewport_processed_) | 884 if (type_ == TilePriority::SOON && !skewport_processed_) |
| 876 skewport_processed_ = true; | 885 skewport_processed_ = true; |
| 877 else | 886 else |
| 878 type_ = static_cast<TilePriority::PriorityBin>(type_ + 1); | 887 type_ = static_cast<TilePriority::PriorityBin>(type_ + 1); |
| 879 | 888 |
| 880 if (type_ == TilePriority::SOON && skewport_processed_) { | 889 if (type_ == TilePriority::SOON && !skewport_processed_) { |
| 890 if (!tiling_->has_skewport_rect_tiles_) | |
| 891 continue; | |
| 892 | |
| 893 spiral_iterator_ = | |
| 894 TilingData::SpiralDifferenceIterator(&tiling_->tiling_data_, | |
| 895 tiling_->current_skewport_rect_, | |
| 896 tiling_->current_visible_rect_, | |
| 897 tiling_->current_visible_rect_); | |
| 898 } else if (type_ == TilePriority::SOON && skewport_processed_) { | |
| 899 if (!tiling_->has_soon_border_rect_tiles_) | |
| 900 continue; | |
| 901 | |
| 881 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 902 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 882 &tiling_->tiling_data_, | 903 &tiling_->tiling_data_, |
| 883 soon_border_rect_in_content_space_, | 904 tiling_->current_soon_border_rect_, |
| 884 skewport_in_content_space_, | 905 tiling_->current_skewport_rect_, |
| 885 visible_rect_in_content_space_); | 906 tiling_->current_visible_rect_); |
| 886 } else if (type_ == TilePriority::EVENTUALLY) { | 907 } else if (type_ == TilePriority::EVENTUALLY) { |
| 908 if (!tiling_->has_eventually_rect_tiles_) { | |
| 909 current_tile_ = NULL; | |
| 910 return; | |
| 911 } | |
| 912 | |
| 887 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 913 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 888 &tiling_->tiling_data_, | 914 &tiling_->tiling_data_, |
| 889 eventually_rect_in_content_space_, | 915 tiling_->current_eventually_rect_, |
| 890 skewport_in_content_space_, | 916 tiling_->current_skewport_rect_, |
| 891 soon_border_rect_in_content_space_); | 917 tiling_->current_soon_border_rect_); |
| 892 } | 918 } |
|
reveman
2014/07/24 13:09:23
This actually made the code a bit easier for me to
| |
| 893 | 919 |
| 894 while (spiral_iterator_) { | 920 while (spiral_iterator_) { |
| 895 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), | 921 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), |
| 896 spiral_iterator_.index_y()); | 922 spiral_iterator_.index_y()); |
| 897 if (current_tile_ && TileNeedsRaster(current_tile_)) | 923 if (current_tile_ && TileNeedsRaster(current_tile_)) |
| 898 break; | 924 break; |
| 899 ++spiral_iterator_; | 925 ++spiral_iterator_; |
| 900 } | 926 } |
| 901 | 927 |
| 902 if (!spiral_iterator_ && type_ == TilePriority::EVENTUALLY) { | 928 if (!spiral_iterator_ && type_ == TilePriority::EVENTUALLY) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 981 DCHECK(*this); | 1007 DCHECK(*this); |
| 982 do { | 1008 do { |
| 983 ++tile_iterator_; | 1009 ++tile_iterator_; |
| 984 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 1010 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
| 985 (!(*tile_iterator_)->HasResources())); | 1011 (!(*tile_iterator_)->HasResources())); |
| 986 | 1012 |
| 987 return *this; | 1013 return *this; |
| 988 } | 1014 } |
| 989 | 1015 |
| 990 } // namespace cc | 1016 } // namespace cc |
| OLD | NEW |