Index: cc/trees/layer_tree_impl.cc |
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
index c48a09a23aeef1fc77c547dce2e9afc284ea3257..efe05896d8f7736b8f472290bec0561c96826b1b 100644 |
--- a/cc/trees/layer_tree_impl.cc |
+++ b/cc/trees/layer_tree_impl.cc |
@@ -580,63 +580,71 @@ bool LayerTreeImpl::UpdateDrawProperties() { |
TRACE_EVENT_BEGIN2("cc", "LayerTreeImpl::UpdateTilePriorities", "IsActive", |
IsActiveTree(), "SourceFrameNumber", |
source_frame_number_); |
- scoped_ptr<OcclusionTracker<LayerImpl>> occlusion_tracker; |
- if (settings().use_occlusion_for_tile_prioritization) { |
- occlusion_tracker.reset(new OcclusionTracker<LayerImpl>( |
- root_layer()->render_surface()->content_rect())); |
- occlusion_tracker->set_minimum_tracking_size( |
- settings().minimum_occlusion_tracking_size); |
- } |
- |
- bool resourceless_software_draw = (layer_tree_host_impl_->GetDrawMode() == |
- DRAW_MODE_RESOURCELESS_SOFTWARE); |
+ OcclusionTracker<LayerImpl> occlusion_tracker( |
+ root_layer()->render_surface()->content_rect()); |
+ occlusion_tracker.set_minimum_tracking_size( |
+ settings().minimum_occlusion_tracking_size); |
// LayerIterator is used here instead of CallFunctionForSubtree to only |
// UpdateTilePriorities on layers that will be visible (and thus have valid |
// draw properties) and not because any ordering is required. |
- typedef LayerIterator<LayerImpl> LayerIteratorType; |
- LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_); |
- size_t layers_updated_count = 0; |
- bool tile_priorities_updated = false; |
- for (LayerIteratorType it = |
- LayerIteratorType::Begin(&render_surface_layer_list_); |
- it != end; |
- ++it) { |
- if (occlusion_tracker) |
- occlusion_tracker->EnterLayer(it); |
- |
- LayerImpl* layer = *it; |
- const Occlusion& occlusion_in_content_space = |
- occlusion_tracker ? occlusion_tracker->GetCurrentOcclusionForLayer( |
- layer->draw_transform()) |
- : Occlusion(); |
+ auto end = LayerIterator<LayerImpl>::End(&render_surface_layer_list_); |
+ for (auto it = LayerIterator<LayerImpl>::Begin(&render_surface_layer_list_); |
+ it != end; ++it) { |
+ occlusion_tracker.EnterLayer(it); |
if (it.represents_itself()) { |
- tile_priorities_updated |= layer->UpdateTiles( |
- occlusion_in_content_space, resourceless_software_draw); |
- ++layers_updated_count; |
+ Occlusion occlusion = |
+ occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()); |
+ it->draw_properties().occlusion_in_content_space = occlusion; |
} |
- if (!it.represents_contributing_render_surface()) { |
- if (occlusion_tracker) |
- occlusion_tracker->LeaveLayer(it); |
- continue; |
+ if (it.represents_contributing_render_surface()) { |
+ it->render_surface()->set_occlusion_in_content_space( |
+ occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
+ it->render_surface()->draw_transform())); |
+ it->render_surface()->set_replica_occlusion_in_content_space( |
+ occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
+ it->render_surface()->replica_draw_transform())); |
+ if (LayerImpl* mask = it->mask_layer()) { |
+ mask->draw_properties().occlusion_in_content_space = |
+ occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
+ it->render_surface()->draw_transform() * |
vmpstr
2015/02/13 00:24:54
This is probably lack of knowledge for my part, bu
danakj
2015/02/13 00:27:07
The mask is used when drawing the surface, so I th
enne (OOO)
2015/02/13 00:30:23
Occlusion on masks is not used anywhere, as it's r
|
+ it->draw_transform()); |
+ } |
+ if (it->replica_layer()) { |
+ if (LayerImpl* mask = it->replica_layer()->mask_layer()) { |
+ mask->draw_properties().occlusion_in_content_space = |
+ occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
+ it->render_surface()->replica_draw_transform() * |
+ it->draw_transform()); |
+ } |
+ } |
} |
- if (layer->mask_layer()) { |
- tile_priorities_updated |= layer->mask_layer()->UpdateTiles( |
- occlusion_in_content_space, resourceless_software_draw); |
- ++layers_updated_count; |
- } |
- if (layer->replica_layer() && layer->replica_layer()->mask_layer()) { |
- tile_priorities_updated |= |
- layer->replica_layer()->mask_layer()->UpdateTiles( |
- occlusion_in_content_space, resourceless_software_draw); |
- ++layers_updated_count; |
- } |
+ occlusion_tracker.LeaveLayer(it); |
+ } |
- if (occlusion_tracker) |
- occlusion_tracker->LeaveLayer(it); |
+ unoccluded_screen_space_region_ = |
+ occlusion_tracker.ComputeVisibleRegionInScreen(); |
+ |
+ const bool resourceless_software_draw = |
+ (layer_tree_host_impl_->GetDrawMode() == |
+ DRAW_MODE_RESOURCELESS_SOFTWARE); |
+ static const Occlusion kEmptyOcclusion; |
+ size_t layers_updated_count = 0; |
+ bool tile_priorities_updated = false; |
+ for (PictureLayerImpl* layer : picture_layers_) { |
+ // TODO(danakj): Remove this to fix crbug.com/446751 |
+ if (!layer->IsDrawnRenderSurfaceLayerListMember()) |
+ continue; |
+ ++layers_updated_count; |
+ const Occlusion& occlusion = |
+ settings().use_occlusion_for_tile_prioritization |
+ ? layer->draw_properties().occlusion_in_content_space |
+ : kEmptyOcclusion; |
+ tile_priorities_updated |= |
+ layer->UpdateTiles(occlusion, resourceless_software_draw); |
vmpstr
2015/02/13 00:24:54
mask and replica mask also need update tiles, righ
|
} |
if (tile_priorities_updated) |
@@ -657,6 +665,13 @@ const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { |
return render_surface_layer_list_; |
} |
+const Region& LayerTreeImpl::UnoccludedScreenSpaceRegion() const { |
+ // If this assert triggers, then the render_surface_layer_list_ is dirty, so |
+ // the unoccluded_screen_space_region_ is not valid anymore. |
+ DCHECK(!needs_update_draw_properties_); |
+ return unoccluded_screen_space_region_; |
+} |
+ |
gfx::Size LayerTreeImpl::ScrollableSize() const { |
LayerImpl* root_scroll_layer = OuterViewportScrollLayer() |
? OuterViewportScrollLayer() |