| 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 <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 synced_scroll_offset()); | 93 synced_scroll_offset()); |
| 94 } | 94 } |
| 95 | 95 |
| 96 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { | 96 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { |
| 97 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); | 97 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); |
| 98 DCHECK_EQ(layer_impl->is_mask_, is_mask_); | 98 DCHECK_EQ(layer_impl->is_mask_, is_mask_); |
| 99 | 99 |
| 100 LayerImpl::PushPropertiesTo(base_layer); | 100 LayerImpl::PushPropertiesTo(base_layer); |
| 101 | 101 |
| 102 // Twin relationships should never change once established. | 102 // Twin relationships should never change once established. |
| 103 DCHECK_IMPLIES(twin_layer_, twin_layer_ == layer_impl); | 103 DCHECK(!twin_layer_ || twin_layer_ == layer_impl); |
| 104 DCHECK_IMPLIES(twin_layer_, layer_impl->twin_layer_ == this); | 104 DCHECK(!twin_layer_ || layer_impl->twin_layer_ == this); |
| 105 // The twin relationship does not need to exist before the first | 105 // The twin relationship does not need to exist before the first |
| 106 // PushPropertiesTo from pending to active layer since before that the active | 106 // PushPropertiesTo from pending to active layer since before that the active |
| 107 // layer can not have a pile or tilings, it has only been created and inserted | 107 // layer can not have a pile or tilings, it has only been created and inserted |
| 108 // into the tree at that point. | 108 // into the tree at that point. |
| 109 twin_layer_ = layer_impl; | 109 twin_layer_ = layer_impl; |
| 110 layer_impl->twin_layer_ = this; | 110 layer_impl->twin_layer_ = this; |
| 111 | 111 |
| 112 layer_impl->SetNearestNeighbor(nearest_neighbor_); | 112 layer_impl->SetNearestNeighbor(nearest_neighbor_); |
| 113 | 113 |
| 114 // Solid color layers have no tilings. | 114 // Solid color layers have no tilings. |
| 115 DCHECK_IMPLIES(raster_source_->IsSolidColor(), tilings_->num_tilings() == 0); | 115 DCHECK(!raster_source_->IsSolidColor() || tilings_->num_tilings() == 0); |
| 116 // The pending tree should only have a high res (and possibly low res) tiling. | 116 // The pending tree should only have a high res (and possibly low res) tiling. |
| 117 DCHECK_LE(tilings_->num_tilings(), | 117 DCHECK_LE(tilings_->num_tilings(), |
| 118 layer_tree_impl()->create_low_res_tiling() ? 2u : 1u); | 118 layer_tree_impl()->create_low_res_tiling() ? 2u : 1u); |
| 119 | 119 |
| 120 layer_impl->set_gpu_raster_max_texture_size(gpu_raster_max_texture_size_); | 120 layer_impl->set_gpu_raster_max_texture_size(gpu_raster_max_texture_size_); |
| 121 layer_impl->UpdateRasterSource(raster_source_, &invalidation_, | 121 layer_impl->UpdateRasterSource(raster_source_, &invalidation_, |
| 122 tilings_.get()); | 122 tilings_.get()); |
| 123 DCHECK(invalidation_.IsEmpty()); | 123 DCHECK(invalidation_.IsEmpty()); |
| 124 | 124 |
| 125 // After syncing a solid color layer, the active layer has no tilings. | 125 // After syncing a solid color layer, the active layer has no tilings. |
| 126 DCHECK_IMPLIES(raster_source_->IsSolidColor(), | 126 DCHECK(!raster_source_->IsSolidColor() || |
| 127 layer_impl->tilings_->num_tilings() == 0); | 127 layer_impl->tilings_->num_tilings() == 0); |
| 128 | 128 |
| 129 layer_impl->raster_page_scale_ = raster_page_scale_; | 129 layer_impl->raster_page_scale_ = raster_page_scale_; |
| 130 layer_impl->raster_device_scale_ = raster_device_scale_; | 130 layer_impl->raster_device_scale_ = raster_device_scale_; |
| 131 layer_impl->raster_source_scale_ = raster_source_scale_; | 131 layer_impl->raster_source_scale_ = raster_source_scale_; |
| 132 layer_impl->raster_contents_scale_ = raster_contents_scale_; | 132 layer_impl->raster_contents_scale_ = raster_contents_scale_; |
| 133 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_; | 133 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_; |
| 134 | 134 |
| 135 layer_impl->SanityCheckTilingState(); | 135 layer_impl->SanityCheckTilingState(); |
| 136 | 136 |
| 137 // We always need to push properties. | 137 // We always need to push properties. |
| 138 // See http://crbug.com/303943 | 138 // See http://crbug.com/303943 |
| 139 // TODO(danakj): Stop always pushing properties since we don't swap tilings. | 139 // TODO(danakj): Stop always pushing properties since we don't swap tilings. |
| 140 needs_push_properties_ = true; | 140 needs_push_properties_ = true; |
| 141 } | 141 } |
| 142 | 142 |
| 143 void PictureLayerImpl::AppendQuads(RenderPass* render_pass, | 143 void PictureLayerImpl::AppendQuads(RenderPass* render_pass, |
| 144 AppendQuadsData* append_quads_data) { | 144 AppendQuadsData* append_quads_data) { |
| 145 // The bounds and the pile size may differ if the pile wasn't updated (ie. | 145 // The bounds and the pile size may differ if the pile wasn't updated (ie. |
| 146 // PictureLayer::Update didn't happen). In that case the pile will be empty. | 146 // PictureLayer::Update didn't happen). In that case the pile will be empty. |
| 147 DCHECK_IMPLIES(!raster_source_->GetSize().IsEmpty(), | 147 DCHECK(raster_source_->GetSize().IsEmpty() || |
| 148 bounds() == raster_source_->GetSize()) | 148 bounds() == raster_source_->GetSize()) |
| 149 << " bounds " << bounds().ToString() << " pile " | 149 << " bounds " << bounds().ToString() << " pile " |
| 150 << raster_source_->GetSize().ToString(); | 150 << raster_source_->GetSize().ToString(); |
| 151 | 151 |
| 152 SharedQuadState* shared_quad_state = | 152 SharedQuadState* shared_quad_state = |
| 153 render_pass->CreateAndAppendSharedQuadState(); | 153 render_pass->CreateAndAppendSharedQuadState(); |
| 154 | 154 |
| 155 if (raster_source_->IsSolidColor()) { | 155 if (raster_source_->IsSolidColor()) { |
| 156 PopulateSharedQuadState(shared_quad_state); | 156 PopulateSharedQuadState(shared_quad_state); |
| 157 | 157 |
| 158 AppendDebugBorderQuad( | 158 AppendDebugBorderQuad( |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 return nullptr; | 522 return nullptr; |
| 523 return twin_layer_; | 523 return twin_layer_; |
| 524 } | 524 } |
| 525 | 525 |
| 526 void PictureLayerImpl::UpdateRasterSource( | 526 void PictureLayerImpl::UpdateRasterSource( |
| 527 scoped_refptr<DisplayListRasterSource> raster_source, | 527 scoped_refptr<DisplayListRasterSource> raster_source, |
| 528 Region* new_invalidation, | 528 Region* new_invalidation, |
| 529 const PictureLayerTilingSet* pending_set) { | 529 const PictureLayerTilingSet* pending_set) { |
| 530 // The bounds and the pile size may differ if the pile wasn't updated (ie. | 530 // The bounds and the pile size may differ if the pile wasn't updated (ie. |
| 531 // PictureLayer::Update didn't happen). In that case the pile will be empty. | 531 // PictureLayer::Update didn't happen). In that case the pile will be empty. |
| 532 DCHECK_IMPLIES(!raster_source->GetSize().IsEmpty(), | 532 DCHECK(raster_source->GetSize().IsEmpty() || |
| 533 bounds() == raster_source->GetSize()) | 533 bounds() == raster_source->GetSize()) |
| 534 << " bounds " << bounds().ToString() << " pile " | 534 << " bounds " << bounds().ToString() << " pile " |
| 535 << raster_source->GetSize().ToString(); | 535 << raster_source->GetSize().ToString(); |
| 536 | 536 |
| 537 // The |raster_source_| is initially null, so have to check for that for the | 537 // The |raster_source_| is initially null, so have to check for that for the |
| 538 // first frame. | 538 // first frame. |
| 539 bool could_have_tilings = raster_source_.get() && CanHaveTilings(); | 539 bool could_have_tilings = raster_source_.get() && CanHaveTilings(); |
| 540 raster_source_.swap(raster_source); | 540 raster_source_.swap(raster_source); |
| 541 | 541 |
| 542 // The |new_invalidation| must be cleared before updating tilings since they | 542 // The |new_invalidation| must be cleared before updating tilings since they |
| 543 // access the invalidation through the PictureLayerTilingClient interface. | 543 // access the invalidation through the PictureLayerTilingClient interface. |
| 544 invalidation_.Clear(); | 544 invalidation_.Clear(); |
| 545 invalidation_.Swap(new_invalidation); | 545 invalidation_.Swap(new_invalidation); |
| 546 | 546 |
| 547 bool can_have_tilings = CanHaveTilings(); | 547 bool can_have_tilings = CanHaveTilings(); |
| 548 DCHECK_IMPLIES( | 548 DCHECK(!pending_set || |
| 549 pending_set, | 549 can_have_tilings == GetPendingOrActiveTwinLayer()->CanHaveTilings()); |
| 550 can_have_tilings == GetPendingOrActiveTwinLayer()->CanHaveTilings()); | |
| 551 | 550 |
| 552 // Need to call UpdateTiles again if CanHaveTilings changed. | 551 // Need to call UpdateTiles again if CanHaveTilings changed. |
| 553 if (could_have_tilings != can_have_tilings) | 552 if (could_have_tilings != can_have_tilings) |
| 554 layer_tree_impl()->set_needs_update_draw_properties(); | 553 layer_tree_impl()->set_needs_update_draw_properties(); |
| 555 | 554 |
| 556 if (!can_have_tilings) { | 555 if (!can_have_tilings) { |
| 557 RemoveAllTilings(); | 556 RemoveAllTilings(); |
| 558 return; | 557 return; |
| 559 } | 558 } |
| 560 | 559 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 // Under no circumstance should we be larger than the max texture size. | 771 // Under no circumstance should we be larger than the max texture size. |
| 773 tile_width = std::min(tile_width, max_texture_size); | 772 tile_width = std::min(tile_width, max_texture_size); |
| 774 tile_height = std::min(tile_height, max_texture_size); | 773 tile_height = std::min(tile_height, max_texture_size); |
| 775 return gfx::Size(tile_width, tile_height); | 774 return gfx::Size(tile_width, tile_height); |
| 776 } | 775 } |
| 777 | 776 |
| 778 void PictureLayerImpl::GetContentsResourceId(ResourceId* resource_id, | 777 void PictureLayerImpl::GetContentsResourceId(ResourceId* resource_id, |
| 779 gfx::Size* resource_size) const { | 778 gfx::Size* resource_size) const { |
| 780 // The bounds and the pile size may differ if the pile wasn't updated (ie. | 779 // The bounds and the pile size may differ if the pile wasn't updated (ie. |
| 781 // PictureLayer::Update didn't happen). In that case the pile will be empty. | 780 // PictureLayer::Update didn't happen). In that case the pile will be empty. |
| 782 DCHECK_IMPLIES(!raster_source_->GetSize().IsEmpty(), | 781 DCHECK(raster_source_->GetSize().IsEmpty() || |
| 783 bounds() == raster_source_->GetSize()) | 782 bounds() == raster_source_->GetSize()) |
| 784 << " bounds " << bounds().ToString() << " pile " | 783 << " bounds " << bounds().ToString() << " pile " |
| 785 << raster_source_->GetSize().ToString(); | 784 << raster_source_->GetSize().ToString(); |
| 786 gfx::Rect content_rect(bounds()); | 785 gfx::Rect content_rect(bounds()); |
| 787 PictureLayerTilingSet::CoverageIterator iter( | 786 PictureLayerTilingSet::CoverageIterator iter( |
| 788 tilings_.get(), 1.f, content_rect, ideal_contents_scale_); | 787 tilings_.get(), 1.f, content_rect, ideal_contents_scale_); |
| 789 | 788 |
| 790 // Mask resource not ready yet. | 789 // Mask resource not ready yet. |
| 791 if (!iter || !*iter) { | 790 if (!iter || !*iter) { |
| 792 *resource_id = 0; | 791 *resource_id = 0; |
| 793 return; | 792 return; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 return; | 912 return; |
| 914 | 913 |
| 915 // We should have a high resolution tiling at raster_contents_scale, so if the | 914 // We should have a high resolution tiling at raster_contents_scale, so if the |
| 916 // low res one is the same then we shouldn't try to override this tiling by | 915 // low res one is the same then we shouldn't try to override this tiling by |
| 917 // marking it as a low res. | 916 // marking it as a low res. |
| 918 if (raster_contents_scale_ == low_res_raster_contents_scale_) | 917 if (raster_contents_scale_ == low_res_raster_contents_scale_) |
| 919 return; | 918 return; |
| 920 | 919 |
| 921 PictureLayerTiling* low_res = | 920 PictureLayerTiling* low_res = |
| 922 tilings_->FindTilingWithScale(low_res_raster_contents_scale_); | 921 tilings_->FindTilingWithScale(low_res_raster_contents_scale_); |
| 923 DCHECK_IMPLIES(low_res, low_res->resolution() != HIGH_RESOLUTION); | 922 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION); |
| 924 | 923 |
| 925 // Only create new low res tilings when the transform is static. This | 924 // Only create new low res tilings when the transform is static. This |
| 926 // prevents wastefully creating a paired low res tiling for every new high | 925 // prevents wastefully creating a paired low res tiling for every new high |
| 927 // res tiling during a pinch or a CSS animation. | 926 // res tiling during a pinch or a CSS animation. |
| 928 bool is_pinching = layer_tree_impl()->PinchGestureActive(); | 927 bool is_pinching = layer_tree_impl()->PinchGestureActive(); |
| 929 bool is_animating = draw_properties().screen_space_transform_is_animating; | 928 bool is_animating = draw_properties().screen_space_transform_is_animating; |
| 930 if (!is_pinching && !is_animating) { | 929 if (!is_pinching && !is_animating) { |
| 931 if (!low_res) | 930 if (!low_res) |
| 932 low_res = AddTiling(low_res_raster_contents_scale_); | 931 low_res = AddTiling(low_res_raster_contents_scale_); |
| 933 low_res->set_resolution(LOW_RESOLUTION); | 932 low_res->set_resolution(LOW_RESOLUTION); |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 | 1262 |
| 1264 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { | 1263 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { |
| 1265 return !layer_tree_impl()->IsRecycleTree(); | 1264 return !layer_tree_impl()->IsRecycleTree(); |
| 1266 } | 1265 } |
| 1267 | 1266 |
| 1268 bool PictureLayerImpl::HasValidTilePriorities() const { | 1267 bool PictureLayerImpl::HasValidTilePriorities() const { |
| 1269 return IsOnActiveOrPendingTree() && IsDrawnRenderSurfaceLayerListMember(); | 1268 return IsOnActiveOrPendingTree() && IsDrawnRenderSurfaceLayerListMember(); |
| 1270 } | 1269 } |
| 1271 | 1270 |
| 1272 } // namespace cc | 1271 } // namespace cc |
| OLD | NEW |