Chromium Code Reviews| Index: cc/surfaces/surface_aggregator.cc |
| diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc |
| index 620ada738264db8151307cfce4269c90a2352d05..88f320d5d3d499dba82618e222df4344c5736c70 100644 |
| --- a/cc/surfaces/surface_aggregator.cc |
| +++ b/cc/surfaces/surface_aggregator.cc |
| @@ -21,6 +21,22 @@ |
| #include "cc/trees/blocking_task_runner.h" |
| namespace cc { |
| +namespace { |
| + |
| +void MoveMatchingRequests( |
| + RenderPassId id, |
| + std::multimap<RenderPassId, CopyOutputRequest*>* copy_requests, |
| + ScopedPtrVector<CopyOutputRequest>* output_requests) { |
| + auto request_range = copy_requests->equal_range(id); |
| + for (auto it = request_range.first; it != request_range.second; ++it) { |
| + DCHECK(it->second); |
| + output_requests->push_back(scoped_ptr<CopyOutputRequest>(it->second)); |
| + it->second = nullptr; |
| + } |
| + copy_requests->erase(request_range.first, request_range.second); |
| +} |
| + |
| +} // namespace |
| SurfaceAggregator::SurfaceAggregator(SurfaceManager* manager, |
| ResourceProvider* provider) |
| @@ -165,16 +181,21 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
| if (!frame_data) |
| return; |
| + std::multimap<RenderPassId, CopyOutputRequest*> copy_requests; |
| + surface->TakeCopyOutputRequests(©_requests); |
| + |
| RenderPassList render_pass_list; |
| bool invalid_frame = TakeResources(surface, frame_data, &render_pass_list); |
| - if (invalid_frame) |
| + if (invalid_frame) { |
| + for (auto& request : copy_requests) { |
| + request.second->SendEmptyResult(); |
| + delete request.second; |
| + } |
| return; |
| + } |
| 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; |
| @@ -195,6 +216,8 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
| source.transform_to_root_target, |
| source.has_transparent_background); |
| + MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); |
|
jamesr
2014/10/15 23:51:24
the RenderPassIds in copy_requests will be in the
|
| + |
| // Contributing passes aggregated in to the pass list need to take the |
| // transform of the surface quad into account to update their transform to |
| // the root surface. |
| @@ -226,8 +249,6 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
| } 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); |
| @@ -319,8 +340,18 @@ void SurfaceAggregator::CopyQuadsToPass( |
| } |
| } |
| -void SurfaceAggregator::CopyPasses(const RenderPassList& source_pass_list, |
| - const Surface* surface) { |
| +void SurfaceAggregator::CopyPasses(const DelegatedFrameData* frame_data, |
| + Surface* surface) { |
| + RenderPassList source_pass_list; |
| + |
| + // The root surface is allowed to have copy output requests, so grab them |
| + // off its render passes. |
| + std::multimap<RenderPassId, CopyOutputRequest*> copy_requests; |
| + surface->TakeCopyOutputRequests(©_requests); |
| + |
| + bool invalid_frame = TakeResources(surface, frame_data, &source_pass_list); |
| + DCHECK(!invalid_frame); |
| + |
| for (size_t i = 0; i < source_pass_list.size(); ++i) { |
| const RenderPass& source = *source_pass_list[i]; |
| @@ -328,6 +359,8 @@ void SurfaceAggregator::CopyPasses(const RenderPassList& source_pass_list, |
| size_t dq_size = source.quad_list.size(); |
| scoped_ptr<RenderPass> copy_pass(RenderPass::Create(sqs_size, dq_size)); |
| + MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); |
| + |
| RenderPassId remapped_pass_id = |
| RemapPassId(source.id, surface->surface_id()); |
| @@ -361,20 +394,12 @@ scoped_ptr<CompositorFrame> SurfaceAggregator::Aggregate(SurfaceId surface_id) { |
| DCHECK(root_surface_frame->delegated_frame_data); |
| - RenderPassList source_pass_list; |
| - |
| SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; |
| dest_resource_list_ = &frame->delegated_frame_data->resource_list; |
| dest_pass_list_ = &frame->delegated_frame_data->render_pass_list; |
| - bool invalid_frame = |
| - TakeResources(surface, |
| - root_surface_frame->delegated_frame_data.get(), |
| - &source_pass_list); |
| - DCHECK(!invalid_frame); |
| - |
| - CopyPasses(source_pass_list, surface); |
| + CopyPasses(root_surface_frame->delegated_frame_data.get(), surface); |
| referenced_surfaces_.erase(it); |
| DCHECK(referenced_surfaces_.empty()); |