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

Side by Side Diff: services/ui/ws/frame_generator.cc

Issue 2470143006: Remove dependency on SurfaceManager in FrameGenerator (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
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 "services/ui/ws/frame_generator.h" 5 #include "services/ui/ws/frame_generator.h"
6 6
7 #include "base/containers/adapters.h" 7 #include "base/containers/adapters.h"
8 #include "cc/output/compositor_frame.h" 8 #include "cc/output/compositor_frame.h"
9 #include "cc/quads/render_pass.h" 9 #include "cc/quads/render_pass.h"
10 #include "cc/quads/render_pass_draw_quad.h" 10 #include "cc/quads/render_pass_draw_quad.h"
11 #include "cc/quads/shared_quad_state.h" 11 #include "cc/quads/shared_quad_state.h"
12 #include "cc/quads/surface_draw_quad.h" 12 #include "cc/quads/surface_draw_quad.h"
13 #include "cc/surfaces/surface.h"
14 #include "cc/surfaces/surface_id.h" 13 #include "cc/surfaces/surface_id.h"
15 #include "gpu/ipc/client/gpu_channel_host.h" 14 #include "gpu/ipc/client/gpu_channel_host.h"
16 #include "services/ui/surfaces/display_compositor.h" 15 #include "services/ui/surfaces/display_compositor.h"
17 #include "services/ui/surfaces/surfaces_context_provider.h" 16 #include "services/ui/surfaces/surfaces_context_provider.h"
18 #include "services/ui/ws/frame_generator_delegate.h" 17 #include "services/ui/ws/frame_generator_delegate.h"
19 #include "services/ui/ws/server_window.h" 18 #include "services/ui/ws/server_window.h"
20 #include "services/ui/ws/server_window_compositor_frame_sink.h" 19 #include "services/ui/ws/server_window_compositor_frame_sink.h"
21 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 20 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
22 21
23 namespace ui { 22 namespace ui {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 } 239 }
241 } 240 }
242 241
243 void FrameGenerator::AddOrUpdateSurfaceReference( 242 void FrameGenerator::AddOrUpdateSurfaceReference(
244 mojom::CompositorFrameSinkType type, 243 mojom::CompositorFrameSinkType type,
245 ServerWindow* window) { 244 ServerWindow* window) {
246 cc::SurfaceId surface_id = 245 cc::SurfaceId surface_id =
247 window->compositor_frame_sink_manager()->GetLatestSurfaceId(type); 246 window->compositor_frame_sink_manager()->GetLatestSurfaceId(type);
248 if (surface_id.is_null()) 247 if (surface_id.is_null())
249 return; 248 return;
250 // TODO(fsamuel): Use mojo interface to give root window a surface reference.
251 cc::SurfaceManager* surface_manager = display_compositor_->manager();
252 auto it = dependencies_.find(surface_id.frame_sink_id()); 249 auto it = dependencies_.find(surface_id.frame_sink_id());
253 if (it == dependencies_.end()) { 250 if (it == dependencies_.end()) {
254 cc::Surface* surface = surface_manager->GetSurfaceForId(surface_id);
255 if (!surface) {
256 LOG(ERROR) << "Attempting to add dependency to nonexistent surface "
257 << surface_id.ToString();
258 return;
259 }
260 SurfaceDependency dependency = { 251 SurfaceDependency dependency = {
261 surface_id.local_frame_id(), 252 surface_id.local_frame_id(),
262 surface_sequence_generator_.CreateSurfaceSequence()}; 253 surface_sequence_generator_.CreateSurfaceSequence()};
263 surface->AddDestructionDependency(dependency.sequence);
264 dependencies_[surface_id.frame_sink_id()] = dependency; 254 dependencies_[surface_id.frame_sink_id()] = dependency;
255 display_compositor_->AddSurfaceReference(surface_id, dependency.sequence);
265 // Observe |window_surface|'s window so that we can release references when 256 // Observe |window_surface|'s window so that we can release references when
266 // the window is destroyed. 257 // the window is destroyed.
267 Add(window); 258 Add(window);
268 return; 259 return;
269 } 260 }
270 261
271 // We are already holding a reference to this surface so there's no work to do 262 // We are already holding a reference to this surface so there's no work to do
272 // here. 263 // here.
273 if (surface_id.local_frame_id() == it->second.local_frame_id) 264 if (surface_id.local_frame_id() == it->second.local_frame_id)
274 return; 265 return;
(...skipping 12 matching lines...) Expand all
287 AddOrUpdateSurfaceReference(type, window); 278 AddOrUpdateSurfaceReference(type, window);
288 } 279 }
289 280
290 void FrameGenerator::ReleaseFrameSinkReference( 281 void FrameGenerator::ReleaseFrameSinkReference(
291 const cc::FrameSinkId& frame_sink_id) { 282 const cc::FrameSinkId& frame_sink_id) {
292 auto it = dependencies_.find(frame_sink_id); 283 auto it = dependencies_.find(frame_sink_id);
293 if (it == dependencies_.end()) 284 if (it == dependencies_.end())
294 return; 285 return;
295 std::vector<uint32_t> sequences; 286 std::vector<uint32_t> sequences;
296 sequences.push_back(it->second.sequence.sequence); 287 sequences.push_back(it->second.sequence.sequence);
297 cc::SurfaceManager* surface_manager = display_compositor_->manager(); 288 display_compositor_->ReturnSurfaceReferences(frame_sink_id,
298 surface_manager->DidSatisfySequences(frame_sink_id_, &sequences); 289 std::move(sequences));
299 dependencies_.erase(it); 290 dependencies_.erase(it);
300 } 291 }
301 292
302 void FrameGenerator::ReleaseAllSurfaceReferences() { 293 void FrameGenerator::ReleaseAllSurfaceReferences() {
303 cc::SurfaceManager* surface_manager = display_compositor_->manager();
304 std::vector<uint32_t> sequences; 294 std::vector<uint32_t> sequences;
305 for (auto& dependency : dependencies_) 295 for (auto& dependency : dependencies_)
306 sequences.push_back(dependency.second.sequence.sequence); 296 sequences.push_back(dependency.second.sequence.sequence);
307 surface_manager->DidSatisfySequences(frame_sink_id_, &sequences); 297 display_compositor_->ReturnSurfaceReferences(frame_sink_id_,
298 std::move(sequences));
308 dependencies_.clear(); 299 dependencies_.clear();
309 } 300 }
310 301
311 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { 302 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
312 Remove(window); 303 Remove(window);
313 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager = 304 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager =
314 window->compositor_frame_sink_manager(); 305 window->compositor_frame_sink_manager();
315 // If FrameGenerator was observing |window|, then that means it had a 306 // If FrameGenerator was observing |window|, then that means it had a
316 // CompositorFrame at some point in time and should have a 307 // CompositorFrame at some point in time and should have a
317 // ServerWindowCompositorFrameSinkManager. 308 // ServerWindowCompositorFrameSinkManager.
318 DCHECK(compositor_frame_sink_manager); 309 DCHECK(compositor_frame_sink_manager);
319 310
320 cc::SurfaceId default_surface_id = 311 cc::SurfaceId default_surface_id =
321 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 312 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
322 mojom::CompositorFrameSinkType::DEFAULT); 313 mojom::CompositorFrameSinkType::DEFAULT);
323 if (!default_surface_id.is_null()) 314 if (!default_surface_id.is_null())
324 ReleaseFrameSinkReference(default_surface_id.frame_sink_id()); 315 ReleaseFrameSinkReference(default_surface_id.frame_sink_id());
325 316
326 cc::SurfaceId underlay_surface_id = 317 cc::SurfaceId underlay_surface_id =
327 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 318 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
328 mojom::CompositorFrameSinkType::UNDERLAY); 319 mojom::CompositorFrameSinkType::UNDERLAY);
329 if (!underlay_surface_id.is_null()) 320 if (!underlay_surface_id.is_null())
330 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id()); 321 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id());
331 } 322 }
332 323
333 } // namespace ws 324 } // namespace ws
334 325
335 } // namespace ui 326 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698