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

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

Issue 2763143002: Remove FrameGenerator::root_window_ (Closed)
Patch Set: 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()) 35 SetNeedsBeginFrame(true);
39 SetNeedsBeginFrame(true);
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()) 43 SetNeedsBeginFrame(true);
48 SetNeedsBeginFrame(true);
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::OnWindowSizeChanged(const gfx::Size& pixel_size) {
62 if (pixel_size_ == pixel_size)
63 return;
64
65 pixel_size_ = pixel_size;
66 SetNeedsBeginFrame(true);
65 } 67 }
66 68
67 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) { 69 void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) {
68 if (begin_frame_source_ && observing_begin_frames_) 70 if (begin_frame_source_ && observing_begin_frames_)
69 begin_frame_source_->RemoveObserver(this); 71 begin_frame_source_->RemoveObserver(this);
70 72
71 begin_frame_source_ = source; 73 begin_frame_source_ = source;
72 74
73 if (begin_frame_source_ && observing_begin_frames_) 75 if (begin_frame_source_ && observing_begin_frames_)
74 begin_frame_source_->AddObserver(this); 76 begin_frame_source_->AddObserver(this);
(...skipping 19 matching lines...) Expand all
94 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {} 96 void FrameGenerator::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {}
95 97
96 void FrameGenerator::SetExternalTilePriorityConstraints( 98 void FrameGenerator::SetExternalTilePriorityConstraints(
97 const gfx::Rect& viewport_rect, 99 const gfx::Rect& viewport_rect,
98 const gfx::Transform& transform) {} 100 const gfx::Transform& transform) {}
99 101
100 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) { 102 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_args) {
101 current_begin_frame_ack_ = cc::BeginFrameAck( 103 current_begin_frame_ack_ = cc::BeginFrameAck(
102 begin_frame_args.source_id, begin_frame_args.sequence_number, 104 begin_frame_args.source_id, begin_frame_args.sequence_number,
103 begin_frame_args.sequence_number, 0, false); 105 begin_frame_args.sequence_number, 0, false);
104 if (!root_window_->visible() || 106 if (begin_frame_args.type == cc::BeginFrameArgs::MISSED) {
105 begin_frame_args.type == cc::BeginFrameArgs::MISSED) {
106 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 107 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
107 return; 108 return;
108 } 109 }
109 110
110 current_begin_frame_ack_.has_damage = true; 111 current_begin_frame_ack_.has_damage = true;
111 last_begin_frame_args_ = begin_frame_args; 112 last_begin_frame_args_ = begin_frame_args;
112 113
113 // TODO(fsamuel): We should add a trace for generating a top level frame. 114 // TODO(fsamuel): We should add a trace for generating a top level frame.
114 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 115 cc::CompositorFrame frame(GenerateCompositorFrame());
116
115 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); 117 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
116 118
117 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); 119 begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_);
118 SetNeedsBeginFrame(false); 120 SetNeedsBeginFrame(false);
119 } 121 }
120 122
121 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const { 123 const cc::BeginFrameArgs& FrameGenerator::LastUsedBeginFrameArgs() const {
122 return last_begin_frame_args_; 124 return last_begin_frame_args_;
123 } 125 }
124 126
125 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {} 127 void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {}
126 128
127 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 129 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() {
128 const gfx::Rect& output_rect) {
129 const int render_pass_id = 1; 130 const int render_pass_id = 1;
131 const gfx::Rect bounds(pixel_size_);
130 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 132 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
131 render_pass->SetNew(render_pass_id, output_rect, output_rect, 133 render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform());
132 gfx::Transform());
133 134
134 DrawWindow(render_pass.get()); 135 DrawWindow(render_pass.get());
135 136
136 cc::CompositorFrame frame; 137 cc::CompositorFrame frame;
137 frame.render_pass_list.push_back(std::move(render_pass)); 138 frame.render_pass_list.push_back(std::move(render_pass));
138 if (high_contrast_mode_enabled_) { 139 if (high_contrast_mode_enabled_) {
139 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 140 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
140 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); 141 invert_pass->SetNew(2, bounds, bounds, gfx::Transform());
141 cc::SharedQuadState* shared_state = 142 cc::SharedQuadState* shared_state =
142 invert_pass->CreateAndAppendSharedQuadState(); 143 invert_pass->CreateAndAppendSharedQuadState();
143 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( 144 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
144 output_rect.size(), window_manager_surface_info_.device_scale_factor(), 145 pixel_size_, window_manager_surface_info_.device_scale_factor(),
145 window_manager_surface_info_.device_scale_factor()); 146 window_manager_surface_info_.device_scale_factor());
146 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, 147 shared_state->SetAll(gfx::Transform(), scaled_bounds, bounds, bounds, false,
147 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); 148 1.f, SkBlendMode::kSrcOver, 0);
148 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 149 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
149 frame.render_pass_list.back()->filters.Append( 150 frame.render_pass_list.back()->filters.Append(
150 cc::FilterOperation::CreateInvertFilter(1.f)); 151 cc::FilterOperation::CreateInvertFilter(1.f));
151 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 152 quad->SetNew(
152 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */, 153 shared_state, bounds, bounds, render_pass_id, 0 /* mask_resource_id */,
153 gfx::Size() /* mask_texture_size */, 154 gfx::RectF() /* mask_uv_rect */, gfx::Size() /* mask_texture_size */,
154 gfx::Vector2dF() /* filters_scale */, 155 gfx::Vector2dF() /* filters_scale */,
155 gfx::PointF() /* filters_origin */, 156 gfx::PointF() /* filters_origin */, gfx::RectF() /* tex_coord_rect */);
156 gfx::RectF() /* tex_coord_rect */);
157 frame.render_pass_list.push_back(std::move(invert_pass)); 157 frame.render_pass_list.push_back(std::move(invert_pass));
158 } 158 }
159 frame.metadata.device_scale_factor = device_scale_factor_; 159 frame.metadata.device_scale_factor = device_scale_factor_;
160 frame.metadata.begin_frame_ack = current_begin_frame_ack_; 160 frame.metadata.begin_frame_ack = current_begin_frame_ack_;
161 161
162 if (window_manager_surface_info_.is_valid()) { 162 if (window_manager_surface_info_.is_valid()) {
163 frame.metadata.referenced_surfaces.push_back( 163 frame.metadata.referenced_surfaces.push_back(
164 window_manager_surface_info_.id()); 164 window_manager_surface_info_.id());
165 } 165 }
166 166
(...skipping 25 matching lines...) Expand all
192 1.0f /* opacity */, SkBlendMode::kSrcOver, 192 1.0f /* opacity */, SkBlendMode::kSrcOver,
193 0 /* sorting-context_id */); 193 0 /* sorting-context_id */);
194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 194 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 195 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
196 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 196 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
197 window_manager_surface_info_.id(), 197 window_manager_surface_info_.id(),
198 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 198 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
199 } 199 }
200 200
201 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) { 201 void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) {
202 needs_begin_frame &= window_manager_surface_info_.is_valid();
202 if (needs_begin_frame == observing_begin_frames_) 203 if (needs_begin_frame == observing_begin_frames_)
203 return; 204 return;
204 205
205 observing_begin_frames_ = needs_begin_frame; 206 observing_begin_frames_ = needs_begin_frame;
206 if (needs_begin_frame) 207 if (needs_begin_frame)
207 begin_frame_source_->AddObserver(this); 208 begin_frame_source_->AddObserver(this);
208 else 209 else
209 begin_frame_source_->RemoveObserver(this); 210 begin_frame_source_->RemoveObserver(this);
210 } 211 }
211 212
212 } // namespace ws 213 } // namespace ws
213 214
214 } // namespace ui 215 } // 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