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

Side by Side Diff: components/viz/frame_sinks/mojo_frame_sink_manager.cc

Issue 2880023002: cc::SurfaceDependencyTracker should not crash when a Display goes away (Closed)
Patch Set: Fix LayerTreeHostImpl unit tests Created 3 years, 7 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 | « components/viz/frame_sinks/mojo_frame_sink_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/viz/frame_sinks/mojo_frame_sink_manager.h" 5 #include "components/viz/frame_sinks/mojo_frame_sink_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "cc/base/switches.h" 11 #include "cc/base/switches.h"
12 #include "cc/scheduler/begin_frame_source.h" 12 #include "cc/scheduler/begin_frame_source.h"
13 #include "cc/surfaces/display.h" 13 #include "cc/surfaces/display.h"
14 #include "cc/surfaces/surface_dependency_tracker.h" 14 #include "cc/surfaces/surface_dependency_tracker.h"
15 #include "components/viz/frame_sinks/display_provider.h" 15 #include "components/viz/frame_sinks/display_provider.h"
16 #include "components/viz/frame_sinks/gpu_compositor_frame_sink.h" 16 #include "components/viz/frame_sinks/gpu_compositor_frame_sink.h"
17 #include "components/viz/frame_sinks/gpu_root_compositor_frame_sink.h" 17 #include "components/viz/frame_sinks/gpu_root_compositor_frame_sink.h"
18 18
19 namespace viz { 19 namespace viz {
20 20
21 MojoFrameSinkManager::MojoFrameSinkManager(bool use_surface_references, 21 MojoFrameSinkManager::MojoFrameSinkManager(bool use_surface_references,
22 DisplayProvider* display_provider) 22 DisplayProvider* display_provider)
23 : manager_(use_surface_references 23 : manager_(use_surface_references
24 ? cc::SurfaceManager::LifetimeType::REFERENCES 24 ? cc::SurfaceManager::LifetimeType::REFERENCES
25 : cc::SurfaceManager::LifetimeType::SEQUENCES), 25 : cc::SurfaceManager::LifetimeType::SEQUENCES),
26 display_provider_(display_provider), 26 display_provider_(display_provider),
27 binding_(this) { 27 binding_(this) {
28 manager_.AddObserver(this); 28 manager_.AddObserver(this);
29 dependency_tracker_ = base::MakeUnique<cc::SurfaceDependencyTracker>(
30 &manager_, manager_.GetPrimaryBeginFrameSource());
31 manager_.SetDependencyTracker(dependency_tracker_.get());
29 } 32 }
30 33
31 MojoFrameSinkManager::~MojoFrameSinkManager() { 34 MojoFrameSinkManager::~MojoFrameSinkManager() {
32 DCHECK(thread_checker_.CalledOnValidThread()); 35 DCHECK(thread_checker_.CalledOnValidThread());
36 manager_.SetDependencyTracker(nullptr);
37 dependency_tracker_.reset();
33 manager_.RemoveObserver(this); 38 manager_.RemoveObserver(this);
34 } 39 }
35 40
36 void MojoFrameSinkManager::Connect( 41 void MojoFrameSinkManager::Connect(
37 cc::mojom::FrameSinkManagerRequest request, 42 cc::mojom::FrameSinkManagerRequest request,
38 cc::mojom::FrameSinkManagerClientPtr client) { 43 cc::mojom::FrameSinkManagerClientPtr client) {
39 DCHECK(!binding_.is_bound()); 44 DCHECK(!binding_.is_bound());
40 binding_.Bind(std::move(request)); 45 binding_.Bind(std::move(request));
41 client_ = std::move(client); 46 client_ = std::move(client);
42 } 47 }
43 48
44 void MojoFrameSinkManager::CreateRootCompositorFrameSink( 49 void MojoFrameSinkManager::CreateRootCompositorFrameSink(
45 const cc::FrameSinkId& frame_sink_id, 50 const cc::FrameSinkId& frame_sink_id,
46 gpu::SurfaceHandle surface_handle, 51 gpu::SurfaceHandle surface_handle,
47 cc::mojom::MojoCompositorFrameSinkAssociatedRequest request, 52 cc::mojom::MojoCompositorFrameSinkAssociatedRequest request,
48 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, 53 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
49 cc::mojom::MojoCompositorFrameSinkClientPtr client, 54 cc::mojom::MojoCompositorFrameSinkClientPtr client,
50 cc::mojom::DisplayPrivateAssociatedRequest display_private_request) { 55 cc::mojom::DisplayPrivateAssociatedRequest display_private_request) {
51 DCHECK(thread_checker_.CalledOnValidThread()); 56 DCHECK(thread_checker_.CalledOnValidThread());
52 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); 57 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle);
53 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); 58 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id));
54 DCHECK(display_provider_); 59 DCHECK(display_provider_);
55 60
56 std::unique_ptr<cc::BeginFrameSource> begin_frame_source; 61 std::unique_ptr<cc::BeginFrameSource> begin_frame_source;
57 std::unique_ptr<cc::Display> display = display_provider_->CreateDisplay( 62 std::unique_ptr<cc::Display> display = display_provider_->CreateDisplay(
58 frame_sink_id, surface_handle, &begin_frame_source); 63 frame_sink_id, surface_handle, &begin_frame_source);
59 64
60 // Lazily inject a SurfaceDependencyTracker into SurfaceManager if surface
61 // synchronization is enabled.
62 if (!manager_.dependency_tracker() &&
63 base::CommandLine::ForCurrentProcess()->HasSwitch(
64 cc::switches::kEnableSurfaceSynchronization)) {
65 std::unique_ptr<cc::SurfaceDependencyTracker> dependency_tracker(
66 new cc::SurfaceDependencyTracker(&manager_, begin_frame_source.get()));
67 manager_.SetDependencyTracker(std::move(dependency_tracker));
68 }
69
70 compositor_frame_sinks_[frame_sink_id] = 65 compositor_frame_sinks_[frame_sink_id] =
71 base::MakeUnique<GpuRootCompositorFrameSink>( 66 base::MakeUnique<GpuRootCompositorFrameSink>(
72 this, &manager_, frame_sink_id, std::move(display), 67 this, &manager_, frame_sink_id, std::move(display),
73 std::move(begin_frame_source), std::move(request), 68 std::move(begin_frame_source), std::move(request),
74 std::move(private_request), std::move(client), 69 std::move(private_request), std::move(client),
75 std::move(display_private_request)); 70 std::move(display_private_request));
76 } 71 }
77 72
78 void MojoFrameSinkManager::CreateCompositorFrameSink( 73 void MojoFrameSinkManager::CreateCompositorFrameSink(
79 const cc::FrameSinkId& frame_sink_id, 74 const cc::FrameSinkId& frame_sink_id,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 140
146 void MojoFrameSinkManager::OnPrivateConnectionLost( 141 void MojoFrameSinkManager::OnPrivateConnectionLost(
147 const cc::FrameSinkId& frame_sink_id, 142 const cc::FrameSinkId& frame_sink_id,
148 bool destroy_compositor_frame_sink) { 143 bool destroy_compositor_frame_sink) {
149 DCHECK(thread_checker_.CalledOnValidThread()); 144 DCHECK(thread_checker_.CalledOnValidThread());
150 if (destroy_compositor_frame_sink) 145 if (destroy_compositor_frame_sink)
151 DestroyCompositorFrameSink(frame_sink_id); 146 DestroyCompositorFrameSink(frame_sink_id);
152 } 147 }
153 148
154 } // namespace viz 149 } // namespace viz
OLDNEW
« no previous file with comments | « components/viz/frame_sinks/mojo_frame_sink_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698