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

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: StrictMock => NiceMock 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
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 begin_frame_source_ = manager_.CreatePrimaryBeginFrameSource();
30 dependency_tracker_ = base::MakeUnique<cc::SurfaceDependencyTracker>(
31 &manager_, begin_frame_source_.get());
32 manager_.SetDependencyTracker(dependency_tracker_.get());
29 } 33 }
30 34
31 MojoFrameSinkManager::~MojoFrameSinkManager() { 35 MojoFrameSinkManager::~MojoFrameSinkManager() {
32 DCHECK(thread_checker_.CalledOnValidThread()); 36 DCHECK(thread_checker_.CalledOnValidThread());
37 manager_.SetDependencyTracker(nullptr);
38 dependency_tracker_.reset();
39 begin_frame_source_.reset();
33 manager_.RemoveObserver(this); 40 manager_.RemoveObserver(this);
34 } 41 }
35 42
36 void MojoFrameSinkManager::Connect( 43 void MojoFrameSinkManager::Connect(
37 cc::mojom::FrameSinkManagerRequest request, 44 cc::mojom::FrameSinkManagerRequest request,
38 cc::mojom::FrameSinkManagerClientPtr client) { 45 cc::mojom::FrameSinkManagerClientPtr client) {
39 DCHECK(!binding_.is_bound()); 46 DCHECK(!binding_.is_bound());
40 binding_.Bind(std::move(request)); 47 binding_.Bind(std::move(request));
41 client_ = std::move(client); 48 client_ = std::move(client);
42 } 49 }
43 50
44 void MojoFrameSinkManager::CreateRootCompositorFrameSink( 51 void MojoFrameSinkManager::CreateRootCompositorFrameSink(
45 const cc::FrameSinkId& frame_sink_id, 52 const cc::FrameSinkId& frame_sink_id,
46 gpu::SurfaceHandle surface_handle, 53 gpu::SurfaceHandle surface_handle,
47 cc::mojom::MojoCompositorFrameSinkAssociatedRequest request, 54 cc::mojom::MojoCompositorFrameSinkAssociatedRequest request,
48 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, 55 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
49 cc::mojom::MojoCompositorFrameSinkClientPtr client, 56 cc::mojom::MojoCompositorFrameSinkClientPtr client,
50 cc::mojom::DisplayPrivateAssociatedRequest display_private_request) { 57 cc::mojom::DisplayPrivateAssociatedRequest display_private_request) {
51 DCHECK(thread_checker_.CalledOnValidThread()); 58 DCHECK(thread_checker_.CalledOnValidThread());
52 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); 59 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle);
53 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); 60 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id));
54 DCHECK(display_provider_); 61 DCHECK(display_provider_);
55 62
56 std::unique_ptr<cc::BeginFrameSource> begin_frame_source; 63 std::unique_ptr<cc::BeginFrameSource> begin_frame_source;
57 std::unique_ptr<cc::Display> display = display_provider_->CreateDisplay( 64 std::unique_ptr<cc::Display> display = display_provider_->CreateDisplay(
58 frame_sink_id, surface_handle, &begin_frame_source); 65 frame_sink_id, surface_handle, &begin_frame_source);
59 66
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] = 67 compositor_frame_sinks_[frame_sink_id] =
71 base::MakeUnique<GpuRootCompositorFrameSink>( 68 base::MakeUnique<GpuRootCompositorFrameSink>(
72 this, &manager_, frame_sink_id, std::move(display), 69 this, &manager_, frame_sink_id, std::move(display),
73 std::move(begin_frame_source), std::move(request), 70 std::move(begin_frame_source), std::move(request),
74 std::move(private_request), std::move(client), 71 std::move(private_request), std::move(client),
75 std::move(display_private_request)); 72 std::move(display_private_request));
76 } 73 }
77 74
78 void MojoFrameSinkManager::CreateCompositorFrameSink( 75 void MojoFrameSinkManager::CreateCompositorFrameSink(
79 const cc::FrameSinkId& frame_sink_id, 76 const cc::FrameSinkId& frame_sink_id,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 139
143 void MojoFrameSinkManager::OnPrivateConnectionLost( 140 void MojoFrameSinkManager::OnPrivateConnectionLost(
144 const cc::FrameSinkId& frame_sink_id, 141 const cc::FrameSinkId& frame_sink_id,
145 bool destroy_compositor_frame_sink) { 142 bool destroy_compositor_frame_sink) {
146 DCHECK(thread_checker_.CalledOnValidThread()); 143 DCHECK(thread_checker_.CalledOnValidThread());
147 if (destroy_compositor_frame_sink) 144 if (destroy_compositor_frame_sink)
148 DestroyCompositorFrameSink(frame_sink_id); 145 DestroyCompositorFrameSink(frame_sink_id);
149 } 146 }
150 147
151 } // namespace viz 148 } // namespace viz
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698