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

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

Issue 2717453002: Revert of FrameGenerator should not be created until an AcceleratedWidget is available (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
« 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 "base/containers/adapters.h" 10 #include "base/containers/adapters.h"
11 #include "cc/output/compositor_frame.h" 11 #include "cc/output/compositor_frame.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" 16 #include "services/ui/ws/frame_generator_delegate.h"
17 #include "services/ui/ws/server_window.h" 17 #include "services/ui/ws/server_window.h"
18 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 18 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
19 #include "services/ui/ws/server_window_delegate.h" 19 #include "services/ui/ws/server_window_delegate.h"
20 20
21 namespace ui { 21 namespace ui {
22 22
23 namespace ws { 23 namespace ws {
24 24
25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 25 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
26 ServerWindow* root_window, 26 ServerWindow* root_window)
27 gfx::AcceleratedWidget widget) 27 : delegate_(delegate),
28 : delegate_(delegate), root_window_(root_window), binding_(this) { 28 root_window_(root_window),
29 binding_(this) {
29 DCHECK(delegate_); 30 DCHECK(delegate_);
31 }
32
33 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
34 if (device_scale_factor_ == device_scale_factor)
35 return;
36 device_scale_factor_ = device_scale_factor;
37 if (compositor_frame_sink_)
38 compositor_frame_sink_->SetNeedsBeginFrame(true);
39 }
40
41 FrameGenerator::~FrameGenerator() {
42 compositor_frame_sink_.reset();
43 }
44
45 void FrameGenerator::OnAcceleratedWidgetAvailable(
46 gfx::AcceleratedWidget widget) {
30 DCHECK_NE(gfx::kNullAcceleratedWidget, widget); 47 DCHECK_NE(gfx::kNullAcceleratedWidget, widget);
31 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request = 48 cc::mojom::MojoCompositorFrameSinkAssociatedRequest sink_request =
32 mojo::MakeRequest(&compositor_frame_sink_); 49 mojo::MakeRequest(&compositor_frame_sink_);
33 cc::mojom::DisplayPrivateAssociatedRequest display_request = 50 cc::mojom::DisplayPrivateAssociatedRequest display_request =
34 mojo::MakeRequest(&display_private_); 51 mojo::MakeRequest(&display_private_);
35 root_window_->CreateDisplayCompositorFrameSink( 52 root_window_->CreateDisplayCompositorFrameSink(
36 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(), 53 widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(),
37 std::move(display_request)); 54 std::move(display_request));
38 } 55 }
39 56
40 FrameGenerator::~FrameGenerator() = default;
41
42 void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
43 if (device_scale_factor_ == device_scale_factor)
44 return;
45 device_scale_factor_ = device_scale_factor;
46 compositor_frame_sink_->SetNeedsBeginFrame(true);
47 }
48
49 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { 57 void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
50 DCHECK(surface_info.id().is_valid()); 58 DCHECK(surface_info.id().is_valid());
51 59
52 // Only handle embedded surfaces changing here. The display root surface 60 // Only handle embedded surfaces changing here. The display root surface
53 // changing is handled immediately after the CompositorFrame is submitted. 61 // changing is handled immediately after the CompositorFrame is submitted.
54 if (surface_info != window_manager_surface_info_) { 62 if (surface_info != window_manager_surface_info_) {
55 window_manager_surface_info_ = surface_info; 63 window_manager_surface_info_ = surface_info;
56 compositor_frame_sink_->SetNeedsBeginFrame(true); 64 compositor_frame_sink_->SetNeedsBeginFrame(true);
57 } 65 }
58 } 66 }
59 67
60 void FrameGenerator::OnWindowDamaged() { 68 void FrameGenerator::OnWindowDamaged() {
61 if (window_manager_surface_info_.id().is_valid()) 69 if (window_manager_surface_info_.id().is_valid())
62 compositor_frame_sink_->SetNeedsBeginFrame(true); 70 compositor_frame_sink_->SetNeedsBeginFrame(true);
63 } 71 }
64 72
65 void FrameGenerator::DidReceiveCompositorFrameAck() {} 73 void FrameGenerator::DidReceiveCompositorFrameAck() {}
66 74
67 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) { 75 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
68 if (!root_window_->visible()) 76 if (!root_window_->visible())
69 return; 77 return;
70 78
71 // TODO(fsamuel): We should add a trace for generating a top level frame. 79 // TODO(fsamuel): We should add a trace for generating a top level frame.
72 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); 80 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
73 81
74 gfx::Size frame_size = last_submitted_frame_size_; 82 if (compositor_frame_sink_) {
75 if (!frame.render_pass_list.empty()) 83 gfx::Size frame_size = last_submitted_frame_size_;
76 frame_size = frame.render_pass_list.back()->output_rect.size(); 84 if (!frame.render_pass_list.empty())
85 frame_size = frame.render_pass_list[0]->output_rect.size();
77 86
78 if (!local_surface_id_.is_valid() || 87 if (!local_surface_id_.is_valid() ||
79 frame_size != last_submitted_frame_size_) { 88 frame_size != last_submitted_frame_size_) {
80 local_surface_id_ = id_allocator_.GenerateId(); 89 local_surface_id_ = id_allocator_.GenerateId();
81 display_private_->ResizeDisplay(frame_size); 90 display_private_->ResizeDisplay(frame_size);
91 }
92
93 display_private_->SetLocalSurfaceId(local_surface_id_,
94 device_scale_factor_);
95 compositor_frame_sink_->SubmitCompositorFrame(local_surface_id_,
96 std::move(frame));
97 compositor_frame_sink_->SetNeedsBeginFrame(false);
98 last_submitted_frame_size_ = frame_size;
82 } 99 }
83
84 display_private_->SetLocalSurfaceId(local_surface_id_, device_scale_factor_);
85 compositor_frame_sink_->SubmitCompositorFrame(local_surface_id_,
86 std::move(frame));
87 compositor_frame_sink_->SetNeedsBeginFrame(false);
88 last_submitted_frame_size_ = frame_size;
89 } 100 }
90 101
91 void FrameGenerator::ReclaimResources( 102 void FrameGenerator::ReclaimResources(
92 const cc::ReturnedResourceArray& resources) { 103 const cc::ReturnedResourceArray& resources) {
93 // Nothing to do here because FrameGenerator CompositorFrames don't reference 104 // Nothing to do here because FrameGenerator CompositorFrames don't reference
94 // any resources. 105 // any resources.
95 DCHECK(resources.empty()); 106 DCHECK(resources.empty());
96 } 107 }
97 108
98 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id, 109 void FrameGenerator::WillDrawSurface(const cc::LocalSurfaceId& local_surface_id,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 178 auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
168 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */, 179 quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
169 bounds_at_origin /* visible_rect */, true /* needs_blending*/, 180 bounds_at_origin /* visible_rect */, true /* needs_blending*/,
170 window_manager_surface_info_.id(), 181 window_manager_surface_info_.id(),
171 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 182 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
172 } 183 }
173 184
174 } // namespace ws 185 } // namespace ws
175 186
176 } // namespace ui 187 } // 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