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

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

Issue 2854163003: [cc] Plumb BeginFrameAcks through SurfaceManager to DisplayScheduler. (Closed)
Patch Set: fix clang compile error Created 3 years, 6 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
« no previous file with comments | « cc/BUILD.gn ('k') | cc/surfaces/compositor_frame_sink_support_unittest.cc » ('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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/compositor_frame_sink_support.h" 5 #include "cc/surfaces/compositor_frame_sink_support.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 return; 79 return;
80 DestroyCurrentSurface(); 80 DestroyCurrentSurface();
81 } 81 }
82 82
83 void CompositorFrameSinkSupport::SetNeedsBeginFrame(bool needs_begin_frame) { 83 void CompositorFrameSinkSupport::SetNeedsBeginFrame(bool needs_begin_frame) {
84 needs_begin_frame_ = needs_begin_frame; 84 needs_begin_frame_ = needs_begin_frame;
85 UpdateNeedsBeginFramesInternal(); 85 UpdateNeedsBeginFramesInternal();
86 } 86 }
87 87
88 void CompositorFrameSinkSupport::DidNotProduceFrame(const BeginFrameAck& ack) { 88 void CompositorFrameSinkSupport::DidNotProduceFrame(const BeginFrameAck& ack) {
89 TRACE_EVENT2("cc", "CompositorFrameSinkSupport::DidNotProduceFrame",
90 "ack.source_id", ack.source_id, "ack.sequence_number",
91 ack.sequence_number);
89 DCHECK_GE(ack.sequence_number, BeginFrameArgs::kStartingFrameNumber); 92 DCHECK_GE(ack.sequence_number, BeginFrameArgs::kStartingFrameNumber);
90 93
91 // |has_damage| is not transmitted, but false by default. 94 // |has_damage| is not transmitted, but false by default.
92 DCHECK(!ack.has_damage); 95 DCHECK(!ack.has_damage);
93 96
94 // TODO(eseckler): Forward |ack| via SurfaceObservers. 97 if (current_surface_)
95 98 surface_manager_->SurfaceModified(current_surface_->surface_id(), ack);
96 if (begin_frame_source_) 99 if (begin_frame_source_)
97 begin_frame_source_->DidFinishFrame(this); 100 begin_frame_source_->DidFinishFrame(this);
98 } 101 }
99 102
100 bool CompositorFrameSinkSupport::SubmitCompositorFrame( 103 bool CompositorFrameSinkSupport::SubmitCompositorFrame(
101 const LocalSurfaceId& local_surface_id, 104 const LocalSurfaceId& local_surface_id,
102 CompositorFrame frame) { 105 CompositorFrame frame) {
103 TRACE_EVENT0("cc", "CompositorFrameSinkSupport::SubmitCompositorFrame"); 106 TRACE_EVENT0("cc", "CompositorFrameSinkSupport::SubmitCompositorFrame");
104 DCHECK(local_surface_id.is_valid()); 107 DCHECK(local_surface_id.is_valid());
105 DCHECK(!frame.render_pass_list.empty()); 108 DCHECK(!frame.render_pass_list.empty());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck, 157 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck,
155 weak_factory_.GetWeakPtr()), 158 weak_factory_.GetWeakPtr()),
156 base::BindRepeating(&CompositorFrameSinkSupport::WillDrawSurface, 159 base::BindRepeating(&CompositorFrameSinkSupport::WillDrawSurface,
157 weak_factory_.GetWeakPtr())); 160 weak_factory_.GetWeakPtr()));
158 161
159 if (!result) { 162 if (!result) {
160 surface_manager_->DestroySurface(std::move(surface)); 163 surface_manager_->DestroySurface(std::move(surface));
161 return false; 164 return false;
162 } 165 }
163 166
167 surface_manager_->SurfaceDamageExpected(surface->surface_id(),
168 last_begin_frame_args_);
169
164 if (current_surface_) { 170 if (current_surface_) {
165 surface->SetPreviousFrameSurface(current_surface_.get()); 171 surface->SetPreviousFrameSurface(current_surface_.get());
166 DestroyCurrentSurface(); 172 DestroyCurrentSurface();
167 } 173 }
168 current_surface_ = std::move(surface); 174 current_surface_ = std::move(surface);
169 175
170 // TODO(eseckler): Forward |ack| via SurfaceObservers.
171
172 if (begin_frame_source_) 176 if (begin_frame_source_)
173 begin_frame_source_->DidFinishFrame(this); 177 begin_frame_source_->DidFinishFrame(this);
174 178
175 return true; 179 return true;
176 } 180 }
177 181
178 void CompositorFrameSinkSupport::UpdateSurfaceReferences( 182 void CompositorFrameSinkSupport::UpdateSurfaceReferences(
179 const SurfaceId& last_surface_id, 183 const SurfaceId& last_surface_id,
180 const LocalSurfaceId& local_surface_id) { 184 const LocalSurfaceId& local_surface_id) {
181 const bool surface_id_changed = 185 const bool surface_id_changed =
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 296
293 void CompositorFrameSinkSupport::Init(SurfaceManager* surface_manager) { 297 void CompositorFrameSinkSupport::Init(SurfaceManager* surface_manager) {
294 surface_manager_ = surface_manager; 298 surface_manager_ = surface_manager;
295 if (handles_frame_sink_id_invalidation_) 299 if (handles_frame_sink_id_invalidation_)
296 surface_manager_->RegisterFrameSinkId(frame_sink_id_); 300 surface_manager_->RegisterFrameSinkId(frame_sink_id_);
297 surface_manager_->RegisterFrameSinkManagerClient(frame_sink_id_, this); 301 surface_manager_->RegisterFrameSinkManagerClient(frame_sink_id_, this);
298 } 302 }
299 303
300 void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) { 304 void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) {
301 UpdateNeedsBeginFramesInternal(); 305 UpdateNeedsBeginFramesInternal();
306 if (current_surface_) {
307 surface_manager_->SurfaceDamageExpected(current_surface_->surface_id(),
308 args);
309 }
302 last_begin_frame_args_ = args; 310 last_begin_frame_args_ = args;
303 if (client_) 311 if (client_)
304 client_->OnBeginFrame(args); 312 client_->OnBeginFrame(args);
305 } 313 }
306 314
307 const BeginFrameArgs& CompositorFrameSinkSupport::LastUsedBeginFrameArgs() 315 const BeginFrameArgs& CompositorFrameSinkSupport::LastUsedBeginFrameArgs()
308 const { 316 const {
309 return last_begin_frame_args_; 317 return last_begin_frame_args_;
310 } 318 }
311 319
312 void CompositorFrameSinkSupport::OnBeginFrameSourcePausedChanged(bool paused) {} 320 void CompositorFrameSinkSupport::OnBeginFrameSourcePausedChanged(bool paused) {}
313 321
314 void CompositorFrameSinkSupport::OnSurfaceActivated(Surface* surface) { 322 void CompositorFrameSinkSupport::OnSurfaceActivated(Surface* surface) {
315 DCHECK(surface->HasActiveFrame()); 323 DCHECK(surface->HasActiveFrame());
324 const CompositorFrame& frame = surface->GetActiveFrame();
316 if (!seen_first_frame_activation_) { 325 if (!seen_first_frame_activation_) {
326 // SurfaceCreated only applies for the first Surface activation.
317 seen_first_frame_activation_ = true; 327 seen_first_frame_activation_ = true;
318 328
319 const CompositorFrame& frame = surface->GetActiveFrame();
320 gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size(); 329 gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size();
321
322 // SurfaceCreated only applies for the first Surface activation. Thus,
323 // SurfaceFactory stops observing new activations after the first one.
324 surface_manager_->SurfaceCreated(SurfaceInfo( 330 surface_manager_->SurfaceCreated(SurfaceInfo(
325 surface->surface_id(), frame.metadata.device_scale_factor, frame_size)); 331 surface->surface_id(), frame.metadata.device_scale_factor, frame_size));
326 } 332 }
327 // Fire SurfaceCreated first so that a temporary reference is added before it 333 // Fire SurfaceCreated first so that a temporary reference is added before it
328 // is potentially transformed into a real reference by the client. 334 // is potentially transformed into a real reference by the client.
329 ReferencedSurfacesChanged(surface->surface_id().local_surface_id(), 335 ReferencedSurfacesChanged(surface->surface_id().local_surface_id(),
330 surface->active_referenced_surfaces()); 336 surface->active_referenced_surfaces());
331 if (!surface_manager_->SurfaceModified(surface->surface_id())) { 337 if (!surface_manager_->SurfaceModified(surface->surface_id(),
338 frame.metadata.begin_frame_ack)) {
332 TRACE_EVENT_INSTANT0("cc", "Damage not visible.", TRACE_EVENT_SCOPE_THREAD); 339 TRACE_EVENT_INSTANT0("cc", "Damage not visible.", TRACE_EVENT_SCOPE_THREAD);
333 surface->RunDrawCallback(); 340 surface->RunDrawCallback();
334 } 341 }
335 surface_manager_->SurfaceActivated(surface); 342 surface_manager_->SurfaceActivated(surface);
336 } 343 }
337 344
338 void CompositorFrameSinkSupport::UpdateNeedsBeginFramesInternal() { 345 void CompositorFrameSinkSupport::UpdateNeedsBeginFramesInternal() {
339 if (!begin_frame_source_) 346 if (!begin_frame_source_)
340 return; 347 return;
341 348
(...skipping 18 matching lines...) Expand all
360 surface_manager_->DestroySurface(std::move(current_surface_)); 367 surface_manager_->DestroySurface(std::move(current_surface_));
361 } 368 }
362 369
363 void CompositorFrameSinkSupport::RequestCopyOfSurface( 370 void CompositorFrameSinkSupport::RequestCopyOfSurface(
364 std::unique_ptr<CopyOutputRequest> copy_request) { 371 std::unique_ptr<CopyOutputRequest> copy_request) {
365 if (!current_surface_) 372 if (!current_surface_)
366 return; 373 return;
367 374
368 DCHECK(current_surface_->compositor_frame_sink_support().get() == this); 375 DCHECK(current_surface_->compositor_frame_sink_support().get() == this);
369 current_surface_->RequestCopyOfOutput(std::move(copy_request)); 376 current_surface_->RequestCopyOfOutput(std::move(copy_request));
370 surface_manager_->SurfaceModified(current_surface_->surface_id()); 377 BeginFrameAck ack;
378 ack.has_damage = true;
379 if (current_surface_->HasActiveFrame())
380 surface_manager_->SurfaceModified(current_surface_->surface_id(), ack);
371 } 381 }
372 382
373 } // namespace cc 383 } // namespace cc
OLDNEW
« no previous file with comments | « cc/BUILD.gn ('k') | cc/surfaces/compositor_frame_sink_support_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698