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

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
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 28 matching lines...) Expand all
39 } 39 }
40 40
41 void FrameGenerator::OnAcceleratedWidgetAvailable( 41 void FrameGenerator::OnAcceleratedWidgetAvailable(
42 gfx::AcceleratedWidget widget) { 42 gfx::AcceleratedWidget widget) {
43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 43 DCHECK_NE(gfx::kNullAcceleratedWidget, widget);
44 cc::mojom::MojoCompositorFrameSinkRequest request(&compositor_frame_sink_); 44 cc::mojom::MojoCompositorFrameSinkRequest request(&compositor_frame_sink_);
45 cc::mojom::DisplayPrivateRequest display_private_request(&display_private_); 45 cc::mojom::DisplayPrivateRequest display_private_request(&display_private_);
46 root_window_->CreateDisplayCompositorFrameSink( 46 root_window_->CreateDisplayCompositorFrameSink(
47 widget, std::move(request), binding_.CreateInterfacePtrAndBind(), 47 widget, std::move(request), binding_.CreateInterfacePtrAndBind(),
48 std::move(display_private_request)); 48 std::move(display_private_request));
49 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
50 // even when we don't need it. Once surface ID propagation work is done,
51 // this will not be necessary because FrameGenerator will only need a
52 // BeginFrame if the window manager changes.
53 compositor_frame_sink_->SetNeedsBeginFrame(true);
54 } 49 }
55 50
56 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id, 51 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
57 ServerWindow* window) { 52 DCHECK(surface_info.id().is_valid());
58 DCHECK(surface_id.is_valid());
59 53
60 // Only handle embedded surfaces changing here. The display root surface 54 // Only handle embedded surfaces changing here. The display root surface
61 // changing is handled immediately after the CompositorFrame is submitted. 55 // changing is handled immediately after the CompositorFrame is submitted.
62 // TODO(samans): Only tell FrameGenerator about WM surface instead of all 56 // TODO(samans): Only tell FrameGenerator about WM surface instead of all
63 // all surfaces. 57 // all surfaces.
64 if (window == delegate_->GetActiveRootWindow()) 58 if (surface_info != window_manager_surface_info_) {
65 window_manager_surface_id_ = surface_id; 59 compositor_frame_sink_->SetNeedsBeginFrame(true);
60 window_manager_surface_info_ = surface_info;
61 }
66 } 62 }
67 63
68 void FrameGenerator::DidReceiveCompositorFrameAck() {} 64 void FrameGenerator::DidReceiveCompositorFrameAck() {}
69 65
70 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 66 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
71 if (!root_window_->visible()) 67 if (!root_window_->visible())
72 return; 68 return;
73 69
74 // TODO(fsamuel): We should add a trace for generating a top level frame. 70 // TODO(fsamuel): We should add a trace for generating a top level frame.
75 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 71 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
76 72
77 if (compositor_frame_sink_) { 73 if (compositor_frame_sink_) {
78 gfx::Size frame_size = last_submitted_frame_size_; 74 gfx::Size frame_size = last_submitted_frame_size_;
79 if (!frame.render_pass_list.empty()) 75 if (!frame.render_pass_list.empty())
80 frame_size = frame.render_pass_list[0]->output_rect.size(); 76 frame_size = frame.render_pass_list[0]->output_rect.size();
81 77
82 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) 78 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_)
83 local_frame_id_ = id_allocator_.GenerateId(); 79 local_frame_id_ = id_allocator_.GenerateId();
84 80
85 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, 81 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
86 std::move(frame)); 82 std::move(frame));
83 compositor_frame_sink_->SetNeedsBeginFrame(false);
87 last_submitted_frame_size_ = frame_size; 84 last_submitted_frame_size_ = frame_size;
88 } 85 }
89 } 86 }
90 87
91 void FrameGenerator::ReclaimResources( 88 void FrameGenerator::ReclaimResources(
92 const cc::ReturnedResourceArray& resources) { 89 const cc::ReturnedResourceArray& resources) {
93 // Nothing to do here because FrameGenerator CompositorFrames don't reference 90 // Nothing to do here because FrameGenerator CompositorFrames don't reference
94 // any resources. 91 // any resources.
95 } 92 }
96 93
97 void FrameGenerator::WillDrawSurface() { 94 void FrameGenerator::WillDrawSurface() {
98 // TODO(fsamuel, staraz): Implement this. 95 // TODO(fsamuel, staraz): Implement this.
99 } 96 }
100 97
101 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 98 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
102 const gfx::Rect& output_rect) { 99 const gfx::Rect& output_rect) {
103 const int render_pass_id = 1; 100 const int render_pass_id = 1;
104 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 101 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
105 render_pass->SetNew(render_pass_id, output_rect, output_rect, 102 render_pass->SetNew(render_pass_id, output_rect, output_rect,
106 gfx::Transform()); 103 gfx::Transform());
107 104
108 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow()); 105 DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow());
Fady Samuel 2017/01/24 02:52:31 We don't need GetActiveRootWindow here anymore. In
Saman Sami 2017/01/24 20:29:58 Done.
109 106
110 cc::CompositorFrame frame; 107 cc::CompositorFrame frame;
111 frame.render_pass_list.push_back(std::move(render_pass)); 108 frame.render_pass_list.push_back(std::move(render_pass));
112 if (delegate_->IsInHighContrastMode()) { 109 if (delegate_->IsInHighContrastMode()) {
113 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 110 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
114 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); 111 invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform());
115 cc::SharedQuadState* shared_state = 112 cc::SharedQuadState* shared_state =
116 invert_pass->CreateAndAppendSharedQuadState(); 113 invert_pass->CreateAndAppendSharedQuadState();
117 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 114 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
Fady Samuel 2017/01/23 23:26:54 You should scale the bounds like so: https://cs.ch
Saman Sami 2017/01/24 20:29:58 Done.
118 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); 115 output_rect, false, 1.f, SkBlendMode::kSrcOver, 0);
119 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 116 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
120 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 117 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
121 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 118 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
122 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 119 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
123 gfx::Size() /* mask_texture_size */, 120 gfx::Size() /* mask_texture_size */,
124 gfx::Vector2dF() /* filters_scale */, 121 gfx::Vector2dF() /* filters_scale */,
125 gfx::PointF() /* filters_origin */); 122 gfx::PointF() /* filters_origin */);
126 frame.render_pass_list.push_back(std::move(invert_pass)); 123 frame.render_pass_list.push_back(std::move(invert_pass));
127 } 124 }
128 frame.metadata.device_scale_factor = device_scale_factor_; 125 frame.metadata.device_scale_factor = device_scale_factor_;
129 126
130 if (window_manager_surface_id_.is_valid()) 127 if (window_manager_surface_info_.id().is_valid()) {
131 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); 128 frame.metadata.referenced_surfaces.push_back(
129 window_manager_surface_info_.id());
130 }
132 131
133 return frame; 132 return frame;
134 } 133 }
135 134
136 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { 135 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) {
137 if (!window || !window->visible()) 136 if (!window || !window->visible())
Fady Samuel 2017/01/24 02:52:31 Remove as well.
Saman Sami 2017/01/24 20:29:58 Done.
138 return; 137 return;
139 138
140 if (!window->compositor_frame_sink_manager()) 139 if (!window->compositor_frame_sink_manager())
Fady Samuel 2017/01/24 02:52:31 This seems unnecessary.
Saman Sami 2017/01/24 20:29:58 Done.
141 return; 140 return;
142 141
143 cc::SurfaceId default_surface_id = 142 cc::SurfaceId default_surface_id =
144 window->compositor_frame_sink_manager()->GetLatestSurfaceId(); 143 window->compositor_frame_sink_manager()->GetLatestSurfaceId();
Fady Samuel 2017/01/23 23:26:54 Just use window_manager_surface_id_
Saman Sami 2017/01/24 20:29:58 Done.
145 144
146 if (!default_surface_id.is_valid()) 145 if (!default_surface_id.is_valid())
Fady Samuel 2017/01/24 02:52:31 This should be a DCHECK instead.
Saman Sami 2017/01/24 20:29:58 Done.
147 return; 146 return;
148 147
149 gfx::Transform quad_to_target_transform; 148 gfx::Transform quad_to_target_transform;
150 quad_to_target_transform.Translate(window->bounds().x(), 149 quad_to_target_transform.Translate(window->bounds().x(),
151 window->bounds().y()); 150 window->bounds().y());
152 151
153 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 152 cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
154 153
155 const gfx::Rect bounds_at_origin(window->bounds().size()); 154 const gfx::Rect bounds_at_origin(window->bounds().size());
Fady Samuel 2017/01/23 23:26:54 Just use surface_info_.size_in_pixels()
Saman Sami 2017/01/24 20:29:58 Done.
156 // TODO(fsamuel): These clipping and visible rects are incorrect. They need 155 // TODO(fsamuel): These clipping and visible rects are incorrect. They need
157 // to be populated from CompositorFrame structs. 156 // to be populated from CompositorFrame structs.
158 sqs->SetAll( 157 sqs->SetAll(
159 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */, 158 quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */,
160 bounds_at_origin /* visible_layer_bounds */, 159 bounds_at_origin /* visible_layer_bounds */,
161 bounds_at_origin /* clip_rect */, false /* is_clipped */, 160 bounds_at_origin /* clip_rect */, false /* is_clipped */,
162 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */); 161 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
163 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 162 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
164 quad->SetAll(sqs, bounds_at_origin /* rect */, 163 quad->SetAll(sqs, bounds_at_origin /* rect */,
165 gfx::Rect() /* opaque_rect */, 164 gfx::Rect() /* opaque_rect */,
166 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 165 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
167 default_surface_id); 166 default_surface_id);
168 } 167 }
169 168
170 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { 169 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
Fady Samuel 2017/01/24 02:52:31 Delete this.
Saman Sami 2017/01/24 20:29:58 Done.
171 Remove(window); 170 Remove(window);
172 } 171 }
173 172
174 } // namespace ws 173 } // namespace ws
175 174
176 } // namespace ui 175 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698