| 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) {}
|
|
|
|
|