Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: cc/surfaces/surface.cc

Issue 2503203002: Revert "Getting rid of DelegatedFrameData" (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/surfaces/surface.h ('k') | cc/surfaces/surface_aggregator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/surfaces/surface.h ('k') | cc/surfaces/surface_aggregator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698