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

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

Issue 2481263002: Introduce Display Compositor mojo interface. Use InProcessContextProvider. (Closed)
Patch Set: Speculative fix for android build issue Created 4 years 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 "gpu/ipc/client/gpu_channel_host.h" 13 #include "cc/surfaces/surface_id.h"
14 #include "services/ui/surfaces/display_compositor.h"
15 #include "services/ui/surfaces/surfaces_context_provider.h"
16 #include "services/ui/ws/frame_generator_delegate.h" 14 #include "services/ui/ws/frame_generator_delegate.h"
17 #include "services/ui/ws/server_window.h" 15 #include "services/ui/ws/server_window.h"
18 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 16 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
19 #include "services/ui/ws/server_window_delegate.h" 17 #include "services/ui/ws/server_window_delegate.h"
20 18
21 namespace ui { 19 namespace ui {
22 20
23 namespace ws { 21 namespace ws {
24 22
25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 23 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
(...skipping 10 matching lines...) Expand all
36 34
37 FrameGenerator::~FrameGenerator() { 35 FrameGenerator::~FrameGenerator() {
38 RemoveDeadSurfaceReferences(); 36 RemoveDeadSurfaceReferences();
39 RemoveAllSurfaceReferences(); 37 RemoveAllSurfaceReferences();
40 // Invalidate WeakPtrs now to avoid callbacks back into the 38 // Invalidate WeakPtrs now to avoid callbacks back into the
41 // FrameGenerator during destruction of |compositor_frame_sink_|. 39 // FrameGenerator during destruction of |compositor_frame_sink_|.
42 weak_factory_.InvalidateWeakPtrs(); 40 weak_factory_.InvalidateWeakPtrs();
43 compositor_frame_sink_.reset(); 41 compositor_frame_sink_.reset();
44 } 42 }
45 43
46 void FrameGenerator::OnGpuChannelEstablished(
47 scoped_refptr<gpu::GpuChannelHost> channel) {
48 if (widget_ != gfx::kNullAcceleratedWidget) {
49 cc::mojom::MojoCompositorFrameSinkRequest request =
50 mojo::GetProxy(&compositor_frame_sink_);
51 // TODO(fsamuel): FrameGenerator should not know about
52 // SurfacesContextProvider. In fact, FrameGenerator should not know
53 // about GpuChannelHost.
54 root_window_->CreateCompositorFrameSink(
55 mojom::CompositorFrameSinkType::DEFAULT, widget_,
56 channel->gpu_memory_buffer_manager(),
57 new SurfacesContextProvider(widget_, channel), std::move(request),
58 binding_.CreateInterfacePtrAndBind());
59 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
60 // even when we don't need it. Once surface ID propagation work is done,
61 // this will not be necessary because FrameGenerator will only need a
62 // BeginFrame if the window manager changes.
63 compositor_frame_sink_->SetNeedsBeginFrame(true);
64 } else {
65 gpu_channel_ = std::move(channel);
66 }
67 }
68
69 void FrameGenerator::OnAcceleratedWidgetAvailable( 44 void FrameGenerator::OnAcceleratedWidgetAvailable(
70 gfx::AcceleratedWidget widget) { 45 gfx::AcceleratedWidget widget) {
71 widget_ = widget; 46 DCHECK_NE(gfx::kNullAcceleratedWidget, widget);
72 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) { 47 cc::mojom::MojoCompositorFrameSinkRequest request =
73 cc::mojom::MojoCompositorFrameSinkRequest request = 48 mojo::GetProxy(&compositor_frame_sink_);
74 mojo::GetProxy(&compositor_frame_sink_); 49 root_window_->CreateCompositorFrameSink(
75 root_window_->CreateCompositorFrameSink( 50 mojom::CompositorFrameSinkType::DEFAULT, widget, std::move(request),
76 mojom::CompositorFrameSinkType::DEFAULT, widget_, 51 binding_.CreateInterfacePtrAndBind());
77 gpu_channel_->gpu_memory_buffer_manager(), 52 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
78 new SurfacesContextProvider(widget_, gpu_channel_), 53 // even when we don't need it. Once surface ID propagation work is done,
79 std::move(request), binding_.CreateInterfacePtrAndBind()); 54 // this will not be necessary because FrameGenerator will only need a
80 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal 55 // BeginFrame if the window manager changes.
81 // even when we don't need it. Once surface ID propagation work is done, 56 compositor_frame_sink_->SetNeedsBeginFrame(true);
82 // this will not be necessary because FrameGenerator will only need a
83 // BeginFrame if the window manager changes.
84 compositor_frame_sink_->SetNeedsBeginFrame(true);
85 }
86 } 57 }
87 58
88 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id, 59 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id,
89 ServerWindow* window) { 60 ServerWindow* window) {
90 DCHECK(surface_id.is_valid()); 61 DCHECK(surface_id.is_valid());
91 62
92 // TODO(kylechar): Adding surface references should be synchronized with 63 // TODO(kylechar): Adding surface references should be synchronized with
93 // SubmitCompositorFrame(). 64 // SubmitCompositorFrame().
94 65
95 auto iter = active_references_.find(surface_id.frame_sink_id()); 66 auto iter = active_references_.find(surface_id.frame_sink_id());
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 275
305 // Observe |window| so that we can remove references when it's destroyed. 276 // Observe |window| so that we can remove references when it's destroyed.
306 Add(window); 277 Add(window);
307 } 278 }
308 279
309 void FrameGenerator::AddNewParentReferences( 280 void FrameGenerator::AddNewParentReferences(
310 const cc::SurfaceId& old_surface_id, 281 const cc::SurfaceId& old_surface_id,
311 const cc::SurfaceId& new_surface_id) { 282 const cc::SurfaceId& new_surface_id) {
312 DCHECK(old_surface_id.frame_sink_id() == new_surface_id.frame_sink_id()); 283 DCHECK(old_surface_id.frame_sink_id() == new_surface_id.frame_sink_id());
313 284
314 DisplayCompositor* display_compositor = GetDisplayCompositor(); 285 cc::mojom::DisplayCompositor* display_compositor = GetDisplayCompositor();
315 for (auto& map_entry : active_references_) { 286 for (auto& map_entry : active_references_) {
316 SurfaceReference& ref = map_entry.second; 287 SurfaceReference& ref = map_entry.second;
317 if (ref.parent_id == old_surface_id) { 288 if (ref.parent_id == old_surface_id) {
318 display_compositor->AddSurfaceReference(new_surface_id, ref.child_id); 289 display_compositor->AddSurfaceReference(new_surface_id, ref.child_id);
319 ref.parent_id = new_surface_id; 290 ref.parent_id = new_surface_id;
320 } 291 }
321 } 292 }
322 } 293 }
323 294
324 void FrameGenerator::RemoveDeadSurfaceReferences() { 295 void FrameGenerator::RemoveDeadSurfaceReferences() {
325 if (dead_references_.empty()) 296 if (dead_references_.empty())
326 return; 297 return;
327 298
328 DisplayCompositor* display_compositor = GetDisplayCompositor(); 299 cc::mojom::DisplayCompositor* display_compositor = GetDisplayCompositor();
329 for (auto& ref : dead_references_) { 300 for (auto& ref : dead_references_) {
330 if (ref.parent_id == top_level_root_surface_id_) 301 if (ref.parent_id == top_level_root_surface_id_)
331 display_compositor->RemoveRootSurfaceReference(ref.child_id); 302 display_compositor->RemoveRootSurfaceReference(ref.child_id);
332 else 303 else
333 display_compositor->RemoveSurfaceReference(ref.parent_id, ref.child_id); 304 display_compositor->RemoveSurfaceReference(ref.parent_id, ref.child_id);
334 } 305 }
335 dead_references_.clear(); 306 dead_references_.clear();
336 } 307 }
337 308
338 void FrameGenerator::RemoveFrameSinkReference( 309 void FrameGenerator::RemoveFrameSinkReference(
339 const cc::FrameSinkId& frame_sink_id) { 310 const cc::FrameSinkId& frame_sink_id) {
340 auto it = active_references_.find(frame_sink_id); 311 auto it = active_references_.find(frame_sink_id);
341 if (it == active_references_.end()) 312 if (it == active_references_.end())
342 return; 313 return;
343 dead_references_.push_back(it->second); 314 dead_references_.push_back(it->second);
344 active_references_.erase(it); 315 active_references_.erase(it);
345 } 316 }
346 317
347 void FrameGenerator::RemoveAllSurfaceReferences() { 318 void FrameGenerator::RemoveAllSurfaceReferences() {
348 // TODO(kylechar): Remove multiple surfaces with one IPC call. 319 // TODO(kylechar): Remove multiple surfaces with one IPC call.
349 DisplayCompositor* display_compositor = GetDisplayCompositor(); 320 cc::mojom::DisplayCompositor* display_compositor = GetDisplayCompositor();
350 for (auto& map_entry : active_references_) { 321 for (auto& map_entry : active_references_) {
351 const SurfaceReference& ref = map_entry.second; 322 const SurfaceReference& ref = map_entry.second;
352 display_compositor->RemoveSurfaceReference(ref.parent_id, ref.child_id); 323 display_compositor->RemoveSurfaceReference(ref.parent_id, ref.child_id);
353 } 324 }
354 active_references_.clear(); 325 active_references_.clear();
355 } 326 }
356 327
357 ui::DisplayCompositor* FrameGenerator::GetDisplayCompositor() { 328 cc::mojom::DisplayCompositor* FrameGenerator::GetDisplayCompositor() {
358 return root_window_->delegate()->GetDisplayCompositor(); 329 return root_window_->delegate()->GetDisplayCompositor();
359 } 330 }
360 331
361 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { 332 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
362 Remove(window); 333 Remove(window);
363 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager = 334 ServerWindowCompositorFrameSinkManager* compositor_frame_sink_manager =
364 window->compositor_frame_sink_manager(); 335 window->compositor_frame_sink_manager();
365 // If FrameGenerator was observing |window|, then that means it had a 336 // If FrameGenerator was observing |window|, then that means it had a
366 // CompositorFrame at some point in time and should have a 337 // CompositorFrame at some point in time and should have a
367 // ServerWindowCompositorFrameSinkManager. 338 // ServerWindowCompositorFrameSinkManager.
368 DCHECK(compositor_frame_sink_manager); 339 DCHECK(compositor_frame_sink_manager);
369 340
370 cc::SurfaceId default_surface_id = 341 cc::SurfaceId default_surface_id =
371 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 342 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
372 mojom::CompositorFrameSinkType::DEFAULT); 343 mojom::CompositorFrameSinkType::DEFAULT);
373 if (default_surface_id.is_valid()) 344 if (default_surface_id.is_valid())
374 RemoveFrameSinkReference(default_surface_id.frame_sink_id()); 345 RemoveFrameSinkReference(default_surface_id.frame_sink_id());
375 346
376 cc::SurfaceId underlay_surface_id = 347 cc::SurfaceId underlay_surface_id =
377 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 348 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
378 mojom::CompositorFrameSinkType::UNDERLAY); 349 mojom::CompositorFrameSinkType::UNDERLAY);
379 if (underlay_surface_id.is_valid()) 350 if (underlay_surface_id.is_valid())
380 RemoveFrameSinkReference(underlay_surface_id.frame_sink_id()); 351 RemoveFrameSinkReference(underlay_surface_id.frame_sink_id());
381 } 352 }
382 353
383 } // namespace ws 354 } // namespace ws
384 355
385 } // namespace ui 356 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698