| Index: cc/surfaces/surface_aggregator.cc
|
| diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
|
| index 050a2f0e0f3b999dcaab8c5a63b428fff4a444e0..ab51068155022c92350b460411ed7037306ef96a 100644
|
| --- a/cc/surfaces/surface_aggregator.cc
|
| +++ b/cc/surfaces/surface_aggregator.cc
|
| @@ -176,8 +176,15 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad,
|
|
|
| SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first;
|
|
|
| + ScopedPtrVector<CopyOutputRequest> copy_requests;
|
| + surface->TakeCopyOutputRequests(©_requests);
|
| +
|
| + bool merge_pass = copy_requests.empty();
|
| +
|
| const RenderPassList& referenced_passes = render_pass_list;
|
| - for (size_t j = 0; j + 1 < referenced_passes.size(); ++j) {
|
| + size_t passes_to_copy =
|
| + merge_pass ? referenced_passes.size() - 1 : referenced_passes.size();
|
| + for (size_t j = 0; j < passes_to_copy; ++j) {
|
| const RenderPass& source = *referenced_passes[j];
|
|
|
| scoped_ptr<RenderPass> copy_pass(RenderPass::Create());
|
| @@ -207,16 +214,37 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad,
|
| dest_pass_list_->push_back(copy_pass.Pass());
|
| }
|
|
|
| - // TODO(jamesr): Clean up last pass special casing.
|
| const RenderPass& last_pass = *render_pass_list.back();
|
| - const QuadList& quads = last_pass.quad_list;
|
| -
|
| - // TODO(jamesr): Make sure clipping is enforced.
|
| - CopyQuadsToPass(quads,
|
| - last_pass.shared_quad_state_list,
|
| - surface_quad->quadTransform(),
|
| - dest_pass,
|
| - surface_id);
|
| + if (merge_pass) {
|
| + // TODO(jamesr): Clean up last pass special casing.
|
| + const QuadList& quads = last_pass.quad_list;
|
| +
|
| + // TODO(jamesr): Make sure clipping is enforced.
|
| + CopyQuadsToPass(quads,
|
| + last_pass.shared_quad_state_list,
|
| + surface_quad->quadTransform(),
|
| + dest_pass,
|
| + surface_id);
|
| + } else {
|
| + RenderPassId remapped_pass_id = RemapPassId(last_pass.id, surface_id);
|
| +
|
| + dest_pass_list_->back()->copy_requests.swap(copy_requests);
|
| +
|
| + SharedQuadState* shared_quad_state =
|
| + dest_pass->CreateAndAppendSharedQuadState();
|
| + shared_quad_state->CopyFrom(surface_quad->shared_quad_state);
|
| + scoped_ptr<RenderPassDrawQuad> quad(new RenderPassDrawQuad);
|
| + quad->SetNew(shared_quad_state,
|
| + surface_quad->rect,
|
| + surface_quad->visible_rect,
|
| + remapped_pass_id,
|
| + 0,
|
| + gfx::RectF(),
|
| + FilterOperations(),
|
| + gfx::Vector2dF(),
|
| + FilterOperations());
|
| + dest_pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| + }
|
| dest_pass->damage_rect =
|
| gfx::UnionRects(dest_pass->damage_rect,
|
| MathUtil::MapEnclosingClippedRect(
|
|
|