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

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: Created 3 years, 10 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 ServerWindow* window) {
58 DCHECK(surface_id.is_valid()); 53 DCHECK(surface_info.id().is_valid());
59 54
60 // Only handle embedded surfaces changing here. The display root surface 55 // Only handle embedded surfaces changing here. The display root surface
61 // changing is handled immediately after the CompositorFrame is submitted. 56 // changing is handled immediately after the CompositorFrame is submitted.
62 // TODO(samans): Only tell FrameGenerator about WM surface instead of all 57 // TODO(samans): Only tell FrameGenerator about WM surface instead of all
63 // all surfaces. 58 // all surfaces.
64 if (window == delegate_->GetActiveRootWindow()) 59 if (window == delegate_->GetActiveRootWindow()) {
65 window_manager_surface_id_ = surface_id; 60 if (surface_info != window_manager_surface_info_)
61 compositor_frame_sink_->SetNeedsBeginFrame(true);
62 window_manager_surface_info_ = surface_info;
63 }
66 } 64 }
67 65
68 void FrameGenerator::DidReceiveCompositorFrameAck() {} 66 void FrameGenerator::DidReceiveCompositorFrameAck() {}
69 67
70 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 68 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
71 if (!root_window_->visible()) 69 if (!root_window_->visible())
72 return; 70 return;
73 71
74 // TODO(fsamuel): We should add a trace for generating a top level frame. 72 // TODO(fsamuel): We should add a trace for generating a top level frame.
75 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 73 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
76 74
77 if (compositor_frame_sink_) { 75 if (compositor_frame_sink_) {
78 gfx::Size frame_size = last_submitted_frame_size_; 76 gfx::Size frame_size = last_submitted_frame_size_;
79 if (!frame.render_pass_list.empty()) 77 if (!frame.render_pass_list.empty())
80 frame_size = frame.render_pass_list[0]->output_rect.size(); 78 frame_size = frame.render_pass_list[0]->output_rect.size();
81 79
82 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_) 80 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_)
83 local_frame_id_ = id_allocator_.GenerateId(); 81 local_frame_id_ = id_allocator_.GenerateId();
84 82
85 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, 83 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
86 std::move(frame)); 84 std::move(frame));
85 compositor_frame_sink_->SetNeedsBeginFrame(false);
87 last_submitted_frame_size_ = frame_size; 86 last_submitted_frame_size_ = frame_size;
88 } 87 }
89 } 88 }
90 89
91 void FrameGenerator::ReclaimResources( 90 void FrameGenerator::ReclaimResources(
92 const cc::ReturnedResourceArray& resources) { 91 const cc::ReturnedResourceArray& resources) {
93 // Nothing to do here because FrameGenerator CompositorFrames don't reference 92 // Nothing to do here because FrameGenerator CompositorFrames don't reference
94 // any resources. 93 // any resources.
95 } 94 }
96 95
(...skipping 23 matching lines...) Expand all
120 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 119 render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
121 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 120 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
122 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 121 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
123 gfx::Size() /* mask_texture_size */, 122 gfx::Size() /* mask_texture_size */,
124 gfx::Vector2dF() /* filters_scale */, 123 gfx::Vector2dF() /* filters_scale */,
125 gfx::PointF() /* filters_origin */); 124 gfx::PointF() /* filters_origin */);
126 frame.render_pass_list.push_back(std::move(invert_pass)); 125 frame.render_pass_list.push_back(std::move(invert_pass));
127 } 126 }
128 frame.metadata.device_scale_factor = device_scale_factor_; 127 frame.metadata.device_scale_factor = device_scale_factor_;
129 128
130 if (window_manager_surface_id_.is_valid()) 129 if (window_manager_surface_info_.id().is_valid()) {
131 frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_); 130 frame.metadata.referenced_surfaces.push_back(
131 window_manager_surface_info_.id());
132 }
132 133
133 return frame; 134 return frame;
134 } 135 }
135 136
136 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) { 137 void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) {
137 if (!window || !window->visible()) 138 if (!window || !window->visible())
138 return; 139 return;
139 140
140 if (!window->compositor_frame_sink_manager()) 141 if (!window->compositor_frame_sink_manager())
141 return; 142 return;
(...skipping 25 matching lines...) Expand all
167 default_surface_id); 168 default_surface_id);
168 } 169 }
169 170
170 void FrameGenerator::OnWindowDestroying(ServerWindow* window) { 171 void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
171 Remove(window); 172 Remove(window);
172 } 173 }
173 174
174 } // namespace ws 175 } // namespace ws
175 176
176 } // namespace ui 177 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698