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

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

Issue 2890913002: Add CompositorFrameSinkClientBinding To Be Used By FrameGenerator (Closed)
Patch Set: FrameGenerator::SetNeedsBeginFrame 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 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)
(...skipping 19 matching lines...) Expand all
59 } 53 }
60 54
61 void FrameGenerator::OnWindowSizeChanged(const gfx::Size& pixel_size) { 55 void FrameGenerator::OnWindowSizeChanged(const gfx::Size& pixel_size) {
62 if (pixel_size_ == pixel_size) 56 if (pixel_size_ == pixel_size)
63 return; 57 return;
64 58
65 pixel_size_ = pixel_size; 59 pixel_size_ = pixel_size;
66 SetNeedsBeginFrame(true); 60 SetNeedsBeginFrame(true);
67 } 61 }
68 62
69 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) { 63 void FrameGenerator::Bind(
70 if (begin_frame_source_ && observing_begin_frames_) 64 std::unique_ptr<CompositorFrameSinkClientBinding> binding) {
71 begin_frame_source_->RemoveObserver(this); 65 DCHECK(!client_binding_);
72 66 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 } 67 }
78 68
79 void FrameGenerator::ReclaimResources( 69 void FrameGenerator::ReclaimResources(
80 const cc::ReturnedResourceArray& resources) { 70 const cc::ReturnedResourceArray& resources) {
81 // Nothing to do here because FrameGenerator CompositorFrames don't reference 71 // Nothing to do here because FrameGenerator CompositorFrames don't reference
82 // any resources. 72 // any resources.
83 DCHECK(resources.empty()); 73 DCHECK(resources.empty());
84 } 74 }
85 75
86 void FrameGenerator::SetTreeActivationCallback(const base::Closure& callback) {} 76 void FrameGenerator::DidReceiveCompositorFrameAck(
87 77 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 78
102 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) { 79 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
80 DCHECK(client_binding_);
103 current_begin_frame_ack_ = cc::BeginFrameAck( 81 current_begin_frame_ack_ = cc::BeginFrameAck(
104 begin_frame_args.source_id, begin_frame_args.sequence_number, 82 begin_frame_args.source_id, begin_frame_args.sequence_number,
105 begin_frame_args.sequence_number, false); 83 begin_frame_args.sequence_number, false);
106 if (begin_frame_args.type == cc::BeginFrameArgs::MISSED) { 84 if (begin_frame_args.type == cc::BeginFrameArgs::MISSED) {
107 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 85 client_binding_->BeginFrameDidNotSwap(current_begin_frame_ack_);
108 return; 86 return;
109 } 87 }
110 88
111 current_begin_frame_ack_.has_damage = true; 89 current_begin_frame_ack_.has_damage = true;
112 last_begin_frame_args_ = begin_frame_args; 90 last_begin_frame_args_ = begin_frame_args;
113 91
114 // TODO(fsamuel): We should add a trace for generating a top level frame. 92 // TODO(fsamuel): We should add a trace for generating a top level frame.
115 cc::CompositorFrame frame(GenerateCompositorFrame()); 93 cc::CompositorFrame frame(GenerateCompositorFrame());
116 94 gfx::Size frame_size = last_submitted_frame_size_;
117 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); 95 if (!frame.render_pass_list.empty())
Fady Samuel 2017/05/19 12:10:15 It is no longer possible for render_pass_list to b
Alex Z. 2017/05/19 13:26:53 Done.
118 96 frame_size = frame.render_pass_list.back()->output_rect.size();
119 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 97 if (!local_surface_id_.is_valid() ||
98 frame_size != last_submitted_frame_size_) {
Fady Samuel 2017/05/19 12:10:15 We should probably allocate a new ID if device sca
Alex Z. 2017/05/19 13:26:53 Done.
99 local_surface_id_ = id_allocator_.GenerateId();
100 }
101 client_binding_->SubmitCompositorFrame(local_surface_id_, std::move(frame));
120 SetNeedsBeginFrame(false); 102 SetNeedsBeginFrame(false);
121 } 103 }
122 104
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() { 105 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
130 const int render_pass_id = 1; 106 const int render_pass_id = 1;
131 const gfx::Rect bounds(pixel_size_); 107 const gfx::Rect bounds(pixel_size_);
132 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 108 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
133 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform()); 109 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform());
134 110
135 DrawWindow(render_pass.get()); 111 DrawWindow(render_pass.get());
136 112
137 cc::CompositorFrame frame; 113 cc::CompositorFrame frame;
138 frame.render_pass_list.push_back(std::move(render_pass)); 114 frame.render_pass_list.push_back(std::move(render_pass));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 169 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 170 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 171 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
196 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 172 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
197 window_manager_surface_info_.id(), 173 window_manager_surface_info_.id(),
198 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 174 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
199 } 175 }
200 176
201 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) { 177 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
202 needs_begin_frame &= window_manager_surface_info_.is_valid(); 178 needs_begin_frame &= window_manager_surface_info_.is_valid();
203 if (needs_begin_frame == observing_begin_frames_) 179 client_binding_->SetNeedsBeginFrame(needs_begin_frame);
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 } 180 }
212 181
213 } // namespace ws 182 } // namespace ws
214 183
215 } // namespace ui 184 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698