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

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

Issue 2651843002: FrameGenerator should receive SurfaceInfo and use it in frame generation (Closed)
Patch Set: c Created 3 years, 11 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_delegate.h » ('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 "base/containers/adapters.h" 10 #include "base/containers/adapters.h"
(...skipping 13 matching lines...) Expand all
24 24
25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
26 ServerWindow* root_window) 26 ServerWindow* root_window)
27 : delegate_(delegate), 27 : delegate_(delegate),
28 root_window_(root_window), 28 root_window_(root_window),
29 binding_(this), 29 binding_(this),
30 weak_factory_(this) { 30 weak_factory_(this) {
31 DCHECK(delegate_); 31 DCHECK(delegate_);
32 } 32 }
33 33
34 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
35 if (device_scale_factor_ == device_scale_factor)
36 return;
37 device_scale_factor_ = device_scale_factor;
38 if (compositor_frame_sink_)
39 compositor_frame_sink_->SetNeedsBeginFrame(true);
40 }
41
34 FrameGenerator::~FrameGenerator() { 42 FrameGenerator::~FrameGenerator() {
35 // Invalidate WeakPtrs now to avoid callbacks back into the 43 // Invalidate WeakPtrs now to avoid callbacks back into the
36 // FrameGenerator during destruction of |compositor_frame_sink_|. 44 // FrameGenerator during destruction of |compositor_frame_sink_|.
37 weak_factory_.InvalidateWeakPtrs(); 45 weak_factory_.InvalidateWeakPtrs();
38 compositor_frame_sink_.reset(); 46 compositor_frame_sink_.reset();
39 } 47 }
40 48
41 void FrameGenerator::OnAcceleratedWidgetAvailable( 49 void FrameGenerator::OnAcceleratedWidgetAvailable(
42 gfx::AcceleratedWidget widget) { 50 gfx::AcceleratedWidget widget) {
43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 51 DCHECK_NE(gfx::kNullAcceleratedWidget, widget);
44 auto associated_group = 52 auto associated_group =
45 root_window_->delegate()->GetDisplayCompositorAssociatedGroup(); 53 root_window_->delegate()->GetDisplayCompositorAssociatedGroup();
46 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request = 54 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request =
47 mojo::MakeRequest(&compositor_frame_sink_, associated_group); 55 mojo::MakeRequest(&compositor_frame_sink_, associated_group);
48 cc::mojom::DisplayPrivateAssociatedRequest display_request = 56 cc::mojom::DisplayPrivateAssociatedRequest display_request =
49 mojo::MakeRequest(&display_private_, associated_group); 57 mojo::MakeRequest(&display_private_, associated_group);
50 root_window_->CreateDisplayCompositorFrameSink( 58 root_window_->CreateDisplayCompositorFrameSink(
51 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(), 59 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(),
52 std::move(display_request)); 60 std::move(display_request));
53 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
54 // even when we don't need it. Once surface ID propagation work is done,
55 // this will not be necessary because FrameGenerator will only need a
56 // BeginFrame if the window manager changes.
57 compositor_frame_sink_->SetNeedsBeginFrame(true);
58 } 61 }
59 62
60 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id, 63 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
61 ServerWindow* window) { 64 DCHECK(surface_info.id().is_valid());
62 DCHECK(surface_id.is_valid());
63 65
64 // Only handle embedded surfaces changing here. The display root surface 66 // Only handle embedded surfaces changing here. The display root surface
65 // changing is handled immediately after the CompositorFrame is submitted. 67 // changing is handled immediately after the CompositorFrame is submitted.
66 // TODO(samans): Only tell FrameGenerator about WM surface instead of all 68 if (surface_info != window_manager_surface_info_) {
67 // all surfaces. 69 window_manager_surface_info_ = surface_info;
68 if (window == delegate_->GetActiveRootWindow()) 70 compositor_frame_sink_->SetNeedsBeginFrame(true);
69 window_manager_surface_id_ = surface_id; 71 }
70 } 72 }
71 73
72 void FrameGenerator::DidReceiveCompositorFrameAck() {} 74 void FrameGenerator::DidReceiveCompositorFrameAck() {}
73 75
74 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 76 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
75 if (!root_window_->visible()) 77 if (!root_window_->visible())
76 return; 78 return;
77 79
78 // TODO(fsamuel): We should add a trace for generating a top level frame. 80 // TODO(fsamuel): We should add a trace for generating a top level frame.
79 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 81 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
80 82
81 if (compositor_frame_sink_) { 83 if (compositor_frame_sink_) {
82 gfx::Size frame_size = last_submitted_frame_size_; 84 gfx::Size frame_size = last_submitted_frame_size_;
83 if (!frame.render_pass_list.empty()) 85 if (!frame.render_pass_list.empty())
84 frame_size = frame.render_pass_list[0]->output_rect.size(); 86 frame_size = frame.render_pass_list[0]->output_rect.size();
85 87
86 if (!local_frame_id_.is_valid() || 88 if (!local_frame_id_.is_valid() ||
87 frame_size != last_submitted_frame_size_) { 89 frame_size != last_submitted_frame_size_) {
88 local_frame_id_ = id_allocator_.GenerateId(); 90 local_frame_id_ = id_allocator_.GenerateId();
89 display_private_->ResizeDisplay(frame_size); 91 display_private_->ResizeDisplay(frame_size);
90 } 92 }
91 93
92 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, 94 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
93 std::move(frame)); 95 std::move(frame));
96 compositor_frame_sink_->SetNeedsBeginFrame(false);
94 last_submitted_frame_size_ = frame_size; 97 last_submitted_frame_size_ = frame_size;
95 } 98 }
96 } 99 }
97 100
98 void FrameGenerator::ReclaimResources( 101 void FrameGenerator::ReclaimResources(
99 const cc::ReturnedResourceArray& resources) { 102 const cc::ReturnedResourceArray& resources) {
100 // Nothing to do here because FrameGenerator CompositorFrames don't reference 103 // Nothing to do here because FrameGenerator CompositorFrames don't reference
101 // any resources. 104 // any resources.
102 } 105 }
103 106
104 void FrameGenerator::WillDrawSurface() { 107 void FrameGenerator::WillDrawSurface() {
105 // TODO(fsamuel, staraz): Implement this. 108 // TODO(fsamuel, staraz): Implement this.
106 } 109 }
107 110
108 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 111 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
109 const gfx::Rect& output_rect) { 112 const gfx::Rect& output_rect) {
110 const int render_pass_id = 1; 113 const int render_pass_id = 1;
111 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 114 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
112 render_pass->SetNew(render_pass_id, output_rect, output_rect, 115 render_pass->SetNew(render_pass_id, output_rect, output_rect,
113 gfx::Transform()); 116 gfx::Transform());
114 117
115 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); 118 DrawWindow(render_pass.get());
116 119
117 cc::CompositorFrame frame; 120 cc::CompositorFrame frame;
118 frame.render_pass_list.push_back(std::move(render_pass)); 121 frame.render_pass_list.push_back(std::move(render_pass));
119 if (delegate_->IsInHighContrastMode()) { 122 if (delegate_->IsInHighContrastMode()) {
120 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 123 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
121 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); 124 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform());
122 cc::SharedQuadState* shared_state = 125 cc::SharedQuadState* shared_state =
123 invert_pass->CreateAndAppendSharedQuadState(); 126 invert_pass->CreateAndAppendSharedQuadState();
124 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 127 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
128 output_rect.size(), window_manager_surface_info_.device_scale_factor(),
129 window_manager_surface_info_.device_scale_factor());
130 shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect,
125 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); 131 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0);
126 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 132 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
127 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 133 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
128 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 134 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
129 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 135 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
130 gfx::Size() /* mask_texture_size */, 136 gfx::Size() /* mask_texture_size */,
131 gfx::Vector2dF() /* filters_scale */, 137 gfx::Vector2dF() /* filters_scale */,
132 gfx::PointF() /* filters_origin */); 138 gfx::PointF() /* filters_origin */);
133 frame.render_pass_list.push_back(std::move(invert_pass)); 139 frame.render_pass_list.push_back(std::move(invert_pass));
134 } 140 }
135 frame.metadata.device_scale_factor = device_scale_factor_; 141 frame.metadata.device_scale_factor = device_scale_factor_;
136 142
137 if (window_manager_surface_id_.is_valid()) 143 if (window_manager_surface_info_.id().is_valid()) {
138 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); 144 frame.metadata.referenced_surfaces.push_back(
145 window_manager_surface_info_.id());
146 }
139 147
140 return frame; 148 return frame;
141 } 149 }
142 150
143 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { 151 void FrameGenerator::DrawWindow(cc::RenderPass* pass) {
144 if (!window || !window->visible()) 152 DCHECK(window_manager_surface_info_.id().is_valid());
145 return;
146 153
147 if (!window->compositor_frame_sink_manager()) 154 const gfx::Rect bounds_at_origin(
148 return; 155 window_manager_surface_info_.size_in_pixels());
149
150 cc::SurfaceId default_surface_id =
151 window->compositor_frame_sink_manager()->GetLatestSurfaceId();
152
153 if (!default_surface_id.is_valid())
154 return;
155 156
156 gfx::Transform quad_to_target_transform; 157 gfx::Transform quad_to_target_transform;
157 quad_to_target_transform.Translate(window->bounds().x(), 158 quad_to_target_transform.Translate(bounds_at_origin.x(),
158 window->bounds().y()); 159 bounds_at_origin.y());
159 160
160 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 161 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
161 162
162 const gfx::Rect bounds_at_origin(window->bounds().size()); 163 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
164 bounds_at_origin.size(),
165 window_manager_surface_info_.device_scale_factor(),
166 window_manager_surface_info_.device_scale_factor());
167
163 // TODO(fsamuel): These clipping and visible rects are incorrect. They need 168 // TODO(fsamuel): These clipping and visible rects are incorrect. They need
164 // to be populated from CompositorFrame structs. 169 // to be populated from CompositorFrame structs.
165 sqs->SetAll( 170 sqs->SetAll(quad_to_target_transform, scaled_bounds /* layer_bounds */,
166 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, 171 bounds_at_origin /* visible_layer_bounds */,
167 bounds_at_origin /* visible_layer_bounds */, 172 bounds_at_origin /* clip_rect */, false /* is_clipped */,
168 bounds_at_origin /* clip_rect */, false /* is_clipped */, 173 1.0f /* opacity */, SkBlendMode::kSrcOver,
169 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 174 0 /* sorting-context_id */);
170 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 175 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
171 quad->SetAll(sqs, bounds_at_origin /* rect */, 176 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
172 gfx::Rect() /* opaque_rect */,
173 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 177 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
174 default_surface_id); 178 window_manager_surface_info_.id());
175 }
176
177 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
178 Remove(window);
179 } 179 }
180 180
181 } // namespace ws 181 } // namespace ws
182 182
183 } // namespace ui 183 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698