| OLD | NEW |
| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "cc/base/math_util.h" | 9 #include "cc/base/math_util.h" |
| 10 #include "cc/layers/heads_up_display_layer_impl.h" | 10 #include "cc/layers/heads_up_display_layer_impl.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 expanded_damage_rect.Intersect(filter_rect); | 45 expanded_damage_rect.Intersect(filter_rect); |
| 46 damage_rect->Union(expanded_damage_rect); | 46 damage_rect->Union(expanded_damage_rect); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void DamageTracker::UpdateDamageTrackingState( | 49 void DamageTracker::UpdateDamageTrackingState( |
| 50 const LayerImplList& layer_list, | 50 const LayerImplList& layer_list, |
| 51 int target_surface_layer_id, | 51 int target_surface_layer_id, |
| 52 bool target_surface_property_changed_only_from_descendant, | 52 bool target_surface_property_changed_only_from_descendant, |
| 53 gfx::Rect target_surface_content_rect, | 53 gfx::Rect target_surface_content_rect, |
| 54 LayerImpl* target_surface_mask_layer, | 54 LayerImpl* target_surface_mask_layer, |
| 55 const FilterOperations& filters, | 55 const FilterOperations& filters) { |
| 56 SkImageFilter* filter) { | |
| 57 // | 56 // |
| 58 // This function computes the "damage rect" of a target surface, and updates | 57 // This function computes the "damage rect" of a target surface, and updates |
| 59 // the state that is used to correctly track damage across frames. The damage | 58 // the state that is used to correctly track damage across frames. The damage |
| 60 // rect is the region of the surface that may have changed and needs to be | 59 // rect is the region of the surface that may have changed and needs to be |
| 61 // redrawn. This can be used to scissor what is actually drawn, to save GPU | 60 // redrawn. This can be used to scissor what is actually drawn, to save GPU |
| 62 // computation and bandwidth. | 61 // computation and bandwidth. |
| 63 // | 62 // |
| 64 // The surface's damage rect is computed as the union of all possible changes | 63 // The surface's damage rect is computed as the union of all possible changes |
| 65 // that have happened to the surface since the last frame was drawn. This | 64 // that have happened to the surface since the last frame was drawn. This |
| 66 // includes: | 65 // includes: |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 | 135 |
| 137 if (target_surface_property_changed_only_from_descendant) { | 136 if (target_surface_property_changed_only_from_descendant) { |
| 138 damage_rect_for_this_update = target_surface_content_rect; | 137 damage_rect_for_this_update = target_surface_content_rect; |
| 139 } else { | 138 } else { |
| 140 // TODO(shawnsingh): can we clamp this damage to the surface's content rect? | 139 // TODO(shawnsingh): can we clamp this damage to the surface's content rect? |
| 141 // (affects performance, but not correctness) | 140 // (affects performance, but not correctness) |
| 142 damage_rect_for_this_update = damage_from_active_layers; | 141 damage_rect_for_this_update = damage_from_active_layers; |
| 143 damage_rect_for_this_update.Union(damage_from_surface_mask); | 142 damage_rect_for_this_update.Union(damage_from_surface_mask); |
| 144 damage_rect_for_this_update.Union(damage_from_leftover_rects); | 143 damage_rect_for_this_update.Union(damage_from_leftover_rects); |
| 145 | 144 |
| 146 if (filters.HasFilterThatMovesPixels()) { | 145 if (filters.HasReferenceFilter()) { |
| 147 ExpandRectWithFilters(&damage_rect_for_this_update, filters); | |
| 148 } else if (filter) { | |
| 149 // TODO(senorblanco): Once SkImageFilter reports its outsets, use | 146 // TODO(senorblanco): Once SkImageFilter reports its outsets, use |
| 150 // those here to limit damage. | 147 // those here to limit damage. |
| 151 damage_rect_for_this_update = target_surface_content_rect; | 148 damage_rect_for_this_update = target_surface_content_rect; |
| 149 } else if (filters.HasFilterThatMovesPixels()) { |
| 150 ExpandRectWithFilters(&damage_rect_for_this_update, filters); |
| 152 } | 151 } |
| 153 } | 152 } |
| 154 | 153 |
| 155 // Damage accumulates until we are notified that we actually did draw on that | 154 // Damage accumulates until we are notified that we actually did draw on that |
| 156 // frame. | 155 // frame. |
| 157 current_damage_rect_.Union(damage_rect_for_this_update); | 156 current_damage_rect_.Union(damage_rect_for_this_update); |
| 158 | 157 |
| 159 // The next history map becomes the current map for the next frame. Note this | 158 // The next history map becomes the current map for the next frame. Note this |
| 160 // must happen every frame to correctly track changes, even if damage | 159 // must happen every frame to correctly track changes, even if damage |
| 161 // accumulates over multiple frames before actually being drawn. | 160 // accumulates over multiple frames before actually being drawn. |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 // one in them. This means we need to redraw any pixels in the surface being | 390 // one in them. This means we need to redraw any pixels in the surface being |
| 392 // used for the blur in this layer this frame. | 391 // used for the blur in this layer this frame. |
| 393 if (layer->background_filters().HasFilterThatMovesPixels()) { | 392 if (layer->background_filters().HasFilterThatMovesPixels()) { |
| 394 ExpandDamageRectInsideRectWithFilters(target_damage_rect, | 393 ExpandDamageRectInsideRectWithFilters(target_damage_rect, |
| 395 surface_rect_in_target_space, | 394 surface_rect_in_target_space, |
| 396 layer->background_filters()); | 395 layer->background_filters()); |
| 397 } | 396 } |
| 398 } | 397 } |
| 399 | 398 |
| 400 } // namespace cc | 399 } // namespace cc |
| OLD | NEW |