summaryrefslogtreecommitdiffstats
path: root/cc/surfaces/surface.cc
diff options
context:
space:
mode:
authorjbauman <jbauman@chromium.org>2014-10-15 20:21:36 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-16 03:21:50 +0000
commit5e50dfa786102701fd831bd155f5dc1ee224458f (patch)
tree6c828567f5d0603bf6fd194e1c1535b9f9802951 /cc/surfaces/surface.cc
parent9cbbf89c8c26d26332ca4bb8ac9a503771ad0c04 (diff)
downloadchromium_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.cc47
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