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

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

Issue 2940183002: cc: Move ownership of surfaces to SurfaceManager (Closed)
Patch Set: Fix exo Created 3 years, 5 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/surfaces/compositor_frame_sink_support.h ('k') | cc/surfaces/surface.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 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 BeginFrameSource* begin_frame_source) { 70 BeginFrameSource* begin_frame_source) {
71 if (begin_frame_source_ && added_frame_observer_) { 71 if (begin_frame_source_ && added_frame_observer_) {
72 begin_frame_source_->RemoveObserver(this); 72 begin_frame_source_->RemoveObserver(this);
73 added_frame_observer_ = false; 73 added_frame_observer_ = false;
74 } 74 }
75 begin_frame_source_ = begin_frame_source; 75 begin_frame_source_ = begin_frame_source;
76 UpdateNeedsBeginFramesInternal(); 76 UpdateNeedsBeginFramesInternal();
77 } 77 }
78 78
79 void CompositorFrameSinkSupport::EvictCurrentSurface() { 79 void CompositorFrameSinkSupport::EvictCurrentSurface() {
80 if (!current_surface_) 80 if (!current_surface_id_.is_valid())
81 return; 81 return;
82 DestroyCurrentSurface(); 82 SurfaceId to_destroy_surface_id = current_surface_id_;
83 current_surface_id_ = SurfaceId();
84 surface_manager_->DestroySurface(to_destroy_surface_id);
83 } 85 }
84 86
85 void CompositorFrameSinkSupport::SetNeedsBeginFrame(bool needs_begin_frame) { 87 void CompositorFrameSinkSupport::SetNeedsBeginFrame(bool needs_begin_frame) {
86 needs_begin_frame_ = needs_begin_frame; 88 needs_begin_frame_ = needs_begin_frame;
87 UpdateNeedsBeginFramesInternal(); 89 UpdateNeedsBeginFramesInternal();
88 } 90 }
89 91
90 void CompositorFrameSinkSupport::DidNotProduceFrame(const BeginFrameAck& ack) { 92 void CompositorFrameSinkSupport::DidNotProduceFrame(const BeginFrameAck& ack) {
91 TRACE_EVENT2("cc", "CompositorFrameSinkSupport::DidNotProduceFrame", 93 TRACE_EVENT2("cc", "CompositorFrameSinkSupport::DidNotProduceFrame",
92 "ack.source_id", ack.source_id, "ack.sequence_number", 94 "ack.source_id", ack.source_id, "ack.sequence_number",
93 ack.sequence_number); 95 ack.sequence_number);
94 DCHECK_GE(ack.sequence_number, BeginFrameArgs::kStartingFrameNumber); 96 DCHECK_GE(ack.sequence_number, BeginFrameArgs::kStartingFrameNumber);
95 97
96 // |has_damage| is not transmitted, but false by default. 98 // |has_damage| is not transmitted, but false by default.
97 DCHECK(!ack.has_damage); 99 DCHECK(!ack.has_damage);
98 100
99 if (current_surface_) 101 if (current_surface_id_.is_valid())
100 surface_manager_->SurfaceModified(current_surface_->surface_id(), ack); 102 surface_manager_->SurfaceModified(current_surface_id_, ack);
103
101 if (begin_frame_source_) 104 if (begin_frame_source_)
102 begin_frame_source_->DidFinishFrame(this); 105 begin_frame_source_->DidFinishFrame(this);
103 } 106 }
104 107
105 bool CompositorFrameSinkSupport::SubmitCompositorFrame( 108 bool CompositorFrameSinkSupport::SubmitCompositorFrame(
106 const LocalSurfaceId& local_surface_id, 109 const LocalSurfaceId& local_surface_id,
107 CompositorFrame frame) { 110 CompositorFrame frame) {
108 TRACE_EVENT0("cc", "CompositorFrameSinkSupport::SubmitCompositorFrame"); 111 TRACE_EVENT0("cc", "CompositorFrameSinkSupport::SubmitCompositorFrame");
109 DCHECK(local_surface_id.is_valid()); 112 DCHECK(local_surface_id.is_valid());
110 DCHECK(!frame.render_pass_list.empty()); 113 DCHECK(!frame.render_pass_list.empty());
111 114
112 ++ack_pending_count_; 115 ++ack_pending_count_;
113 116
114 // |has_damage| is not transmitted. 117 // |has_damage| is not transmitted.
115 frame.metadata.begin_frame_ack.has_damage = true; 118 frame.metadata.begin_frame_ack.has_damage = true;
116 BeginFrameAck ack = frame.metadata.begin_frame_ack; 119 BeginFrameAck ack = frame.metadata.begin_frame_ack;
117 DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); 120 DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
118 121
119 if (!ui::LatencyInfo::Verify(frame.metadata.latency_info, 122 if (!ui::LatencyInfo::Verify(frame.metadata.latency_info,
120 "RenderWidgetHostImpl::OnSwapCompositorFrame")) { 123 "RenderWidgetHostImpl::OnSwapCompositorFrame")) {
121 std::vector<ui::LatencyInfo>().swap(frame.metadata.latency_info); 124 std::vector<ui::LatencyInfo>().swap(frame.metadata.latency_info);
122 } 125 }
123 for (ui::LatencyInfo& latency : frame.metadata.latency_info) { 126 for (ui::LatencyInfo& latency : frame.metadata.latency_info) {
124 if (latency.latency_components().size() > 0) { 127 if (latency.latency_components().size() > 0) {
125 latency.AddLatencyNumber(ui::DISPLAY_COMPOSITOR_RECEIVED_FRAME_COMPONENT, 128 latency.AddLatencyNumber(ui::DISPLAY_COMPOSITOR_RECEIVED_FRAME_COMPONENT,
126 0, 0); 129 0, 0);
127 } 130 }
128 } 131 }
129 132
130 std::unique_ptr<Surface> surface; 133 Surface* prev_surface =
131 bool create_new_surface = 134 surface_manager_->GetSurfaceForId(current_surface_id_);
132 (!current_surface_ || 135 Surface* current_surface = nullptr;
133 local_surface_id != current_surface_->surface_id().local_surface_id()); 136 if (prev_surface &&
134 if (!create_new_surface) { 137 local_surface_id == current_surface_id_.local_surface_id()) {
135 surface = std::move(current_surface_); 138 current_surface = prev_surface;
136 } else { 139 } else {
137 SurfaceId surface_id(frame_sink_id_, local_surface_id); 140 SurfaceId surface_id(frame_sink_id_, local_surface_id);
138 gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size(); 141 gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size();
139 float device_scale_factor = frame.metadata.device_scale_factor; 142 float device_scale_factor = frame.metadata.device_scale_factor;
140 SurfaceInfo surface_info(surface_id, device_scale_factor, frame_size); 143 SurfaceInfo surface_info(surface_id, device_scale_factor, frame_size);
141 144
142 if (!surface_info.is_valid()) { 145 if (!surface_info.is_valid()) {
143 TRACE_EVENT_INSTANT0("cc", "Invalid SurfaceInfo", 146 TRACE_EVENT_INSTANT0("cc", "Invalid SurfaceInfo",
144 TRACE_EVENT_SCOPE_THREAD); 147 TRACE_EVENT_SCOPE_THREAD);
145 if (current_surface_) 148 EvictCurrentSurface();
146 DestroyCurrentSurface();
147 ReturnedResourceArray resources; 149 ReturnedResourceArray resources;
148 TransferableResource::ReturnResources(frame.resource_list, &resources); 150 TransferableResource::ReturnResources(frame.resource_list, &resources);
149 ReturnResources(resources); 151 ReturnResources(resources);
150 DidReceiveCompositorFrameAck(); 152 DidReceiveCompositorFrameAck();
151 return true; 153 return true;
152 } 154 }
153 155
154 surface = CreateSurface(surface_info); 156 current_surface = CreateSurface(surface_info);
155 surface_manager_->SurfaceDamageExpected(surface->surface_id(), 157 current_surface_id_ = SurfaceId(frame_sink_id_, local_surface_id);
158 surface_manager_->SurfaceDamageExpected(current_surface->surface_id(),
156 last_begin_frame_args_); 159 last_begin_frame_args_);
157 } 160 }
158 161
159 bool result = surface->QueueFrame( 162 bool result = current_surface->QueueFrame(
160 std::move(frame), 163 std::move(frame),
161 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck, 164 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck,
162 weak_factory_.GetWeakPtr()), 165 weak_factory_.GetWeakPtr()),
163 base::BindRepeating(&CompositorFrameSinkSupport::WillDrawSurface, 166 base::BindRepeating(&CompositorFrameSinkSupport::WillDrawSurface,
164 weak_factory_.GetWeakPtr())); 167 weak_factory_.GetWeakPtr()));
165 168
166 if (!result) { 169 if (!result) {
167 surface_manager_->DestroySurface(std::move(surface)); 170 EvictCurrentSurface();
168 return false; 171 return false;
169 } 172 }
170 173
171 if (current_surface_) { 174 if (prev_surface && prev_surface != current_surface) {
172 surface->SetPreviousFrameSurface(current_surface_.get()); 175 current_surface->SetPreviousFrameSurface(prev_surface);
173 DestroyCurrentSurface(); 176 surface_manager_->DestroySurface(prev_surface->surface_id());
174 } 177 }
175 current_surface_ = std::move(surface);
176 178
177 if (begin_frame_source_) 179 if (begin_frame_source_)
178 begin_frame_source_->DidFinishFrame(this); 180 begin_frame_source_->DidFinishFrame(this);
179 181
180 return true; 182 return true;
181 } 183 }
182 184
183 void CompositorFrameSinkSupport::UpdateSurfaceReferences( 185 void CompositorFrameSinkSupport::UpdateSurfaceReferences(
184 const LocalSurfaceId& local_surface_id, 186 const LocalSurfaceId& local_surface_id,
185 const std::vector<SurfaceId>& active_referenced_surfaces) { 187 const std::vector<SurfaceId>& active_referenced_surfaces) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 283
282 void CompositorFrameSinkSupport::Init(SurfaceManager* surface_manager) { 284 void CompositorFrameSinkSupport::Init(SurfaceManager* surface_manager) {
283 surface_manager_ = surface_manager; 285 surface_manager_ = surface_manager;
284 if (handles_frame_sink_id_invalidation_) 286 if (handles_frame_sink_id_invalidation_)
285 surface_manager_->RegisterFrameSinkId(frame_sink_id_); 287 surface_manager_->RegisterFrameSinkId(frame_sink_id_);
286 surface_manager_->RegisterFrameSinkManagerClient(frame_sink_id_, this); 288 surface_manager_->RegisterFrameSinkManagerClient(frame_sink_id_, this);
287 } 289 }
288 290
289 void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) { 291 void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) {
290 UpdateNeedsBeginFramesInternal(); 292 UpdateNeedsBeginFramesInternal();
291 if (current_surface_) { 293 if (current_surface_id_.is_valid()) {
292 surface_manager_->SurfaceDamageExpected(current_surface_->surface_id(), 294 surface_manager_->SurfaceDamageExpected(current_surface_id_, args);
293 args);
294 } 295 }
295 last_begin_frame_args_ = args; 296 last_begin_frame_args_ = args;
296 if (client_) 297 if (client_)
297 client_->OnBeginFrame(args); 298 client_->OnBeginFrame(args);
298 } 299 }
299 300
300 const BeginFrameArgs& CompositorFrameSinkSupport::LastUsedBeginFrameArgs() 301 const BeginFrameArgs& CompositorFrameSinkSupport::LastUsedBeginFrameArgs()
301 const { 302 const {
302 return last_begin_frame_args_; 303 return last_begin_frame_args_;
303 } 304 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 if (needs_begin_frame_ == added_frame_observer_) 336 if (needs_begin_frame_ == added_frame_observer_)
336 return; 337 return;
337 338
338 added_frame_observer_ = needs_begin_frame_; 339 added_frame_observer_ = needs_begin_frame_;
339 if (needs_begin_frame_) 340 if (needs_begin_frame_)
340 begin_frame_source_->AddObserver(this); 341 begin_frame_source_->AddObserver(this);
341 else 342 else
342 begin_frame_source_->RemoveObserver(this); 343 begin_frame_source_->RemoveObserver(this);
343 } 344 }
344 345
345 std::unique_ptr<Surface> CompositorFrameSinkSupport::CreateSurface( 346 Surface* CompositorFrameSinkSupport::CreateSurface(
346 const SurfaceInfo& surface_info) { 347 const SurfaceInfo& surface_info) {
347 seen_first_frame_activation_ = false; 348 seen_first_frame_activation_ = false;
348 return surface_manager_->CreateSurface(weak_factory_.GetWeakPtr(), 349 return surface_manager_->CreateSurface(weak_factory_.GetWeakPtr(),
349 surface_info); 350 surface_info);
350 } 351 }
351 352
352 void CompositorFrameSinkSupport::DestroyCurrentSurface() { 353 void CompositorFrameSinkSupport::RequestCopyOfSurface(
353 surface_manager_->DestroySurface(std::move(current_surface_)); 354 std::unique_ptr<CopyOutputRequest> copy_request) {
355 if (!current_surface_id_.is_valid())
356 return;
357 Surface* current_surface =
358 surface_manager_->GetSurfaceForId(current_surface_id_);
359 DCHECK_EQ(this, current_surface->compositor_frame_sink_support().get());
360 current_surface->RequestCopyOfOutput(std::move(copy_request));
361 BeginFrameAck ack;
362 ack.has_damage = true;
363 if (current_surface->HasActiveFrame())
364 surface_manager_->SurfaceModified(current_surface->surface_id(), ack);
354 } 365 }
355 366
356 void CompositorFrameSinkSupport::RequestCopyOfSurface( 367 Surface* CompositorFrameSinkSupport::GetCurrentSurfaceForTesting() {
357 std::unique_ptr<CopyOutputRequest> copy_request) { 368 return surface_manager_->GetSurfaceForId(current_surface_id_);
358 if (!current_surface_)
359 return;
360
361 DCHECK(current_surface_->compositor_frame_sink_support().get() == this);
362 current_surface_->RequestCopyOfOutput(std::move(copy_request));
363 BeginFrameAck ack;
364 ack.has_damage = true;
365 if (current_surface_->HasActiveFrame())
366 surface_manager_->SurfaceModified(current_surface_->surface_id(), ack);
367 } 369 }
368 370
369 } // namespace cc 371 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.h ('k') | cc/surfaces/surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698