Index: cc/output/dc_layer_overlay.cc |
diff --git a/cc/output/dc_layer_overlay.cc b/cc/output/dc_layer_overlay.cc |
index 3523c4519ac489361cf0f0a03a1df4dbd11b45c1..44baeeb62e74c6c2a7d481d45ea56c556877814b 100644 |
--- a/cc/output/dc_layer_overlay.cc |
+++ b/cc/output/dc_layer_overlay.cc |
@@ -113,6 +113,7 @@ void DCLayerOverlayProcessor::Process(ResourceProvider* resource_provider, |
gfx::Rect* damage_rect, |
DCLayerOverlayList* ca_layer_overlays) { |
gfx::Rect this_frame_underlay_rect; |
+ bool display_rect_changed = (display_rect != previous_display_rect_); |
for (auto it = quad_list->begin(); it != quad_list->end(); ++it) { |
DCLayerOverlay ca_layer; |
DCLayerResult result = FromDrawQuad(resource_provider, display_rect, |
@@ -123,14 +124,15 @@ void DCLayerOverlayProcessor::Process(ResourceProvider* resource_provider, |
it->shared_quad_state->quad_to_target_transform, it->rect); |
gfx::RectF occlusion_bounding_box = |
GetOcclusionBounds(gfx::RectF(quad_rectangle), quad_list->begin(), it); |
+ overlay_damage_rect->Union(quad_rectangle); |
if (occlusion_bounding_box.IsEmpty()) { |
// The quad is on top, so promote it to an overlay and remove all damage |
// underneath it. |
if (it->shared_quad_state->quad_to_target_transform |
- .Preserves2dAxisAlignment()) { |
+ .Preserves2dAxisAlignment() && |
+ !display_rect_changed) { |
damage_rect->Subtract(quad_rectangle); |
- overlay_damage_rect->Union(quad_rectangle); |
} |
quad_list->EraseAndInvalidateAllPointers(it); |
} else { |
@@ -154,7 +156,8 @@ void DCLayerOverlayProcessor::Process(ResourceProvider* resource_provider, |
// already cleared last frame. Add back the damage from the occluded |
// area for this and last frame, as that may have changed. |
if (it->shared_quad_state->quad_to_target_transform |
- .Preserves2dAxisAlignment()) { |
+ .Preserves2dAxisAlignment() && |
+ !display_rect_changed) { |
gfx::Rect occluding_damage_rect = *damage_rect; |
occluding_damage_rect.Intersect(quad_rectangle); |
damage_rect->Subtract(quad_rectangle); |
@@ -164,7 +167,6 @@ void DCLayerOverlayProcessor::Process(ResourceProvider* resource_provider, |
occluding_damage_rect.Intersect(new_occlusion_bounding_box); |
damage_rect->Union(occluding_damage_rect); |
- overlay_damage_rect->Union(quad_rectangle); |
} |
} else { |
// Entire replacement quad must be redrawn. |
@@ -178,7 +180,9 @@ void DCLayerOverlayProcessor::Process(ResourceProvider* resource_provider, |
// Only allow one overlay for now. |
break; |
} |
+ damage_rect->Intersect(gfx::ToEnclosingRect(display_rect)); |
previous_frame_underlay_rect_ = this_frame_underlay_rect; |
+ previous_display_rect_ = display_rect; |
} |
} // namespace cc |