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

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

Issue 2738923002: Add DisplayClientCompositorFrameSink (Closed)
Patch Set: addressed nits 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
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/platform_display_default.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
11 #include "cc/output/compositor_frame_sink.h"
12 #include "cc/quads/render_pass.h" 12 #include "cc/quads/render_pass.h"
13 #include "cc/quads/render_pass_draw_quad.h" 13 #include "cc/quads/render_pass_draw_quad.h"
14 #include "cc/quads/shared_quad_state.h" 14 #include "cc/quads/shared_quad_state.h"
15 #include "cc/quads/surface_draw_quad.h" 15 #include "cc/quads/surface_draw_quad.h"
16 #include "services/ui/ws/frame_generator_delegate.h" 16 #include "services/ui/ws/frame_generator_delegate.h"
17 #include "services/ui/ws/server_window.h" 17 #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_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(
26 ServerWindow* root_window, 24 FrameGeneratorDelegate* delegate,
27 gfx::AcceleratedWidget widget) 25 ServerWindow* root_window,
28 : delegate_(delegate), root_window_(root_window), binding_(this) { 26 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink)
27 : delegate_(delegate),
28 root_window_(root_window),
29 compositor_frame_sink_(std::move(compositor_frame_sink)) {
29 DCHECK(delegate_); 30 DCHECK(delegate_);
30 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 31 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 } 32 }
39 33
40 FrameGenerator::~FrameGenerator() = default; 34 FrameGenerator::~FrameGenerator() {
35 compositor_frame_sink_->DetachFromClient();
36 }
41 37
42 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 38 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
43 if (device_scale_factor_ == device_scale_factor) 39 if (device_scale_factor_ == device_scale_factor)
44 return; 40 return;
45 device_scale_factor_ = device_scale_factor; 41 device_scale_factor_ = device_scale_factor;
46 if (window_manager_surface_info_.is_valid()) 42 if (window_manager_surface_info_.is_valid())
47 compositor_frame_sink_->SetNeedsBeginFrame(true); 43 SetNeedsBeginFrame(true);
48 } 44 }
49 45
50 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 46 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
51 DCHECK(surface_info.is_valid()); 47 DCHECK(surface_info.is_valid());
52 48
53 // Only handle embedded surfaces changing here. The display root surface 49 // Only handle embedded surfaces changing here. The display root surface
54 // changing is handled immediately after the CompositorFrame is submitted. 50 // changing is handled immediately after the CompositorFrame is submitted.
55 if (surface_info != window_manager_surface_info_) { 51 if (surface_info != window_manager_surface_info_) {
56 window_manager_surface_info_ = surface_info; 52 window_manager_surface_info_ = surface_info;
57 compositor_frame_sink_->SetNeedsBeginFrame(true); 53 SetNeedsBeginFrame(true);
58 } 54 }
59 } 55 }
60 56
61 void FrameGenerator::OnWindowDamaged() { 57 void FrameGenerator::OnWindowDamaged() {
62 if (window_manager_surface_info_.is_valid()) 58 if (window_manager_surface_info_.is_valid())
63 compositor_frame_sink_->SetNeedsBeginFrame(true); 59 SetNeedsBeginFrame(true);
64 } 60 }
65 61
66 void FrameGenerator::DidReceiveCompositorFrameAck() {} 62 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
63 if (begin_frame_source_ && observing_begin_frames_)
64 begin_frame_source_->RemoveObserver(this);
67 65
68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 66 begin_frame_source_ = source;
69 if (!root_window_->visible())
70 return;
71 67
72 // TODO(fsamuel): We should add a trace for generating a top level frame. 68 if (begin_frame_source_ && observing_begin_frames_)
73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 69 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 } 70 }
91 71
92 void FrameGenerator::ReclaimResources( 72 void FrameGenerator::ReclaimResources(
93 const cc::ReturnedResourceArray& resources) { 73 const cc::ReturnedResourceArray& resources) {
94 // Nothing to do here because FrameGenerator CompositorFrames don't reference 74 // Nothing to do here because FrameGenerator CompositorFrames don't reference
95 // any resources. 75 // any resources.
96 DCHECK(resources.empty()); 76 DCHECK(resources.empty());
97 } 77 }
98 78
99 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id, 79 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {}
100 const gfx::Rect& damage_rect) { 80
101 // TODO(fsamuel, staraz): Implement this. 81 void FrameGenerator::DidReceiveCompositorFrameAck() {}
82
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) {
96 if (!root_window_->visible())
97 return;
98
99 // TODO(fsamuel): We should add a trace for generating a top level frame.
100 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
101
102 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
103 SetNeedsBeginFrame(false);
104 last_begin_frame_args_ = begin_frame_args;
102 } 105 }
103 106
107 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
108 return last_begin_frame_args_;
109 }
110
111 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
112
104 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 113 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
105 const gfx::Rect& output_rect) { 114 const gfx::Rect& output_rect) {
106 const int render_pass_id = 1; 115 const int render_pass_id = 1;
107 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 116 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
108 render_pass->SetNew(render_pass_id, output_rect, output_rect, 117 render_pass->SetNew(render_pass_id, output_rect, output_rect,
109 gfx::Transform()); 118 gfx::Transform());
110 119
111 DrawWindow(render_pass.get()); 120 DrawWindow(render_pass.get());
112 121
113 cc::CompositorFrame frame; 122 cc::CompositorFrame frame;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 bounds_at_origin /* clip_rect */, false /* is_clipped */, 175 bounds_at_origin /* clip_rect */, false /* is_clipped */,
167 1.0f /* opacity */, SkBlendMode::kSrcOver, 176 1.0f /* opacity */, SkBlendMode::kSrcOver,
168 0 /* sorting-context_id */); 177 0 /* sorting-context_id */);
169 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 178 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
170 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 179 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
171 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 180 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
172 window_manager_surface_info_.id(), 181 window_manager_surface_info_.id(),
173 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 182 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
174 } 183 }
175 184
185 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
186 if (needs_begin_frame == observing_begin_frames_)
187 return;
188
189 if (needs_begin_frame) {
190 begin_frame_source_->AddObserver(this);
191 observing_begin_frames_ = true;
192 return;
193 }
194
195 begin_frame_source_->RemoveObserver(this);
196 observing_begin_frames_ = false;
197 }
198
176 } // namespace ws 199 } // namespace ws
177 200
178 } // namespace ui 201 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/platform_display_default.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698