| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 Surface::Surface(const SurfaceId& id, base::WeakPtr<SurfaceFactory> factory) | 25 Surface::Surface(const SurfaceId& id, base::WeakPtr<SurfaceFactory> factory) |
| 26 : surface_id_(id), | 26 : surface_id_(id), |
| 27 previous_frame_surface_id_(id), | 27 previous_frame_surface_id_(id), |
| 28 factory_(factory), | 28 factory_(factory), |
| 29 frame_index_(kFrameIndexStart), | 29 frame_index_(kFrameIndexStart), |
| 30 destroyed_(false) {} | 30 destroyed_(false) {} |
| 31 | 31 |
| 32 Surface::~Surface() { | 32 Surface::~Surface() { |
| 33 ClearCopyRequests(); | 33 ClearCopyRequests(); |
| 34 if (current_frame_ && factory_) { | 34 if (current_frame_.delegated_frame_data && factory_) { |
| 35 UnrefFrameResources(*current_frame_); | 35 UnrefFrameResources(current_frame_.delegated_frame_data.get()); |
| 36 } | 36 } |
| 37 if (!draw_callback_.is_null()) | 37 if (!draw_callback_.is_null()) |
| 38 draw_callback_.Run(); | 38 draw_callback_.Run(); |
| 39 } | 39 } |
| 40 | 40 |
| 41 void Surface::SetPreviousFrameSurface(Surface* surface) { | 41 void Surface::SetPreviousFrameSurface(Surface* surface) { |
| 42 DCHECK(surface); | 42 DCHECK(surface); |
| 43 frame_index_ = surface->frame_index() + 1; | 43 frame_index_ = surface->frame_index() + 1; |
| 44 previous_frame_surface_id_ = surface->surface_id(); | 44 previous_frame_surface_id_ = surface->surface_id(); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void Surface::QueueFrame(CompositorFrame frame, const DrawCallback& callback) { | 47 void Surface::QueueFrame(CompositorFrame frame, const DrawCallback& callback) { |
| 48 DCHECK(factory_); | 48 DCHECK(factory_); |
| 49 ClearCopyRequests(); | 49 ClearCopyRequests(); |
| 50 | 50 |
| 51 TakeLatencyInfo(&frame.metadata.latency_info); | 51 if (frame.delegated_frame_data) { |
| 52 TakeLatencyInfo(&frame.metadata.latency_info); |
| 53 } |
| 52 | 54 |
| 53 base::Optional<CompositorFrame> previous_frame = std::move(current_frame_); | 55 CompositorFrame previous_frame = std::move(current_frame_); |
| 54 current_frame_ = std::move(frame); | 56 current_frame_ = std::move(frame); |
| 55 | 57 |
| 56 if (current_frame_) { | 58 if (current_frame_.delegated_frame_data) { |
| 57 factory_->ReceiveFromChild(current_frame_->resource_list); | 59 factory_->ReceiveFromChild( |
| 60 current_frame_.delegated_frame_data->resource_list); |
| 58 } | 61 } |
| 59 | 62 |
| 60 // Empty frames shouldn't be drawn and shouldn't contribute damage, so don't | 63 // Empty frames shouldn't be drawn and shouldn't contribute damage, so don't |
| 61 // increment frame index for them. | 64 // increment frame index for them. |
| 62 if (current_frame_ && !current_frame_->render_pass_list.empty()) { | 65 if (current_frame_.delegated_frame_data && |
| 66 !current_frame_.delegated_frame_data->render_pass_list.empty()) { |
| 63 ++frame_index_; | 67 ++frame_index_; |
| 64 } | 68 } |
| 65 | 69 |
| 66 previous_frame_surface_id_ = surface_id(); | 70 previous_frame_surface_id_ = surface_id(); |
| 67 | 71 |
| 68 std::vector<SurfaceId> new_referenced_surfaces; | 72 std::vector<SurfaceId> new_referenced_surfaces; |
| 69 new_referenced_surfaces = current_frame_->metadata.referenced_surfaces; | 73 new_referenced_surfaces = current_frame_.metadata.referenced_surfaces; |
| 70 | 74 |
| 71 if (previous_frame) | 75 if (previous_frame.delegated_frame_data) |
| 72 UnrefFrameResources(*previous_frame); | 76 UnrefFrameResources(previous_frame.delegated_frame_data.get()); |
| 73 | 77 |
| 74 if (!draw_callback_.is_null()) | 78 if (!draw_callback_.is_null()) |
| 75 draw_callback_.Run(); | 79 draw_callback_.Run(); |
| 76 draw_callback_ = callback; | 80 draw_callback_ = callback; |
| 77 | 81 |
| 78 bool referenced_surfaces_changed = | 82 bool referenced_surfaces_changed = |
| 79 (referenced_surfaces_ != new_referenced_surfaces); | 83 (referenced_surfaces_ != new_referenced_surfaces); |
| 80 referenced_surfaces_ = new_referenced_surfaces; | 84 referenced_surfaces_ = new_referenced_surfaces; |
| 81 std::vector<uint32_t> satisfies_sequences = | 85 std::vector<uint32_t> satisfies_sequences = |
| 82 std::move(current_frame_->metadata.satisfies_sequences); | 86 std::move(current_frame_.metadata.satisfies_sequences); |
| 83 | 87 |
| 84 if (referenced_surfaces_changed || !satisfies_sequences.empty()) { | 88 if (referenced_surfaces_changed || !satisfies_sequences.empty()) { |
| 85 // Notify the manager that sequences were satisfied either if some new | 89 // Notify the manager that sequences were satisfied either if some new |
| 86 // sequences were satisfied, or if the set of referenced surfaces changed | 90 // sequences were satisfied, or if the set of referenced surfaces changed |
| 87 // to force a GC to happen. | 91 // to force a GC to happen. |
| 88 factory_->manager()->DidSatisfySequences(surface_id_.frame_sink_id(), | 92 factory_->manager()->DidSatisfySequences(surface_id_.frame_sink_id(), |
| 89 &satisfies_sequences); | 93 &satisfies_sequences); |
| 90 } | 94 } |
| 91 } | 95 } |
| 92 | 96 |
| 93 void Surface::RequestCopyOfOutput( | 97 void Surface::RequestCopyOfOutput( |
| 94 std::unique_ptr<CopyOutputRequest> copy_request) { | 98 std::unique_ptr<CopyOutputRequest> copy_request) { |
| 95 if (current_frame_ && !current_frame_->render_pass_list.empty()) { | 99 if (current_frame_.delegated_frame_data && |
| 100 !current_frame_.delegated_frame_data->render_pass_list.empty()) { |
| 96 std::vector<std::unique_ptr<CopyOutputRequest>>& copy_requests = | 101 std::vector<std::unique_ptr<CopyOutputRequest>>& copy_requests = |
| 97 current_frame_->render_pass_list.back()->copy_requests; | 102 current_frame_.delegated_frame_data->render_pass_list.back() |
| 103 ->copy_requests; |
| 98 | 104 |
| 99 if (void* source = copy_request->source()) { | 105 if (void* source = copy_request->source()) { |
| 100 // Remove existing CopyOutputRequests made on the Surface by the same | 106 // Remove existing CopyOutputRequests made on the Surface by the same |
| 101 // source. | 107 // source. |
| 102 auto to_remove = | 108 auto to_remove = |
| 103 std::remove_if(copy_requests.begin(), copy_requests.end(), | 109 std::remove_if(copy_requests.begin(), copy_requests.end(), |
| 104 [source](const std::unique_ptr<CopyOutputRequest>& x) { | 110 [source](const std::unique_ptr<CopyOutputRequest>& x) { |
| 105 return x->source() == source; | 111 return x->source() == source; |
| 106 }); | 112 }); |
| 107 copy_requests.erase(to_remove, copy_requests.end()); | 113 copy_requests.erase(to_remove, copy_requests.end()); |
| 108 } | 114 } |
| 109 copy_requests.push_back(std::move(copy_request)); | 115 copy_requests.push_back(std::move(copy_request)); |
| 110 } else { | 116 } else { |
| 111 copy_request->SendEmptyResult(); | 117 copy_request->SendEmptyResult(); |
| 112 } | 118 } |
| 113 } | 119 } |
| 114 | 120 |
| 115 void Surface::TakeCopyOutputRequests( | 121 void Surface::TakeCopyOutputRequests( |
| 116 std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>>* | 122 std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>>* |
| 117 copy_requests) { | 123 copy_requests) { |
| 118 DCHECK(copy_requests->empty()); | 124 DCHECK(copy_requests->empty()); |
| 119 if (current_frame_) { | 125 if (current_frame_.delegated_frame_data) { |
| 120 for (const auto& render_pass : current_frame_->render_pass_list) { | 126 for (const auto& render_pass : |
| 127 current_frame_.delegated_frame_data->render_pass_list) { |
| 121 for (auto& request : render_pass->copy_requests) { | 128 for (auto& request : render_pass->copy_requests) { |
| 122 copy_requests->insert( | 129 copy_requests->insert( |
| 123 std::make_pair(render_pass->id, std::move(request))); | 130 std::make_pair(render_pass->id, std::move(request))); |
| 124 } | 131 } |
| 125 render_pass->copy_requests.clear(); | 132 render_pass->copy_requests.clear(); |
| 126 } | 133 } |
| 127 } | 134 } |
| 128 } | 135 } |
| 129 | 136 |
| 130 const CompositorFrame& Surface::GetEligibleFrame() { | 137 const CompositorFrame& Surface::GetEligibleFrame() { |
| 131 DCHECK(current_frame_); | 138 return current_frame_; |
| 132 return current_frame_.value(); | |
| 133 } | 139 } |
| 134 | 140 |
| 135 void Surface::TakeLatencyInfo(std::vector<ui::LatencyInfo>* latency_info) { | 141 void Surface::TakeLatencyInfo(std::vector<ui::LatencyInfo>* latency_info) { |
| 136 if (!current_frame_) | 142 if (!current_frame_.delegated_frame_data) |
| 137 return; | 143 return; |
| 138 if (latency_info->empty()) { | 144 if (latency_info->empty()) { |
| 139 current_frame_->metadata.latency_info.swap(*latency_info); | 145 current_frame_.metadata.latency_info.swap(*latency_info); |
| 140 return; | 146 return; |
| 141 } | 147 } |
| 142 std::copy(current_frame_->metadata.latency_info.begin(), | 148 std::copy(current_frame_.metadata.latency_info.begin(), |
| 143 current_frame_->metadata.latency_info.end(), | 149 current_frame_.metadata.latency_info.end(), |
| 144 std::back_inserter(*latency_info)); | 150 std::back_inserter(*latency_info)); |
| 145 current_frame_->metadata.latency_info.clear(); | 151 current_frame_.metadata.latency_info.clear(); |
| 146 } | 152 } |
| 147 | 153 |
| 148 void Surface::RunDrawCallbacks() { | 154 void Surface::RunDrawCallbacks() { |
| 149 if (!draw_callback_.is_null()) { | 155 if (!draw_callback_.is_null()) { |
| 150 DrawCallback callback = draw_callback_; | 156 DrawCallback callback = draw_callback_; |
| 151 draw_callback_ = DrawCallback(); | 157 draw_callback_ = DrawCallback(); |
| 152 callback.Run(); | 158 callback.Run(); |
| 153 } | 159 } |
| 154 } | 160 } |
| 155 | 161 |
| 156 void Surface::AddDestructionDependency(SurfaceSequence sequence) { | 162 void Surface::AddDestructionDependency(SurfaceSequence sequence) { |
| 157 destruction_dependencies_.push_back(sequence); | 163 destruction_dependencies_.push_back(sequence); |
| 158 } | 164 } |
| 159 | 165 |
| 160 void Surface::SatisfyDestructionDependencies( | 166 void Surface::SatisfyDestructionDependencies( |
| 161 std::unordered_set<SurfaceSequence, SurfaceSequenceHash>* sequences, | 167 std::unordered_set<SurfaceSequence, SurfaceSequenceHash>* sequences, |
| 162 std::unordered_set<FrameSinkId, FrameSinkIdHash>* valid_frame_sink_ids) { | 168 std::unordered_set<FrameSinkId, FrameSinkIdHash>* valid_frame_sink_ids) { |
| 163 destruction_dependencies_.erase( | 169 destruction_dependencies_.erase( |
| 164 std::remove_if(destruction_dependencies_.begin(), | 170 std::remove_if(destruction_dependencies_.begin(), |
| 165 destruction_dependencies_.end(), | 171 destruction_dependencies_.end(), |
| 166 [sequences, valid_frame_sink_ids](SurfaceSequence seq) { | 172 [sequences, valid_frame_sink_ids](SurfaceSequence seq) { |
| 167 return (!!sequences->erase(seq) || | 173 return (!!sequences->erase(seq) || |
| 168 !valid_frame_sink_ids->count(seq.frame_sink_id)); | 174 !valid_frame_sink_ids->count(seq.frame_sink_id)); |
| 169 }), | 175 }), |
| 170 destruction_dependencies_.end()); | 176 destruction_dependencies_.end()); |
| 171 } | 177 } |
| 172 | 178 |
| 173 void Surface::UnrefFrameResources(const CompositorFrame& frame) { | 179 void Surface::UnrefFrameResources(DelegatedFrameData* frame_data) { |
| 174 ReturnedResourceArray resources; | 180 ReturnedResourceArray resources; |
| 175 TransferableResource::ReturnResources(frame.resource_list, &resources); | 181 TransferableResource::ReturnResources(frame_data->resource_list, &resources); |
| 176 // No point in returning same sync token to sender. | 182 // No point in returning same sync token to sender. |
| 177 for (auto& resource : resources) | 183 for (auto& resource : resources) |
| 178 resource.sync_token.Clear(); | 184 resource.sync_token.Clear(); |
| 179 factory_->UnrefResources(resources); | 185 factory_->UnrefResources(resources); |
| 180 } | 186 } |
| 181 | 187 |
| 182 void Surface::ClearCopyRequests() { | 188 void Surface::ClearCopyRequests() { |
| 183 if (current_frame_) { | 189 if (current_frame_.delegated_frame_data) { |
| 184 for (const auto& render_pass : current_frame_->render_pass_list) { | 190 for (const auto& render_pass : |
| 191 current_frame_.delegated_frame_data->render_pass_list) { |
| 185 for (const auto& copy_request : render_pass->copy_requests) | 192 for (const auto& copy_request : render_pass->copy_requests) |
| 186 copy_request->SendEmptyResult(); | 193 copy_request->SendEmptyResult(); |
| 187 } | 194 } |
| 188 } | 195 } |
| 189 } | 196 } |
| 190 | 197 |
| 191 } // namespace cc | 198 } // namespace cc |
| OLD | NEW |