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

Unified Diff: cc/picture_layer_impl.cc

Issue 11882037: Activate LayerImpl tree with sync+push instead of pointer swap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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
Index: cc/picture_layer_impl.cc
diff --git a/cc/picture_layer_impl.cc b/cc/picture_layer_impl.cc
index 2aef705e60c6ab235cb63ed56b23805b69193d4e..d8093ca2875dd55c7cb543563a2946576bb464f6 100644
--- a/cc/picture_layer_impl.cc
+++ b/cc/picture_layer_impl.cc
@@ -25,7 +25,7 @@ namespace cc {
PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* treeImpl, int id)
: LayerImpl(treeImpl, id),
- tilings_(this),
+ tilings_(new PictureLayerTilingSet(this)),
pile_(PicturePileImpl::Create()),
last_update_time_(0),
last_content_scale_(0),
@@ -40,6 +40,23 @@ const char* PictureLayerImpl::layerTypeAsString() const {
return "PictureLayer";
}
+scoped_ptr<LayerImpl> PictureLayerImpl::createLayerImpl(
+ LayerTreeImpl* treeImpl) {
+ return PictureLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>();
+}
+
+void PictureLayerImpl::pushPropertiesTo(LayerImpl* base_layer) {
+ LayerImpl::pushPropertiesTo(base_layer);
+
+ PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
+ layer_impl->SetIsMask(is_mask_);
+ layer_impl->tilings_.swap(tilings_);
+ tilings_.reset(new PictureLayerTilingSet(this));
+ layer_impl->pile_ = pile_;
+ pile_ = PicturePileImpl::Create();
+}
+
+
void PictureLayerImpl::appendQuads(QuadSink& quadSink,
AppendQuadsData& appendQuadsData) {
@@ -57,7 +74,7 @@ void PictureLayerImpl::appendQuads(QuadSink& quadSink,
bool useAA = !isAxisAlignedInTarget;
if (showDebugBorders()) {
- for (PictureLayerTilingSet::Iterator iter(&tilings_,
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(),
contentsScaleX(),
rect,
ideal_contents_scale_);
@@ -85,7 +102,7 @@ void PictureLayerImpl::appendQuads(QuadSink& quadSink,
// unused can be considered for removal.
std::vector<PictureLayerTiling*> seen_tilings;
- for (PictureLayerTilingSet::Iterator iter(&tilings_,
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(),
contentsScaleX(),
rect,
ideal_contents_scale_);
@@ -163,7 +180,7 @@ void PictureLayerImpl::didUpdateTransforms() {
time_delta = current_time - last_update_time_;
}
WhichTree tree = layerTreeImpl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
- tilings_.UpdateTilePriorities(
+ tilings_->UpdateTilePriorities(
tree,
layerTreeImpl()->device_viewport_size(),
last_content_scale_,
@@ -180,11 +197,12 @@ void PictureLayerImpl::didUpdateTransforms() {
}
void PictureLayerImpl::didBecomeActive() {
- tilings_.MoveTilePriorities(PENDING_TREE, ACTIVE_TREE);
+ LayerImpl::didBecomeActive();
+ tilings_->MoveTilePriorities(PENDING_TREE, ACTIVE_TREE);
}
void PictureLayerImpl::didLoseOutputSurface() {
- tilings_.RemoveAllTilings();
+ tilings_->RemoveAllTilings();
}
void PictureLayerImpl::calculateContentsScale(
@@ -193,7 +211,7 @@ void PictureLayerImpl::calculateContentsScale(
float* contents_scale_y,
gfx::Size* content_bounds) {
if (!drawsContent()) {
- DCHECK(!tilings_.num_tilings());
+ DCHECK(!tilings_->num_tilings());
return;
}
@@ -209,8 +227,8 @@ void PictureLayerImpl::calculateContentsScale(
// tilings (and then map back to floating point texture coordinates), the
// contents scale must be at least as large as the largest of the tilings.
float max_contents_scale = min_contents_scale;
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) {
- const PictureLayerTiling* tiling = tilings_.tiling_at(i);
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ const PictureLayerTiling* tiling = tilings_->tiling_at(i);
max_contents_scale = std::max(max_contents_scale, tiling->contents_scale());
}
@@ -253,25 +271,25 @@ void PictureLayerImpl::SyncFromActiveLayer() {
}
void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
- tilings_.CloneAll(other->tilings_, invalidation_);
+ tilings_->CloneAll(*other->tilings_, invalidation_);
}
void PictureLayerImpl::SyncTiling(
const PictureLayerTiling* tiling) {
- tilings_.Clone(tiling, invalidation_);
+ tilings_->Clone(tiling, invalidation_);
}
void PictureLayerImpl::SetIsMask(bool is_mask) {
if (is_mask_ == is_mask)
return;
is_mask_ = is_mask;
- tilings_.RemoveAllTiles();
+ tilings_->RemoveAllTiles();
}
ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const {
gfx::Rect content_rect(gfx::Point(), contentBounds());
float scale = contentsScaleX();
- for (PictureLayerTilingSet::Iterator iter(&tilings_,
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(),
scale,
content_rect,
ideal_contents_scale_);
@@ -291,8 +309,8 @@ ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const {
bool PictureLayerImpl::areVisibleResourcesReady() const {
const gfx::Rect& rect = visibleContentRect();
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) {
- const PictureLayerTiling* tiling = tilings_.tiling_at(i);
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ const PictureLayerTiling* tiling = tilings_->tiling_at(i);
// Ignore non-high resolution tilings.
if (tiling->resolution() != HIGH_RESOLUTION)
@@ -316,7 +334,7 @@ PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
if (contents_scale < layerTreeImpl()->settings().minimumContentsScale)
return NULL;
- PictureLayerTiling* tiling = tilings_.AddTiling(
+ PictureLayerTiling* tiling = tilings_->AddTiling(
contents_scale,
TileSize());
@@ -377,8 +395,8 @@ void PictureLayerImpl::ManageTilings(float ideal_contents_scale) {
if (layerTreeImpl()->IsPendingTree() &&
!layerTreeImpl()->PinchGestureActive()) {
std::vector<PictureLayerTiling*> remove_list;
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) {
- PictureLayerTiling* tiling = tilings_.tiling_at(i);
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ PictureLayerTiling* tiling = tilings_->tiling_at(i);
if (tiling->contents_scale() == ideal_contents_scale)
continue;
if (tiling->contents_scale() == low_res_contents_scale)
@@ -387,14 +405,14 @@ void PictureLayerImpl::ManageTilings(float ideal_contents_scale) {
}
for (size_t i = 0; i < remove_list.size(); ++i)
- tilings_.Remove(remove_list[i]);
+ tilings_->Remove(remove_list[i]);
}
// Find existing tilings closest to ideal high / low res.
PictureLayerTiling* high_res = NULL;
PictureLayerTiling* low_res = NULL;
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) {
- PictureLayerTiling* tiling = tilings_.tiling_at(i);
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ PictureLayerTiling* tiling = tilings_->tiling_at(i);
if (!high_res || IsCloserToThan(tiling, high_res, ideal_contents_scale))
high_res = tiling;
if (!low_res || IsCloserToThan(tiling, low_res, low_res_contents_scale))
@@ -438,8 +456,8 @@ void PictureLayerImpl::CleanUpUnusedTilings(
std::vector<PictureLayerTiling*> used_tilings) {
std::vector<PictureLayerTiling*> to_remove;
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) {
- PictureLayerTiling* tiling = tilings_.tiling_at(i);
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ PictureLayerTiling* tiling = tilings_->tiling_at(i);
// Don't remove the current high or low res tilinig.
if (tiling->resolution() != NON_IDEAL_RESOLUTION)
continue;
@@ -449,7 +467,7 @@ void PictureLayerImpl::CleanUpUnusedTilings(
}
for (size_t i = 0; i < to_remove.size(); ++i)
- tilings_.Remove(to_remove[i]);
+ tilings_->Remove(to_remove[i]);
}
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698