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

Unified Diff: cc/layers/picture_layer_impl.cc

Issue 895853003: Update from https://crrev.com/314320 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layers/picture_layer_impl.cc
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 813bc47877c1f41cd803f2ab5ea4b5c9c45ec01d..15059ba7d2782771774f19bdb197a90c43b34656 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -9,8 +9,8 @@
#include <limits>
#include <set>
-#include "base/debug/trace_event_argument.h"
#include "base/time/time.h"
+#include "base/trace_event/trace_event_argument.h"
#include "cc/base/math_util.h"
#include "cc/base/util.h"
#include "cc/debug/debug_colors.h"
@@ -65,10 +65,12 @@ PictureLayerImpl::Pair::Pair(PictureLayerImpl* active_layer,
PictureLayerImpl::Pair::~Pair() {
}
-PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl,
- int id,
- bool is_mask)
- : LayerImpl(tree_impl, id),
+PictureLayerImpl::PictureLayerImpl(
+ LayerTreeImpl* tree_impl,
+ int id,
+ bool is_mask,
+ scoped_refptr<SyncedScrollOffset> scroll_offset)
+ : LayerImpl(tree_impl, id, scroll_offset),
twin_layer_(nullptr),
tilings_(CreatePictureLayerTilingSet()),
ideal_page_scale_(0.f),
@@ -100,7 +102,8 @@ const char* PictureLayerImpl::LayerTypeAsString() const {
scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl(
LayerTreeImpl* tree_impl) {
- return PictureLayerImpl::Create(tree_impl, id(), is_mask_);
+ return PictureLayerImpl::Create(tree_impl, id(), is_mask_,
+ synced_scroll_offset());
}
void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
@@ -276,7 +279,7 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
// Keep track of the tilings that were used so that tilings that are
// unused can be considered for removal.
- std::vector<PictureLayerTiling*> seen_tilings;
+ last_append_quads_tilings_.clear();
// Ignore missing tiles outside of viewport for tile priority. This is
// normally the same as draw viewport but can be independently overridden by
@@ -403,8 +406,10 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
if (iter.resolution() != LOW_RESOLUTION)
only_used_low_res_last_append_quads_ = false;
- if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
- seen_tilings.push_back(iter.CurrentTiling());
+ if (last_append_quads_tilings_.empty() ||
+ last_append_quads_tilings_.back() != iter.CurrentTiling()) {
+ last_append_quads_tilings_.push_back(iter.CurrentTiling());
+ }
}
if (missing_tile_count) {
@@ -421,7 +426,7 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
// that this is at the expense of doing cause more frequent re-painting. A
// better scheme would be to maintain a tighter visible_content_rect for the
// finer tilings.
- CleanUpTilingsOnActiveLayer(seen_tilings);
+ CleanUpTilingsOnActiveLayer(last_append_quads_tilings_);
}
bool PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
@@ -442,6 +447,14 @@ bool PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
return false;
}
+ // Remove any non-ideal tilings that were not used last time we generated
+ // quads to save memory and processing time. Note that pending tree should
+ // only have one or two tilings (high and low res), so only clean up the
+ // active layer. This cleans it up here in case AppendQuads didn't run.
+ // If it did run, this would not remove any additional tilings.
+ if (GetTree() == ACTIVE_TREE)
+ CleanUpTilingsOnActiveLayer(last_append_quads_tilings_);
+
UpdateIdealScales();
if (!raster_contents_scale_ || ShouldAdjustRasterScale()) {
@@ -460,7 +473,6 @@ bool PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
if (draw_transform_is_animating())
raster_source_->SetShouldAttemptToUseDistanceFieldText();
-
return UpdateTilePriorities(occlusion_in_content_space);
}
@@ -992,7 +1004,7 @@ void PictureLayerImpl::RecalculateRasterScales() {
}
void PictureLayerImpl::CleanUpTilingsOnActiveLayer(
- std::vector<PictureLayerTiling*> used_tilings) {
+ const std::vector<PictureLayerTiling*>& used_tilings) {
DCHECK(layer_tree_impl()->IsActiveTree());
if (tilings_->num_tilings() == 0)
return;
@@ -1222,68 +1234,4 @@ bool PictureLayerImpl::HasValidTilePriorities() const {
return IsOnActiveOrPendingTree() && IsDrawnRenderSurfaceLayerListMember();
}
-bool PictureLayerImpl::AllTilesRequiredAreReadyToDraw(
- TileRequirementCheck is_tile_required_callback) const {
- if (!HasValidTilePriorities())
- return true;
-
- if (!tilings_)
- return true;
-
- if (visible_rect_for_tile_priority_.IsEmpty())
- return true;
-
- gfx::Rect rect = viewport_rect_for_tile_priority_in_content_space_;
- rect.Intersect(visible_rect_for_tile_priority_);
-
- // The high resolution tiling is the only tiling that can mark tiles as
- // requiring either draw or activation. There is an explicit check in those
- // callbacks to return false if they are not high resolution tilings. This
- // check needs to remain since there are other callers of that function that
- // rely on it. However, for the purposes of this function, we don't have to
- // check other tilings.
- PictureLayerTiling* tiling =
- tilings_->FindTilingWithResolution(HIGH_RESOLUTION);
- if (!tiling)
- return true;
-
- for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter;
- ++iter) {
- const Tile* tile = *iter;
- // A null tile (i.e. missing recording) can just be skipped.
- // TODO(vmpstr): Verify this is true if we create tiles in raster
- // iterators.
- if (!tile)
- continue;
-
- // We can't check tile->required_for_activation, because that value might
- // be out of date. It is updated in the raster/eviction iterators.
- // TODO(vmpstr): Remove the comment once you can't access this information
- // from the tile.
- if ((tiling->*is_tile_required_callback)(tile) && !tile->IsReadyToDraw()) {
- TRACE_EVENT_INSTANT0("cc", "Tile required, but not ready to draw.",
- TRACE_EVENT_SCOPE_THREAD);
- return false;
- }
- }
-
- return true;
-}
-
-bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
- if (!layer_tree_impl()->IsPendingTree())
- return true;
-
- return AllTilesRequiredAreReadyToDraw(
- &PictureLayerTiling::IsTileRequiredForActivationIfVisible);
-}
-
-bool PictureLayerImpl::AllTilesRequiredForDrawAreReadyToDraw() const {
- if (!layer_tree_impl()->IsActiveTree())
- return true;
-
- return AllTilesRequiredAreReadyToDraw(
- &PictureLayerTiling::IsTileRequiredForDrawIfVisible);
-}
-
} // namespace cc
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698