Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 367833003: cc: Start using raster/eviction iterators. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 LayerTreeImpl* tree_impl) { 79 LayerTreeImpl* tree_impl) {
80 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 80 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
81 } 81 }
82 82
83 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { 83 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
84 // It's possible this layer was never drawn or updated (e.g. because it was 84 // It's possible this layer was never drawn or updated (e.g. because it was
85 // a descendant of an opacity 0 layer). 85 // a descendant of an opacity 0 layer).
86 DoPostCommitInitializationIfNeeded(); 86 DoPostCommitInitializationIfNeeded();
87 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); 87 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
88 88
89 // We have already synced the important bits from the the active layer, and
90 // we will soon swap out its tilings and use them for recycling. However,
91 // there are now tiles in this layer's tilings that were unref'd and replaced
92 // with new tiles (due to invalidation). This resets all active priorities on
93 // the to-be-recycled tiling to ensure replaced tiles don't linger and take
94 // memory (due to a stale 'active' priority).
95 if (layer_impl->tilings_)
96 layer_impl->tilings_->DidBecomeRecycled();
97
98 LayerImpl::PushPropertiesTo(base_layer); 89 LayerImpl::PushPropertiesTo(base_layer);
99 90
100 // When the pending tree pushes to the active tree, the pending twin 91 // When the pending tree pushes to the active tree, the pending twin
101 // disappears. 92 // disappears.
102 layer_impl->twin_layer_ = NULL; 93 layer_impl->twin_layer_ = NULL;
103 twin_layer_ = NULL; 94 twin_layer_ = NULL;
104 95
105 layer_impl->SetIsMask(is_mask_); 96 layer_impl->SetIsMask(is_mask_);
106 layer_impl->pile_ = pile_; 97 layer_impl->pile_ = pile_;
107 98
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 float width; 200 float width;
210 if (*iter && iter->IsReadyToDraw()) { 201 if (*iter && iter->IsReadyToDraw()) {
211 ManagedTileState::TileVersion::Mode mode = 202 ManagedTileState::TileVersion::Mode mode =
212 iter->GetTileVersionForDrawing().mode(); 203 iter->GetTileVersionForDrawing().mode();
213 if (mode == ManagedTileState::TileVersion::SOLID_COLOR_MODE) { 204 if (mode == ManagedTileState::TileVersion::SOLID_COLOR_MODE) {
214 color = DebugColors::SolidColorTileBorderColor(); 205 color = DebugColors::SolidColorTileBorderColor();
215 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); 206 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl());
216 } else if (mode == ManagedTileState::TileVersion::PICTURE_PILE_MODE) { 207 } else if (mode == ManagedTileState::TileVersion::PICTURE_PILE_MODE) {
217 color = DebugColors::PictureTileBorderColor(); 208 color = DebugColors::PictureTileBorderColor();
218 width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); 209 width = DebugColors::PictureTileBorderWidth(layer_tree_impl());
219 } else if (iter->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) { 210 } else if (iter.resolution() == HIGH_RESOLUTION) {
220 color = DebugColors::HighResTileBorderColor(); 211 color = DebugColors::HighResTileBorderColor();
221 width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); 212 width = DebugColors::HighResTileBorderWidth(layer_tree_impl());
222 } else if (iter->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) { 213 } else if (iter.resolution() == LOW_RESOLUTION) {
223 color = DebugColors::LowResTileBorderColor(); 214 color = DebugColors::LowResTileBorderColor();
224 width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); 215 width = DebugColors::LowResTileBorderWidth(layer_tree_impl());
225 } else if (iter->contents_scale() > max_contents_scale) { 216 } else if (iter->contents_scale() > max_contents_scale) {
226 color = DebugColors::ExtraHighResTileBorderColor(); 217 color = DebugColors::ExtraHighResTileBorderColor();
227 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); 218 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl());
228 } else { 219 } else {
229 color = DebugColors::ExtraLowResTileBorderColor(); 220 color = DebugColors::ExtraLowResTileBorderColor();
230 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl()); 221 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl());
231 } 222 }
232 } else { 223 } else {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 false); 341 false);
351 } 342 }
352 343
353 append_quads_data->num_missing_tiles++; 344 append_quads_data->num_missing_tiles++;
354 append_quads_data->approximated_visible_content_area += 345 append_quads_data->approximated_visible_content_area +=
355 visible_geometry_rect.width() * visible_geometry_rect.height(); 346 visible_geometry_rect.width() * visible_geometry_rect.height();
356 ++missing_tile_count; 347 ++missing_tile_count;
357 continue; 348 continue;
358 } 349 }
359 350
360 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { 351 if (iter.resolution() != HIGH_RESOLUTION) {
361 append_quads_data->approximated_visible_content_area += 352 append_quads_data->approximated_visible_content_area +=
362 visible_geometry_rect.width() * visible_geometry_rect.height(); 353 visible_geometry_rect.width() * visible_geometry_rect.height();
363 } 354 }
364 355
365 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) 356 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
366 seen_tilings.push_back(iter.CurrentTiling()); 357 seen_tilings.push_back(iter.CurrentTiling());
367 } 358 }
368 359
369 if (missing_tile_count) { 360 if (missing_tile_count) {
370 TRACE_EVENT_INSTANT2("cc", 361 TRACE_EVENT_INSTANT2("cc",
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 DCHECK(raster_source_scale_); 417 DCHECK(raster_source_scale_);
427 DCHECK(raster_contents_scale_); 418 DCHECK(raster_contents_scale_);
428 DCHECK(low_res_raster_contents_scale_); 419 DCHECK(low_res_raster_contents_scale_);
429 420
430 was_screen_space_transform_animating_ = 421 was_screen_space_transform_animating_ =
431 draw_properties().screen_space_transform_is_animating; 422 draw_properties().screen_space_transform_is_animating;
432 423
433 should_update_tile_priorities_ = true; 424 should_update_tile_priorities_ = true;
434 425
435 UpdateTilePriorities(occlusion_tracker); 426 UpdateTilePriorities(occlusion_tracker);
436
437 if (layer_tree_impl()->IsPendingTree())
438 MarkVisibleResourcesAsRequired();
439 } 427 }
440 428
441 void PictureLayerImpl::UpdateTilePriorities( 429 void PictureLayerImpl::UpdateTilePriorities(
442 const OcclusionTracker<LayerImpl>* occlusion_tracker) { 430 const OcclusionTracker<LayerImpl>* occlusion_tracker) {
443 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); 431 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities");
444 432
445 double current_frame_time_in_seconds = 433 double current_frame_time_in_seconds =
446 (layer_tree_impl()->CurrentFrameTimeTicks() - 434 (layer_tree_impl()->CurrentFrameTimeTicks() -
447 base::TimeTicks()).InSecondsF(); 435 base::TimeTicks()).InSecondsF();
448 436
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() * 579 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() *
592 layer_tree_impl()->settings().skewport_target_time_multiplier; 580 layer_tree_impl()->settings().skewport_target_time_multiplier;
593 } 581 }
594 582
595 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { 583 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const {
596 return layer_tree_impl() 584 return layer_tree_impl()
597 ->settings() 585 ->settings()
598 .skewport_extrapolation_limit_in_content_pixels; 586 .skewport_extrapolation_limit_in_content_pixels;
599 } 587 }
600 588
589 bool PictureLayerImpl::RequiresHighResToDraw() const {
590 const PictureLayerImpl* layer = this;
591 if (GetTree() == PENDING_TREE)
592 layer = twin_layer_;
593
594 if (layer)
595 return layer->layer_tree_impl()->RequiresHighResToDraw();
596 return false;
597 }
598
601 gfx::Size PictureLayerImpl::CalculateTileSize( 599 gfx::Size PictureLayerImpl::CalculateTileSize(
602 const gfx::Size& content_bounds) const { 600 const gfx::Size& content_bounds) const {
603 if (is_mask_) { 601 if (is_mask_) {
604 int max_size = layer_tree_impl()->MaxTextureSize(); 602 int max_size = layer_tree_impl()->MaxTextureSize();
605 return gfx::Size( 603 return gfx::Size(
606 std::min(max_size, content_bounds.width()), 604 std::min(max_size, content_bounds.width()),
607 std::min(max_size, content_bounds.height())); 605 std::min(max_size, content_bounds.height()));
608 } 606 }
609 607
610 int max_texture_size = 608 int max_texture_size =
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 743
746 const ManagedTileState::TileVersion& tile_version = 744 const ManagedTileState::TileVersion& tile_version =
747 iter->GetTileVersionForDrawing(); 745 iter->GetTileVersionForDrawing();
748 if (!tile_version.IsReadyToDraw() || 746 if (!tile_version.IsReadyToDraw() ||
749 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE) 747 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE)
750 return 0; 748 return 0;
751 749
752 return tile_version.get_resource_id(); 750 return tile_version.get_resource_id();
753 } 751 }
754 752
755 void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
756 DCHECK(layer_tree_impl()->IsPendingTree());
757 DCHECK(ideal_contents_scale_);
758 DCHECK_GT(tilings_->num_tilings(), 0u);
759
760 // The goal of this function is to find the minimum set of tiles that need to
761 // be ready to draw in order to activate without flashing content from a
762 // higher res on the active tree to a lower res on the pending tree.
763
764 // First, early out for layers with no visible content.
765 if (visible_content_rect().IsEmpty())
766 return;
767
768 gfx::Rect rect(visible_content_rect());
769
770 float min_acceptable_scale =
771 std::min(raster_contents_scale_, ideal_contents_scale_);
772
773 if (PictureLayerImpl* twin = twin_layer_) {
774 float twin_min_acceptable_scale =
775 std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_);
776 // Ignore 0 scale in case CalculateContentsScale() has never been
777 // called for active twin.
778 if (twin_min_acceptable_scale != 0.0f) {
779 min_acceptable_scale =
780 std::min(min_acceptable_scale, twin_min_acceptable_scale);
781 }
782 }
783
784 PictureLayerTiling* high_res = NULL;
785 PictureLayerTiling* low_res = NULL;
786
787 // First pass: ready to draw tiles in acceptable but non-ideal tilings are
788 // marked as required for activation so that their textures are not thrown
789 // away; any non-ready tiles are not marked as required.
790 Region missing_region = rect;
791 for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
792 PictureLayerTiling* tiling = tilings_->tiling_at(i);
793 DCHECK(tiling->has_ever_been_updated());
794
795 if (tiling->resolution() == LOW_RESOLUTION) {
796 DCHECK(!low_res) << "There can only be one low res tiling";
797 low_res = tiling;
798 }
799 if (tiling->contents_scale() < min_acceptable_scale)
800 continue;
801 if (tiling->resolution() == HIGH_RESOLUTION) {
802 DCHECK(!high_res) << "There can only be one high res tiling";
803 high_res = tiling;
804 continue;
805 }
806 for (PictureLayerTiling::CoverageIterator iter(tiling,
807 contents_scale_x(),
808 rect);
809 iter;
810 ++iter) {
811 if (!*iter || !iter->IsReadyToDraw())
812 continue;
813
814 missing_region.Subtract(iter.geometry_rect());
815 iter->MarkRequiredForActivation();
816 }
817 }
818 DCHECK(high_res) << "There must be one high res tiling";
819
820 // If these pointers are null (because no twin, no matching tiling, or the
821 // simpification just below), then high res tiles will be required to fill any
822 // holes left by the first pass above. If the pointers are valid, then this
823 // layer is allowed to skip any tiles that are not ready on its twin.
824 const PictureLayerTiling* twin_high_res = NULL;
825 const PictureLayerTiling* twin_low_res = NULL;
826
827 if (twin_layer_) {
828 // As a simplification, only allow activating to skip twin tiles that the
829 // active layer is also missing when both this layer and its twin have
830 // "simple" sets of tilings: only 2 tilings (high and low) or only 1 high
831 // res tiling. This avoids having to iterate/track coverage of non-ideal
832 // tilings during the last draw call on the active layer.
833 if (tilings_->num_tilings() <= 2 &&
834 twin_layer_->tilings_->num_tilings() <= tilings_->num_tilings()) {
835 twin_low_res = low_res ? GetTwinTiling(low_res) : NULL;
836 twin_high_res = high_res ? GetTwinTiling(high_res) : NULL;
837 }
838
839 // If this layer and its twin have different transforms, then don't compare
840 // them and only allow activating to high res tiles, since tiles on each
841 // layer will be in different places on screen.
842 if (twin_layer_->layer_tree_impl()->RequiresHighResToDraw() ||
843 bounds() != twin_layer_->bounds() ||
844 draw_properties().screen_space_transform !=
845 twin_layer_->draw_properties().screen_space_transform) {
846 twin_high_res = NULL;
847 twin_low_res = NULL;
848 }
849 }
850
851 // As a second pass, mark as required any visible high res tiles not filled in
852 // by acceptable non-ideal tiles from the first pass.
853 if (MarkVisibleTilesAsRequired(
854 high_res, twin_high_res, contents_scale_x(), rect, missing_region)) {
855 // As an optional third pass, if a high res tile was skipped because its
856 // twin was also missing, then fall back to mark low res tiles as required
857 // in case the active twin is substituting those for missing high res
858 // content. Only suitable, when low res is enabled.
859 if (low_res) {
860 MarkVisibleTilesAsRequired(
861 low_res, twin_low_res, contents_scale_x(), rect, missing_region);
862 }
863 }
864 }
865
866 bool PictureLayerImpl::MarkVisibleTilesAsRequired(
867 PictureLayerTiling* tiling,
868 const PictureLayerTiling* optional_twin_tiling,
869 float contents_scale,
870 const gfx::Rect& rect,
871 const Region& missing_region) const {
872 bool twin_had_missing_tile = false;
873 for (PictureLayerTiling::CoverageIterator iter(tiling,
874 contents_scale,
875 rect);
876 iter;
877 ++iter) {
878 Tile* tile = *iter;
879 // A null tile (i.e. missing recording) can just be skipped.
880 if (!tile)
881 continue;
882
883 // If the tile is occluded, don't mark it as required for activation.
884 if (tile->is_occluded(PENDING_TREE))
885 continue;
886
887 // If the missing region doesn't cover it, this tile is fully
888 // covered by acceptable tiles at other scales.
889 if (!missing_region.Intersects(iter.geometry_rect()))
890 continue;
891
892 // If the twin tile doesn't exist (i.e. missing recording or so far away
893 // that it is outside the visible tile rect) or this tile is shared between
894 // with the twin, then this tile isn't required to prevent flashing.
895 if (optional_twin_tiling) {
896 Tile* twin_tile = optional_twin_tiling->TileAt(iter.i(), iter.j());
897 if (!twin_tile || twin_tile == tile) {
898 twin_had_missing_tile = true;
899 continue;
900 }
901 }
902
903 tile->MarkRequiredForActivation();
904 }
905 return twin_had_missing_tile;
906 }
907
908 void PictureLayerImpl::DoPostCommitInitialization() { 753 void PictureLayerImpl::DoPostCommitInitialization() {
909 DCHECK(needs_post_commit_initialization_); 754 DCHECK(needs_post_commit_initialization_);
910 DCHECK(layer_tree_impl()->IsPendingTree()); 755 DCHECK(layer_tree_impl()->IsPendingTree());
911 756
912 if (!tilings_) 757 if (!tilings_)
913 tilings_.reset(new PictureLayerTilingSet(this, bounds())); 758 tilings_.reset(new PictureLayerTilingSet(this, bounds()));
914 759
915 DCHECK(!twin_layer_); 760 DCHECK(!twin_layer_);
916 twin_layer_ = static_cast<PictureLayerImpl*>( 761 twin_layer_ = static_cast<PictureLayerImpl*>(
917 layer_tree_impl()->FindActiveTreeLayerById(id())); 762 layer_tree_impl()->FindActiveTreeLayerById(id()));
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after
1635 return iterator_index_ < iterators_.size(); 1480 return iterator_index_ < iterators_.size();
1636 } 1481 }
1637 1482
1638 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( 1483 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType(
1639 PictureLayerTiling::TilingEvictionTileIterator* it) const { 1484 PictureLayerTiling::TilingEvictionTileIterator* it) const {
1640 return it->get_type() == iteration_stage_ && 1485 return it->get_type() == iteration_stage_ &&
1641 (**it)->required_for_activation() == required_for_activation_; 1486 (**it)->required_for_activation() == required_for_activation_;
1642 } 1487 }
1643 1488
1644 } // namespace cc 1489 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698