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

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

Issue 2763143002: Remove FrameGenerator::root_window_ (Closed)
Patch Set: Rebased and addressed comments 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/frame_generator_unittest.cc » ('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 "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 #include "services/ui/ws/server_window.h"
17 16
18 namespace ui { 17 namespace ui {
19 18
20 namespace ws { 19 namespace ws {
21 20
22 FrameGenerator::FrameGenerator( 21 FrameGenerator::FrameGenerator(
23 ServerWindow* root_window,
24 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink) 22 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink)
25 : root_window_(root_window), 23 : compositor_frame_sink_(std::move(compositor_frame_sink)) {
26 compositor_frame_sink_(std::move(compositor_frame_sink)) {
27 compositor_frame_sink_->BindToClient(this); 24 compositor_frame_sink_->BindToClient(this);
28 } 25 }
29 26
30 FrameGenerator::~FrameGenerator() { 27 FrameGenerator::~FrameGenerator() {
31 compositor_frame_sink_->DetachFromClient(); 28 compositor_frame_sink_->DetachFromClient();
32 } 29 }
33 30
34 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { 31 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
35 if (device_scale_factor_ == device_scale_factor) 32 if (device_scale_factor_ == device_scale_factor)
36 return; 33 return;
37 device_scale_factor_ = device_scale_factor; 34 device_scale_factor_ = device_scale_factor;
38 if (window_manager_surface_info_.is_valid())
39 SetNeedsBeginFrame(true); 35 SetNeedsBeginFrame(true);
Fady Samuel 2017/03/22 15:32:27 alignment.
Alex Z. 2017/03/22 16:55:33 Done.
40 } 36 }
41 37
42 void FrameGenerator::SetHighContrastMode(bool enabled) { 38 void FrameGenerator::SetHighContrastMode(bool enabled) {
43 if (high_contrast_mode_enabled_ == enabled) 39 if (high_contrast_mode_enabled_ == enabled)
44 return; 40 return;
45 41
46 high_contrast_mode_enabled_ = enabled; 42 high_contrast_mode_enabled_ = enabled;
47 if (window_manager_surface_info_.is_valid())
48 SetNeedsBeginFrame(true); 43 SetNeedsBeginFrame(true);
Fady Samuel 2017/03/22 15:32:27 This alignment is wrong.
Alex Z. 2017/03/22 16:55:33 Done.
49 } 44 }
50 45
51 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 46 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
52 DCHECK(surface_info.is_valid()); 47 DCHECK(surface_info.is_valid());
53 48
54 // Only handle embedded surfaces changing here. The display root surface 49 // Only handle embedded surfaces changing here. The display root surface
55 // changing is handled immediately after the CompositorFrame is submitted. 50 // changing is handled immediately after the CompositorFrame is submitted.
56 if (surface_info != window_manager_surface_info_) { 51 if (surface_info != window_manager_surface_info_) {
57 window_manager_surface_info_ = surface_info; 52 window_manager_surface_info_ = surface_info;
58 SetNeedsBeginFrame(true); 53 SetNeedsBeginFrame(true);
59 } 54 }
60 } 55 }
61 56
62 void FrameGenerator::OnWindowDamaged() { 57 void FrameGenerator::OnWindowDamaged() {
63 if (window_manager_surface_info_.is_valid()) 58 SetNeedsBeginFrame(true);
64 SetNeedsBeginFrame(true); 59 }
60
61 void FrameGenerator::OnWindowVisibilityChanged(bool visible) {
62 if (visible == is_window_visible_)
63 return;
64
65 is_window_visible_ = visible;
66 SetNeedsBeginFrame(visible);
67 }
68
69 void FrameGenerator::OnWindowBoundsChanged(const gfx::Rect& bounds) {
70 if (bounds == bounds_)
71 return;
72
73 bounds_ = bounds;
74 SetNeedsBeginFrame(true);
65 } 75 }
66 76
67 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) { 77 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
68 if (begin_frame_source_ && observing_begin_frames_) 78 if (begin_frame_source_ && observing_begin_frames_)
69 begin_frame_source_->RemoveObserver(this); 79 begin_frame_source_->RemoveObserver(this);
70 80
71 begin_frame_source_ = source; 81 begin_frame_source_ = source;
72 82
73 if (begin_frame_source_ && observing_begin_frames_) 83 if (begin_frame_source_ && observing_begin_frames_)
74 begin_frame_source_->AddObserver(this); 84 begin_frame_source_->AddObserver(this);
(...skipping 19 matching lines...) Expand all
94 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {} 104 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
95 105
96 void FrameGenerator::SetExternalTilePriorityConstraints( 106 void FrameGenerator::SetExternalTilePriorityConstraints(
97 const gfx::Rect& viewport_rect, 107 const gfx::Rect& viewport_rect,
98 const gfx::Transform& transform) {} 108 const gfx::Transform& transform) {}
99 109
100 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) { 110 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
101 current_begin_frame_ack_ = cc::BeginFrameAck( 111 current_begin_frame_ack_ = cc::BeginFrameAck(
102 begin_frame_args.source_id, begin_frame_args.sequence_number, 112 begin_frame_args.source_id, begin_frame_args.sequence_number,
103 begin_frame_args.sequence_number, 0, false); 113 begin_frame_args.sequence_number, 0, false);
104 if (!root_window_->visible() || 114 if (!is_window_visible_ ||
105 begin_frame_args.type == cc::BeginFrameArgs::MISSED) { 115 begin_frame_args.type == cc::BeginFrameArgs::MISSED) {
106 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 116 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
107 return; 117 return;
108 } 118 }
109 119
110 current_begin_frame_ack_.has_damage = true; 120 current_begin_frame_ack_.has_damage = true;
111 last_begin_frame_args_ = begin_frame_args; 121 last_begin_frame_args_ = begin_frame_args;
112 122
113 // TODO(fsamuel): We should add a trace for generating a top level frame. 123 // TODO(fsamuel): We should add a trace for generating a top level frame.
114 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 124 cc::CompositorFrame frame(GenerateCompositorFrame());
125
115 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); 126 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
116 127
117 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 128 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
118 SetNeedsBeginFrame(false); 129 SetNeedsBeginFrame(false);
119 } 130 }
120 131
121 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const { 132 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
122 return last_begin_frame_args_; 133 return last_begin_frame_args_;
123 } 134 }
124 135
125 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {} 136 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
126 137
127 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 138 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
128 const gfx::Rect& output_rect) {
129 const int render_pass_id = 1; 139 const int render_pass_id = 1;
130 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 140 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
131 render_pass->SetNew(render_pass_id, output_rect, output_rect, 141 render_pass->SetNew(render_pass_id, bounds_, bounds_, gfx::Transform());
132 gfx::Transform());
133 142
134 DrawWindow(render_pass.get()); 143 DrawWindow(render_pass.get());
135 144
136 cc::CompositorFrame frame; 145 cc::CompositorFrame frame;
137 frame.render_pass_list.push_back(std::move(render_pass)); 146 frame.render_pass_list.push_back(std::move(render_pass));
138 if (high_contrast_mode_enabled_) { 147 if (high_contrast_mode_enabled_) {
139 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 148 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
140 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); 149 invert_pass->SetNew(2, bounds_, bounds_, gfx::Transform());
141 cc::SharedQuadState* shared_state = 150 cc::SharedQuadState* shared_state =
142 invert_pass->CreateAndAppendSharedQuadState(); 151 invert_pass->CreateAndAppendSharedQuadState();
143 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( 152 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
144 output_rect.size(), window_manager_surface_info_.device_scale_factor(), 153 bounds_.size(), window_manager_surface_info_.device_scale_factor(),
145 window_manager_surface_info_.device_scale_factor()); 154 window_manager_surface_info_.device_scale_factor());
146 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, 155 shared_state->SetAll(gfx::Transform(), scaled_bounds, bounds_, bounds_,
147 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); 156 false, 1.f, SkBlendMode::kSrcOver, 0);
148 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 157 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
149 frame.render_pass_list.back()->filters.Append( 158 frame.render_pass_list.back()->filters.Append(
150 cc::FilterOperation::CreateInvertFilter(1.f)); 159 cc::FilterOperation::CreateInvertFilter(1.f));
151 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 160 quad->SetNew(shared_state, bounds_, bounds_, render_pass_id,
152 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */, 161 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */,
153 gfx::Size() /* mask_texture_size */, 162 gfx::Size() /* mask_texture_size */,
154 gfx::Vector2dF() /* filters_scale */, 163 gfx::Vector2dF() /* filters_scale */,
155 gfx::PointF() /* filters_origin */, 164 gfx::PointF() /* filters_origin */,
156 gfx::RectF() /* tex_coord_rect */); 165 gfx::RectF() /* tex_coord_rect */);
157 frame.render_pass_list.push_back(std::move(invert_pass)); 166 frame.render_pass_list.push_back(std::move(invert_pass));
158 } 167 }
159 frame.metadata.device_scale_factor = device_scale_factor_; 168 frame.metadata.device_scale_factor = device_scale_factor_;
160 frame.metadata.begin_frame_ack = current_begin_frame_ack_; 169 frame.metadata.begin_frame_ack = current_begin_frame_ack_;
161 170
(...skipping 30 matching lines...) Expand all
192 1.0f /* opacity */, SkBlendMode::kSrcOver, 201 1.0f /* opacity */, SkBlendMode::kSrcOver,
193 0 /* sorting-context_id */); 202 0 /* sorting-context_id */);
194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 203 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 204 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
196 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 205 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
197 window_manager_surface_info_.id(), 206 window_manager_surface_info_.id(),
198 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 207 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
199 } 208 }
200 209
201 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) { 210 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
211 if (!window_manager_surface_info_.is_valid())
Fady Samuel 2017/03/22 15:32:27 This seems wrong.
212 return;
213
214 needs_begin_frame &= is_window_visible_;
Fady Samuel 2017/03/22 15:32:27 Maybe: needs_begin_frame &= is_window_visible_ &&
Alex Z. 2017/03/22 16:55:33 Done.
202 if (needs_begin_frame == observing_begin_frames_) 215 if (needs_begin_frame == observing_begin_frames_)
203 return; 216 return;
204 217
205 observing_begin_frames_ = needs_begin_frame; 218 observing_begin_frames_ = needs_begin_frame;
206 if (needs_begin_frame) 219 if (needs_begin_frame)
207 begin_frame_source_->AddObserver(this); 220 begin_frame_source_->AddObserver(this);
208 else 221 else
209 begin_frame_source_->RemoveObserver(this); 222 begin_frame_source_->RemoveObserver(this);
210 } 223 }
211 224
212 } // namespace ws 225 } // namespace ws
213 226
214 } // namespace ui 227 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698