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

Unified Diff: cc/trees/layer_tree_impl.cc

Issue 915083004: cc: Make occlusion a draw property. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: occlusiondrawproperty: notvirtual Created 5 years, 10 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/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()

Powered by Google App Engine
This is Rietveld 408576698