Index: cc/surfaces/surface_aggregator.cc |
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc |
index 4f00ff34ba738a02154bb0c8b8f8d40a314daae2..21ec6dbdb3802051aabf82246c9f84aac0098f43 100644 |
--- a/cc/surfaces/surface_aggregator.cc |
+++ b/cc/surfaces/surface_aggregator.cc |
@@ -228,6 +228,8 @@ void SurfaceAggregator::HandleSurfaceQuad( |
bool merge_pass = surface_quad->opacity() == 1.f && copy_requests.empty(); |
+ gfx::Rect surface_damage = DamageRectForSurface( |
+ surface, *render_pass_list.back(), surface_quad->visible_rect); |
const RenderPassList& referenced_passes = render_pass_list; |
size_t passes_to_copy = |
merge_pass ? referenced_passes.size() - 1 : referenced_passes.size(); |
@@ -240,9 +242,7 @@ void SurfaceAggregator::HandleSurfaceQuad( |
RenderPassId remapped_pass_id = RemapPassId(source.id, surface_id); |
- copy_pass->SetAll(remapped_pass_id, |
- source.output_rect, |
- source.damage_rect, |
+ copy_pass->SetAll(remapped_pass_id, source.output_rect, gfx::Rect(), |
source.transform_to_root_target, |
source.has_transparent_background); |
@@ -261,6 +261,9 @@ void SurfaceAggregator::HandleSurfaceQuad( |
CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
gfx::Transform(), ClipData(), copy_pass.get(), surface_id); |
+ if (j == referenced_passes.size() - 1) |
+ surface_damage = gfx::UnionRects(surface_damage, copy_pass->damage_rect); |
+ |
dest_pass_list_->push_back(copy_pass.Pass()); |
} |
@@ -309,9 +312,7 @@ void SurfaceAggregator::HandleSurfaceQuad( |
dest_pass->damage_rect = |
gfx::UnionRects(dest_pass->damage_rect, |
MathUtil::MapEnclosingClippedRect( |
- surface_quad->quadTransform(), |
- DamageRectForSurface(surface, last_pass, |
- surface_quad->visible_rect))); |
+ surface_quad->quadTransform(), surface_damage)); |
referenced_surfaces_.erase(it); |
} |
@@ -375,10 +376,20 @@ void SurfaceAggregator::CopyQuadsToPass( |
RenderPassId remapped_pass_id = |
RemapPassId(original_pass_id, surface_id); |
- dest_pass->CopyFromAndAppendRenderPassDrawQuad( |
- pass_quad, |
- dest_pass->shared_quad_state_list.back(), |
+ gfx::Rect pass_damage; |
+ for (const auto* pass : *dest_pass_list_) { |
+ if (pass->id == remapped_pass_id) { |
+ pass_damage = pass->damage_rect; |
+ break; |
+ } |
+ } |
+ |
+ DrawQuad* rpdq = dest_pass->CopyFromAndAppendRenderPassDrawQuad( |
+ pass_quad, dest_pass->shared_quad_state_list.back(), |
remapped_pass_id); |
+ dest_pass->damage_rect = gfx::UnionRects( |
+ dest_pass->damage_rect, MathUtil::MapEnclosingClippedRect( |
+ rpdq->quadTransform(), pass_damage)); |
} else { |
dest_pass->CopyFromAndAppendDrawQuad( |
quad, dest_pass->shared_quad_state_list.back()); |
@@ -411,8 +422,11 @@ void SurfaceAggregator::CopyPasses(const DelegatedFrameData* frame_data, |
RenderPassId remapped_pass_id = |
RemapPassId(source.id, surface->surface_id()); |
- copy_pass->SetAll(remapped_pass_id, source.output_rect, |
- DamageRectForSurface(surface, source, source.output_rect), |
+ gfx::Rect damage_rect = |
+ (i < source_pass_list.size() - 1) |
+ ? gfx::Rect() |
+ : DamageRectForSurface(surface, source, source.output_rect); |
+ copy_pass->SetAll(remapped_pass_id, source.output_rect, damage_rect, |
source.transform_to_root_target, |
source.has_transparent_background); |