| Index: cc/trees/layer_tree_impl.cc
|
| diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
|
| index 4093c425eb19541fc3a05651e0318a13c1313eed..e86e785732654ce037e16758aa34adf1ed8da73b 100644
|
| --- a/cc/trees/layer_tree_impl.cc
|
| +++ b/cc/trees/layer_tree_impl.cc
|
| @@ -534,20 +534,27 @@ void LayerTreeImpl::ClearViewportLayers() {
|
| outer_viewport_scroll_layer_ = NULL;
|
| }
|
|
|
| -bool LayerTreeImpl::UpdateDrawProperties() {
|
| +bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) {
|
| if (!needs_update_draw_properties_)
|
| return true;
|
|
|
| - // For max_texture_size.
|
| + // Calling UpdateDrawProperties must clear this flag, so there can be no
|
| + // early outs before this.
|
| + needs_update_draw_properties_ = false;
|
| +
|
| + // For max_texture_size. When the renderer is re-created in
|
| + // CreateAndSetRenderer, the needs update draw properties flag is set
|
| + // again.
|
| if (!layer_tree_host_impl_->renderer())
|
| return false;
|
|
|
| + // Clear this after the renderer early out, as it should still be
|
| + // possible to hit test even without a renderer.
|
| + render_surface_layer_list_.clear();
|
| +
|
| if (!root_layer())
|
| return false;
|
|
|
| - needs_update_draw_properties_ = false;
|
| - render_surface_layer_list_.clear();
|
| -
|
| {
|
| TRACE_EVENT2(
|
| "cc", "LayerTreeImpl::UpdateDrawProperties::CalculateDrawProperties",
|
| @@ -647,6 +654,25 @@ bool LayerTreeImpl::UpdateDrawProperties() {
|
| occlusion_tracker.ComputeVisibleRegionInScreen();
|
| }
|
|
|
| + // It'd be ideal if this could be done earlier, but when the raster source
|
| + // is updated from the main thread during push properties, update draw
|
| + // properties has not occurred yet and so it's not clear whether or not the
|
| + // layer can or cannot use lcd text. So, this is the cleanup pass to
|
| + // determine if the raster source needs to be replaced with a non-lcd
|
| + // raster source due to draw properties.
|
| + if (update_lcd_text) {
|
| + // TODO(enne): Make LTHI::sync_tree return this value.
|
| + LayerTreeImpl* sync_tree =
|
| + layer_tree_host_impl_->proxy()->CommitToActiveTree()
|
| + ? layer_tree_host_impl_->active_tree()
|
| + : layer_tree_host_impl_->pending_tree();
|
| + // If this is not the sync tree, then it is not safe to update lcd text
|
| + // as it causes invalidations and the tiles may be in use.
|
| + DCHECK_EQ(this, sync_tree);
|
| + for (const auto& layer : picture_layers_)
|
| + layer->UpdateCanUseLCDTextAfterCommit();
|
| + }
|
| +
|
| {
|
| TRACE_EVENT_BEGIN2("cc", "LayerTreeImpl::UpdateDrawProperties::UpdateTiles",
|
| "IsActive", IsActiveTree(), "SourceFrameNumber",
|
| @@ -859,6 +885,10 @@ bool LayerTreeImpl::IsRecycleTree() const {
|
| return layer_tree_host_impl_->recycle_tree() == this;
|
| }
|
|
|
| +bool LayerTreeImpl::IsSyncTree() const {
|
| + return layer_tree_host_impl_->sync_tree() == this;
|
| +}
|
| +
|
| LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) {
|
| LayerTreeImpl* tree = layer_tree_host_impl_->active_tree();
|
| if (!tree)
|
| @@ -912,7 +942,7 @@ LayerTreeImpl::CreateScrollbarAnimationController(LayerImpl* scrolling_layer) {
|
| base::TimeDelta duration =
|
| base::TimeDelta::FromMilliseconds(settings().scrollbar_fade_duration_ms);
|
| switch (settings().scrollbar_animator) {
|
| - case LayerTreeSettings::LinearFade: {
|
| + case LayerTreeSettings::LINEAR_FADE: {
|
| return ScrollbarAnimationControllerLinearFade::Create(
|
| scrolling_layer,
|
| layer_tree_host_impl_,
|
| @@ -920,14 +950,14 @@ LayerTreeImpl::CreateScrollbarAnimationController(LayerImpl* scrolling_layer) {
|
| resize_delay,
|
| duration);
|
| }
|
| - case LayerTreeSettings::Thinning: {
|
| + case LayerTreeSettings::THINNING: {
|
| return ScrollbarAnimationControllerThinning::Create(scrolling_layer,
|
| layer_tree_host_impl_,
|
| delay,
|
| resize_delay,
|
| duration);
|
| }
|
| - case LayerTreeSettings::NoAnimator:
|
| + case LayerTreeSettings::NO_ANIMATOR:
|
| NOTREACHED();
|
| break;
|
| }
|
| @@ -1161,13 +1191,13 @@ bool LayerTreeImpl::IsUIResourceOpaque(UIResourceId uid) const {
|
| void LayerTreeImpl::ProcessUIResourceRequestQueue() {
|
| for (const auto& req : ui_resource_request_queue_) {
|
| switch (req.GetType()) {
|
| - case UIResourceRequest::UIResourceCreate:
|
| + case UIResourceRequest::UI_RESOURCE_CREATE:
|
| layer_tree_host_impl_->CreateUIResource(req.GetId(), req.GetBitmap());
|
| break;
|
| - case UIResourceRequest::UIResourceDelete:
|
| + case UIResourceRequest::UI_RESOURCE_DELETE:
|
| layer_tree_host_impl_->DeleteUIResource(req.GetId());
|
| break;
|
| - case UIResourceRequest::UIResourceInvalidRequest:
|
| + case UIResourceRequest::UI_RESOURCE_INVALID_REQUEST:
|
| NOTREACHED();
|
| break;
|
| }
|
| @@ -1461,7 +1491,8 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPoint(
|
| const gfx::PointF& screen_space_point) {
|
| if (!root_layer())
|
| return NULL;
|
| - if (!UpdateDrawProperties())
|
| + bool update_lcd_text = false;
|
| + if (!UpdateDrawProperties(update_lcd_text))
|
| return NULL;
|
| FindClosestMatchingLayerDataForRecursion data_for_recursion;
|
| FindClosestMatchingLayer(screen_space_point,
|
| @@ -1503,7 +1534,8 @@ LayerImpl* LayerTreeImpl::FindLayerWithWheelHandlerThatIsHitByPoint(
|
| const gfx::PointF& screen_space_point) {
|
| if (!root_layer())
|
| return NULL;
|
| - if (!UpdateDrawProperties())
|
| + bool update_lcd_text = false;
|
| + if (!UpdateDrawProperties(update_lcd_text))
|
| return NULL;
|
| FindWheelEventLayerFunctor func;
|
| FindClosestMatchingLayerDataForRecursion data_for_recursion;
|
| @@ -1523,7 +1555,8 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion(
|
| const gfx::PointF& screen_space_point) {
|
| if (!root_layer())
|
| return NULL;
|
| - if (!UpdateDrawProperties())
|
| + bool update_lcd_text = false;
|
| + if (!UpdateDrawProperties(update_lcd_text))
|
| return NULL;
|
| FindTouchEventLayerFunctor func = {screen_space_point};
|
| FindClosestMatchingLayerDataForRecursion data_for_recursion;
|
|
|