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

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

Issue 2738923002: Add DisplayClientCompositorFrameSink (Closed)
Patch Set: Updated BeginFrame requests logic and other fixes from fsamuel@ 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,
Fady Samuel 2017/03/10 18:37:57 Remove this?
Alex Z. 2017/03/10 19:08:39 Done.
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);
Fady Samuel 2017/03/10 18:37:57 Remove this?
Alex Z. 2017/03/10 19:08:39 Done.
31 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request = 36 compositor_frame_sink_->BindToClient(this);
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 } 37 }
39 38
40 FrameGenerator::~FrameGenerator() = default; 39 FrameGenerator::~FrameGenerator() {
40 compositor_frame_sink_->DetachFromClient();
41 }
41 42
42 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 43 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
43 if (device_scale_factor_ == device_scale_factor) 44 if (device_scale_factor_ == device_scale_factor)
44 return; 45 return;
45 device_scale_factor_ = device_scale_factor; 46 device_scale_factor_ = device_scale_factor;
46 if (window_manager_surface_info_.is_valid()) 47 if (window_manager_surface_info_.is_valid())
47 compositor_frame_sink_->SetNeedsBeginFrame(true); 48 SetNeedsBeginFrame(true);
48 } 49 }
49 50
50 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 51 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
51 DCHECK(surface_info.is_valid()); 52 DCHECK(surface_info.is_valid());
52 53
53 // Only handle embedded surfaces changing here. The display root surface 54 // Only handle embedded surfaces changing here. The display root surface
54 // changing is handled immediately after the CompositorFrame is submitted. 55 // changing is handled immediately after the CompositorFrame is submitted.
55 if (surface_info != window_manager_surface_info_) { 56 if (surface_info != window_manager_surface_info_) {
56 window_manager_surface_info_ = surface_info; 57 window_manager_surface_info_ = surface_info;
57 compositor_frame_sink_->SetNeedsBeginFrame(true); 58 SetNeedsBeginFrame(true);
58 } 59 }
59 } 60 }
60 61
61 void FrameGenerator::OnWindowDamaged() { 62 void FrameGenerator::OnWindowDamaged() {
62 if (window_manager_surface_info_.is_valid()) 63 if (window_manager_surface_info_.is_valid())
63 compositor_frame_sink_->SetNeedsBeginFrame(true); 64 SetNeedsBeginFrame(true);
64 } 65 }
65 66
66 void FrameGenerator::DidReceiveCompositorFrameAck() {} 67 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
68 if (begin_frame_source_ && observing_begin_frames_)
69 begin_frame_source_->RemoveObserver(this);
67 70
68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 71 begin_frame_source_ = source;
69 if (!root_window_->visible())
70 return;
71 72
72 // TODO(fsamuel): We should add a trace for generating a top level frame. 73 if (begin_frame_source_ && observing_begin_frames_)
73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 74 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 } 75 }
91 76
92 void FrameGenerator::ReclaimResources( 77 void FrameGenerator::ReclaimResources(
93 const cc::ReturnedResourceArray& resources) { 78 const cc::ReturnedResourceArray& resources) {
94 // Nothing to do here because FrameGenerator CompositorFrames don't reference 79 // Nothing to do here because FrameGenerator CompositorFrames don't reference
95 // any resources. 80 // any resources.
96 DCHECK(resources.empty()); 81 DCHECK(resources.empty());
97 } 82 }
98 83
99 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id, 84 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {}
100 const gfx::Rect& damage_rect) { 85
101 // TODO(fsamuel, staraz): Implement this. 86 void FrameGenerator::DidReceiveCompositorFrameAck() {}
87
88 void FrameGenerator::DidLoseCompositorFrameSink() {}
89
90 void FrameGenerator::OnDraw(const gfx::Transform& transform,
91 const gfx::Rect& viewport,
92 bool resourceless_software_draw) {}
93
94 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
95
96 void FrameGenerator::SetExternalTilePriorityConstraints(
97 const gfx::Rect& viewport_rect,
98 const gfx::Transform& transform) {}
99
100 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
101 if (!root_window_->visible())
102 return;
103
104 // TODO(fsamuel): We should add a trace for generating a top level frame.
105 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
106
107 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
108 SetNeedsBeginFrame(false);
109 last_begin_frame_args_ = begin_frame_args;
102 } 110 }
103 111
112 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
113 return last_begin_frame_args_;
114 }
115
116 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
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
113 cc::CompositorFrame frame; 127 cc::CompositorFrame frame;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 bounds_at_origin /* clip_rect */, false /* is_clipped */, 180 bounds_at_origin /* clip_rect */, false /* is_clipped */,
167 1.0f /* opacity */, SkBlendMode::kSrcOver, 181 1.0f /* opacity */, SkBlendMode::kSrcOver,
168 0 /* sorting-context_id */); 182 0 /* sorting-context_id */);
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
190 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
191 if (needs_begin_frame == observing_begin_frames_)
192 return;
193
194 if (needs_begin_frame) {
195 begin_frame_source_->AddObserver(this);
196 observing_begin_frames_ = true;
197 return;
198 }
199
200 begin_frame_source_->RemoveObserver(this);
201 observing_begin_frames_ = false;
202 }
203
176 } // namespace ws 204 } // namespace ws
177 205
178 } // namespace ui 206 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698