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

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

Issue 2738923002: Add DisplayClientCompositorFrameSink (Closed)
Patch Set: Crashing mojo Created 3 years, 9 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 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 <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/containers/adapters.h" 10 #include "base/containers/adapters.h"
11 #include "cc/output/compositor_frame.h" 11 #include "cc/output/compositor_frame.h"
12 #include "cc/output/compositor_frame_sink.h"
12 #include "cc/quads/render_pass.h" 13 #include "cc/quads/render_pass.h"
13 #include "cc/quads/render_pass_draw_quad.h" 14 #include "cc/quads/render_pass_draw_quad.h"
14 #include "cc/quads/shared_quad_state.h" 15 #include "cc/quads/shared_quad_state.h"
15 #include "cc/quads/surface_draw_quad.h" 16 #include "cc/quads/surface_draw_quad.h"
16 #include "services/ui/ws/frame_generator_delegate.h" 17 #include "services/ui/ws/frame_generator_delegate.h"
17 #include "services/ui/ws/server_window.h" 18 #include "services/ui/ws/server_window.h"
18 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 19 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
19 #include "services/ui/ws/server_window_delegate.h" 20 #include "services/ui/ws/server_window_delegate.h"
20 21
21 namespace ui { 22 namespace ui {
22 23
23 namespace ws { 24 namespace ws {
24 25
25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 26 FrameGenerator::FrameGenerator(
26 ServerWindow* root_window, 27 FrameGeneratorDelegate* delegate,
27 gfx::AcceleratedWidget widget) 28 ServerWindow* root_window,
28 : delegate_(delegate), root_window_(root_window), binding_(this) { 29 gfx::AcceleratedWidget widget,
30 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink)
31 : delegate_(delegate),
32 root_window_(root_window),
33 compositor_frame_sink_(std::move(compositor_frame_sink)) {
29 DCHECK(delegate_); 34 DCHECK(delegate_);
30 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 35 DCHECK_NE(gfx::kNullAcceleratedWidget, widget);
31 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request =
32 mojo::MakeRequest(&compositor_frame_sink_);
33 cc::mojom::DisplayPrivateAssociatedRequest display_request =
34 mojo::MakeRequest(&display_private_);
35 root_window_->CreateRootCompositorFrameSink(
36 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(),
37 std::move(display_request));
38 } 36 }
39 37
40 FrameGenerator::~FrameGenerator() = default; 38 FrameGenerator::~FrameGenerator() = default;
41 39
42 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 40 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
43 if (device_scale_factor_ == device_scale_factor) 41 if (device_scale_factor_ == device_scale_factor)
44 return; 42 return;
45 device_scale_factor_ = device_scale_factor; 43 device_scale_factor_ = device_scale_factor;
46 if (window_manager_surface_info_.is_valid()) 44 if (window_manager_surface_info_.is_valid())
47 compositor_frame_sink_->SetNeedsBeginFrame(true); 45 compositor_frame_sink_->BindToClient(this);
Fady Samuel 2017/03/09 21:25:19 Do this in the constructor.
Alex Z. 2017/03/10 16:04:01 Done.
48 } 46 }
49 47
50 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 48 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
51 DCHECK(surface_info.is_valid()); 49 DCHECK(surface_info.is_valid());
52 50
53 // Only handle embedded surfaces changing here. The display root surface 51 // Only handle embedded surfaces changing here. The display root surface
54 // changing is handled immediately after the CompositorFrame is submitted. 52 // changing is handled immediately after the CompositorFrame is submitted.
55 if (surface_info != window_manager_surface_info_) { 53 if (surface_info != window_manager_surface_info_) {
56 window_manager_surface_info_ = surface_info; 54 window_manager_surface_info_ = surface_info;
57 compositor_frame_sink_->SetNeedsBeginFrame(true); 55 compositor_frame_sink_->BindToClient(this);
Fady Samuel 2017/03/09 21:25:19 Add an observer on the begin_frame_source instead.
Alex Z. 2017/03/10 16:04:01 Done.
58 } 56 }
59 } 57 }
60 58
61 void FrameGenerator::OnWindowDamaged() { 59 void FrameGenerator::OnWindowDamaged() {
62 if (window_manager_surface_info_.is_valid()) 60 if (window_manager_surface_info_.is_valid())
63 compositor_frame_sink_->SetNeedsBeginFrame(true); 61 compositor_frame_sink_->BindToClient(this);
Fady Samuel 2017/03/09 21:25:18 What you want instead is to add an observer on the
Alex Z. 2017/03/10 16:04:01 Done.
Fady Samuel 2017/03/09 21:25:19 Do this in the constructor.
Alex Z. 2017/03/10 16:04:01 Done.
64 } 62 }
65 63
64 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
65 if (begin_frame_source_)
66 begin_frame_source_->RemoveObserver(this);
67
68 begin_frame_source_ = source;
69 begin_frame_source_->AddObserver(this);
70 }
71
72 void FrameGenerator::ReclaimResources(
73 const cc::ReturnedResourceArray& resources) {
74 // Nothing to do here because FrameGenerator CompositorFrames don't reference
75 // any resources.
76 DCHECK(resources.empty());
77 }
78
79 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {}
80
66 void FrameGenerator::DidReceiveCompositorFrameAck() {} 81 void FrameGenerator::DidReceiveCompositorFrameAck() {}
67 82
68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 83 void FrameGenerator::DidLoseCompositorFrameSink() {}
84
85 void FrameGenerator::OnDraw(const gfx::Transform& transform,
86 const gfx::Rect& viewport,
87 bool resourceless_software_draw) {}
88
89 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
90
91 void FrameGenerator::SetExternalTilePriorityConstraints(
92 const gfx::Rect& viewport_rect,
93 const gfx::Transform& transform) {}
94
95 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
69 if (!root_window_->visible()) 96 if (!root_window_->visible())
70 return; 97 return;
71 98
72 // TODO(fsamuel): We should add a trace for generating a top level frame. 99 // TODO(fsamuel): We should add a trace for generating a top level frame.
73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 100 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
74 101
75 gfx::Size frame_size = last_submitted_frame_size_; 102 gfx::Size frame_size = last_submitted_frame_size_;
76 if (!frame.render_pass_list.empty()) 103 if (!frame.render_pass_list.empty())
77 frame_size = frame.render_pass_list.back()->output_rect.size(); 104 frame_size = frame.render_pass_list.back()->output_rect.size();
78 105
79 if (!local_surface_id_.is_valid() || 106 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
80 frame_size != last_submitted_frame_size_) { 107 compositor_frame_sink_->DetachFromClient();
Fady Samuel 2017/03/09 21:25:18 Don't DetachFromClient here.
Alex Z. 2017/03/10 16:04:01 Done.
81 local_surface_id_ = id_allocator_.GenerateId();
82 display_private_->ResizeDisplay(frame_size);
83 }
84
85 display_private_->SetLocalSurfaceId(local_surface_id_, device_scale_factor_);
86 compositor_frame_sink_->SubmitCompositorFrame(local_surface_id_,
87 std::move(frame));
88 compositor_frame_sink_->SetNeedsBeginFrame(false);
89 last_submitted_frame_size_ = frame_size; 108 last_submitted_frame_size_ = frame_size;
109 last_begin_frame_args_ = begin_frame_args;
90 } 110 }
91 111
92 void FrameGenerator::ReclaimResources( 112 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
93 const cc::ReturnedResourceArray& resources) { 113 return last_begin_frame_args_;
94 // Nothing to do here because FrameGenerator CompositorFrames don't reference
95 // any resources.
96 DCHECK(resources.empty());
97 } 114 }
98 115
99 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id, 116 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
100 const gfx::Rect& damage_rect) {
101 // TODO(fsamuel, staraz): Implement this.
102 }
103 117
104 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 118 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
105 const gfx::Rect& output_rect) { 119 const gfx::Rect& output_rect) {
106 const int render_pass_id = 1; 120 const int render_pass_id = 1;
107 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 121 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
108 render_pass->SetNew(render_pass_id, output_rect, output_rect, 122 render_pass->SetNew(render_pass_id, output_rect, output_rect,
109 gfx::Transform()); 123 gfx::Transform());
110 124
111 DrawWindow(render_pass.get()); 125 DrawWindow(render_pass.get());
112 126
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 183 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
170 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 184 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
171 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 185 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
172 window_manager_surface_info_.id(), 186 window_manager_surface_info_.id(),
173 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 187 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
174 } 188 }
175 189
176 } // namespace ws 190 } // namespace ws
177 191
178 } // namespace ui 192 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698