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

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

Issue 2834553002: Replace CompositorFrameSinkSupport::WillDrawSurface With RepeatingCallback (Closed)
Patch Set: Fix surface_aggregator_perftest Created 3 years, 8 months 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
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 void Surface::SetPreviousFrameSurface(Surface* surface) { 43 void Surface::SetPreviousFrameSurface(Surface* surface) {
44 DCHECK(surface && (HasActiveFrame() || HasPendingFrame())); 44 DCHECK(surface && (HasActiveFrame() || HasPendingFrame()));
45 frame_index_ = surface->frame_index() + 1; 45 frame_index_ = surface->frame_index() + 1;
46 previous_frame_surface_id_ = surface->surface_id(); 46 previous_frame_surface_id_ = surface->surface_id();
47 CompositorFrame& frame = active_frame_data_ ? active_frame_data_->frame 47 CompositorFrame& frame = active_frame_data_ ? active_frame_data_->frame
48 : pending_frame_data_->frame; 48 : pending_frame_data_->frame;
49 surface->TakeLatencyInfo(&frame.metadata.latency_info); 49 surface->TakeLatencyInfo(&frame.metadata.latency_info);
50 surface->TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info); 50 surface->TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info);
51 } 51 }
52 52
53 void Surface::QueueFrame(CompositorFrame frame, const DrawCallback& callback) { 53 void Surface::QueueFrame(CompositorFrame frame,
54 const DrawCallback& callback,
55 const WillDrawCallback& will_draw_callback) {
54 TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info); 56 TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info);
55 57
56 base::Optional<FrameData> previous_pending_frame_data = 58 base::Optional<FrameData> previous_pending_frame_data =
57 std::move(pending_frame_data_); 59 std::move(pending_frame_data_);
58 pending_frame_data_.reset(); 60 pending_frame_data_.reset();
59 61
60 UpdateBlockingSurfaces(previous_pending_frame_data.has_value(), frame); 62 UpdateBlockingSurfaces(previous_pending_frame_data.has_value(), frame);
61 63
62 // Receive and track the resources referenced from the CompositorFrame 64 // Receive and track the resources referenced from the CompositorFrame
63 // regardless of whether it's pending or active. 65 // regardless of whether it's pending or active.
64 factory_->ReceiveFromChild(frame.resource_list); 66 factory_->ReceiveFromChild(frame.resource_list);
65 67
66 bool is_pending_frame = !blocking_surfaces_.empty(); 68 bool is_pending_frame = !blocking_surfaces_.empty();
67 69
68 if (is_pending_frame) { 70 if (is_pending_frame) {
69 pending_frame_data_ = FrameData(std::move(frame), callback); 71 pending_frame_data_ =
72 FrameData(std::move(frame), callback, will_draw_callback);
70 // Ask the surface manager to inform |this| when its dependencies are 73 // Ask the surface manager to inform |this| when its dependencies are
71 // resolved. 74 // resolved.
72 factory_->manager()->RequestSurfaceResolution(this); 75 factory_->manager()->RequestSurfaceResolution(this);
73 } else { 76 } else {
74 // If there are no blockers, then immediately activate the frame. 77 // If there are no blockers, then immediately activate the frame.
75 ActivateFrame(FrameData(std::move(frame), callback)); 78 ActivateFrame(FrameData(std::move(frame), callback, will_draw_callback));
76 } 79 }
77 80
78 // Returns resources for the previous pending frame. 81 // Returns resources for the previous pending frame.
79 UnrefFrameResourcesAndRunDrawCallback(std::move(previous_pending_frame_data)); 82 UnrefFrameResourcesAndRunDrawCallback(std::move(previous_pending_frame_data));
80 } 83 }
81 84
82 void Surface::EvictFrame() { 85 void Surface::EvictFrame() {
83 QueueFrame(CompositorFrame(), DrawCallback()); 86 QueueFrame(CompositorFrame(), DrawCallback(), WillDrawCallback());
84 active_frame_data_.reset(); 87 active_frame_data_.reset();
85 } 88 }
86 89
87 void Surface::RequestCopyOfOutput( 90 void Surface::RequestCopyOfOutput(
88 std::unique_ptr<CopyOutputRequest> copy_request) { 91 std::unique_ptr<CopyOutputRequest> copy_request) {
89 if (!active_frame_data_ || 92 if (!active_frame_data_ ||
90 active_frame_data_->frame.render_pass_list.empty()) { 93 active_frame_data_->frame.render_pass_list.empty()) {
91 copy_request->SendEmptyResult(); 94 copy_request->SendEmptyResult();
92 return; 95 return;
93 } 96 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 return; 139 return;
137 } 140 }
138 141
139 // If a frame is being activated because of a deadline, then clear its set 142 // If a frame is being activated because of a deadline, then clear its set
140 // of blockers. 143 // of blockers.
141 blocking_surfaces_.clear(); 144 blocking_surfaces_.clear();
142 ActivatePendingFrame(); 145 ActivatePendingFrame();
143 } 146 }
144 147
145 Surface::FrameData::FrameData(CompositorFrame&& frame, 148 Surface::FrameData::FrameData(CompositorFrame&& frame,
146 const DrawCallback& draw_callback) 149 const DrawCallback& draw_callback,
147 : frame(std::move(frame)), draw_callback(draw_callback) {} 150 const WillDrawCallback& will_draw_callback)
151 : frame(std::move(frame)),
152 draw_callback(draw_callback),
153 will_draw_callback(will_draw_callback) {}
148 154
149 Surface::FrameData::FrameData(FrameData&& other) = default; 155 Surface::FrameData::FrameData(FrameData&& other) = default;
150 156
151 Surface::FrameData& Surface::FrameData::operator=(FrameData&& other) = default; 157 Surface::FrameData& Surface::FrameData::operator=(FrameData&& other) = default;
152 158
153 Surface::FrameData::~FrameData() = default; 159 Surface::FrameData::~FrameData() = default;
154 160
155 void Surface::ActivatePendingFrame() { 161 void Surface::ActivatePendingFrame() {
156 DCHECK(pending_frame_data_); 162 DCHECK(pending_frame_data_);
157 ActivateFrame(std::move(*pending_frame_data_)); 163 ActivateFrame(std::move(*pending_frame_data_));
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 } 281 }
276 282
277 void Surface::RunDrawCallbacks() { 283 void Surface::RunDrawCallbacks() {
278 if (active_frame_data_ && !active_frame_data_->draw_callback.is_null()) { 284 if (active_frame_data_ && !active_frame_data_->draw_callback.is_null()) {
279 DrawCallback callback = active_frame_data_->draw_callback; 285 DrawCallback callback = active_frame_data_->draw_callback;
280 active_frame_data_->draw_callback = DrawCallback(); 286 active_frame_data_->draw_callback = DrawCallback();
281 callback.Run(); 287 callback.Run();
282 } 288 }
283 } 289 }
284 290
291 void Surface::RunWillDrawCallbacks(const gfx::Rect& damage_rect) {
Fady Samuel 2017/04/20 12:45:48 I'm really not sure why this is plural. RunWillDra
danakj 2017/04/20 13:56:45 +1 to RunWillDrawCallback. Early out is fine, but
Alex Z. 2017/04/20 13:58:05 Done. I got the plural form RunDrawCallbacks. I fi
292 if (active_frame_data_ && !active_frame_data_->will_draw_callback.is_null()) {
293 active_frame_data_->will_draw_callback.Run(surface_id_.local_surface_id(),
294 damage_rect);
295 }
296 }
297
285 void Surface::AddDestructionDependency(SurfaceSequence sequence) { 298 void Surface::AddDestructionDependency(SurfaceSequence sequence) {
286 destruction_dependencies_.push_back(sequence); 299 destruction_dependencies_.push_back(sequence);
287 } 300 }
288 301
289 void Surface::SatisfyDestructionDependencies( 302 void Surface::SatisfyDestructionDependencies(
290 std::unordered_set<SurfaceSequence, SurfaceSequenceHash>* sequences, 303 std::unordered_set<SurfaceSequence, SurfaceSequenceHash>* sequences,
291 std::unordered_set<FrameSinkId, FrameSinkIdHash>* valid_frame_sink_ids) { 304 std::unordered_set<FrameSinkId, FrameSinkIdHash>* valid_frame_sink_ids) {
292 base::EraseIf(destruction_dependencies_, 305 base::EraseIf(destruction_dependencies_,
293 [sequences, valid_frame_sink_ids](SurfaceSequence seq) { 306 [sequences, valid_frame_sink_ids](SurfaceSequence seq) {
294 return (!!sequences->erase(seq) || 307 return (!!sequences->erase(seq) ||
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 frame->metadata.latency_info.swap(*latency_info); 350 frame->metadata.latency_info.swap(*latency_info);
338 return; 351 return;
339 } 352 }
340 std::copy(frame->metadata.latency_info.begin(), 353 std::copy(frame->metadata.latency_info.begin(),
341 frame->metadata.latency_info.end(), 354 frame->metadata.latency_info.end(),
342 std::back_inserter(*latency_info)); 355 std::back_inserter(*latency_info));
343 frame->metadata.latency_info.clear(); 356 frame->metadata.latency_info.clear();
344 } 357 }
345 358
346 } // namespace cc 359 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698