Chromium Code Reviews| Index: cc/trees/layer_tree_host_impl.cc |
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
| index 9524e41ece9f68a796c393a651aa28dfb5763dc3..78ce57cb728f36082776cb9346d04dde34a4f202 100644 |
| --- a/cc/trees/layer_tree_host_impl.cc |
| +++ b/cc/trees/layer_tree_host_impl.cc |
| @@ -9,6 +9,7 @@ |
| #include <map> |
| #include <set> |
| +#include "base/auto_reset.h" |
| #include "base/basictypes.h" |
| #include "base/containers/hash_tables.h" |
| #include "base/containers/small_map.h" |
| @@ -1257,6 +1258,17 @@ size_t LayerTreeHostImpl::SourceAnimationFrameNumberForTesting() const { |
| return fps_counter_->current_frame_number(); |
| } |
| +void LayerTreeHostImpl::SetExternalViewportForTesting( |
| + const gfx::Rect& external_viewport) { |
| + external_viewport_ = external_viewport; |
| +} |
| + |
| +void LayerTreeHostImpl::SetResourcelessSoftwareDrawForTesting( |
| + bool resourceless_software_draw) { |
| + resourceless_software_draw_ = resourceless_software_draw; |
| + active_tree_->set_needs_update_draw_properties(); |
| +} |
| + |
| void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( |
| const ManagedMemoryPolicy& policy) { |
| if (!resource_pool_) |
| @@ -1453,60 +1465,32 @@ void LayerTreeHostImpl::SetManagedMemoryPolicy( |
| client_->SetNeedsCommitOnImplThread(); |
| } |
| -void LayerTreeHostImpl::SetExternalDrawConstraints( |
| - const gfx::Transform& transform, |
| - const gfx::Rect& viewport, |
| - const gfx::Rect& clip, |
| - const gfx::Rect& viewport_rect_for_tile_priority, |
| - const gfx::Transform& transform_for_tile_priority, |
| - bool resourceless_software_draw) { |
| +void LayerTreeHostImpl::SetExternalTilePriorityConstraints( |
| + const gfx::Rect& viewport_rect, |
| + const gfx::Transform& transform) { |
|
brianderson
2015/12/14 20:51:26
Would it make sense to DCHECK(using_synchronous_re
boliu
2015/12/16 19:06:41
This works in production, and so probably good ide
|
| gfx::Rect viewport_rect_for_tile_priority_in_view_space; |
| - if (!resourceless_software_draw) { |
| - gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization); |
| - if (transform_for_tile_priority.GetInverse(&screen_to_view)) { |
| - // Convert from screen space to view space. |
| - viewport_rect_for_tile_priority_in_view_space = |
| - MathUtil::ProjectEnclosingClippedRect( |
| - screen_to_view, viewport_rect_for_tile_priority); |
| - } |
| + gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization); |
| + if (transform.GetInverse(&screen_to_view)) { |
| + // Convert from screen space to view space. |
| + viewport_rect_for_tile_priority_in_view_space = |
| + MathUtil::ProjectEnclosingClippedRect(screen_to_view, viewport_rect); |
| } |
| - const bool transform_changed = external_transform_ != transform; |
| - const bool viewport_changed = external_viewport_ != viewport; |
| - const bool clip_changed = external_clip_ != clip; |
| - const bool resourceless_software_draw_changed = |
| - resourceless_software_draw_ != resourceless_software_draw; |
| const bool tile_priority_params_changed = |
| viewport_rect_for_tile_priority_ != |
| viewport_rect_for_tile_priority_in_view_space; |
| - // UpdateDrawProperties does not depend on clip. |
| - if (transform_changed || viewport_changed || |
| - resourceless_software_draw_changed || tile_priority_params_changed) { |
| - active_tree_->set_needs_update_draw_properties(); |
| - } |
| - |
| - external_transform_ = transform; |
| - external_viewport_ = viewport; |
| - external_clip_ = clip; |
| viewport_rect_for_tile_priority_ = |
| viewport_rect_for_tile_priority_in_view_space; |
| - resourceless_software_draw_ = resourceless_software_draw; |
| - // When not toggling resourceless software draw, need to set redraw for |
| - // all changes to draw parameters. Damage will be set externally by Android |
| - // WebView for resourceless software draw toggles, so ignored here. |
| - const bool draw_params_changed = transform_changed || viewport_changed || |
| - clip_changed || tile_priority_params_changed; |
| - if (!resourceless_software_draw_changed && draw_params_changed) { |
| + if (tile_priority_params_changed) { |
| + active_tree_->set_needs_update_draw_properties(); |
| + |
| + // Compositor, not OutputSurface, is responsible for setting damage and |
| + // triggering redraw for constraint changes. |
| SetFullRootLayerDamage(); |
| SetNeedsRedraw(); |
| } |
| - |
| - if (resourceless_software_draw_changed) { |
| - client_->OnResourcelessSoftareDrawStateChanged(resourceless_software_draw); |
| - client_->OnCanDrawStateChanged(CanDraw()); |
| - } |
| } |
| void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
| @@ -1556,8 +1540,53 @@ void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { |
| } |
| } |
| -void LayerTreeHostImpl::OnDraw() { |
| - client_->OnDrawForOutputSurface(); |
| +void LayerTreeHostImpl::OnDraw(const gfx::Transform& transform, |
| + const gfx::Rect& viewport, |
| + const gfx::Rect& clip, |
| + bool resourceless_software_draw) { |
| + DCHECK(!resourceless_software_draw_); |
| + const bool transform_changed = external_transform_ != transform; |
| + const bool viewport_changed = external_viewport_ != viewport; |
| + const bool clip_changed = external_clip_ != clip; |
| + |
| + external_transform_ = transform; |
| + external_viewport_ = viewport; |
| + external_clip_ = clip; |
| + |
| + { |
| + base::AutoReset<bool> resourceless_software_draw_reset( |
| + &resourceless_software_draw_, resourceless_software_draw); |
| + |
| + // For resourceless software draw, always set full damage to ensure they |
| + // always swap. Otherwise, need to set redraw for any changes to draw |
| + // parameters. |
| + const bool draw_params_changed = |
| + transform_changed || viewport_changed || clip_changed; |
| + if (resourceless_software_draw_ || draw_params_changed) { |
| + SetFullRootLayerDamage(); |
| + SetNeedsRedraw(); |
| + } |
| + |
| + // UpdateDrawProperties does not depend on clip. |
| + if (transform_changed || viewport_changed || resourceless_software_draw_) { |
| + active_tree_->set_needs_update_draw_properties(); |
| + } |
| + |
| + if (resourceless_software_draw) { |
| + client_->OnCanDrawStateChanged(CanDraw()); |
| + } |
| + |
| + client_->OnDrawForOutputSurface(resourceless_software_draw_); |
| + } |
| + |
| + if (resourceless_software_draw) { |
|
brianderson
2015/12/14 20:51:26
I think it would be easier to understand the flow
boliu
2015/12/16 19:06:41
Tried this, result below in this comment. Really d
|
| + active_tree_->set_needs_update_draw_properties(); |
| + client_->OnCanDrawStateChanged(CanDraw()); |
| + // This draw may have reset all damage, which would lead to subsequent |
| + // incorrect hardware draw, so explicitly set damage for next hardware |
| + // draw as well. |
| + SetFullRootLayerDamage(); |
| + } |
| } |
| void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { |