OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/surfaces/surface.h" | 5 #include "cc/surfaces/surface.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
10 #include "cc/output/copy_output_request.h" | 10 #include "cc/output/copy_output_request.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 Surface::~Surface() { | 27 Surface::~Surface() { |
28 ClearCopyRequests(); | 28 ClearCopyRequests(); |
29 if (current_frame_ && factory_) { | 29 if (current_frame_ && factory_) { |
30 ReturnedResourceArray current_resources; | 30 ReturnedResourceArray current_resources; |
31 TransferableResource::ReturnResources( | 31 TransferableResource::ReturnResources( |
32 current_frame_->delegated_frame_data->resource_list, | 32 current_frame_->delegated_frame_data->resource_list, |
33 ¤t_resources); | 33 ¤t_resources); |
34 factory_->UnrefResources(current_resources); | 34 factory_->UnrefResources(current_resources); |
35 } | 35 } |
| 36 if (!draw_callback_.is_null()) |
| 37 draw_callback_.Run(false); |
36 } | 38 } |
37 | 39 |
38 void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, | 40 void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, |
39 const base::Closure& callback) { | 41 const DrawCallback& callback) { |
40 DCHECK(factory_); | 42 DCHECK(factory_); |
41 ClearCopyRequests(); | 43 ClearCopyRequests(); |
42 TakeLatencyInfo(&frame->metadata.latency_info); | 44 TakeLatencyInfo(&frame->metadata.latency_info); |
43 scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); | 45 scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); |
44 current_frame_ = frame.Pass(); | 46 current_frame_ = frame.Pass(); |
45 factory_->ReceiveFromChild( | 47 factory_->ReceiveFromChild( |
46 current_frame_->delegated_frame_data->resource_list); | 48 current_frame_->delegated_frame_data->resource_list); |
47 ++frame_index_; | 49 ++frame_index_; |
48 | 50 |
49 if (previous_frame) { | 51 if (previous_frame) { |
50 ReturnedResourceArray previous_resources; | 52 ReturnedResourceArray previous_resources; |
51 TransferableResource::ReturnResources( | 53 TransferableResource::ReturnResources( |
52 previous_frame->delegated_frame_data->resource_list, | 54 previous_frame->delegated_frame_data->resource_list, |
53 &previous_resources); | 55 &previous_resources); |
54 factory_->UnrefResources(previous_resources); | 56 factory_->UnrefResources(previous_resources); |
55 } | 57 } |
56 if (!draw_callback_.is_null()) | 58 if (!draw_callback_.is_null()) |
57 draw_callback_.Run(); | 59 draw_callback_.Run(false); |
58 draw_callback_ = callback; | 60 draw_callback_ = callback; |
59 factory_->manager()->DidSatisfySequences( | 61 factory_->manager()->DidSatisfySequences( |
60 SurfaceIdAllocator::NamespaceForId(surface_id_), | 62 SurfaceIdAllocator::NamespaceForId(surface_id_), |
61 ¤t_frame_->metadata.satisfies_sequences); | 63 ¤t_frame_->metadata.satisfies_sequences); |
62 } | 64 } |
63 | 65 |
64 void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { | 66 void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { |
65 if (current_frame_ && | 67 if (current_frame_ && |
66 !current_frame_->delegated_frame_data->render_pass_list.empty()) | 68 !current_frame_->delegated_frame_data->render_pass_list.empty()) |
67 current_frame_->delegated_frame_data->render_pass_list.back() | 69 current_frame_->delegated_frame_data->render_pass_list.back() |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 return; | 101 return; |
100 } | 102 } |
101 std::copy(current_frame_->metadata.latency_info.begin(), | 103 std::copy(current_frame_->metadata.latency_info.begin(), |
102 current_frame_->metadata.latency_info.end(), | 104 current_frame_->metadata.latency_info.end(), |
103 std::back_inserter(*latency_info)); | 105 std::back_inserter(*latency_info)); |
104 current_frame_->metadata.latency_info.clear(); | 106 current_frame_->metadata.latency_info.clear(); |
105 } | 107 } |
106 | 108 |
107 void Surface::RunDrawCallbacks() { | 109 void Surface::RunDrawCallbacks() { |
108 if (!draw_callback_.is_null()) { | 110 if (!draw_callback_.is_null()) { |
109 base::Closure callback = draw_callback_; | 111 DrawCallback callback = draw_callback_; |
110 draw_callback_ = base::Closure(); | 112 draw_callback_ = DrawCallback(); |
111 callback.Run(); | 113 callback.Run(true); |
112 } | 114 } |
113 } | 115 } |
114 | 116 |
115 void Surface::AddDestructionDependency(SurfaceSequence sequence) { | 117 void Surface::AddDestructionDependency(SurfaceSequence sequence) { |
116 destruction_dependencies_.push_back(sequence); | 118 destruction_dependencies_.push_back(sequence); |
117 } | 119 } |
118 | 120 |
119 void Surface::SatisfyDestructionDependencies( | 121 void Surface::SatisfyDestructionDependencies( |
120 base::hash_set<SurfaceSequence>* sequences) { | 122 base::hash_set<SurfaceSequence>* sequences) { |
121 destruction_dependencies_.erase( | 123 destruction_dependencies_.erase( |
122 std::remove_if( | 124 std::remove_if( |
123 destruction_dependencies_.begin(), destruction_dependencies_.end(), | 125 destruction_dependencies_.begin(), destruction_dependencies_.end(), |
124 [sequences](SurfaceSequence seq) { return !!sequences->erase(seq); }), | 126 [sequences](SurfaceSequence seq) { return !!sequences->erase(seq); }), |
125 destruction_dependencies_.end()); | 127 destruction_dependencies_.end()); |
126 } | 128 } |
127 | 129 |
128 void Surface::ClearCopyRequests() { | 130 void Surface::ClearCopyRequests() { |
129 if (current_frame_) { | 131 if (current_frame_) { |
130 for (const auto& render_pass : | 132 for (const auto& render_pass : |
131 current_frame_->delegated_frame_data->render_pass_list) { | 133 current_frame_->delegated_frame_data->render_pass_list) { |
132 for (const auto& copy_request : render_pass->copy_requests) | 134 for (const auto& copy_request : render_pass->copy_requests) |
133 copy_request->SendEmptyResult(); | 135 copy_request->SendEmptyResult(); |
134 } | 136 } |
135 } | 137 } |
136 } | 138 } |
137 | 139 |
138 } // namespace cc | 140 } // namespace cc |
OLD | NEW |