diff options
-rw-r--r-- | cc/layers/layer_impl.h | 3 | ||||
-rw-r--r-- | cc/layers/picture_image_layer_impl_unittest.cc | 2 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 39 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl.h | 6 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 305 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling.cc | 19 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling.h | 14 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling_perftest.cc | 20 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling_unittest.cc | 133 | ||||
-rw-r--r-- | cc/resources/tile.cc | 1 | ||||
-rw-r--r-- | cc/resources/tile.h | 4 | ||||
-rw-r--r-- | cc/resources/tile_manager_perftest.cc | 2 | ||||
-rw-r--r-- | cc/resources/tile_manager_unittest.cc | 64 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.cc | 27 | ||||
-rw-r--r-- | cc/trees/layer_tree_settings.cc | 3 | ||||
-rw-r--r-- | cc/trees/layer_tree_settings.h | 1 |
16 files changed, 564 insertions, 79 deletions
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index 6632060..5e29a1c 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h @@ -190,7 +190,8 @@ class CC_EXPORT LayerImpl : public LayerAnimationValueObserver, virtual RenderPass::Id FirstContributingRenderPassId() const; virtual RenderPass::Id NextContributingRenderPassId(RenderPass::Id id) const; - virtual void UpdateTiles() {} + virtual void UpdateTiles( + const OcclusionTracker<LayerImpl>* occlusion_tracker) {} virtual void NotifyTileStateChanged(const Tile* tile) {} virtual ScrollbarLayerImplBase* ToScrollbarLayer(); diff --git a/cc/layers/picture_image_layer_impl_unittest.cc b/cc/layers/picture_image_layer_impl_unittest.cc index 9dfdf0a..456c6ee 100644 --- a/cc/layers/picture_image_layer_impl_unittest.cc +++ b/cc/layers/picture_image_layer_impl_unittest.cc @@ -84,7 +84,7 @@ class PictureImageLayerImplTest : public testing::Test { maximum_animation_contents_scale; layer->draw_properties().screen_space_transform_is_animating = animating_transform_to_screen; - layer->UpdateTiles(); + layer->UpdateTiles(NULL); } protected: diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index b058e2b..3694e7c 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -393,11 +393,18 @@ void PictureLayerImpl::AppendQuads( CleanUpTilingsOnActiveLayer(seen_tilings); } -void PictureLayerImpl::UpdateTiles() { +void PictureLayerImpl::UpdateTiles( + const OcclusionTracker<LayerImpl>* occlusion_tracker) { TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTiles"); DoPostCommitInitializationIfNeeded(); + // TODO(danakj): We should always get an occlusion tracker when we are using + // occlusion, so update this check when we don't use a pending tree in the + // browser compositor. + DCHECK(!occlusion_tracker || + layer_tree_impl()->settings().use_occlusion_for_tile_prioritization); + if (layer_tree_impl()->device_viewport_valid_for_tile_management()) { visible_rect_for_tile_priority_ = visible_content_rect(); viewport_size_for_tile_priority_ = layer_tree_impl()->DrawViewportSize(); @@ -435,13 +442,14 @@ void PictureLayerImpl::UpdateTiles() { // non-updated tree which will then be updated immediately afterwards. should_update_tile_priorities_ = true; - UpdateTilePriorities(); + UpdateTilePriorities(occlusion_tracker); if (layer_tree_impl()->IsPendingTree()) MarkVisibleResourcesAsRequired(); } -void PictureLayerImpl::UpdateTilePriorities() { +void PictureLayerImpl::UpdateTilePriorities( + const OcclusionTracker<LayerImpl>* occlusion_tracker) { TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); double current_frame_time_in_seconds = @@ -483,7 +491,10 @@ void PictureLayerImpl::UpdateTilePriorities() { tilings_->tiling_at(i)->UpdateTilePriorities(tree, visible_layer_rect, MaximumTilingContentsScale(), - current_frame_time_in_seconds); + current_frame_time_in_seconds, + occlusion_tracker, + render_target(), + draw_transform()); } // Tile priorities were modified. @@ -714,7 +725,11 @@ void PictureLayerImpl::SyncTiling( // we can create tiles for this tiling immediately. if (!layer_tree_impl()->needs_update_draw_properties() && should_update_tile_priorities_) { - UpdateTilePriorities(); + // TODO(danakj): Add a DCHECK() that we are not using occlusion tracking + // when we stop using the pending tree in the browser compositor. If we want + // to support occlusion tracking here, we need to dirty the draw properties + // or save occlusion as a draw property. + UpdateTilePriorities(NULL); } } @@ -877,6 +892,10 @@ bool PictureLayerImpl::MarkVisibleTilesAsRequired( if (!tile) continue; + // If the tile is occluded, don't mark it as required for activation. + if (tile->is_occluded()) + continue; + // If the missing region doesn't cover it, this tile is fully // covered by acceptable tiles at other scales. if (!missing_region.Intersects(iter.geometry_rect())) @@ -1451,7 +1470,8 @@ PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( IteratorType index = stages_[current_stage_].iterator_type; TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; - if (!iterators_[index] || iterators_[index].get_type() != tile_type) + if (!iterators_[index] || iterators_[index].get_type() != tile_type || + (*iterators_[index])->is_occluded()) ++(*this); } @@ -1471,6 +1491,10 @@ operator++() { if (iterators_[index]) ++iterators_[index]; + while (iterators_[index] && iterators_[index].get_type() == tile_type && + (*iterators_[index])->is_occluded()) + ++iterators_[index]; + if (iterators_[index] && iterators_[index].get_type() == tile_type) return *this; @@ -1481,7 +1505,8 @@ operator++() { index = stages_[current_stage_].iterator_type; tile_type = stages_[current_stage_].tile_type; - if (iterators_[index] && iterators_[index].get_type() == tile_type) + if (iterators_[index] && iterators_[index].get_type() == tile_type && + !(*iterators_[index])->is_occluded()) break; ++current_stage_; } diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h index b9db60f..e8eba29 100644 --- a/cc/layers/picture_layer_impl.h +++ b/cc/layers/picture_layer_impl.h @@ -91,7 +91,8 @@ class CC_EXPORT PictureLayerImpl virtual void AppendQuads(RenderPass* render_pass, const OcclusionTracker<LayerImpl>& occlusion_tracker, AppendQuadsData* append_quads_data) OVERRIDE; - virtual void UpdateTiles() OVERRIDE; + virtual void UpdateTiles( + const OcclusionTracker<LayerImpl>* occlusion_tracker) OVERRIDE; virtual void NotifyTileStateChanged(const Tile* tile) OVERRIDE; virtual void DidBecomeActive() OVERRIDE; virtual void DidBeginTracing() OVERRIDE; @@ -139,7 +140,8 @@ class CC_EXPORT PictureLayerImpl void RemoveAllTilings(); void SyncFromActiveLayer(const PictureLayerImpl* other); void AddTilingsForRasterScale(); - void UpdateTilePriorities(); + void UpdateTilePriorities( + const OcclusionTracker<LayerImpl>* occlusion_tracker); virtual bool ShouldAdjustRasterScale() const; virtual void RecalculateRasterScales(); void CleanUpTilingsOnActiveLayer( diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 97ebf54..f6fc3ef 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -153,7 +153,7 @@ class PictureLayerImplTest : public testing::Test { maximum_animation_contents_scale; layer->draw_properties().screen_space_transform_is_animating = animating_transform_to_screen; - layer->UpdateTiles(); + layer->UpdateTiles(NULL); } static void VerifyAllTilesExistAndHavePile( const PictureLayerTiling* tiling, @@ -326,7 +326,7 @@ TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) { transform, viewport, viewport, valid_for_tile_management); active_layer_->draw_properties().visible_content_rect = viewport; active_layer_->draw_properties().screen_space_transform = transform; - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); gfx::Rect visible_rect_for_tile_priority = active_layer_->visible_rect_for_tile_priority(); @@ -348,7 +348,7 @@ TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) { active_layer_->draw_properties().screen_space_transform = transform; host_impl_.SetExternalDrawConstraints( transform, viewport, viewport, valid_for_tile_management); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); EXPECT_RECT_EQ(visible_rect_for_tile_priority, active_layer_->visible_rect_for_tile_priority()); @@ -364,7 +364,7 @@ TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) { valid_for_tile_management = true; host_impl_.SetExternalDrawConstraints( transform, viewport, viewport, valid_for_tile_management); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); EXPECT_FALSE(visible_rect_for_tile_priority == active_layer_->visible_rect_for_tile_priority()); @@ -401,7 +401,7 @@ TEST_F(PictureLayerImplTest, InvalidViewportAfterReleaseResources) { EXPECT_TRUE(active_layer_->HighResTiling()); size_t num_tilings = active_layer_->num_tilings(); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); pending_layer_->AddTiling(0.5f); EXPECT_EQ(num_tilings + 1, active_layer_->num_tilings()); } @@ -2419,7 +2419,7 @@ TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { transform, viewport, viewport, valid_for_tile_management); active_layer_->draw_properties().visible_content_rect = viewport; active_layer_->draw_properties().screen_space_transform = transform; - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); gfx::Rect visible_rect_for_tile_priority = active_layer_->visible_rect_for_tile_priority(); @@ -2441,7 +2441,7 @@ TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { active_layer_->draw_properties().screen_space_transform = transform; host_impl_.SetExternalDrawConstraints( transform, viewport, viewport, valid_for_tile_management); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); EXPECT_RECT_EQ(visible_rect_for_tile_priority, active_layer_->visible_rect_for_tile_priority()); @@ -2457,7 +2457,7 @@ TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { valid_for_tile_management = true; host_impl_.SetExternalDrawConstraints( transform, viewport, viewport, valid_for_tile_management); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); EXPECT_FALSE(visible_rect_for_tile_priority == active_layer_->visible_rect_for_tile_priority()); @@ -2494,7 +2494,7 @@ TEST_F(NoLowResPictureLayerImplTest, InvalidViewportAfterReleaseResources) { EXPECT_TRUE(active_layer_->HighResTiling()); size_t num_tilings = active_layer_->num_tilings(); - active_layer_->UpdateTiles(); + active_layer_->UpdateTiles(NULL); pending_layer_->AddTiling(0.5f); EXPECT_EQ(num_tilings + 1, active_layer_->num_tilings()); } @@ -2807,5 +2807,292 @@ TEST_F(PictureLayerImplTest, UpdateTilesForMasksWithNoVisibleContent) { EXPECT_NE(0u, pending_mask_content->num_tilings()); } +class OcclusionTrackingSettings : public ImplSidePaintingSettings { + public: + OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } +}; + +class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { + public: + OcclusionTrackingPictureLayerImplTest() + : PictureLayerImplTest(OcclusionTrackingSettings()) {} +}; + +TEST_F(OcclusionTrackingPictureLayerImplTest, + OccludedTilesSkippedDuringRasterization) { + gfx::Size tile_size(102, 102); + gfx::Size layer_bounds(1000, 1000); + gfx::Size viewport_size(500, 500); + gfx::Point occluding_layer_position(310, 0); + + scoped_refptr<FakePicturePileImpl> pending_pile = + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); + SetupPendingTree(pending_pile); + pending_layer_->set_fixed_tile_size(tile_size); + + host_impl_.SetViewportSize(viewport_size); + host_impl_.pending_tree()->UpdateDrawProperties(); + + // No occlusion. + int unoccluded_tile_count = 0; + for (PictureLayerImpl::LayerRasterTileIterator it = + PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); + it; + ++it) { + Tile* tile = *it; + + // Occluded tiles should not be iterated over. + EXPECT_FALSE(tile->is_occluded()); + + // Some tiles may not be visible (i.e. outside the viewport). The rest are + // visible and at least partially unoccluded, verified by the above expect. + bool tile_is_visible = + tile->content_rect().Intersects(pending_layer_->visible_content_rect()); + if (tile_is_visible) + unoccluded_tile_count++; + } + EXPECT_EQ(unoccluded_tile_count, 25 + 4); + + // Partial occlusion. + pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); + LayerImpl* layer1 = pending_layer_->children()[0]; + layer1->SetBounds(layer_bounds); + layer1->SetContentBounds(layer_bounds); + layer1->SetDrawsContent(true); + layer1->SetContentsOpaque(true); + layer1->SetPosition(occluding_layer_position); + + host_impl_.pending_tree()->UpdateDrawProperties(); + + unoccluded_tile_count = 0; + for (PictureLayerImpl::LayerRasterTileIterator it = + PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); + it; + ++it) { + Tile* tile = *it; + + EXPECT_FALSE(tile->is_occluded()); + + bool tile_is_visible = + tile->content_rect().Intersects(pending_layer_->visible_content_rect()); + if (tile_is_visible) + unoccluded_tile_count++; + } + EXPECT_EQ(unoccluded_tile_count, 20 + 2); + + // Full occlusion. + layer1->SetPosition(gfx::Point(0, 0)); + + host_impl_.pending_tree()->UpdateDrawProperties(); + + unoccluded_tile_count = 0; + for (PictureLayerImpl::LayerRasterTileIterator it = + PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); + it; + ++it) { + Tile* tile = *it; + + EXPECT_FALSE(tile->is_occluded()); + + bool tile_is_visible = + tile->content_rect().Intersects(pending_layer_->visible_content_rect()); + if (tile_is_visible) + unoccluded_tile_count++; + } + EXPECT_EQ(unoccluded_tile_count, 0); +} + +TEST_F(OcclusionTrackingPictureLayerImplTest, + OccludedTilesNotMarkedAsRequired) { + gfx::Size tile_size(102, 102); + gfx::Size layer_bounds(1000, 1000); + gfx::Size viewport_size(500, 500); + gfx::Point occluding_layer_position(310, 0); + + scoped_refptr<FakePicturePileImpl> pending_pile = + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); + SetupPendingTree(pending_pile); + pending_layer_->set_fixed_tile_size(tile_size); + + host_impl_.SetViewportSize(viewport_size); + host_impl_.pending_tree()->UpdateDrawProperties(); + + // No occlusion. + int occluded_tile_count = 0; + for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { + PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); + + occluded_tile_count = 0; + for (PictureLayerTiling::CoverageIterator iter( + tiling, + pending_layer_->contents_scale_x(), + gfx::Rect(layer_bounds)); + iter; + ++iter) { + if (!*iter) + continue; + const Tile* tile = *iter; + + // Fully occluded tiles are not required for activation. + if (tile->is_occluded()) { + EXPECT_FALSE(tile->required_for_activation()); + occluded_tile_count++; + } + } + EXPECT_EQ(occluded_tile_count, 0); + } + + // Partial occlusion. + pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); + LayerImpl* layer1 = pending_layer_->children()[0]; + layer1->SetBounds(layer_bounds); + layer1->SetContentBounds(layer_bounds); + layer1->SetDrawsContent(true); + layer1->SetContentsOpaque(true); + layer1->SetPosition(occluding_layer_position); + + host_impl_.pending_tree()->UpdateDrawProperties(); + + for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { + PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); + + occluded_tile_count = 0; + for (PictureLayerTiling::CoverageIterator iter( + tiling, + pending_layer_->contents_scale_x(), + gfx::Rect(layer_bounds)); + iter; + ++iter) { + if (!*iter) + continue; + const Tile* tile = *iter; + + if (tile->is_occluded()) { + EXPECT_FALSE(tile->required_for_activation()); + occluded_tile_count++; + } + } + switch (i) { + case 0: + EXPECT_EQ(occluded_tile_count, 5); + break; + case 1: + EXPECT_EQ(occluded_tile_count, 2); + break; + default: + NOTREACHED(); + } + } + + // Full occlusion. + layer1->SetPosition(gfx::PointF(0, 0)); + + host_impl_.pending_tree()->UpdateDrawProperties(); + + for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { + PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); + + occluded_tile_count = 0; + for (PictureLayerTiling::CoverageIterator iter( + tiling, + pending_layer_->contents_scale_x(), + gfx::Rect(layer_bounds)); + iter; + ++iter) { + if (!*iter) + continue; + const Tile* tile = *iter; + + if (tile->is_occluded()) { + EXPECT_FALSE(tile->required_for_activation()); + occluded_tile_count++; + } + } + switch (i) { + case 0: + EXPECT_EQ(occluded_tile_count, 25); + break; + case 1: + EXPECT_EQ(occluded_tile_count, 4); + break; + default: + NOTREACHED(); + } + } +} + +TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) { + gfx::Size tile_size(102, 102); + gfx::Size layer_bounds(1000, 1000); + gfx::Size viewport_size(500, 500); + gfx::Point occluding_layer_position(310, 0); + + scoped_refptr<FakePicturePileImpl> pending_pile = + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); + SetupPendingTree(pending_pile); + pending_layer_->set_fixed_tile_size(tile_size); + + ASSERT_TRUE(pending_layer_->CanHaveTilings()); + + float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; + + std::vector<PictureLayerTiling*> tilings; + tilings.push_back(pending_layer_->AddTiling(low_res_factor)); + tilings.push_back(pending_layer_->AddTiling(0.3f)); + tilings.push_back(pending_layer_->AddTiling(0.7f)); + tilings.push_back(pending_layer_->AddTiling(1.0f)); + tilings.push_back(pending_layer_->AddTiling(2.0f)); + + pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); + LayerImpl* layer1 = pending_layer_->children()[0]; + layer1->SetBounds(layer_bounds); + layer1->SetContentBounds(layer_bounds); + layer1->SetDrawsContent(true); + layer1->SetContentsOpaque(true); + layer1->SetPosition(occluding_layer_position); + + host_impl_.SetViewportSize(viewport_size); + host_impl_.pending_tree()->UpdateDrawProperties(); + + int tiling_count = 0; + int occluded_tile_count = 0; + for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = + tilings.begin(); + tiling_iterator != tilings.end(); + ++tiling_iterator) { + std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); + + occluded_tile_count = 0; + for (size_t i = 0; i < tiles.size(); ++i) { + if (tiles[i]->is_occluded()) { + gfx::Rect scaled_content_rect = ScaleToEnclosingRect( + tiles[i]->content_rect(), 1.0f / tiles[i]->contents_scale()); + EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x()); + occluded_tile_count++; + } + } + switch (tiling_count) { + case 0: + case 1: + EXPECT_EQ(occluded_tile_count, 2); + break; + case 2: + EXPECT_EQ(occluded_tile_count, 4); + break; + case 3: + EXPECT_EQ(occluded_tile_count, 5); + break; + case 4: + EXPECT_EQ(occluded_tile_count, 30); + break; + default: + NOTREACHED(); + } + + tiling_count++; + } + + EXPECT_EQ(tiling_count, 5); +} } // namespace } // namespace cc diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc index 5a41951..33e9038 100644 --- a/cc/resources/picture_layer_tiling.cc +++ b/cc/resources/picture_layer_tiling.cc @@ -12,6 +12,7 @@ #include "cc/base/math_util.h" #include "cc/resources/tile.h" #include "cc/resources/tile_priority.h" +#include "cc/trees/occlusion_tracker.h" #include "ui/gfx/point_conversions.h" #include "ui/gfx/rect_conversions.h" #include "ui/gfx/safe_integer_conversions.h" @@ -419,7 +420,10 @@ void PictureLayerTiling::UpdateTilePriorities( WhichTree tree, const gfx::Rect& visible_layer_rect, float layer_contents_scale, - double current_frame_time_in_seconds) { + double current_frame_time_in_seconds, + const OcclusionTracker<LayerImpl>* occlusion_tracker, + const LayerImpl* render_target, + const gfx::Transform& draw_transform) { if (!NeedsUpdateForFrameAtTime(current_frame_time_in_seconds)) { // This should never be zero for the purposes of has_ever_been_updated(). DCHECK_NE(current_frame_time_in_seconds, 0.0); @@ -479,6 +483,19 @@ void PictureLayerTiling::UpdateTilePriorities( Tile* tile = find->second.get(); tile->SetPriority(tree, now_priority); + + // Set whether tile is occluded or not. + bool is_occluded = false; + if (occlusion_tracker) { + gfx::Rect tile_query_rect = ScaleToEnclosingRect( + IntersectRects(tile->content_rect(), visible_rect_in_content_space), + 1.0f / contents_scale_); + // TODO(vmpstr): Remove render_target and draw_transform from the + // parameters so they can be hidden from the tiling. + is_occluded = occlusion_tracker->Occluded( + render_target, tile_query_rect, draw_transform); + } + tile->set_is_occluded(is_occluded); } // Assign soon priority to skewport tiles. diff --git a/cc/resources/picture_layer_tiling.h b/cc/resources/picture_layer_tiling.h index fc7505c..df58618 100644 --- a/cc/resources/picture_layer_tiling.h +++ b/cc/resources/picture_layer_tiling.h @@ -20,6 +20,8 @@ namespace cc { +template <typename LayerType> +class OcclusionTracker; class PictureLayerTiling; class CC_EXPORT PictureLayerTilingClient { @@ -206,10 +208,14 @@ class CC_EXPORT PictureLayerTiling { void Reset(); - void UpdateTilePriorities(WhichTree tree, - const gfx::Rect& visible_layer_rect, - float layer_contents_scale, - double current_frame_time_in_seconds); + void UpdateTilePriorities( + WhichTree tree, + const gfx::Rect& visible_layer_rect, + float layer_contents_scale, + double current_frame_time_in_seconds, + const OcclusionTracker<LayerImpl>* occlusion_tracker, + const LayerImpl* render_target, + const gfx::Transform& draw_transform); // Copies the src_tree priority into the dst_tree priority for all tiles. // The src_tree priority is reset to the lowest priority possible. This diff --git a/cc/resources/picture_layer_tiling_perftest.cc b/cc/resources/picture_layer_tiling_perftest.cc index 1e698b9..e956d17b 100644 --- a/cc/resources/picture_layer_tiling_perftest.cc +++ b/cc/resources/picture_layer_tiling_perftest.cc @@ -53,8 +53,13 @@ class PictureLayerTilingPerfTest : public testing::Test { timer_.Reset(); do { - picture_layer_tiling_->UpdateTilePriorities( - ACTIVE_TREE, viewport_rect, 1.f, timer_.NumLaps() + 1); + picture_layer_tiling_->UpdateTilePriorities(ACTIVE_TREE, + viewport_rect, + 1.f, + timer_.NumLaps() + 1, + NULL, + NULL, + gfx::Transform()); timer_.NextLap(); } while (!timer_.HasTimeLimitExpired()); @@ -78,8 +83,13 @@ class PictureLayerTilingPerfTest : public testing::Test { timer_.Reset(); do { - picture_layer_tiling_->UpdateTilePriorities( - ACTIVE_TREE, viewport_rect, 1.f, timer_.NumLaps() + 1); + picture_layer_tiling_->UpdateTilePriorities(ACTIVE_TREE, + viewport_rect, + 1.f, + timer_.NumLaps() + 1, + NULL, + NULL, + gfx::Transform()); viewport_rect = gfx::Rect(viewport_rect.x() + xoffsets[offsetIndex], viewport_rect.y() + yoffsets[offsetIndex], @@ -108,7 +118,7 @@ class PictureLayerTilingPerfTest : public testing::Test { picture_layer_tiling_ = PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_); picture_layer_tiling_->UpdateTilePriorities( - ACTIVE_TREE, viewport, 1.0f, 1.0); + ACTIVE_TREE, viewport, 1.0f, 1.0, NULL, NULL, gfx::Transform()); timer_.Reset(); do { diff --git a/cc/resources/picture_layer_tiling_unittest.cc b/cc/resources/picture_layer_tiling_unittest.cc index bfdd6fc..9743a82 100644 --- a/cc/resources/picture_layer_tiling_unittest.cc +++ b/cc/resources/picture_layer_tiling_unittest.cc @@ -43,7 +43,10 @@ static void UpdateAllTilePriorities(PictureLayerTilingSet* set, set->tiling_at(i)->UpdateTilePriorities(tree, visible_layer_rect, layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, + NULL, + gfx::Transform()); } } @@ -315,7 +318,8 @@ TEST(PictureLayerTilingTest, SkewportLimits) { client.SetTileSize(gfx::Size(100, 100)); tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.f, 1.0, NULL, NULL, gfx::Transform()); // Move viewport down 50 pixels in 0.5 seconds. gfx::Rect down_skewport = @@ -380,7 +384,8 @@ TEST(PictureLayerTilingTest, ComputeSkewport) { client.SetTileSize(gfx::Size(100, 100)); tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.f, 1.0, NULL, NULL, gfx::Transform()); // Move viewport down 50 pixels in 0.5 seconds. gfx::Rect down_skewport = @@ -446,7 +451,8 @@ TEST(PictureLayerTilingTest, ViewportDistanceWithScale) { gfx::Rect viewport_in_content_space = gfx::ToEnclosedRect(gfx::ScaleRect(viewport, 0.25f)); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.f, 1.0, NULL, NULL, gfx::Transform()); gfx::Rect soon_rect = viewport; soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); @@ -529,7 +535,8 @@ TEST(PictureLayerTilingTest, ViewportDistanceWithScale) { EXPECT_EQ(25, skewport.width()); EXPECT_EQ(35, skewport.height()); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 2.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.f, 2.0, NULL, NULL, gfx::Transform()); have_now = false; have_eventually = false; @@ -579,7 +586,8 @@ TEST(PictureLayerTilingTest, ViewportDistanceWithScale) { EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); // Change the underlying layer scale. - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 2.0f, 3.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 2.0f, 3.0, NULL, NULL, gfx::Transform()); priority = tiling->TileAt(5, 1)->priority(ACTIVE_TREE); EXPECT_FLOAT_EQ(34.f, priority.distance_to_visible); @@ -822,7 +830,8 @@ TEST(PictureLayerTilingTest, TilingRasterTileIteratorStaticViewport) { client.SetTileSize(gfx::Size(30, 30)); tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.0f, 1.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.0f, 1.0, NULL, NULL, gfx::Transform()); PictureLayerTiling::TilingRasterTileIterator empty_iterator; EXPECT_FALSE(empty_iterator); @@ -929,8 +938,10 @@ TEST(PictureLayerTilingTest, TilingRasterTileIteratorMovingViewport) { client.SetTileSize(gfx::Size(30, 30)); tiling = TestablePictureLayerTiling::Create(1.f, layer_bounds, &client); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.0f, 1.0); - tiling->UpdateTilePriorities(ACTIVE_TREE, moved_viewport, 1.0f, 2.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.0f, 1.0, NULL, NULL, gfx::Transform()); + tiling->UpdateTilePriorities( + ACTIVE_TREE, moved_viewport, 1.0f, 2.0, NULL, NULL, gfx::Transform()); gfx::Rect soon_rect = moved_viewport; soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); @@ -1002,7 +1013,8 @@ TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) { client.SetTileSize(gfx::Size(30, 30)); tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client); - tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.0f, 1.0); + tiling->UpdateTilePriorities( + ACTIVE_TREE, viewport, 1.0f, 1.0, NULL, NULL, gfx::Transform()); PictureLayerTiling::TilingRasterTileIterator empty_iterator; EXPECT_FALSE(empty_iterator); @@ -1056,14 +1068,20 @@ TEST_F(PictureLayerTilingIteratorTest, TilesExist) { ACTIVE_TREE, gfx::Rect(layer_bounds), // visible content rect 1.f, // current contents scale - 1.0); // current frame time + 1.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); // Make the viewport rect empty. All tiles are killed and become zombies. tiling_->UpdateTilePriorities(ACTIVE_TREE, - gfx::Rect(), // visible content rect - 1.f, // current contents scale - 2.0); // current frame time + gfx::Rect(), // visible content rect + 1.f, // current contents scale + 2.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); } @@ -1079,14 +1097,20 @@ TEST_F(PictureLayerTilingIteratorTest, TilesExistGiantViewport) { ACTIVE_TREE, gfx::Rect(layer_bounds), // visible content rect 1.f, // current contents scale - 1.0); // current frame time + 1.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); // If the visible content rect is empty, it should still have live tiles. tiling_->UpdateTilePriorities(ACTIVE_TREE, - giant_rect, // visible content rect - 1.f, // current contents scale - 2.0); // current frame time + giant_rect, // visible content rect + 1.f, // current contents scale + 2.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); } @@ -1102,9 +1126,12 @@ TEST_F(PictureLayerTilingIteratorTest, TilesExistOutsideViewport) { EXPECT_FALSE(viewport_rect.Intersects(gfx::Rect(layer_bounds))); tiling_->UpdateTilePriorities(ACTIVE_TREE, - viewport_rect, // visible content rect - 1.f, // current contents scale - 1.0); // current frame time + viewport_rect, // visible content rect + 1.f, // current contents scale + 1.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); } @@ -1130,9 +1157,12 @@ TEST_F(PictureLayerTilingIteratorTest, set_max_tiles_for_interest_area(1); tiling_->UpdateTilePriorities(ACTIVE_TREE, - visible_rect, // visible content rect - 1.f, // current contents scale - 1.0); // current frame time + visible_rect, // visible content rect + 1.f, // current contents scale + 1.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TilesIntersectingRectExist, visible_rect, true)); @@ -1157,7 +1187,10 @@ TEST_F(PictureLayerTilingIteratorTest, ACTIVE_TREE, gfx::Rect(layer_bounds), // visible content rect 1.f, // current contents scale - 1.0); // current frame time + 1.0, // current frame time + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform int num_tiles = 0; VerifyTiles(1.f, @@ -1246,7 +1279,10 @@ TEST(UpdateTilePrioritiesTest, VisibleTiles) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1299,7 +1335,10 @@ TEST(UpdateTilePrioritiesTest, OffscreenTiles) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1362,7 +1401,10 @@ TEST(UpdateTilePrioritiesTest, PartiallyOffscreenLayer) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1419,7 +1461,10 @@ TEST(UpdateTilePrioritiesTest, PartiallyOffscreenRotatedLayer) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1500,7 +1545,10 @@ TEST(UpdateTilePrioritiesTest, PerspectiveLayer) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1591,7 +1639,10 @@ TEST(UpdateTilePrioritiesTest, PerspectiveLayerClippedByW) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1653,13 +1704,19 @@ TEST(UpdateTilePrioritiesTest, BasicMotion) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, last_layer_contents_scale, - last_frame_time_in_seconds); + last_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform // current frame tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); @@ -1728,13 +1785,19 @@ TEST(UpdateTilePrioritiesTest, RotationMotion) { tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, last_layer_contents_scale, - last_frame_time_in_seconds); + last_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform // current frame tiling->UpdateTilePriorities(ACTIVE_TREE, viewport_in_layer_space, current_layer_contents_scale, - current_frame_time_in_seconds); + current_frame_time_in_seconds, + NULL, // occlusion tracker + NULL, // render target + gfx::Transform()); // draw transform ASSERT_TRUE(tiling->TileAt(0, 0)); ASSERT_TRUE(tiling->TileAt(0, 1)); diff --git a/cc/resources/tile.cc b/cc/resources/tile.cc index d59dc02..781d008 100644 --- a/cc/resources/tile.cc +++ b/cc/resources/tile.cc @@ -30,6 +30,7 @@ Tile::Tile(TileManager* tile_manager, content_rect_(content_rect), contents_scale_(contents_scale), opaque_rect_(opaque_rect), + is_occluded_(false), layer_id_(layer_id), source_frame_number_(source_frame_number), flags_(flags), diff --git a/cc/resources/tile.h b/cc/resources/tile.h index 69ef56f..29acf80 100644 --- a/cc/resources/tile.h +++ b/cc/resources/tile.h @@ -128,6 +128,9 @@ class CC_EXPORT Tile : public RefCountedManaged<Tile> { return managed_state_.tile_versions[mode]; } + void set_is_occluded(bool is_occluded) { is_occluded_ = is_occluded; } + bool is_occluded() const { return is_occluded_; } + private: friend class TileManager; friend class PrioritizedTileSet; @@ -157,6 +160,7 @@ class CC_EXPORT Tile : public RefCountedManaged<Tile> { gfx::Rect content_rect_; float contents_scale_; gfx::Rect opaque_rect_; + bool is_occluded_; TilePriority priority_[NUM_TREES]; ManagedTileState managed_state_; diff --git a/cc/resources/tile_manager_perftest.cc b/cc/resources/tile_manager_perftest.cc index cc54fbb..e17c661 100644 --- a/cc/resources/tile_manager_perftest.cc +++ b/cc/resources/tile_manager_perftest.cc @@ -277,7 +277,7 @@ class TileManagerPerfTest : public testing::Test { do { host_impl_.UpdateCurrentFrameTime(); for (unsigned i = 0; i < layers.size(); ++i) - layers[i]->UpdateTiles(); + layers[i]->UpdateTiles(NULL); GlobalStateThatImpactsTilePriority global_state(GlobalStateForTest()); tile_manager()->ManageTiles(global_state); diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc index f894c4f..024ca20 100644 --- a/cc/resources/tile_manager_unittest.cc +++ b/cc/resources/tile_manager_unittest.cc @@ -638,13 +638,37 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) { // Renew all of the tile priorities. gfx::Rect viewport(50, 50, 100, 100); pending_layer_->HighResTiling()->UpdateTilePriorities( - PENDING_TREE, viewport, 1.0f, 1.0); + PENDING_TREE, + viewport, + 1.0f, + 1.0, + NULL, + pending_layer_->render_target(), + pending_layer_->draw_transform()); pending_layer_->LowResTiling()->UpdateTilePriorities( - PENDING_TREE, viewport, 1.0f, 1.0); + PENDING_TREE, + viewport, + 1.0f, + 1.0, + NULL, + pending_layer_->render_target(), + pending_layer_->draw_transform()); active_layer_->HighResTiling()->UpdateTilePriorities( - ACTIVE_TREE, viewport, 1.0f, 1.0); + ACTIVE_TREE, + viewport, + 1.0f, + 1.0, + NULL, + active_layer_->render_target(), + active_layer_->draw_transform()); active_layer_->LowResTiling()->UpdateTilePriorities( - ACTIVE_TREE, viewport, 1.0f, 1.0); + ACTIVE_TREE, + viewport, + 1.0f, + 1.0, + NULL, + active_layer_->render_target(), + active_layer_->draw_transform()); // Populate all tiles directly from the tilings. all_tiles.clear(); @@ -815,13 +839,37 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) { // Renew all of the tile priorities. gfx::Rect viewport(50, 50, 100, 100); pending_layer_->HighResTiling()->UpdateTilePriorities( - PENDING_TREE, viewport, 1.0f, 1.0); + PENDING_TREE, + viewport, + 1.0f, + 1.0, + NULL, + pending_layer_->render_target(), + pending_layer_->draw_transform()); pending_layer_->LowResTiling()->UpdateTilePriorities( - PENDING_TREE, viewport, 1.0f, 1.0); + PENDING_TREE, + viewport, + 1.0f, + 1.0, + NULL, + pending_layer_->render_target(), + pending_layer_->draw_transform()); active_layer_->HighResTiling()->UpdateTilePriorities( - ACTIVE_TREE, viewport, 1.0f, 1.0); + ACTIVE_TREE, + viewport, + 1.0f, + 1.0, + NULL, + active_layer_->render_target(), + active_layer_->draw_transform()); active_layer_->LowResTiling()->UpdateTilePriorities( - ACTIVE_TREE, viewport, 1.0f, 1.0); + ACTIVE_TREE, + viewport, + 1.0f, + 1.0, + NULL, + active_layer_->render_target(), + active_layer_->draw_transform()); // Populate all tiles directly from the tilings. all_tiles.clear(); diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index d5ec804..dccdf8c 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc @@ -24,6 +24,7 @@ #include "cc/resources/ui_resource_request.h" #include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_host_impl.h" +#include "cc/trees/occlusion_tracker.h" #include "ui/gfx/point_conversions.h" #include "ui/gfx/size_conversions.h" #include "ui/gfx/vector2d_conversions.h" @@ -486,6 +487,14 @@ bool LayerTreeImpl::UpdateDrawProperties() { 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); + } + // 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. @@ -495,17 +504,27 @@ bool LayerTreeImpl::UpdateDrawProperties() { LayerIteratorType::Begin(&render_surface_layer_list_); it != end; ++it) { + if (occlusion_tracker) + occlusion_tracker->EnterLayer(it); + LayerImpl* layer = *it; if (it.represents_itself()) - layer->UpdateTiles(); + layer->UpdateTiles(occlusion_tracker.get()); - if (!it.represents_contributing_render_surface()) + if (!it.represents_contributing_render_surface()) { + if (occlusion_tracker) + occlusion_tracker->LeaveLayer(it); continue; + } if (layer->mask_layer()) - layer->mask_layer()->UpdateTiles(); + layer->mask_layer()->UpdateTiles(occlusion_tracker.get()); if (layer->replica_layer() && layer->replica_layer()->mask_layer()) - layer->replica_layer()->mask_layer()->UpdateTiles(); + layer->replica_layer()->mask_layer()->UpdateTiles( + occlusion_tracker.get()); + + if (occlusion_tracker) + occlusion_tracker->LeaveLayer(it); } } diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index 629b4e2..4b56d7c 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc @@ -63,7 +63,8 @@ LayerTreeSettings::LayerTreeSettings() ignore_root_layer_flings(false), use_rgba_4444_textures(false), touch_hit_testing(true), - texture_id_allocation_chunk_size(64) { + texture_id_allocation_chunk_size(64), + use_occlusion_for_tile_prioritization(false) { } LayerTreeSettings::~LayerTreeSettings() {} diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 8192b3d..21d72c9 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h @@ -79,6 +79,7 @@ class CC_EXPORT LayerTreeSettings { bool use_rgba_4444_textures; bool touch_hit_testing; size_t texture_id_allocation_chunk_size; + bool use_occlusion_for_tile_prioritization; LayerTreeDebugState initial_debug_state; }; |