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

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: rebase 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
« no previous file with comments | « cc/picture_layer_impl.h ('k') | cc/picture_layer_tiling_set.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/picture_layer_impl.cc
diff --git a/cc/picture_layer_impl.cc b/cc/picture_layer_impl.cc
index 238f01d801df31bdb6ff4004d93d893933cd133a..987f972a0f0a94abd2283921beba09884091231e 100644
--- a/cc/picture_layer_impl.cc
+++ b/cc/picture_layer_impl.cc
@@ -25,7 +25,6 @@ namespace cc {
PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* treeImpl, int id)
: LayerImpl(treeImpl, id),
- tilings_(this),
pile_(PicturePileImpl::Create()),
last_update_time_(0),
last_content_scale_(0),
@@ -40,6 +39,36 @@ const char* PictureLayerImpl::layerTypeAsString() const {
return "PictureLayer";
}
+scoped_ptr<LayerImpl> PictureLayerImpl::createLayerImpl(
+ LayerTreeImpl* treeImpl) {
+ return PictureLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>();
+}
+
+void PictureLayerImpl::CreateTilingSet() {
+ DCHECK(layerTreeImpl()->IsPendingTree());
+ DCHECK(!tilings_);
+ tilings_.reset(new PictureLayerTilingSet(this));
+ tilings_->SetLayerBounds(bounds());
+}
+
+void PictureLayerImpl::TransferTilingSet(scoped_ptr<PictureLayerTilingSet> tilings) {
+ DCHECK(layerTreeImpl()->IsActiveTree());
+ tilings->SetClient(this);
+ tilings_ = tilings.Pass();
+}
+
+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->TransferTilingSet(tilings_.Pass());
+ layer_impl->pile_ = pile_;
+ pile_ = PicturePileImpl::Create();
+}
+
+
void PictureLayerImpl::appendQuads(QuadSink& quadSink,
AppendQuadsData& appendQuadsData) {
const gfx::Rect& rect = visibleContentRect();
@@ -56,7 +85,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_);
@@ -84,7 +113,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_);
@@ -162,7 +191,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_,
@@ -179,11 +208,13 @@ void PictureLayerImpl::didUpdateTransforms() {
}
void PictureLayerImpl::didBecomeActive() {
- tilings_.DidBecomeActive();
+ LayerImpl::didBecomeActive();
+ tilings_->DidBecomeActive();
}
void PictureLayerImpl::didLoseOutputSurface() {
- tilings_.RemoveAllTilings();
+ if (tilings_)
+ tilings_->RemoveAllTilings();
}
void PictureLayerImpl::calculateContentsScale(
@@ -192,7 +223,7 @@ void PictureLayerImpl::calculateContentsScale(
float* contents_scale_y,
gfx::Size* content_bounds) {
if (!drawsContent()) {
- DCHECK(!tilings_.num_tilings());
+ DCHECK(!tilings_->num_tilings());
return;
}
@@ -208,8 +239,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());
}
@@ -256,26 +287,26 @@ void PictureLayerImpl::SyncFromActiveLayer() {
}
void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
- tilings_.CloneAll(other->tilings_, invalidation_);
- DCHECK(bounds() == tilings_.LayerBounds());
+ tilings_->CloneAll(*other->tilings_, invalidation_);
+ DCHECK(bounds() == tilings_->LayerBounds());
}
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_);
@@ -295,8 +326,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)
@@ -320,7 +351,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());
@@ -381,8 +412,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)
@@ -391,14 +422,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))
@@ -442,8 +473,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;
@@ -453,7 +484,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
« no previous file with comments | « cc/picture_layer_impl.h ('k') | cc/picture_layer_tiling_set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698