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

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

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