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

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

Issue 2738923002: Add DisplayClientCompositorFrameSink (Closed)
Patch Set: clean up 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"
Fady Samuel 2017/03/10 19:17:40 nit: remove this?
Alex Z. 2017/03/10 19:28:50 Done.
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"
Fady Samuel 2017/03/10 19:17:40 nit: remove this?
Alex Z. 2017/03/10 19:28:50 Done.
19 #include "services/ui/ws/server_window_delegate.h" 20 #include "services/ui/ws/server_window_delegate.h"
Fady Samuel 2017/03/10 19:17:40 nit: remove this?
Alex Z. 2017/03/10 19:28:50 Done.
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 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink)
30 : delegate_(delegate),
31 root_window_(root_window),
32 compositor_frame_sink_(std::move(compositor_frame_sink)) {
29 DCHECK(delegate_); 33 DCHECK(delegate_);
30 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 34 compositor_frame_sink_->BindToClient(this);
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 } 35 }
39 36
40 FrameGenerator::~FrameGenerator() = default; 37 FrameGenerator::~FrameGenerator() {
38 compositor_frame_sink_->DetachFromClient();
39 }
41 40
42 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 41 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
43 if (device_scale_factor_ == device_scale_factor) 42 if (device_scale_factor_ == device_scale_factor)
44 return; 43 return;
45 device_scale_factor_ = device_scale_factor; 44 device_scale_factor_ = device_scale_factor;
46 if (window_manager_surface_info_.is_valid()) 45 if (window_manager_surface_info_.is_valid())
47 compositor_frame_sink_->SetNeedsBeginFrame(true); 46 SetNeedsBeginFrame(true);
48 } 47 }
49 48
50 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 49 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
51 DCHECK(surface_info.is_valid()); 50 DCHECK(surface_info.is_valid());
52 51
53 // Only handle embedded surfaces changing here. The display root surface 52 // Only handle embedded surfaces changing here. The display root surface
54 // changing is handled immediately after the CompositorFrame is submitted. 53 // changing is handled immediately after the CompositorFrame is submitted.
55 if (surface_info != window_manager_surface_info_) { 54 if (surface_info != window_manager_surface_info_) {
56 window_manager_surface_info_ = surface_info; 55 window_manager_surface_info_ = surface_info;
57 compositor_frame_sink_->SetNeedsBeginFrame(true); 56 SetNeedsBeginFrame(true);
58 } 57 }
59 } 58 }
60 59
61 void FrameGenerator::OnWindowDamaged() { 60 void FrameGenerator::OnWindowDamaged() {
62 if (window_manager_surface_info_.is_valid()) 61 if (window_manager_surface_info_.is_valid())
63 compositor_frame_sink_->SetNeedsBeginFrame(true); 62 SetNeedsBeginFrame(true);
64 } 63 }
65 64
66 void FrameGenerator::DidReceiveCompositorFrameAck() {} 65 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
66 if (begin_frame_source_ && observing_begin_frames_)
67 begin_frame_source_->RemoveObserver(this);
67 68
68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 69 begin_frame_source_ = source;
69 if (!root_window_->visible())
70 return;
71 70
72 // TODO(fsamuel): We should add a trace for generating a top level frame. 71 if (begin_frame_source_ && observing_begin_frames_)
73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 72 begin_frame_source_->AddObserver(this);
74
75 gfx::Size frame_size = last_submitted_frame_size_;
76 if (!frame.render_pass_list.empty())
77 frame_size = frame.render_pass_list.back()->output_rect.size();
78
79 if (!local_surface_id_.is_valid() ||
80 frame_size != last_submitted_frame_size_) {
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;
90 } 73 }
91 74
92 void FrameGenerator::ReclaimResources( 75 void FrameGenerator::ReclaimResources(
93 const cc::ReturnedResourceArray& resources) { 76 const cc::ReturnedResourceArray& resources) {
94 // Nothing to do here because FrameGenerator CompositorFrames don't reference 77 // Nothing to do here because FrameGenerator CompositorFrames don't reference
95 // any resources. 78 // any resources.
96 DCHECK(resources.empty()); 79 DCHECK(resources.empty());
97 } 80 }
98 81
99 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id, 82 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {}
100 const gfx::Rect& damage_rect) { 83
101 // TODO(fsamuel, staraz): Implement this. 84 void FrameGenerator::DidReceiveCompositorFrameAck() {}
85
86 void FrameGenerator::DidLoseCompositorFrameSink() {}
87
88 void FrameGenerator::OnDraw(const gfx::Transform& transform,
89 const gfx::Rect& viewport,
90 bool resourceless_software_draw) {}
91
92 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
93
94 void FrameGenerator::SetExternalTilePriorityConstraints(
95 const gfx::Rect& viewport_rect,
96 const gfx::Transform& transform) {}
97
98 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
99 if (!root_window_->visible())
100 return;
101
102 // TODO(fsamuel): We should add a trace for generating a top level frame.
103 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
104
105 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
106 SetNeedsBeginFrame(false);
107 last_begin_frame_args_ = begin_frame_args;
102 } 108 }
103 109
110 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
111 return last_begin_frame_args_;
112 }
113
114 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
115
104 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 116 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
105 const gfx::Rect& output_rect) { 117 const gfx::Rect& output_rect) {
106 const int render_pass_id = 1; 118 const int render_pass_id = 1;
107 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 119 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
108 render_pass->SetNew(render_pass_id, output_rect, output_rect, 120 render_pass->SetNew(render_pass_id, output_rect, output_rect,
109 gfx::Transform()); 121 gfx::Transform());
110 122
111 DrawWindow(render_pass.get()); 123 DrawWindow(render_pass.get());
112 124
113 cc::CompositorFrame frame; 125 cc::CompositorFrame frame;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 bounds_at_origin /* clip_rect */, false /* is_clipped */, 178 bounds_at_origin /* clip_rect */, false /* is_clipped */,
167 1.0f /* opacity */, SkBlendMode::kSrcOver, 179 1.0f /* opacity */, SkBlendMode::kSrcOver,
168 0 /* sorting-context_id */); 180 0 /* sorting-context_id */);
169 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 181 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
170 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 182 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
171 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 183 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
172 window_manager_surface_info_.id(), 184 window_manager_surface_info_.id(),
173 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 185 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
174 } 186 }
175 187
188 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
189 if (needs_begin_frame == observing_begin_frames_)
190 return;
191
192 if (needs_begin_frame) {
193 begin_frame_source_->AddObserver(this);
194 observing_begin_frames_ = true;
195 return;
196 }
197
198 begin_frame_source_->RemoveObserver(this);
199 observing_begin_frames_ = false;
200 }
201
176 } // namespace ws 202 } // namespace ws
177 203
178 } // namespace ui 204 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698