diff options
author | jbauman <jbauman@chromium.org> | 2014-10-15 20:21:36 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-16 03:21:50 +0000 |
commit | 5e50dfa786102701fd831bd155f5dc1ee224458f (patch) | |
tree | 6c828567f5d0603bf6fd194e1c1535b9f9802951 /cc/surfaces/surface.cc | |
parent | 9cbbf89c8c26d26332ca4bb8ac9a503771ad0c04 (diff) | |
download | chromium_src-5e50dfa786102701fd831bd155f5dc1ee224458f.zip chromium_src-5e50dfa786102701fd831bd155f5dc1ee224458f.tar.gz chromium_src-5e50dfa786102701fd831bd155f5dc1ee224458f.tar.bz2 |
Allow CopyOutputRequests on all render passes of a surface
The browser compositor in content/ currently expects to be able to do copy output requests of arbitrary layers. The surface aggregator should allow ever render pass to contain copy requests, and move them to the aggregated frame.
BUG=397730
Review URL: https://codereview.chromium.org/614073005
Cr-Commit-Position: refs/heads/master@{#299831}
Diffstat (limited to 'cc/surfaces/surface.cc')
-rw-r--r-- | cc/surfaces/surface.cc | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc index 4d32d72..07c5ae6 100644 --- a/cc/surfaces/surface.cc +++ b/cc/surfaces/surface.cc @@ -23,12 +23,7 @@ Surface::Surface(SurfaceId id, const gfx::Size& size, SurfaceFactory* factory) } Surface::~Surface() { - for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); - it != copy_requests_.end(); - ++it) { - (*it)->SendEmptyResult(); - } - copy_requests_.clear(); + ClearCopyRequests(); if (current_frame_ && factory_) { ReturnedResourceArray current_resources; TransferableResource::ReturnResources( @@ -41,13 +36,7 @@ Surface::~Surface() { void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, const base::Closure& callback) { DCHECK(factory_); - for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); - it != copy_requests_.end(); - ++it) { - (*it)->SendEmptyResult(); - } - copy_requests_.clear(); - + ClearCopyRequests(); TakeLatencyInfo(&frame->metadata.latency_info); scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); current_frame_ = frame.Pass(); @@ -70,13 +59,29 @@ void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, } void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { - copy_requests_.push_back(copy_request.Pass()); + if (current_frame_ && + !current_frame_->delegated_frame_data->render_pass_list.empty()) + current_frame_->delegated_frame_data->render_pass_list.back() + ->copy_requests.push_back(copy_request.Pass()); + else + copy_request->SendEmptyResult(); } void Surface::TakeCopyOutputRequests( - ScopedPtrVector<CopyOutputRequest>* copy_requests) { + std::multimap<RenderPassId, CopyOutputRequest*>* copy_requests) { DCHECK(copy_requests->empty()); - copy_requests->swap(copy_requests_); + if (current_frame_) { + for (auto* render_pass : + current_frame_->delegated_frame_data->render_pass_list) { + while (!render_pass->copy_requests.empty()) { + scoped_ptr<CopyOutputRequest> request = + render_pass->copy_requests.take_back(); + render_pass->copy_requests.pop_back(); + copy_requests->insert( + std::make_pair(render_pass->id, request.release())); + } + } + } } const CompositorFrame* Surface::GetEligibleFrame() { @@ -104,4 +109,14 @@ void Surface::RunDrawCallbacks() { } } +void Surface::ClearCopyRequests() { + if (current_frame_) { + for (auto* render_pass : + current_frame_->delegated_frame_data->render_pass_list) { + for (auto* copy_request : render_pass->copy_requests) + copy_request->SendEmptyResult(); + } + } +} + } // namespace cc |