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

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

Issue 2481263002: Introduce Display Compositor mojo interface. Use InProcessContextProvider. (Closed)
Patch Set: Make ContextProvider NON_EXPORTED_BASE of InProcessContextProvider 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_id.h" 13 #include "cc/surfaces/surface_id.h"
14 #include "gpu/ipc/client/gpu_channel_host.h"
15 #include "services/ui/surfaces/display_compositor.h"
16 #include "services/ui/surfaces/surfaces_context_provider.h"
17 #include "services/ui/ws/frame_generator_delegate.h" 14 #include "services/ui/ws/frame_generator_delegate.h"
18 #include "services/ui/ws/server_window.h" 15 #include "services/ui/ws/server_window.h"
19 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 16 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
20 #include "services/ui/ws/server_window_delegate.h" 17 #include "services/ui/ws/server_window_delegate.h"
21 18
22 namespace ui { 19 namespace ui {
23 20
24 namespace ws { 21 namespace ws {
25 22
26 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 23 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
(...skipping 10 matching lines...) Expand all
37 } 34 }
38 35
39 FrameGenerator::~FrameGenerator() { 36 FrameGenerator::~FrameGenerator() {
40 ReleaseAllSurfaceReferences(); 37 ReleaseAllSurfaceReferences();
41 // Invalidate WeakPtrs now to avoid callbacks back into the 38 // Invalidate WeakPtrs now to avoid callbacks back into the
42 // FrameGenerator during destruction of |compositor_frame_sink_|. 39 // FrameGenerator during destruction of |compositor_frame_sink_|.
43 weak_factory_.InvalidateWeakPtrs(); 40 weak_factory_.InvalidateWeakPtrs();
44 compositor_frame_sink_.reset(); 41 compositor_frame_sink_.reset();
45 } 42 }
46 43
47 void FrameGenerator::OnGpuChannelEstablished(
48 scoped_refptr<gpu::GpuChannelHost> channel) {
49 if (widget_ != gfx::kNullAcceleratedWidget) {
50 cc::mojom::MojoCompositorFrameSinkRequest request =
51 mojo::GetProxy(&compositor_frame_sink_);
52 // TODO(fsamuel): FrameGenerator should not know about
53 // SurfacesContextProvider. In fact, FrameGenerator should not know
54 // about GpuChannelHost.
55 root_window_->CreateCompositorFrameSink(
56 mojom::CompositorFrameSinkType::DEFAULT, widget_,
57 channel->gpu_memory_buffer_manager(),
58 new SurfacesContextProvider(widget_, channel), std::move(request),
59 binding_.CreateInterfacePtrAndBind());
60 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
61 // even when we don't need it. Once surface ID propagation work is done,
62 // this will not be necessary because FrameGenerator will only need a
63 // BeginFrame if the window manager changes.
64 compositor_frame_sink_->SetNeedsBeginFrame(true);
65 } else {
66 gpu_channel_ = std::move(channel);
67 }
68 }
69
70 void FrameGenerator::OnAcceleratedWidgetAvailable( 44 void FrameGenerator::OnAcceleratedWidgetAvailable(
71 gfx::AcceleratedWidget widget) { 45 gfx::AcceleratedWidget widget) {
72 widget_ = widget; 46 DCHECK(widget != gfx::kNullAcceleratedWidget);
sadrul 2016/11/21 17:23:49 DCHECK_NE
Fady Samuel 2016/11/21 20:40:41 Done.
73 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) { 47 cc::mojom::MojoCompositorFrameSinkRequest request =
74 cc::mojom::MojoCompositorFrameSinkRequest request = 48 mojo::GetProxy(&compositor_frame_sink_);
75 mojo::GetProxy(&compositor_frame_sink_); 49 root_window_->CreateCompositorFrameSink(
76 root_window_->CreateCompositorFrameSink( 50 mojom::CompositorFrameSinkType::DEFAULT, widget, std::move(request),
77 mojom::CompositorFrameSinkType::DEFAULT, widget_, 51 binding_.CreateInterfacePtrAndBind());
78 gpu_channel_->gpu_memory_buffer_manager(), 52 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
79 new SurfacesContextProvider(widget_, gpu_channel_), 53 // even when we don't need it. Once surface ID propagation work is done,
80 std::move(request), binding_.CreateInterfacePtrAndBind()); 54 // this will not be necessary because FrameGenerator will only need a
81 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal 55 // BeginFrame if the window manager changes.
82 // even when we don't need it. Once surface ID propagation work is done, 56 compositor_frame_sink_->SetNeedsBeginFrame(true);
83 // this will not be necessary because FrameGenerator will only need a
84 // BeginFrame if the window manager changes.
85 compositor_frame_sink_->SetNeedsBeginFrame(true);
86 }
87 } 57 }
88 58
89 void FrameGenerator::DidReceiveCompositorFrameAck() {} 59 void FrameGenerator::DidReceiveCompositorFrameAck() {}
90 60
91 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 61 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
92 if (!root_window_->visible()) 62 if (!root_window_->visible())
93 return; 63 return;
94 64
95 // TODO(fsamuel): We should add a trace for generating a top level frame. 65 // TODO(fsamuel): We should add a trace for generating a top level frame.
96 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 66 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 } 242 }
273 243
274 void FrameGenerator::ReleaseAllSurfaceReferences() { 244 void FrameGenerator::ReleaseAllSurfaceReferences() {
275 std::vector<uint32_t> sequences; 245 std::vector<uint32_t> sequences;
276 for (auto& dependency : dependencies_) 246 for (auto& dependency : dependencies_)
277 sequences.push_back(dependency.second.sequence.sequence); 247 sequences.push_back(dependency.second.sequence.sequence);
278 GetDisplayCompositor()->ReturnSurfaceReferences(frame_sink_id_, sequences); 248 GetDisplayCompositor()->ReturnSurfaceReferences(frame_sink_id_, sequences);
279 dependencies_.clear(); 249 dependencies_.clear();
280 } 250 }
281 251
282 ui::DisplayCompositor* FrameGenerator::GetDisplayCompositor() { 252 cc::mojom::DisplayCompositor* FrameGenerator::GetDisplayCompositor() {
283 return root_window_->delegate()->GetDisplayCompositor(); 253 return root_window_->delegate()->GetDisplayCompositor();
284 } 254 }
285 255
286 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { 256 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
287 Remove(window); 257 Remove(window);
288 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager = 258 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager =
289 window->compositor_frame_sink_manager(); 259 window->compositor_frame_sink_manager();
290 // If FrameGenerator was observing |window|, then that means it had a 260 // If FrameGenerator was observing |window|, then that means it had a
291 // CompositorFrame at some point in time and should have a 261 // CompositorFrame at some point in time and should have a
292 // ServerWindowCompositorFrameSinkManager. 262 // ServerWindowCompositorFrameSinkManager.
293 DCHECK(compositor_frame_sink_manager); 263 DCHECK(compositor_frame_sink_manager);
294 264
295 cc::SurfaceId default_surface_id = 265 cc::SurfaceId default_surface_id =
296 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 266 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
297 mojom::CompositorFrameSinkType::DEFAULT); 267 mojom::CompositorFrameSinkType::DEFAULT);
298 if (default_surface_id.is_valid()) 268 if (default_surface_id.is_valid())
299 ReleaseFrameSinkReference(default_surface_id.frame_sink_id()); 269 ReleaseFrameSinkReference(default_surface_id.frame_sink_id());
300 270
301 cc::SurfaceId underlay_surface_id = 271 cc::SurfaceId underlay_surface_id =
302 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 272 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
303 mojom::CompositorFrameSinkType::UNDERLAY); 273 mojom::CompositorFrameSinkType::UNDERLAY);
304 if (underlay_surface_id.is_valid()) 274 if (underlay_surface_id.is_valid())
305 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id()); 275 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id());
306 } 276 }
307 277
308 } // namespace ws 278 } // namespace ws
309 279
310 } // namespace ui 280 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698