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

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

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

Powered by Google App Engine
This is Rietveld 408576698