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

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

Issue 2890913002: Add CompositorFrameSinkClientBinding To Be Used By FrameGenerator (Closed)
Patch Set: Address comments Created 3 years, 7 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 "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
11 #include "cc/output/compositor_frame_sink.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 16
17 namespace ui { 17 namespace ui {
18 18
19 namespace ws { 19 namespace ws {
20 20
21 FrameGenerator::FrameGenerator( 21 FrameGenerator::FrameGenerator() = default;
22 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink)
23 : compositor_frame_sink_(std::move(compositor_frame_sink)) {
24 compositor_frame_sink_->BindToClient(this);
25 }
26 22
27 FrameGenerator::~FrameGenerator() { 23 FrameGenerator::~FrameGenerator() = default;
28 compositor_frame_sink_->DetachFromClient();
29 }
30 24
31 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 25 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
32 if (device_scale_factor_ == device_scale_factor) 26 if (device_scale_factor_ == device_scale_factor)
33 return; 27 return;
34 device_scale_factor_ = device_scale_factor; 28 device_scale_factor_ = device_scale_factor;
35 SetNeedsBeginFrame(true); 29 client_binding_->SetNeedsBeginFrame(true);
36 } 30 }
37 31
38 void FrameGenerator::SetHighContrastMode(bool enabled) { 32 void FrameGenerator::SetHighContrastMode(bool enabled) {
39 if (high_contrast_mode_enabled_ == enabled) 33 if (high_contrast_mode_enabled_ == enabled)
40 return; 34 return;
41 35
42 high_contrast_mode_enabled_ = enabled; 36 high_contrast_mode_enabled_ = enabled;
43 SetNeedsBeginFrame(true); 37 client_binding_->SetNeedsBeginFrame(true);
44 } 38 }
45 39
46 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 40 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
47 DCHECK(surface_info.is_valid()); 41 DCHECK(surface_info.is_valid());
48
49 // Only handle embedded surfaces changing here. The display root surface 42 // Only handle embedded surfaces changing here. The display root surface
50 // changing is handled immediately after the CompositorFrame is submitted. 43 // changing is handled immediately after the CompositorFrame is submitted.
51 if (surface_info != window_manager_surface_info_) { 44 if (surface_info != window_manager_surface_info_) {
52 window_manager_surface_info_ = surface_info; 45 window_manager_surface_info_ = surface_info;
53 SetNeedsBeginFrame(true); 46 client_binding_->SetNeedsBeginFrame(true);
54 } 47 }
55 } 48 }
56 49
57 void FrameGenerator::OnWindowDamaged() { 50 void FrameGenerator::OnWindowDamaged() {
58 SetNeedsBeginFrame(true); 51 client_binding_->SetNeedsBeginFrame(true);
59 } 52 }
60 53
61 void FrameGenerator::OnWindowSizeChanged(const gfx::Size& pixel_size) { 54 void FrameGenerator::OnWindowSizeChanged(const gfx::Size& pixel_size) {
62 if (pixel_size_ == pixel_size) 55 if (pixel_size_ == pixel_size)
63 return; 56 return;
64 57
65 pixel_size_ = pixel_size; 58 pixel_size_ = pixel_size;
66 SetNeedsBeginFrame(true); 59 client_binding_->SetNeedsBeginFrame(true);
67 } 60 }
68 61
69 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) { 62 void FrameGenerator::Bind(
70 if (begin_frame_source_ && observing_begin_frames_) 63 std::unique_ptr<CompositorFrameSinkClientBinding> binding) {
71 begin_frame_source_->RemoveObserver(this); 64 DCHECK(!client_binding_);
72 65 client_binding_ = std::move(binding);
73 begin_frame_source_ = source;
74
75 if (begin_frame_source_ && observing_begin_frames_)
76 begin_frame_source_->AddObserver(this);
77 } 66 }
78 67
79 void FrameGenerator::ReclaimResources( 68 void FrameGenerator::ReclaimResources(
80 const cc::ReturnedResourceArray& resources) { 69 const cc::ReturnedResourceArray& resources) {
81 // Nothing to do here because FrameGenerator CompositorFrames don't reference 70 // Nothing to do here because FrameGenerator CompositorFrames don't reference
82 // any resources. 71 // any resources.
83 DCHECK(resources.empty()); 72 DCHECK(resources.empty());
84 } 73 }
85 74
86 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {} 75 void FrameGenerator::DidReceiveCompositorFrameAck(
87 76 const cc::ReturnedResourceArray& resources) {}
88 void FrameGenerator::DidReceiveCompositorFrameAck() {}
89
90 void FrameGenerator::DidLoseCompositorFrameSink() {}
91
92 void FrameGenerator::OnDraw(const gfx::Transform& transform,
93 const gfx::Rect& viewport,
94 bool resourceless_software_draw) {}
95
96 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
97
98 void FrameGenerator::SetExternalTilePriorityConstraints(
99 const gfx::Rect& viewport_rect,
100 const gfx::Transform& transform) {}
101 77
102 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) { 78 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
79 DCHECK(client_binding_);
103 current_begin_frame_ack_ = cc::BeginFrameAck( 80 current_begin_frame_ack_ = cc::BeginFrameAck(
104 begin_frame_args.source_id, begin_frame_args.sequence_number, 81 begin_frame_args.source_id, begin_frame_args.sequence_number,
105 begin_frame_args.sequence_number, false); 82 begin_frame_args.sequence_number, false);
106 if (begin_frame_args.type == cc::BeginFrameArgs::MISSED) { 83 if (begin_frame_args.type == cc::BeginFrameArgs::MISSED)
Fady Samuel 2017/05/17 20:33:04 I think you need to add a BeginFrameDidNotSwap to
Alex Z. 2017/05/17 21:30:52 Done.
107 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
108 return; 84 return;
109 }
110 85
111 current_begin_frame_ack_.has_damage = true; 86 current_begin_frame_ack_.has_damage = true;
112 last_begin_frame_args_ = begin_frame_args; 87 last_begin_frame_args_ = begin_frame_args;
113 88
114 // TODO(fsamuel): We should add a trace for generating a top level frame. 89 // TODO(fsamuel): We should add a trace for generating a top level frame.
115 cc::CompositorFrame frame(GenerateCompositorFrame()); 90 cc::CompositorFrame frame(GenerateCompositorFrame());
116 91 client_binding_->SubmitCompositorFrame(std::move(frame));
117 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); 92 client_binding_->SetNeedsBeginFrame(false);
118
119 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
120 SetNeedsBeginFrame(false);
121 } 93 }
122 94
123 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
124 return last_begin_frame_args_;
125 }
126
127 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
128
129 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() { 95 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
130 const int render_pass_id = 1; 96 const int render_pass_id = 1;
131 const gfx::Rect bounds(pixel_size_); 97 const gfx::Rect bounds(pixel_size_);
132 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 98 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
133 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform()); 99 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform());
134 100
135 DrawWindow(render_pass.get()); 101 DrawWindow(render_pass.get());
136 102
137 cc::CompositorFrame frame; 103 cc::CompositorFrame frame;
138 frame.render_pass_list.push_back(std::move(render_pass)); 104 frame.render_pass_list.push_back(std::move(render_pass));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 bounds_at_origin /* visible_layer_bounds */, 157 bounds_at_origin /* visible_layer_bounds */,
192 bounds_at_origin /* clip_rect */, false /* is_clipped */, 158 bounds_at_origin /* clip_rect */, false /* is_clipped */,
193 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 159 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 160 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 161 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
196 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 162 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
197 window_manager_surface_info_.id(), 163 window_manager_surface_info_.id(),
198 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 164 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
199 } 165 }
200 166
201 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
202 needs_begin_frame &= window_manager_surface_info_.is_valid();
203 if (needs_begin_frame == observing_begin_frames_)
204 return;
205
206 observing_begin_frames_ = needs_begin_frame;
207 if (needs_begin_frame)
208 begin_frame_source_->AddObserver(this);
209 else
210 begin_frame_source_->RemoveObserver(this);
211 }
212
213 } // namespace ws 167 } // namespace ws
214 168
215 } // namespace ui 169 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698