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

Side by Side Diff: services/ui/surfaces/gpu_compositor_frame_sink.cc

Issue 2654693003: Decouple GpuCompositorFrameSink from DisplayCompositor (Closed)
Patch Set: Fix vars Created 3 years, 11 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 "services/ui/surfaces/gpu_compositor_frame_sink.h" 5 #include "services/ui/surfaces/gpu_compositor_frame_sink.h"
6 6
7 #include "cc/surfaces/surface_reference.h" 7 #include "cc/surfaces/surface_reference.h"
8 #include "services/ui/surfaces/display_compositor.h" 8 #include "services/ui/surfaces/display_compositor.h"
9 9
10 namespace ui { 10 namespace ui {
11 11
12 GpuCompositorFrameSink::GpuCompositorFrameSink( 12 GpuCompositorFrameSink::GpuCompositorFrameSink(
13 DisplayCompositor* display_compositor, 13 cc::CompositorFrameSinkDelegate* delegate,
14 cc::SurfaceManager* surface_manager,
14 const cc::FrameSinkId& frame_sink_id, 15 const cc::FrameSinkId& frame_sink_id,
15 std::unique_ptr<cc::Display> display, 16 std::unique_ptr<cc::Display> display,
16 std::unique_ptr<cc::BeginFrameSource> begin_frame_source, 17 std::unique_ptr<cc::BeginFrameSource> begin_frame_source,
17 cc::mojom::MojoCompositorFrameSinkPrivateRequest 18 cc::mojom::MojoCompositorFrameSinkPrivateRequest
18 compositor_frame_sink_private_request, 19 compositor_frame_sink_private_request,
19 cc::mojom::MojoCompositorFrameSinkClientPtr client) 20 cc::mojom::MojoCompositorFrameSinkClientPtr client)
20 : display_compositor_(display_compositor), 21 : delegate_(delegate),
21 support_(this, 22 support_(this,
22 display_compositor->manager(), 23 surface_manager,
23 frame_sink_id, 24 frame_sink_id,
24 std::move(display), 25 std::move(display),
25 std::move(begin_frame_source)), 26 std::move(begin_frame_source)),
27 surface_manager_(surface_manager),
26 surface_tracker_(frame_sink_id), 28 surface_tracker_(frame_sink_id),
27 client_(std::move(client)), 29 client_(std::move(client)),
28 compositor_frame_sink_private_binding_( 30 compositor_frame_sink_private_binding_(
29 this, 31 this,
30 std::move(compositor_frame_sink_private_request)) { 32 std::move(compositor_frame_sink_private_request)) {
31 compositor_frame_sink_private_binding_.set_connection_error_handler( 33 compositor_frame_sink_private_binding_.set_connection_error_handler(
32 base::Bind(&GpuCompositorFrameSink::OnPrivateConnectionLost, 34 base::Bind(&GpuCompositorFrameSink::OnPrivateConnectionLost,
33 base::Unretained(this))); 35 base::Unretained(this)));
34 } 36 }
35 37
36 GpuCompositorFrameSink::~GpuCompositorFrameSink() { 38 GpuCompositorFrameSink::~GpuCompositorFrameSink() {
37 // For display root surfaces, remove the reference from top level root to 39 // For display root surfaces, remove the reference from top level root to
38 // indicate the display root surface is no longer visible. 40 // indicate the display root surface is no longer visible.
39 if (support_.display() && surface_tracker_.current_surface_id().is_valid()) { 41 if (support_.display() && surface_tracker_.current_surface_id().is_valid()) {
40 const cc::SurfaceId top_level_root_surface_id = 42 const cc::SurfaceId top_level_root_surface_id =
41 display_compositor_->manager()->GetRootSurfaceId(); 43 surface_manager_->GetRootSurfaceId();
42 std::vector<cc::SurfaceReference> references_to_remove{cc::SurfaceReference( 44 std::vector<cc::SurfaceReference> references_to_remove{cc::SurfaceReference(
43 top_level_root_surface_id, surface_tracker_.current_surface_id())}; 45 top_level_root_surface_id, surface_tracker_.current_surface_id())};
44 display_compositor_->RemoveSurfaceReferences(references_to_remove); 46 RemoveSurfaceReferences(references_to_remove);
45 } 47 }
46 } 48 }
47 49
48 void GpuCompositorFrameSink::EvictFrame() { 50 void GpuCompositorFrameSink::EvictFrame() {
49 support_.EvictFrame(); 51 support_.EvictFrame();
50 } 52 }
51 53
52 void GpuCompositorFrameSink::SetNeedsBeginFrame(bool needs_begin_frame) { 54 void GpuCompositorFrameSink::SetNeedsBeginFrame(bool needs_begin_frame) {
53 support_.SetNeedsBeginFrame(needs_begin_frame); 55 support_.SetNeedsBeginFrame(needs_begin_frame);
54 } 56 }
(...skipping 12 matching lines...) Expand all
67 std::vector<cc::SurfaceReference>& references_to_add = 69 std::vector<cc::SurfaceReference>& references_to_add =
68 surface_tracker_.references_to_add(); 70 surface_tracker_.references_to_add();
69 std::vector<cc::SurfaceReference>& references_to_remove = 71 std::vector<cc::SurfaceReference>& references_to_remove =
70 surface_tracker_.references_to_remove(); 72 surface_tracker_.references_to_remove();
71 73
72 // Append TLR references for the display root surfaces when display root 74 // Append TLR references for the display root surfaces when display root
73 // surface changes. 75 // surface changes.
74 if (support_.display() && 76 if (support_.display() &&
75 start_surface_id != surface_tracker_.current_surface_id()) { 77 start_surface_id != surface_tracker_.current_surface_id()) {
76 const cc::SurfaceId top_level_root_surface_id = 78 const cc::SurfaceId top_level_root_surface_id =
77 display_compositor_->manager()->GetRootSurfaceId(); 79 surface_manager_->GetRootSurfaceId();
78 80
79 // The first frame will not have a valid |start_surface_id| and there will 81 // The first frame will not have a valid |start_surface_id| and there will
80 // be no surface to remove. 82 // be no surface to remove.
81 if (start_surface_id.local_frame_id().is_valid()) { 83 if (start_surface_id.local_frame_id().is_valid()) {
82 references_to_remove.push_back( 84 references_to_remove.push_back(
83 cc::SurfaceReference(top_level_root_surface_id, start_surface_id)); 85 cc::SurfaceReference(top_level_root_surface_id, start_surface_id));
84 } 86 }
85 87
86 references_to_add.push_back(cc::SurfaceReference( 88 references_to_add.push_back(cc::SurfaceReference(
87 top_level_root_surface_id, surface_tracker_.current_surface_id())); 89 top_level_root_surface_id, surface_tracker_.current_surface_id()));
88 } 90 }
89 91
90 if (!references_to_add.empty()) 92 if (!references_to_add.empty())
91 display_compositor_->AddSurfaceReferences(references_to_add); 93 AddSurfaceReferences(references_to_add);
92 if (!references_to_remove.empty()) 94 if (!references_to_remove.empty())
93 display_compositor_->RemoveSurfaceReferences(references_to_remove); 95 RemoveSurfaceReferences(references_to_remove);
96 }
97
98 void GpuCompositorFrameSink::AddSurfaceReferences(
Fady Samuel 2017/01/24 13:09:43 Move this to SurfaceManager.
99 const std::vector<cc::SurfaceReference>& references) {
100 for (const auto& reference : references) {
101 surface_manager_->AddSurfaceReference(reference.parent_id(),
102 reference.child_id());
103 }
104 }
105
106 void GpuCompositorFrameSink::RemoveSurfaceReferences(
Fady Samuel 2017/01/24 13:09:43 I'd just move this to SurfaceManager.
107 const std::vector<cc::SurfaceReference>& references) {
108 // TODO(kylechar): Each remove reference can trigger GC, it would be better if
109 // we GC only once if removing multiple references.
110 for (const auto& reference : references) {
111 surface_manager_->RemoveSurfaceReference(reference.parent_id(),
112 reference.child_id());
113 }
94 } 114 }
95 115
96 void GpuCompositorFrameSink::Require(const cc::LocalFrameId& local_frame_id, 116 void GpuCompositorFrameSink::Require(const cc::LocalFrameId& local_frame_id,
97 const cc::SurfaceSequence& sequence) { 117 const cc::SurfaceSequence& sequence) {
98 support_.Require(local_frame_id, sequence); 118 support_.Require(local_frame_id, sequence);
99 } 119 }
100 120
101 void GpuCompositorFrameSink::Satisfy(const cc::SurfaceSequence& sequence) { 121 void GpuCompositorFrameSink::Satisfy(const cc::SurfaceSequence& sequence) {
102 support_.Satisfy(sequence); 122 support_.Satisfy(sequence);
103 } 123 }
(...skipping 25 matching lines...) Expand all
129 } 149 }
130 150
131 void GpuCompositorFrameSink::WillDrawSurface() { 151 void GpuCompositorFrameSink::WillDrawSurface() {
132 if (client_) 152 if (client_)
133 client_->WillDrawSurface(); 153 client_->WillDrawSurface();
134 } 154 }
135 155
136 void GpuCompositorFrameSink::OnClientConnectionLost() { 156 void GpuCompositorFrameSink::OnClientConnectionLost() {
137 client_connection_lost_ = true; 157 client_connection_lost_ = true;
138 // Request destruction of |this| only if both connections are lost. 158 // Request destruction of |this| only if both connections are lost.
139 display_compositor_->OnCompositorFrameSinkClientConnectionLost( 159 delegate_->OnClientConnectionLost(support_.frame_sink_id(),
140 support_.frame_sink_id(), private_connection_lost_); 160 private_connection_lost_);
141 } 161 }
142 162
143 void GpuCompositorFrameSink::OnPrivateConnectionLost() { 163 void GpuCompositorFrameSink::OnPrivateConnectionLost() {
144 private_connection_lost_ = true; 164 private_connection_lost_ = true;
145 // Request destruction of |this| only if both connections are lost. 165 // Request destruction of |this| only if both connections are lost.
146 display_compositor_->OnCompositorFrameSinkPrivateConnectionLost( 166 delegate_->OnPrivateConnectionLost(support_.frame_sink_id(),
147 support_.frame_sink_id(), client_connection_lost_); 167 client_connection_lost_);
148 } 168 }
149 169
150 } // namespace ui 170 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698