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

Unified Diff: cc/layers/picture_layer_impl.cc

Issue 287643004: Re-land: cc: Examine layers to determine if we're ready to activate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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/layers/picture_layer_impl.cc
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 8a4e30ee8aeed23cd721254522ffaaeb664b46f8..8e136162539e96d01a193314d1b501e2faebe3c9 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -247,8 +247,72 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
append_quads_data->visible_content_area +=
visible_geometry_rect.width() * visible_geometry_rect.height();
- if (!*iter || !iter->IsReadyToDraw()) {
- had_checkerboard_quads = true;
+ scoped_ptr<DrawQuad> draw_quad;
+ if (*iter && iter->IsReadyToDraw()) {
+ const ManagedTileState::TileVersion& tile_version =
+ iter->GetTileVersionForDrawing();
+ switch (tile_version.mode()) {
+ case ManagedTileState::TileVersion::RESOURCE_MODE: {
+ gfx::RectF texture_rect = iter.texture_rect();
+ gfx::Rect opaque_rect = iter->opaque_rect();
+ opaque_rect.Intersect(geometry_rect);
+
+ if (iter->contents_scale() != ideal_contents_scale_)
+ append_quads_data->had_incomplete_tile = true;
+
+ scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
+ quad->SetNew(shared_quad_state,
+ geometry_rect,
+ opaque_rect,
+ visible_geometry_rect,
+ tile_version.get_resource_id(),
+ texture_rect,
+ iter.texture_size(),
+ tile_version.contents_swizzled());
+ draw_quad = quad.PassAs<DrawQuad>();
+ break;
+ }
+ case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
+ if (layer_tree_impl()
+ ->GetRendererCapabilities()
+ .allow_rasterize_on_demand) {
+ gfx::RectF texture_rect = iter.texture_rect();
+ gfx::Rect opaque_rect = iter->opaque_rect();
+ opaque_rect.Intersect(geometry_rect);
+
+ ResourceProvider* resource_provider =
+ layer_tree_impl()->resource_provider();
+ ResourceFormat format =
+ resource_provider->memory_efficient_texture_format();
+ scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
+ quad->SetNew(shared_quad_state,
+ geometry_rect,
+ opaque_rect,
+ visible_geometry_rect,
+ texture_rect,
+ iter.texture_size(),
+ format,
+ iter->content_rect(),
+ iter->contents_scale(),
+ pile_);
+ draw_quad = quad.PassAs<DrawQuad>();
+ }
+ break;
+ }
+ case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
+ scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
+ quad->SetNew(shared_quad_state,
+ geometry_rect,
+ visible_geometry_rect,
+ tile_version.get_solid_color(),
+ false);
+ draw_quad = quad.PassAs<DrawQuad>();
+ break;
+ }
+ }
+ }
+
+ if (!draw_quad) {
if (draw_checkerboard_for_missing_tiles()) {
scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
SkColor color = DebugColors::DefaultCheckerboardColor();
@@ -270,69 +334,10 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
append_quads_data->had_incomplete_tile = true;
append_quads_data->approximated_visible_content_area +=
visible_geometry_rect.width() * visible_geometry_rect.height();
+ had_checkerboard_quads = true;
continue;
}
- const ManagedTileState::TileVersion& tile_version =
- iter->GetTileVersionForDrawing();
- scoped_ptr<DrawQuad> draw_quad;
- switch (tile_version.mode()) {
- case ManagedTileState::TileVersion::RESOURCE_MODE: {
- gfx::RectF texture_rect = iter.texture_rect();
- gfx::Rect opaque_rect = iter->opaque_rect();
- opaque_rect.Intersect(geometry_rect);
-
- if (iter->contents_scale() != ideal_contents_scale_)
- append_quads_data->had_incomplete_tile = true;
-
- scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
- quad->SetNew(shared_quad_state,
- geometry_rect,
- opaque_rect,
- visible_geometry_rect,
- tile_version.get_resource_id(),
- texture_rect,
- iter.texture_size(),
- tile_version.contents_swizzled());
- draw_quad = quad.PassAs<DrawQuad>();
- break;
- }
- case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
- gfx::RectF texture_rect = iter.texture_rect();
- gfx::Rect opaque_rect = iter->opaque_rect();
- opaque_rect.Intersect(geometry_rect);
-
- ResourceProvider* resource_provider =
- layer_tree_impl()->resource_provider();
- ResourceFormat format =
- resource_provider->memory_efficient_texture_format();
- scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
- quad->SetNew(shared_quad_state,
- geometry_rect,
- opaque_rect,
- visible_geometry_rect,
- texture_rect,
- iter.texture_size(),
- format,
- iter->content_rect(),
- iter->contents_scale(),
- pile_);
- draw_quad = quad.PassAs<DrawQuad>();
- break;
- }
- case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
- scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
- quad->SetNew(shared_quad_state,
- geometry_rect,
- visible_geometry_rect,
- tile_version.get_solid_color(),
- false);
- draw_quad = quad.PassAs<DrawQuad>();
- break;
- }
- }
-
- DCHECK(draw_quad);
quad_sink->Append(draw_quad.Pass());
if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) {
@@ -1341,6 +1346,30 @@ bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
return !layer_tree_impl()->IsRecycleTree();
}
+bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
+ if (!layer_tree_impl()->IsPendingTree())
+ return true;
+
+ if (!tilings_)
+ return true;
+
+ gfx::Rect rect(visible_content_rect());
+ for (PictureLayerTilingSet::CoverageIterator iter(
+ tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_);
+ iter;
+ ++iter) {
+ const Tile* tile = *iter;
+ // A null tile (i.e. missing recording) can just be skipped.
+ if (!tile)
+ continue;
+
+ if (tile->required_for_activation() && !tile->IsReadyToDraw())
+ return false;
+ }
+
+ return true;
+}
+
PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
: layer_(NULL) {}

Powered by Google App Engine
This is Rietveld 408576698