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

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: Created 5 years, 2 months 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 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() {

Powered by Google App Engine
This is Rietveld 408576698