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 0590b357569574b48df9fc8ee1c17b4d828fd70f..f3b2e65595cdccd5af198a38e6005608d4f1d39d 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" |
@@ -1227,6 +1228,17 @@ size_t LayerTreeHostImpl::SourceAnimationFrameNumberForTesting() const { |
return fps_counter_->current_frame_number(); |
} |
+void LayerTreeHostImpl::SetExternalViewporForTesting( |
danakj
2015/11/24 21:17:31
Why aren't callers of this just using SetExternalD
boliu
2015/11/24 23:27:38
external_viewport_ is set in OnDraw now, so this i
danakj
2015/12/10 22:33:54
If you call CalcDrawProps you can pass whatever vi
|
+ 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_) |
@@ -1424,59 +1436,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(); |
danakj
2015/11/24 21:17:31
Can you explain why this and SetNeedsRedraw() stil
boliu
2015/11/24 23:27:38
Essentially this replaces SetNeedsRedrawRect from
|
SetNeedsRedraw(); |
} |
- |
- if (resourceless_software_draw_changed) { |
- client_->OnResourcelessSoftareDrawStateChanged(resourceless_software_draw); |
- client_->OnCanDrawStateChanged(CanDraw()); |
- } |
} |
void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
@@ -1526,8 +1508,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 all changes to draw |
danakj
2015/11/24 21:17:30
all changes => any changes
boliu
2015/11/24 23:27:38
Done.
|
+ // 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() { |