| 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 974d82116d8c0f81d2fbe4af7c4aa1ae996ee220..d94f6c41aa1950241db724296fe752bba670e834 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"
|
| @@ -1453,60 +1454,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) {
|
| 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 +1529,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) {
|
| + 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() {
|
|
|