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

Side by Side Diff: cc/trees/damage_tracker.cc

Issue 2873593002: Force use of and cache render surface. (Closed)
Patch Set: Calculate damage of |force_render_surface|. Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/damage_tracker.h" 5 #include "cc/trees/damage_tracker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "cc/base/filter_operations.h" 12 #include "cc/base/filter_operations.h"
13 #include "cc/base/math_util.h" 13 #include "cc/base/math_util.h"
14 #include "cc/layers/heads_up_display_layer_impl.h" 14 #include "cc/layers/heads_up_display_layer_impl.h"
15 #include "cc/layers/layer_impl.h" 15 #include "cc/layers/layer_impl.h"
16 #include "cc/layers/render_surface_impl.h" 16 #include "cc/layers/render_surface_impl.h"
17 #include "cc/trees/effect_node.h" 17 #include "cc/trees/effect_node.h"
18 #include "cc/trees/layer_tree_host_common.h" 18 #include "cc/trees/layer_tree_host_common.h"
19 #include "cc/trees/layer_tree_impl.h" 19 #include "cc/trees/layer_tree_impl.h"
20 #include "ui/gfx/geometry/rect_conversions.h" 20 #include "ui/gfx/geometry/rect_conversions.h"
21 21
22 namespace cc { 22 namespace cc {
23 23
24 std::unique_ptr<DamageTracker> DamageTracker::Create() { 24 std::unique_ptr<DamageTracker> DamageTracker::Create() {
25 return base::WrapUnique(new DamageTracker()); 25 return base::WrapUnique(new DamageTracker());
26 } 26 }
27 27
28 DamageTracker::DamageTracker() 28 DamageTracker::DamageTracker()
29 : mailboxId_(0) {} 29 : mailboxId_(0),
30 has_property_change_on_contributing_render_surface_(false) {}
30 31
31 DamageTracker::~DamageTracker() {} 32 DamageTracker::~DamageTracker() {}
32 33
33 void DamageTracker::UpdateDamageTracking( 34 void DamageTracker::UpdateDamageTracking(
34 LayerTreeImpl* layer_tree_impl, 35 LayerTreeImpl* layer_tree_impl,
35 const RenderSurfaceList& render_surface_list) { 36 const RenderSurfaceList& render_surface_list) {
36 // 37 //
37 // This function computes the "damage rect" of each target surface, and 38 // This function computes the "damage rect" of each target surface, and
38 // updates the state that is used to correctly track damage across frames. The 39 // updates the state that is used to correctly track damage across frames. The
39 // damage rect is the region of the surface that may have changed and needs to 40 // damage rect is the region of the surface that may have changed and needs to
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 !target_surface_mask_layer->update_rect().IsEmpty()) { 252 !target_surface_mask_layer->update_rect().IsEmpty()) {
252 damage.Union(gfx::Rect(target_surface_mask_layer->bounds())); 253 damage.Union(gfx::Rect(target_surface_mask_layer->bounds()));
253 } 254 }
254 255
255 return damage; 256 return damage;
256 } 257 }
257 258
258 void DamageTracker::PrepareForUpdate() { 259 void DamageTracker::PrepareForUpdate() {
259 mailboxId_++; 260 mailboxId_++;
260 damage_for_this_update_ = DamageAccumulator(); 261 damage_for_this_update_ = DamageAccumulator();
262 has_property_change_on_contributing_render_surface_ = false;
261 } 263 }
262 264
263 DamageTracker::DamageAccumulator DamageTracker::TrackDamageFromLeftoverRects() { 265 DamageTracker::DamageAccumulator DamageTracker::TrackDamageFromLeftoverRects() {
264 // After computing damage for all active layers, any leftover items in the 266 // After computing damage for all active layers, any leftover items in the
265 // current rect history correspond to layers/surfaces that no longer exist. 267 // current rect history correspond to layers/surfaces that no longer exist.
266 // So, these regions are now exposed on the target surface. 268 // So, these regions are now exposed on the target surface.
267 269
268 DamageAccumulator damage; 270 DamageAccumulator damage;
269 SortedRectMapForLayers::iterator layer_cur_pos = 271 SortedRectMapForLayers::iterator layer_cur_pos =
270 rect_history_for_layers_.begin(); 272 rect_history_for_layers_.begin();
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 416
415 bool surface_is_new = false; 417 bool surface_is_new = false;
416 SurfaceRectMapData& data = 418 SurfaceRectMapData& data =
417 RectDataForSurface(render_surface->id(), &surface_is_new); 419 RectDataForSurface(render_surface->id(), &surface_is_new);
418 gfx::Rect old_surface_rect = data.rect_; 420 gfx::Rect old_surface_rect = data.rect_;
419 421
420 gfx::Rect surface_rect_in_target_space = 422 gfx::Rect surface_rect_in_target_space =
421 gfx::ToEnclosingRect(render_surface->DrawableContentRect()); 423 gfx::ToEnclosingRect(render_surface->DrawableContentRect());
422 data.Update(surface_rect_in_target_space, mailboxId_); 424 data.Update(surface_rect_in_target_space, mailboxId_);
423 425
426 has_property_change_on_contributing_render_surface_ |=
weiliangc 2017/06/07 21:19:01 The flag for not able to use the texture should be
wutao 2017/06/09 02:31:32 This is a very good point. Do you mean damage_for_
427 render_surface->SurfacePropertyChanged() ||
weiliangc 2017/06/07 21:19:01 SurfacePropertyChanged() seems to be ok for reusin
wutao 2017/06/09 02:31:32 Acknowledged.
428 render_surface->ContributingRenderSurfacePropertyChanged();
429
424 if (surface_is_new || render_surface->SurfacePropertyChanged()) { 430 if (surface_is_new || render_surface->SurfacePropertyChanged()) {
425 // The entire surface contributes damage. 431 // The entire surface contributes damage.
426 damage_for_this_update_.Union(surface_rect_in_target_space); 432 damage_for_this_update_.Union(surface_rect_in_target_space);
427 433
428 // The surface's old region is now exposed on the target surface, too. 434 // The surface's old region is now exposed on the target surface, too.
429 damage_for_this_update_.Union(old_surface_rect); 435 damage_for_this_update_.Union(old_surface_rect);
430 } else { 436 } else {
431 // Only the surface's damage_rect will damage the target surface. 437 // Only the surface's damage_rect will damage the target surface.
432 gfx::Rect damage_rect_in_local_space; 438 gfx::Rect damage_rect_in_local_space;
433 bool is_valid_rect = render_surface->damage_tracker()->GetDamageRectIfValid( 439 bool is_valid_rect = render_surface->damage_tracker()->GetDamageRectIfValid(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 } 478 }
473 479
474 rect->set_x(x_); 480 rect->set_x(x_);
475 rect->set_y(y_); 481 rect->set_y(y_);
476 rect->set_width(width.ValueOrDie()); 482 rect->set_width(width.ValueOrDie());
477 rect->set_height(height.ValueOrDie()); 483 rect->set_height(height.ValueOrDie());
478 return true; 484 return true;
479 } 485 }
480 486
481 } // namespace cc 487 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698