Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(629)

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 1418273002: cc: Move draw params from SetExternalDrawConstraints to OnDraw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698