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

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

Issue 2890913002: Add CompositorFrameSinkClientBinding To Be Used By FrameGenerator (Closed)
Patch Set: LastBeginFrameAck() 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) {
107 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 84 client_binding_->BeginFrameDidNotSwap(current_begin_frame_ack_);
108 return; 85 return;
109 } 86 }
110 87
111 current_begin_frame_ack_.has_damage = true; 88 current_begin_frame_ack_.has_damage = true;
112 last_begin_frame_args_ = begin_frame_args; 89 last_begin_frame_args_ = begin_frame_args;
113 90
114 // TODO(fsamuel): We should add a trace for generating a top level frame. 91 // TODO(fsamuel): We should add a trace for generating a top level frame.
115 cc::CompositorFrame frame(GenerateCompositorFrame()); 92 cc::CompositorFrame frame(GenerateCompositorFrame());
116 93 client_binding_->SubmitCompositorFrame(std::move(frame));
117 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); 94 client_binding_->SetNeedsBeginFrame(false);
118
119 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
120 SetNeedsBeginFrame(false);
121 } 95 }
122 96
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() { 97 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
130 const int render_pass_id = 1; 98 const int render_pass_id = 1;
131 const gfx::Rect bounds(pixel_size_); 99 const gfx::Rect bounds(pixel_size_);
132 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 100 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
133 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform()); 101 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform());
134 102
135 DrawWindow(render_pass.get()); 103 DrawWindow(render_pass.get());
136 104
137 cc::CompositorFrame frame; 105 cc::CompositorFrame frame;
138 frame.render_pass_list.push_back(std::move(render_pass)); 106 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 */, 159 bounds_at_origin /* visible_layer_bounds */,
192 bounds_at_origin /* clip_rect */, false /* is_clipped */, 160 bounds_at_origin /* clip_rect */, false /* is_clipped */,
193 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 161 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 162 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 163 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
196 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 164 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
197 window_manager_surface_info_.id(), 165 window_manager_surface_info_.id(),
198 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 166 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
199 } 167 }
200 168
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 169 } // namespace ws
214 170
215 } // namespace ui 171 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698