OLD | NEW |
---|---|
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/frame_generator_delegate.h" | |
17 #include "services/ui/ws/server_window.h" | 16 #include "services/ui/ws/server_window.h" |
18 | 17 |
19 namespace ui { | 18 namespace ui { |
20 | 19 |
21 namespace ws { | 20 namespace ws { |
22 | 21 |
23 FrameGenerator::FrameGenerator( | 22 FrameGenerator::FrameGenerator( |
24 FrameGeneratorDelegate* delegate, | |
25 ServerWindow* root_window, | 23 ServerWindow* root_window, |
26 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink) | 24 std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink) |
27 : delegate_(delegate), | 25 : root_window_(root_window), |
28 root_window_(root_window), | |
29 compositor_frame_sink_(std::move(compositor_frame_sink)) { | 26 compositor_frame_sink_(std::move(compositor_frame_sink)) { |
30 DCHECK(delegate_); | |
31 compositor_frame_sink_->BindToClient(this); | 27 compositor_frame_sink_->BindToClient(this); |
32 } | 28 } |
33 | 29 |
34 FrameGenerator::~FrameGenerator() { | 30 FrameGenerator::~FrameGenerator() { |
35 compositor_frame_sink_->DetachFromClient(); | 31 compositor_frame_sink_->DetachFromClient(); |
36 } | 32 } |
37 | 33 |
38 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { | 34 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) { |
39 if (device_scale_factor_ == device_scale_factor) | 35 if (device_scale_factor_ == device_scale_factor) |
40 return; | 36 return; |
41 device_scale_factor_ = device_scale_factor; | 37 device_scale_factor_ = device_scale_factor; |
42 if (window_manager_surface_info_.is_valid()) | 38 if (window_manager_surface_info_.is_valid()) |
43 SetNeedsBeginFrame(true); | 39 SetNeedsBeginFrame(true); |
44 } | 40 } |
45 | 41 |
42 void FrameGenerator::SetHighContrastMode(bool enabled) { | |
43 if (high_contrast_mode_enabled_ == enabled) | |
44 return; | |
45 | |
46 high_contrast_mode_enabled_ = enabled; | |
47 if (window_manager_surface_info_.is_valid()) | |
48 SetNeedsBeginFrame(true); | |
49 } | |
50 | |
46 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { | 51 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { |
47 DCHECK(surface_info.is_valid()); | 52 DCHECK(surface_info.is_valid()); |
48 | 53 |
49 // Only handle embedded surfaces changing here. The display root surface | 54 // Only handle embedded surfaces changing here. The display root surface |
50 // changing is handled immediately after the CompositorFrame is submitted. | 55 // changing is handled immediately after the CompositorFrame is submitted. |
51 if (surface_info != window_manager_surface_info_) { | 56 if (surface_info != window_manager_surface_info_) { |
52 window_manager_surface_info_ = surface_info; | 57 window_manager_surface_info_ = surface_info; |
53 SetNeedsBeginFrame(true); | 58 SetNeedsBeginFrame(true); |
54 } | 59 } |
55 } | 60 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
116 const gfx::Rect& output_rect) { | 121 const gfx::Rect& output_rect) { |
117 const int render_pass_id = 1; | 122 const int render_pass_id = 1; |
118 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); | 123 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
119 render_pass->SetNew(render_pass_id, output_rect, output_rect, | 124 render_pass->SetNew(render_pass_id, output_rect, output_rect, |
120 gfx::Transform()); | 125 gfx::Transform()); |
121 | 126 |
122 DrawWindow(render_pass.get()); | 127 DrawWindow(render_pass.get()); |
123 | 128 |
124 cc::CompositorFrame frame; | 129 cc::CompositorFrame frame; |
125 frame.render_pass_list.push_back(std::move(render_pass)); | 130 frame.render_pass_list.push_back(std::move(render_pass)); |
126 if (delegate_->IsInHighContrastMode()) { | 131 if (high_contrast_mode_enabled_) { |
127 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); | 132 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); |
128 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); | 133 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); |
129 cc::SharedQuadState* shared_state = | 134 cc::SharedQuadState* shared_state = |
130 invert_pass->CreateAndAppendSharedQuadState(); | 135 invert_pass->CreateAndAppendSharedQuadState(); |
131 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( | 136 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( |
132 output_rect.size(), window_manager_surface_info_.device_scale_factor(), | 137 output_rect.size(), window_manager_surface_info_.device_scale_factor(), |
133 window_manager_surface_info_.device_scale_factor()); | 138 window_manager_surface_info_.device_scale_factor()); |
134 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, | 139 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, |
135 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); | 140 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); |
136 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); | 141 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); |
137 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); | 142 frame.render_pass_list.back()->filters.Append( |
msw
2017/03/20 23:55:26
q: why not continue using |render_pass| here?
Alex Z.
2017/03/21 15:30:53
render_pass is moved on line 130.
| |
143 cc::FilterOperation::CreateInvertFilter(1.f)); | |
138 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, | 144 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, |
139 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */, | 145 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */, |
140 gfx::Size() /* mask_texture_size */, | 146 gfx::Size() /* mask_texture_size */, |
141 gfx::Vector2dF() /* filters_scale */, | 147 gfx::Vector2dF() /* filters_scale */, |
142 gfx::PointF() /* filters_origin */, | 148 gfx::PointF() /* filters_origin */, |
143 gfx::RectF() /* tex_coord_rect */); | 149 gfx::RectF() /* tex_coord_rect */); |
144 frame.render_pass_list.push_back(std::move(invert_pass)); | 150 frame.render_pass_list.push_back(std::move(invert_pass)); |
145 } | 151 } |
146 frame.metadata.device_scale_factor = device_scale_factor_; | 152 frame.metadata.device_scale_factor = device_scale_factor_; |
147 | 153 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
191 observing_begin_frames_ = needs_begin_frame; | 197 observing_begin_frames_ = needs_begin_frame; |
192 if (needs_begin_frame) | 198 if (needs_begin_frame) |
193 begin_frame_source_->AddObserver(this); | 199 begin_frame_source_->AddObserver(this); |
194 else | 200 else |
195 begin_frame_source_->RemoveObserver(this); | 201 begin_frame_source_->RemoveObserver(this); |
196 } | 202 } |
197 | 203 |
198 } // namespace ws | 204 } // namespace ws |
199 | 205 |
200 } // namespace ui | 206 } // namespace ui |
OLD | NEW |