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

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

Issue 2471503002: Mus+Ash: Unify CompositorFrameSinks (Closed)
Patch Set: Added comment 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.h"
13 #include "cc/surfaces/surface_id.h" 14 #include "cc/surfaces/surface_id.h"
14 #include "gpu/ipc/client/gpu_channel_host.h" 15 #include "gpu/ipc/client/gpu_channel_host.h"
15 #include "services/ui/surfaces/display_compositor_frame_sink.h" 16 #include "services/ui/surfaces/display_compositor.h"
17 #include "services/ui/surfaces/surfaces_context_provider.h"
16 #include "services/ui/ws/frame_generator_delegate.h" 18 #include "services/ui/ws/frame_generator_delegate.h"
17 #include "services/ui/ws/server_window.h" 19 #include "services/ui/ws/server_window.h"
18 #include "services/ui/ws/server_window_compositor_frame_sink.h" 20 #include "services/ui/ws/server_window_compositor_frame_sink.h"
19 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 21 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
20 22
21 namespace ui { 23 namespace ui {
22 24
23 namespace ws { 25 namespace ws {
24 26
25 FrameGenerator::FrameGenerator( 27 FrameGenerator::FrameGenerator(
26 FrameGeneratorDelegate* delegate, 28 FrameGeneratorDelegate* delegate,
27 ServerWindow* root_window, 29 ServerWindow* root_window,
28 scoped_refptr<DisplayCompositor> display_compositor) 30 scoped_refptr<DisplayCompositor> display_compositor)
29 : delegate_(delegate), 31 : delegate_(delegate),
30 display_compositor_(display_compositor), 32 display_compositor_(display_compositor),
31 frame_sink_id_( 33 frame_sink_id_(
32 WindowIdToTransportId(root_window->id()), 34 WindowIdToTransportId(root_window->id()),
33 static_cast<uint32_t>(mojom::CompositorFrameSinkType::DEFAULT)), 35 static_cast<uint32_t>(mojom::CompositorFrameSinkType::DEFAULT)),
36 root_window_(root_window),
34 draw_timer_(false, false), 37 draw_timer_(false, false),
38 binding_(this),
35 weak_factory_(this) { 39 weak_factory_(this) {
36 DCHECK(delegate_); 40 DCHECK(delegate_);
37 surface_sequence_generator_.set_frame_sink_id(frame_sink_id_); 41 surface_sequence_generator_.set_frame_sink_id(frame_sink_id_);
38 } 42 }
39 43
40 FrameGenerator::~FrameGenerator() { 44 FrameGenerator::~FrameGenerator() {
41 ReleaseAllSurfaceReferences(); 45 ReleaseAllSurfaceReferences();
42 // Invalidate WeakPtrs now to avoid callbacks back into the 46 // Invalidate WeakPtrs now to avoid callbacks back into the
43 // FrameGenerator during destruction of |compositor_frame_sink_|. 47 // FrameGenerator during destruction of |compositor_frame_sink_|.
44 weak_factory_.InvalidateWeakPtrs(); 48 weak_factory_.InvalidateWeakPtrs();
45 compositor_frame_sink_.reset(); 49 compositor_frame_sink_.reset();
46 } 50 }
47 51
48 void FrameGenerator::OnGpuChannelEstablished( 52 void FrameGenerator::OnGpuChannelEstablished(
49 scoped_refptr<gpu::GpuChannelHost> channel) { 53 scoped_refptr<gpu::GpuChannelHost> channel) {
50 if (widget_ != gfx::kNullAcceleratedWidget) { 54 if (widget_ != gfx::kNullAcceleratedWidget) {
51 compositor_frame_sink_ = base::MakeUnique<DisplayCompositorFrameSink>( 55 cc::mojom::MojoCompositorFrameSinkRequest request =
52 frame_sink_id_, base::ThreadTaskRunnerHandle::Get(), widget_, 56 mojo::GetProxy(&compositor_frame_sink_);
53 std::move(channel), display_compositor_); 57 // TODO(fsamuel): FrameGenerator should not know about
58 // SurfacesContextProvider. In fact, FrameGenerator should not know
59 // about GpuChannelHost.
60 root_window_->CreateCompositorFrameSink(
61 mojom::CompositorFrameSinkType::DEFAULT, widget_,
62 channel->gpu_memory_buffer_manager(),
63 new SurfacesContextProvider(widget_, channel), std::move(request),
64 binding_.CreateInterfacePtrAndBind());
54 } else { 65 } else {
55 gpu_channel_ = std::move(channel); 66 gpu_channel_ = std::move(channel);
56 } 67 }
57 } 68 }
58 69
59 void FrameGenerator::RequestRedraw(const gfx::Rect& redraw_region) { 70 void FrameGenerator::RequestRedraw(const gfx::Rect& redraw_region) {
60 dirty_rect_.Union(redraw_region); 71 dirty_rect_.Union(redraw_region);
61 WantToDraw(); 72 WantToDraw();
62 } 73 }
63 74
64 void FrameGenerator::OnAcceleratedWidgetAvailable( 75 void FrameGenerator::OnAcceleratedWidgetAvailable(
65 gfx::AcceleratedWidget widget) { 76 gfx::AcceleratedWidget widget) {
66 widget_ = widget; 77 widget_ = widget;
67 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) { 78 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) {
68 compositor_frame_sink_ = base::MakeUnique<DisplayCompositorFrameSink>( 79 cc::mojom::MojoCompositorFrameSinkRequest request =
69 frame_sink_id_, base::ThreadTaskRunnerHandle::Get(), widget_, 80 mojo::GetProxy(&compositor_frame_sink_);
70 std::move(gpu_channel_), display_compositor_); 81 root_window_->CreateCompositorFrameSink(
82 mojom::CompositorFrameSinkType::DEFAULT, widget_,
83 gpu_channel_->gpu_memory_buffer_manager(),
84 new SurfacesContextProvider(widget_, std::move(gpu_channel_)),
85 std::move(request), binding_.CreateInterfacePtrAndBind());
71 } 86 }
72 } 87 }
73 88
89 void FrameGenerator::DidReceiveCompositorFrameAck() {
90 frame_pending_ = false;
91 if (!dirty_rect_.IsEmpty())
92 WantToDraw();
93 }
94
95 void FrameGenerator::ReclaimResources(
96 const cc::ReturnedResourceArray& resources) {
97 // Nothing to do here because FrameGenerator CompositorFrames don't reference
98 // any resources.
99 }
100
74 void FrameGenerator::WantToDraw() { 101 void FrameGenerator::WantToDraw() {
75 if (draw_timer_.IsRunning() || frame_pending_) 102 if (draw_timer_.IsRunning() || frame_pending_)
76 return; 103 return;
77 104
78 // TODO(rjkroege): Use vblank to kick off Draw. 105 // TODO(rjkroege): Use vblank to kick off Draw.
79 draw_timer_.Start( 106 draw_timer_.Start(
80 FROM_HERE, base::TimeDelta(), 107 FROM_HERE, base::TimeDelta(),
81 base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr())); 108 base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr()));
82 } 109 }
83 110
84 void FrameGenerator::Draw() { 111 void FrameGenerator::Draw() {
85 if (!delegate_->GetRootWindow()->visible()) 112 if (!delegate_->GetRootWindow()->visible())
86 return; 113 return;
87 114
88 const gfx::Rect output_rect(delegate_->GetViewportMetrics().pixel_size); 115 const gfx::Rect output_rect(delegate_->GetViewportMetrics().pixel_size);
89 dirty_rect_.Intersect(output_rect); 116 dirty_rect_.Intersect(output_rect);
90 // TODO(fsamuel): We should add a trace for generating a top level frame. 117 // TODO(fsamuel): We should add a trace for generating a top level frame.
91 cc::CompositorFrame frame(GenerateCompositorFrame(output_rect)); 118 cc::CompositorFrame frame(GenerateCompositorFrame(output_rect));
92 if (compositor_frame_sink_) { 119 if (compositor_frame_sink_) {
93 frame_pending_ = true; 120 frame_pending_ = true;
94 compositor_frame_sink_->SubmitCompositorFrame( 121 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
95 std::move(frame),
96 base::Bind(&FrameGenerator::DidDraw, weak_factory_.GetWeakPtr()));
97 } 122 }
98 dirty_rect_ = gfx::Rect(); 123 dirty_rect_ = gfx::Rect();
99 } 124 }
100 125
101 void FrameGenerator::DidDraw() {
102 frame_pending_ = false;
103 if (!dirty_rect_.IsEmpty())
104 WantToDraw();
105 }
106
107 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 126 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
108 const gfx::Rect& output_rect) { 127 const gfx::Rect& output_rect) {
109 const cc::RenderPassId render_pass_id(1, 1); 128 const cc::RenderPassId render_pass_id(1, 1);
110 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 129 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
111 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_, 130 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_,
112 gfx::Transform()); 131 gfx::Transform());
113 132
114 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(), 133 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(),
115 1.0f); 134 1.0f);
116 135
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 cc::SurfaceId underlay_surface_id = 326 cc::SurfaceId underlay_surface_id =
308 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 327 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
309 mojom::CompositorFrameSinkType::UNDERLAY); 328 mojom::CompositorFrameSinkType::UNDERLAY);
310 if (!underlay_surface_id.is_null()) 329 if (!underlay_surface_id.is_null())
311 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id()); 330 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id());
312 } 331 }
313 332
314 } // namespace ws 333 } // namespace ws
315 334
316 } // namespace ui 335 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698