| 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 28 matching lines...) Expand all Loading... |
| 39 // Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in | 39 // Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in |
| 40 // TileManager::BinFromTilePriority). | 40 // TileManager::BinFromTilePriority). |
| 41 const float kGpuSkewportTargetTimeInFrames = 0.0f; | 41 const float kGpuSkewportTargetTimeInFrames = 0.0f; |
| 42 | 42 |
| 43 // Minimum width/height of a layer that would require analysis for tiles. | 43 // Minimum width/height of a layer that would require analysis for tiles. |
| 44 const int kMinDimensionsForAnalysis = 256; | 44 const int kMinDimensionsForAnalysis = 256; |
| 45 } // namespace | 45 } // namespace |
| 46 | 46 |
| 47 namespace cc { | 47 namespace cc { |
| 48 | 48 |
| 49 PairedPictureLayer::PairedPictureLayer() |
| 50 : active_layer(NULL), pending_layer(NULL) { |
| 51 } |
| 52 |
| 53 PairedPictureLayer::~PairedPictureLayer() { |
| 54 } |
| 55 |
| 49 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id) | 56 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id) |
| 50 : LayerImpl(tree_impl, id), | 57 : LayerImpl(tree_impl, id), |
| 51 twin_layer_(NULL), | 58 twin_layer_(NULL), |
| 52 pile_(PicturePileImpl::Create()), | 59 pile_(PicturePileImpl::Create()), |
| 53 is_mask_(false), | 60 is_mask_(false), |
| 54 ideal_page_scale_(0.f), | 61 ideal_page_scale_(0.f), |
| 55 ideal_device_scale_(0.f), | 62 ideal_device_scale_(0.f), |
| 56 ideal_source_scale_(0.f), | 63 ideal_source_scale_(0.f), |
| 57 ideal_contents_scale_(0.f), | 64 ideal_contents_scale_(0.f), |
| 58 raster_page_scale_(0.f), | 65 raster_page_scale_(0.f), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 79 LayerTreeImpl* tree_impl) { | 86 LayerTreeImpl* tree_impl) { |
| 80 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); | 87 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); |
| 81 } | 88 } |
| 82 | 89 |
| 83 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { | 90 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { |
| 84 // It's possible this layer was never drawn or updated (e.g. because it was | 91 // It's possible this layer was never drawn or updated (e.g. because it was |
| 85 // a descendant of an opacity 0 layer). | 92 // a descendant of an opacity 0 layer). |
| 86 DoPostCommitInitializationIfNeeded(); | 93 DoPostCommitInitializationIfNeeded(); |
| 87 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); | 94 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); |
| 88 | 95 |
| 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); | 96 LayerImpl::PushPropertiesTo(base_layer); |
| 99 | 97 |
| 100 // When the pending tree pushes to the active tree, the pending twin | 98 // When the pending tree pushes to the active tree, the pending twin |
| 101 // disappears. | 99 // disappears. |
| 102 layer_impl->twin_layer_ = NULL; | 100 layer_impl->twin_layer_ = NULL; |
| 103 twin_layer_ = NULL; | 101 twin_layer_ = NULL; |
| 104 | 102 |
| 105 layer_impl->SetIsMask(is_mask_); | 103 layer_impl->SetIsMask(is_mask_); |
| 106 layer_impl->pile_ = pile_; | 104 layer_impl->pile_ = pile_; |
| 107 | 105 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 float width; | 208 float width; |
| 211 if (*iter && iter->IsReadyToDraw()) { | 209 if (*iter && iter->IsReadyToDraw()) { |
| 212 ManagedTileState::TileVersion::Mode mode = | 210 ManagedTileState::TileVersion::Mode mode = |
| 213 iter->GetTileVersionForDrawing().mode(); | 211 iter->GetTileVersionForDrawing().mode(); |
| 214 if (mode == ManagedTileState::TileVersion::SOLID_COLOR_MODE) { | 212 if (mode == ManagedTileState::TileVersion::SOLID_COLOR_MODE) { |
| 215 color = DebugColors::SolidColorTileBorderColor(); | 213 color = DebugColors::SolidColorTileBorderColor(); |
| 216 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); | 214 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); |
| 217 } else if (mode == ManagedTileState::TileVersion::PICTURE_PILE_MODE) { | 215 } else if (mode == ManagedTileState::TileVersion::PICTURE_PILE_MODE) { |
| 218 color = DebugColors::PictureTileBorderColor(); | 216 color = DebugColors::PictureTileBorderColor(); |
| 219 width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); | 217 width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); |
| 220 } else if (iter->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) { | 218 } else if (iter.resolution() == HIGH_RESOLUTION) { |
| 221 color = DebugColors::HighResTileBorderColor(); | 219 color = DebugColors::HighResTileBorderColor(); |
| 222 width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); | 220 width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); |
| 223 } else if (iter->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) { | 221 } else if (iter.resolution() == LOW_RESOLUTION) { |
| 224 color = DebugColors::LowResTileBorderColor(); | 222 color = DebugColors::LowResTileBorderColor(); |
| 225 width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); | 223 width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); |
| 226 } else if (iter->contents_scale() > max_contents_scale) { | 224 } else if (iter->contents_scale() > max_contents_scale) { |
| 227 color = DebugColors::ExtraHighResTileBorderColor(); | 225 color = DebugColors::ExtraHighResTileBorderColor(); |
| 228 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); | 226 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); |
| 229 } else { | 227 } else { |
| 230 color = DebugColors::ExtraLowResTileBorderColor(); | 228 color = DebugColors::ExtraLowResTileBorderColor(); |
| 231 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl()); | 229 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl()); |
| 232 } | 230 } |
| 233 } else { | 231 } else { |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 } | 350 } |
| 353 | 351 |
| 354 append_quads_data->num_missing_tiles++; | 352 append_quads_data->num_missing_tiles++; |
| 355 append_quads_data->had_incomplete_tile = true; | 353 append_quads_data->had_incomplete_tile = true; |
| 356 append_quads_data->approximated_visible_content_area += | 354 append_quads_data->approximated_visible_content_area += |
| 357 visible_geometry_rect.width() * visible_geometry_rect.height(); | 355 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 358 ++missing_tile_count; | 356 ++missing_tile_count; |
| 359 continue; | 357 continue; |
| 360 } | 358 } |
| 361 | 359 |
| 362 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { | 360 if (iter.resolution() != HIGH_RESOLUTION) { |
| 363 append_quads_data->approximated_visible_content_area += | 361 append_quads_data->approximated_visible_content_area += |
| 364 visible_geometry_rect.width() * visible_geometry_rect.height(); | 362 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 365 } | 363 } |
| 366 | 364 |
| 367 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) | 365 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) |
| 368 seen_tilings.push_back(iter.CurrentTiling()); | 366 seen_tilings.push_back(iter.CurrentTiling()); |
| 369 } | 367 } |
| 370 | 368 |
| 371 if (missing_tile_count) { | 369 if (missing_tile_count) { |
| 372 TRACE_EVENT_INSTANT2("cc", | 370 TRACE_EVENT_INSTANT2("cc", |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 DCHECK(raster_source_scale_); | 426 DCHECK(raster_source_scale_); |
| 429 DCHECK(raster_contents_scale_); | 427 DCHECK(raster_contents_scale_); |
| 430 DCHECK(low_res_raster_contents_scale_); | 428 DCHECK(low_res_raster_contents_scale_); |
| 431 | 429 |
| 432 was_screen_space_transform_animating_ = | 430 was_screen_space_transform_animating_ = |
| 433 draw_properties().screen_space_transform_is_animating; | 431 draw_properties().screen_space_transform_is_animating; |
| 434 | 432 |
| 435 should_update_tile_priorities_ = true; | 433 should_update_tile_priorities_ = true; |
| 436 | 434 |
| 437 UpdateTilePriorities(occlusion_tracker); | 435 UpdateTilePriorities(occlusion_tracker); |
| 438 | |
| 439 if (layer_tree_impl()->IsPendingTree()) | |
| 440 MarkVisibleResourcesAsRequired(); | |
| 441 } | 436 } |
| 442 | 437 |
| 443 void PictureLayerImpl::UpdateTilePriorities( | 438 void PictureLayerImpl::UpdateTilePriorities( |
| 444 const OcclusionTracker<LayerImpl>* occlusion_tracker) { | 439 const OcclusionTracker<LayerImpl>* occlusion_tracker) { |
| 445 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); | 440 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); |
| 446 | 441 |
| 447 double current_frame_time_in_seconds = | 442 double current_frame_time_in_seconds = |
| 448 (layer_tree_impl()->CurrentFrameTimeTicks() - | 443 (layer_tree_impl()->CurrentFrameTimeTicks() - |
| 449 base::TimeTicks()).InSecondsF(); | 444 base::TimeTicks()).InSecondsF(); |
| 450 | 445 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() * | 588 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() * |
| 594 layer_tree_impl()->settings().skewport_target_time_multiplier; | 589 layer_tree_impl()->settings().skewport_target_time_multiplier; |
| 595 } | 590 } |
| 596 | 591 |
| 597 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { | 592 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { |
| 598 return layer_tree_impl() | 593 return layer_tree_impl() |
| 599 ->settings() | 594 ->settings() |
| 600 .skewport_extrapolation_limit_in_content_pixels; | 595 .skewport_extrapolation_limit_in_content_pixels; |
| 601 } | 596 } |
| 602 | 597 |
| 598 bool PictureLayerImpl::RequiresHighResToDraw() const { |
| 599 const PictureLayerImpl* layer = this; |
| 600 if (GetTree() == PENDING_TREE) |
| 601 layer = twin_layer_; |
| 602 |
| 603 if (layer) |
| 604 return layer->layer_tree_impl()->RequiresHighResToDraw(); |
| 605 return false; |
| 606 } |
| 607 |
| 603 gfx::Size PictureLayerImpl::CalculateTileSize( | 608 gfx::Size PictureLayerImpl::CalculateTileSize( |
| 604 const gfx::Size& content_bounds) const { | 609 const gfx::Size& content_bounds) const { |
| 605 if (is_mask_) { | 610 if (is_mask_) { |
| 606 int max_size = layer_tree_impl()->MaxTextureSize(); | 611 int max_size = layer_tree_impl()->MaxTextureSize(); |
| 607 return gfx::Size( | 612 return gfx::Size( |
| 608 std::min(max_size, content_bounds.width()), | 613 std::min(max_size, content_bounds.width()), |
| 609 std::min(max_size, content_bounds.height())); | 614 std::min(max_size, content_bounds.height())); |
| 610 } | 615 } |
| 611 | 616 |
| 612 int max_texture_size = | 617 int max_texture_size = |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 | 752 |
| 748 const ManagedTileState::TileVersion& tile_version = | 753 const ManagedTileState::TileVersion& tile_version = |
| 749 iter->GetTileVersionForDrawing(); | 754 iter->GetTileVersionForDrawing(); |
| 750 if (!tile_version.IsReadyToDraw() || | 755 if (!tile_version.IsReadyToDraw() || |
| 751 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE) | 756 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE) |
| 752 return 0; | 757 return 0; |
| 753 | 758 |
| 754 return tile_version.get_resource_id(); | 759 return tile_version.get_resource_id(); |
| 755 } | 760 } |
| 756 | 761 |
| 757 void PictureLayerImpl::MarkVisibleResourcesAsRequired() const { | |
| 758 DCHECK(layer_tree_impl()->IsPendingTree()); | |
| 759 DCHECK(ideal_contents_scale_); | |
| 760 DCHECK_GT(tilings_->num_tilings(), 0u); | |
| 761 | |
| 762 // The goal of this function is to find the minimum set of tiles that need to | |
| 763 // be ready to draw in order to activate without flashing content from a | |
| 764 // higher res on the active tree to a lower res on the pending tree. | |
| 765 | |
| 766 // First, early out for layers with no visible content. | |
| 767 if (visible_content_rect().IsEmpty()) | |
| 768 return; | |
| 769 | |
| 770 gfx::Rect rect(visible_content_rect()); | |
| 771 | |
| 772 float min_acceptable_scale = | |
| 773 std::min(raster_contents_scale_, ideal_contents_scale_); | |
| 774 | |
| 775 if (PictureLayerImpl* twin = twin_layer_) { | |
| 776 float twin_min_acceptable_scale = | |
| 777 std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_); | |
| 778 // Ignore 0 scale in case CalculateContentsScale() has never been | |
| 779 // called for active twin. | |
| 780 if (twin_min_acceptable_scale != 0.0f) { | |
| 781 min_acceptable_scale = | |
| 782 std::min(min_acceptable_scale, twin_min_acceptable_scale); | |
| 783 } | |
| 784 } | |
| 785 | |
| 786 PictureLayerTiling* high_res = NULL; | |
| 787 PictureLayerTiling* low_res = NULL; | |
| 788 | |
| 789 // First pass: ready to draw tiles in acceptable but non-ideal tilings are | |
| 790 // marked as required for activation so that their textures are not thrown | |
| 791 // away; any non-ready tiles are not marked as required. | |
| 792 Region missing_region = rect; | |
| 793 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | |
| 794 PictureLayerTiling* tiling = tilings_->tiling_at(i); | |
| 795 DCHECK(tiling->has_ever_been_updated()); | |
| 796 | |
| 797 if (tiling->resolution() == LOW_RESOLUTION) { | |
| 798 DCHECK(!low_res) << "There can only be one low res tiling"; | |
| 799 low_res = tiling; | |
| 800 } | |
| 801 if (tiling->contents_scale() < min_acceptable_scale) | |
| 802 continue; | |
| 803 if (tiling->resolution() == HIGH_RESOLUTION) { | |
| 804 DCHECK(!high_res) << "There can only be one high res tiling"; | |
| 805 high_res = tiling; | |
| 806 continue; | |
| 807 } | |
| 808 for (PictureLayerTiling::CoverageIterator iter(tiling, | |
| 809 contents_scale_x(), | |
| 810 rect); | |
| 811 iter; | |
| 812 ++iter) { | |
| 813 if (!*iter || !iter->IsReadyToDraw()) | |
| 814 continue; | |
| 815 | |
| 816 missing_region.Subtract(iter.geometry_rect()); | |
| 817 iter->MarkRequiredForActivation(); | |
| 818 } | |
| 819 } | |
| 820 DCHECK(high_res) << "There must be one high res tiling"; | |
| 821 | |
| 822 // If these pointers are null (because no twin, no matching tiling, or the | |
| 823 // simpification just below), then high res tiles will be required to fill any | |
| 824 // holes left by the first pass above. If the pointers are valid, then this | |
| 825 // layer is allowed to skip any tiles that are not ready on its twin. | |
| 826 const PictureLayerTiling* twin_high_res = NULL; | |
| 827 const PictureLayerTiling* twin_low_res = NULL; | |
| 828 | |
| 829 if (twin_layer_) { | |
| 830 // As a simplification, only allow activating to skip twin tiles that the | |
| 831 // active layer is also missing when both this layer and its twin have | |
| 832 // "simple" sets of tilings: only 2 tilings (high and low) or only 1 high | |
| 833 // res tiling. This avoids having to iterate/track coverage of non-ideal | |
| 834 // tilings during the last draw call on the active layer. | |
| 835 if (tilings_->num_tilings() <= 2 && | |
| 836 twin_layer_->tilings_->num_tilings() <= tilings_->num_tilings()) { | |
| 837 twin_low_res = low_res ? GetTwinTiling(low_res) : NULL; | |
| 838 twin_high_res = high_res ? GetTwinTiling(high_res) : NULL; | |
| 839 } | |
| 840 | |
| 841 // If this layer and its twin have different transforms, then don't compare | |
| 842 // them and only allow activating to high res tiles, since tiles on each | |
| 843 // layer will be in different places on screen. | |
| 844 if (twin_layer_->layer_tree_impl()->RequiresHighResToDraw() || | |
| 845 bounds() != twin_layer_->bounds() || | |
| 846 draw_properties().screen_space_transform != | |
| 847 twin_layer_->draw_properties().screen_space_transform) { | |
| 848 twin_high_res = NULL; | |
| 849 twin_low_res = NULL; | |
| 850 } | |
| 851 } | |
| 852 | |
| 853 // As a second pass, mark as required any visible high res tiles not filled in | |
| 854 // by acceptable non-ideal tiles from the first pass. | |
| 855 if (MarkVisibleTilesAsRequired( | |
| 856 high_res, twin_high_res, contents_scale_x(), rect, missing_region)) { | |
| 857 // As an optional third pass, if a high res tile was skipped because its | |
| 858 // twin was also missing, then fall back to mark low res tiles as required | |
| 859 // in case the active twin is substituting those for missing high res | |
| 860 // content. Only suitable, when low res is enabled. | |
| 861 if (low_res) { | |
| 862 MarkVisibleTilesAsRequired( | |
| 863 low_res, twin_low_res, contents_scale_x(), rect, missing_region); | |
| 864 } | |
| 865 } | |
| 866 } | |
| 867 | |
| 868 bool PictureLayerImpl::MarkVisibleTilesAsRequired( | |
| 869 PictureLayerTiling* tiling, | |
| 870 const PictureLayerTiling* optional_twin_tiling, | |
| 871 float contents_scale, | |
| 872 const gfx::Rect& rect, | |
| 873 const Region& missing_region) const { | |
| 874 bool twin_had_missing_tile = false; | |
| 875 for (PictureLayerTiling::CoverageIterator iter(tiling, | |
| 876 contents_scale, | |
| 877 rect); | |
| 878 iter; | |
| 879 ++iter) { | |
| 880 Tile* tile = *iter; | |
| 881 // A null tile (i.e. missing recording) can just be skipped. | |
| 882 if (!tile) | |
| 883 continue; | |
| 884 | |
| 885 // If the tile is occluded, don't mark it as required for activation. | |
| 886 if (tile->is_occluded(PENDING_TREE)) | |
| 887 continue; | |
| 888 | |
| 889 // If the missing region doesn't cover it, this tile is fully | |
| 890 // covered by acceptable tiles at other scales. | |
| 891 if (!missing_region.Intersects(iter.geometry_rect())) | |
| 892 continue; | |
| 893 | |
| 894 // If the twin tile doesn't exist (i.e. missing recording or so far away | |
| 895 // that it is outside the visible tile rect) or this tile is shared between | |
| 896 // with the twin, then this tile isn't required to prevent flashing. | |
| 897 if (optional_twin_tiling) { | |
| 898 Tile* twin_tile = optional_twin_tiling->TileAt(iter.i(), iter.j()); | |
| 899 if (!twin_tile || twin_tile == tile) { | |
| 900 twin_had_missing_tile = true; | |
| 901 continue; | |
| 902 } | |
| 903 } | |
| 904 | |
| 905 tile->MarkRequiredForActivation(); | |
| 906 } | |
| 907 return twin_had_missing_tile; | |
| 908 } | |
| 909 | |
| 910 void PictureLayerImpl::DoPostCommitInitialization() { | 762 void PictureLayerImpl::DoPostCommitInitialization() { |
| 911 DCHECK(needs_post_commit_initialization_); | 763 DCHECK(needs_post_commit_initialization_); |
| 912 DCHECK(layer_tree_impl()->IsPendingTree()); | 764 DCHECK(layer_tree_impl()->IsPendingTree()); |
| 913 | 765 |
| 914 if (!tilings_) | 766 if (!tilings_) |
| 915 tilings_.reset(new PictureLayerTilingSet(this, bounds())); | 767 tilings_.reset(new PictureLayerTilingSet(this, bounds())); |
| 916 | 768 |
| 917 DCHECK(!twin_layer_); | 769 DCHECK(!twin_layer_); |
| 918 twin_layer_ = static_cast<PictureLayerImpl*>( | 770 twin_layer_ = static_cast<PictureLayerImpl*>( |
| 919 layer_tree_impl()->FindActiveTreeLayerById(id())); | 771 layer_tree_impl()->FindActiveTreeLayerById(id())); |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1637 return iterator_index_ < iterators_.size(); | 1489 return iterator_index_ < iterators_.size(); |
| 1638 } | 1490 } |
| 1639 | 1491 |
| 1640 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( | 1492 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( |
| 1641 PictureLayerTiling::TilingEvictionTileIterator* it) const { | 1493 PictureLayerTiling::TilingEvictionTileIterator* it) const { |
| 1642 return it->get_type() == iteration_stage_ && | 1494 return it->get_type() == iteration_stage_ && |
| 1643 (**it)->required_for_activation() == required_for_activation_; | 1495 (**it)->required_for_activation() == required_for_activation_; |
| 1644 } | 1496 } |
| 1645 | 1497 |
| 1646 } // namespace cc | 1498 } // namespace cc |
| OLD | NEW |