OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 | 271 |
272 size_t missing_tile_count = 0u; | 272 size_t missing_tile_count = 0u; |
273 size_t on_demand_missing_tile_count = 0u; | 273 size_t on_demand_missing_tile_count = 0u; |
274 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), | 274 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), |
275 max_contents_scale, | 275 max_contents_scale, |
276 scaled_visible_content_rect, | 276 scaled_visible_content_rect, |
277 ideal_contents_scale_); | 277 ideal_contents_scale_); |
278 iter; | 278 iter; |
279 ++iter) { | 279 ++iter) { |
280 gfx::Rect geometry_rect = iter.geometry_rect(); | 280 gfx::Rect geometry_rect = iter.geometry_rect(); |
| 281 gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect(); |
281 gfx::Rect visible_geometry_rect = occlusion_tracker.UnoccludedContentRect( | 282 gfx::Rect visible_geometry_rect = occlusion_tracker.UnoccludedContentRect( |
282 geometry_rect, scaled_draw_transform); | 283 geometry_rect, scaled_draw_transform); |
283 if (visible_geometry_rect.IsEmpty()) | 284 if (visible_geometry_rect.IsEmpty()) |
284 continue; | 285 continue; |
285 | 286 |
286 append_quads_data->visible_content_area += | 287 append_quads_data->visible_content_area += |
287 visible_geometry_rect.width() * visible_geometry_rect.height(); | 288 visible_geometry_rect.width() * visible_geometry_rect.height(); |
288 | 289 |
289 bool has_draw_quad = false; | 290 bool has_draw_quad = false; |
290 if (*iter && iter->IsReadyToDraw()) { | 291 if (*iter && iter->IsReadyToDraw()) { |
291 const ManagedTileState::TileVersion& tile_version = | 292 const ManagedTileState::TileVersion& tile_version = |
292 iter->GetTileVersionForDrawing(); | 293 iter->GetTileVersionForDrawing(); |
293 switch (tile_version.mode()) { | 294 switch (tile_version.mode()) { |
294 case ManagedTileState::TileVersion::RESOURCE_MODE: { | 295 case ManagedTileState::TileVersion::RESOURCE_MODE: { |
295 gfx::RectF texture_rect = iter.texture_rect(); | 296 gfx::RectF texture_rect = iter.texture_rect(); |
296 gfx::Rect opaque_rect = iter->opaque_rect(); | |
297 opaque_rect.Intersect(geometry_rect); | |
298 | 297 |
299 // The raster_contents_scale_ is the best scale that the layer is | 298 // The raster_contents_scale_ is the best scale that the layer is |
300 // trying to produce, even though it may not be ideal. Since that's | 299 // trying to produce, even though it may not be ideal. Since that's |
301 // the best the layer can promise in the future, consider those as | 300 // the best the layer can promise in the future, consider those as |
302 // complete. But if a tile is ideal scale, we don't want to consider | 301 // complete. But if a tile is ideal scale, we don't want to consider |
303 // it incomplete and trying to replace it with a tile at a worse | 302 // it incomplete and trying to replace it with a tile at a worse |
304 // scale. | 303 // scale. |
305 if (iter->contents_scale() != raster_contents_scale_ && | 304 if (iter->contents_scale() != raster_contents_scale_ && |
306 iter->contents_scale() != ideal_contents_scale_ && | 305 iter->contents_scale() != ideal_contents_scale_ && |
307 geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { | 306 geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { |
(...skipping 15 matching lines...) Expand all Loading... |
323 } | 322 } |
324 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: { | 323 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: { |
325 if (!layer_tree_impl() | 324 if (!layer_tree_impl() |
326 ->GetRendererCapabilities() | 325 ->GetRendererCapabilities() |
327 .allow_rasterize_on_demand) { | 326 .allow_rasterize_on_demand) { |
328 ++on_demand_missing_tile_count; | 327 ++on_demand_missing_tile_count; |
329 break; | 328 break; |
330 } | 329 } |
331 | 330 |
332 gfx::RectF texture_rect = iter.texture_rect(); | 331 gfx::RectF texture_rect = iter.texture_rect(); |
333 gfx::Rect opaque_rect = iter->opaque_rect(); | |
334 opaque_rect.Intersect(geometry_rect); | |
335 | 332 |
336 ResourceProvider* resource_provider = | 333 ResourceProvider* resource_provider = |
337 layer_tree_impl()->resource_provider(); | 334 layer_tree_impl()->resource_provider(); |
338 ResourceFormat format = | 335 ResourceFormat format = |
339 resource_provider->memory_efficient_texture_format(); | 336 resource_provider->memory_efficient_texture_format(); |
340 PictureDrawQuad* quad = | 337 PictureDrawQuad* quad = |
341 render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); | 338 render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); |
342 quad->SetNew(shared_quad_state, | 339 quad->SetNew(shared_quad_state, |
343 geometry_rect, | 340 geometry_rect, |
344 opaque_rect, | 341 opaque_rect, |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 // memory savings that we can get. Note that we don't handle solid color | 577 // memory savings that we can get. Note that we don't handle solid color |
581 // masks, so we shouldn't bother analyzing those. | 578 // masks, so we shouldn't bother analyzing those. |
582 // Bugs: crbug.com/397198, crbug.com/396908 | 579 // Bugs: crbug.com/397198, crbug.com/396908 |
583 if (!pile_->is_mask()) | 580 if (!pile_->is_mask()) |
584 flags = Tile::USE_PICTURE_ANALYSIS; | 581 flags = Tile::USE_PICTURE_ANALYSIS; |
585 | 582 |
586 return layer_tree_impl()->tile_manager()->CreateTile( | 583 return layer_tree_impl()->tile_manager()->CreateTile( |
587 pile_.get(), | 584 pile_.get(), |
588 content_rect.size(), | 585 content_rect.size(), |
589 content_rect, | 586 content_rect, |
590 contents_opaque() ? content_rect : gfx::Rect(), | |
591 tiling->contents_scale(), | 587 tiling->contents_scale(), |
592 id(), | 588 id(), |
593 layer_tree_impl()->source_frame_number(), | 589 layer_tree_impl()->source_frame_number(), |
594 flags); | 590 flags); |
595 } | 591 } |
596 | 592 |
597 PicturePileImpl* PictureLayerImpl::GetPile() { | 593 PicturePileImpl* PictureLayerImpl::GetPile() { |
598 return pile_.get(); | 594 return pile_.get(); |
599 } | 595 } |
600 | 596 |
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1766 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); | 1762 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); |
1767 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; | 1763 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; |
1768 return tiling_range.end - 1 - current_tiling_range_offset; | 1764 return tiling_range.end - 1 - current_tiling_range_offset; |
1769 } | 1765 } |
1770 } | 1766 } |
1771 NOTREACHED(); | 1767 NOTREACHED(); |
1772 return 0; | 1768 return 0; |
1773 } | 1769 } |
1774 | 1770 |
1775 } // namespace cc | 1771 } // namespace cc |
OLD | NEW |