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 235817de449eceb01df10477a7aeb2e17bc726a6..e125867073cb3c9b9cf8137055639081bf2e00a6 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" |
| @@ -1399,59 +1400,29 @@ void LayerTreeHostImpl::SetManagedMemoryPolicy( |
| } |
| 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) { |
| + const gfx::Transform& transform_for_tile_priority) { |
| 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_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); |
| } |
| - 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(); |
| SetFullRootLayerDamage(); |
| SetNeedsRedraw(); |
| } |
| - |
| - if (resourceless_software_draw_changed) { |
| - client_->OnResourcelessSoftareDrawStateChanged(resourceless_software_draw); |
| - client_->OnCanDrawStateChanged(CanDraw()); |
| - } |
| } |
| void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
| @@ -1501,8 +1472,55 @@ 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 = DrawTransform() != transform; |
| + const bool viewport_changed = DeviceViewport() != viewport; |
| + const bool clip_changed = DeviceClip() != clip; |
| + |
| + { |
| + base::AutoReset<gfx::Transform> transform_reset(&external_transform_, |
| + transform); |
| + base::AutoReset<gfx::Rect> viewport_reset(&external_viewport_, viewport); |
| + base::AutoReset<gfx::Rect> clip_reset(&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 all 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_->OnResourcelessSoftareDrawStateChanged( |
| + resourceless_software_draw_); |
| + client_->OnCanDrawStateChanged(CanDraw()); |
| + } |
| + |
| + client_->OnDrawForOutputSurface(); |
|
danakj
2015/10/23 18:13:10
I was picturing resourcelessdraw being passed here
boliu
2015/10/23 18:18:20
Ahh, good point :)
|
| + } |
| + |
| + if (resourceless_software_draw) { |
| + client_->OnResourcelessSoftareDrawStateChanged(resourceless_software_draw_); |
| + 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() { |