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

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

Issue 2474113002: Mus+Ash: Unified BeginFrame Skeleton (Closed)
Patch Set: Rebase Created 4 years, 1 month 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/server_window_compositor_frame_sink.h" 5 #include "services/ui/ws/server_window_compositor_frame_sink.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
11 #include "cc/output/compositor_frame.h" 11 #include "cc/output/compositor_frame.h"
12 #include "cc/output/output_surface.h" 12 #include "cc/output/output_surface.h"
13 #include "cc/output/texture_mailbox_deleter.h" 13 #include "cc/output/texture_mailbox_deleter.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 "cc/scheduler/begin_frame_source.h" 16 #include "cc/scheduler/begin_frame_source.h"
17 #include "cc/surfaces/display_scheduler.h" 17 #include "cc/surfaces/display_scheduler.h"
18 #include "services/ui/surfaces/direct_output_surface.h" 18 #include "services/ui/surfaces/direct_output_surface.h"
19 #include "services/ui/surfaces/display_compositor.h" 19 #include "services/ui/surfaces/display_compositor.h"
20 #include "services/ui/ws/server_window.h"
21 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
22 #include "services/ui/ws/server_window_delegate.h"
23 20
24 #if defined(USE_OZONE) 21 #if defined(USE_OZONE)
25 #include "gpu/command_buffer/client/gles2_interface.h" 22 #include "gpu/command_buffer/client/gles2_interface.h"
26 #include "services/ui/surfaces/direct_output_surface_ozone.h" 23 #include "services/ui/surfaces/direct_output_surface_ozone.h"
27 #endif 24 #endif
28 25
29 namespace ui { 26 namespace ui {
30 namespace ws { 27 namespace ws {
31 28
32 ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink( 29 ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink(
33 ServerWindowCompositorFrameSinkManager* manager, 30 scoped_refptr<DisplayCompositor> display_compositor,
34 const cc::FrameSinkId& frame_sink_id, 31 const cc::FrameSinkId& frame_sink_id,
35 gfx::AcceleratedWidget widget, 32 gfx::AcceleratedWidget widget,
36 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 33 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
37 scoped_refptr<SurfacesContextProvider> context_provider, 34 scoped_refptr<SurfacesContextProvider> context_provider,
38 cc::mojom::MojoCompositorFrameSinkRequest request, 35 cc::mojom::MojoCompositorFrameSinkRequest request,
39 cc::mojom::MojoCompositorFrameSinkClientPtr client) 36 cc::mojom::MojoCompositorFrameSinkClientPtr client)
40 : frame_sink_id_(frame_sink_id), 37 : frame_sink_id_(frame_sink_id),
41 task_runner_(base::ThreadTaskRunnerHandle::Get()), 38 task_runner_(base::ThreadTaskRunnerHandle::Get()),
42 manager_(manager), 39 display_compositor_(display_compositor),
43 surface_factory_(frame_sink_id_, 40 surface_factory_(frame_sink_id_, display_compositor_->manager(), this),
44 manager_->GetCompositorFrameSinkManager(),
45 this),
46 client_(std::move(client)), 41 client_(std::move(client)),
47 binding_(this, std::move(request)) { 42 binding_(this, std::move(request)) {
48 cc::SurfaceManager* surface_manager = 43 display_compositor_->manager()->RegisterFrameSinkId(frame_sink_id_);
49 manager_->GetCompositorFrameSinkManager(); 44 display_compositor_->manager()->RegisterSurfaceFactoryClient(frame_sink_id_,
50 surface_manager->RegisterFrameSinkId(frame_sink_id_); 45 this);
51 surface_manager->RegisterSurfaceFactoryClient(frame_sink_id_, this);
52 46
53 if (widget != gfx::kNullAcceleratedWidget) 47 if (widget != gfx::kNullAcceleratedWidget)
54 InitDisplay(widget, gpu_memory_buffer_manager, std::move(context_provider)); 48 InitDisplay(widget, gpu_memory_buffer_manager, std::move(context_provider));
55 } 49 }
56 50
57 ServerWindowCompositorFrameSink::~ServerWindowCompositorFrameSink() { 51 ServerWindowCompositorFrameSink::~ServerWindowCompositorFrameSink() {
58 // SurfaceFactory's destructor will attempt to return resources which will 52 // SurfaceFactory's destructor will attempt to return resources which will
59 // call back into here and access |client_| so we should destroy 53 // call back into here and access |client_| so we should destroy
60 // |surface_factory_|'s resources early on. 54 // |surface_factory_|'s resources early on.
61 surface_factory_.DestroyAll(); 55 surface_factory_.DestroyAll();
62 cc::SurfaceManager* surface_manager = 56 display_compositor_->manager()->UnregisterSurfaceFactoryClient(
63 manager_->GetCompositorFrameSinkManager(); 57 frame_sink_id_);
64 surface_manager->UnregisterSurfaceFactoryClient(frame_sink_id_); 58 display_compositor_->manager()->InvalidateFrameSinkId(frame_sink_id_);
65 surface_manager->InvalidateFrameSinkId(frame_sink_id_);
66 } 59 }
67 60
68 void ServerWindowCompositorFrameSink::SetNeedsBeginFrame( 61 void ServerWindowCompositorFrameSink::SetNeedsBeginFrame(
69 bool needs_begin_frame) { 62 bool needs_begin_frame) {
70 // TODO(fsamuel): Implement this. 63 needs_begin_frame_ = needs_begin_frame;
64 UpdateNeedsBeginFramesInternal();
71 } 65 }
72 66
73 void ServerWindowCompositorFrameSink::SubmitCompositorFrame( 67 void ServerWindowCompositorFrameSink::SubmitCompositorFrame(
74 cc::CompositorFrame frame) { 68 cc::CompositorFrame frame) {
75 gfx::Size frame_size = frame.render_pass_list[0]->output_rect.size(); 69 gfx::Size frame_size = frame.render_pass_list[0]->output_rect.size();
76 // If the size of the CompostiorFrame has changed then destroy the existing 70 // If the size of the CompostiorFrame has changed then destroy the existing
77 // Surface and create a new one of the appropriate size. 71 // Surface and create a new one of the appropriate size.
78 if (local_frame_id_.is_null() || frame_size != last_submitted_frame_size_) { 72 if (local_frame_id_.is_null() || frame_size != last_submitted_frame_size_) {
79 if (!local_frame_id_.is_null()) 73 if (!local_frame_id_.is_null())
80 surface_factory_.Destroy(local_frame_id_); 74 surface_factory_.Destroy(local_frame_id_);
81 local_frame_id_ = surface_id_allocator_.GenerateId(); 75 local_frame_id_ = surface_id_allocator_.GenerateId();
82 surface_factory_.Create(local_frame_id_); 76 surface_factory_.Create(local_frame_id_);
83 if (display_) 77 if (display_)
84 display_->Resize(frame_size); 78 display_->Resize(frame_size);
85 } 79 }
86 ++ack_pending_count_; 80 ++ack_pending_count_;
87 surface_factory_.SubmitCompositorFrame( 81 surface_factory_.SubmitCompositorFrame(
88 local_frame_id_, std::move(frame), 82 local_frame_id_, std::move(frame),
89 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck, 83 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck,
90 base::Unretained(this))); 84 base::Unretained(this)));
91 if (display_) { 85 if (display_) {
92 display_->SetSurfaceId(cc::SurfaceId(frame_sink_id_, local_frame_id_), 86 display_->SetSurfaceId(cc::SurfaceId(frame_sink_id_, local_frame_id_),
93 frame.metadata.device_scale_factor); 87 frame.metadata.device_scale_factor);
94 } 88 }
95 last_submitted_frame_size_ = frame_size; 89 last_submitted_frame_size_ = frame_size;
96 ServerWindow* window = manager_->window_;
97 window->delegate()->OnScheduleWindowPaint(window);
98 } 90 }
99 91
100 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() { 92 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
101 if (!client_) 93 if (!client_)
102 return; 94 return;
103 client_->DidReceiveCompositorFrameAck(); 95 client_->DidReceiveCompositorFrameAck();
104 DCHECK_GT(ack_pending_count_, 0); 96 DCHECK_GT(ack_pending_count_, 0);
105 if (!surface_returned_resources_.empty()) { 97 if (!surface_returned_resources_.empty()) {
106 client_->ReclaimResources(surface_returned_resources_); 98 client_->ReclaimResources(surface_returned_resources_);
107 surface_returned_resources_.clear(); 99 surface_returned_resources_.clear();
108 } 100 }
109 ack_pending_count_--; 101 ack_pending_count_--;
110 } 102 }
111 103
104 void ServerWindowCompositorFrameSink::AddChildFrameSink(
105 const cc::FrameSinkId& child_frame_sink_id) {
106 cc::SurfaceManager* surface_manager = display_compositor_->manager();
107 surface_manager->RegisterFrameSinkHierarchy(frame_sink_id_,
108 child_frame_sink_id);
109 }
110
111 void ServerWindowCompositorFrameSink::RemoveChildFrameSink(
112 const cc::FrameSinkId& child_frame_sink_id) {
113 cc::SurfaceManager* surface_manager = display_compositor_->manager();
114 surface_manager->UnregisterFrameSinkHierarchy(frame_sink_id_,
115 child_frame_sink_id);
116 }
117
112 void ServerWindowCompositorFrameSink::InitDisplay( 118 void ServerWindowCompositorFrameSink::InitDisplay(
113 gfx::AcceleratedWidget widget, 119 gfx::AcceleratedWidget widget,
114 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 120 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
115 scoped_refptr<SurfacesContextProvider> context_provider) { 121 scoped_refptr<SurfacesContextProvider> context_provider) {
116 // TODO(rjkroege): If there is something better to do than CHECK, add it. 122 // TODO(rjkroege): If there is something better to do than CHECK, add it.
117 CHECK(context_provider->BindToCurrentThread()); 123 CHECK(context_provider->BindToCurrentThread());
118 124
119 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source( 125 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source(
120 new cc::DelayBasedBeginFrameSource( 126 new cc::DelayBasedBeginFrameSource(
121 base::MakeUnique<cc::DelayBasedTimeSource>(task_runner_.get()))); 127 base::MakeUnique<cc::DelayBasedTimeSource>(task_runner_.get())));
(...skipping 18 matching lines...) Expand all
140 146
141 std::unique_ptr<cc::DisplayScheduler> scheduler( 147 std::unique_ptr<cc::DisplayScheduler> scheduler(
142 new cc::DisplayScheduler(synthetic_begin_frame_source.get(), 148 new cc::DisplayScheduler(synthetic_begin_frame_source.get(),
143 task_runner_.get(), max_frames_pending)); 149 task_runner_.get(), max_frames_pending));
144 150
145 display_.reset(new cc::Display( 151 display_.reset(new cc::Display(
146 nullptr /* bitmap_manager */, gpu_memory_buffer_manager, 152 nullptr /* bitmap_manager */, gpu_memory_buffer_manager,
147 cc::RendererSettings(), std::move(synthetic_begin_frame_source), 153 cc::RendererSettings(), std::move(synthetic_begin_frame_source),
148 std::move(display_output_surface), std::move(scheduler), 154 std::move(display_output_surface), std::move(scheduler),
149 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner_.get()))); 155 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner_.get())));
150 display_->Initialize(this, manager_->GetCompositorFrameSinkManager(), 156 display_->Initialize(this, display_compositor_->manager(), frame_sink_id_);
151 frame_sink_id_);
152 display_->SetVisible(true); 157 display_->SetVisible(true);
153 } 158 }
154 159
155 void ServerWindowCompositorFrameSink::DisplayOutputSurfaceLost() {} 160 void ServerWindowCompositorFrameSink::DisplayOutputSurfaceLost() {}
156 161
157 void ServerWindowCompositorFrameSink::DisplayWillDrawAndSwap( 162 void ServerWindowCompositorFrameSink::DisplayWillDrawAndSwap(
158 bool will_draw_and_swap, 163 bool will_draw_and_swap,
159 const cc::RenderPassList& render_passes) {} 164 const cc::RenderPassList& render_passes) {}
160 165
161 void ServerWindowCompositorFrameSink::DisplayDidDrawAndSwap() {} 166 void ServerWindowCompositorFrameSink::DisplayDidDrawAndSwap() {}
162 167
163 void ServerWindowCompositorFrameSink::ReturnResources( 168 void ServerWindowCompositorFrameSink::ReturnResources(
164 const cc::ReturnedResourceArray& resources) { 169 const cc::ReturnedResourceArray& resources) {
165 if (resources.empty()) 170 if (resources.empty())
166 return; 171 return;
167 172
168 if (!ack_pending_count_ && client_) { 173 if (!ack_pending_count_ && client_) {
169 client_->ReclaimResources(resources); 174 client_->ReclaimResources(resources);
170 return; 175 return;
171 } 176 }
172 177
173 std::copy(resources.begin(), resources.end(), 178 std::copy(resources.begin(), resources.end(),
174 std::back_inserter(surface_returned_resources_)); 179 std::back_inserter(surface_returned_resources_));
175 } 180 }
176 181
177 void ServerWindowCompositorFrameSink::SetBeginFrameSource( 182 void ServerWindowCompositorFrameSink::SetBeginFrameSource(
178 cc::BeginFrameSource* begin_frame_source) { 183 cc::BeginFrameSource* begin_frame_source) {
179 // TODO(tansell): Implement this. 184 // TODO(tansell): Implement this.
185 if (begin_frame_source_ && added_frame_observer_) {
186 begin_frame_source_->RemoveObserver(this);
187 added_frame_observer_ = false;
188 }
189 begin_frame_source_ = begin_frame_source;
190 UpdateNeedsBeginFramesInternal();
191 }
192
193 void ServerWindowCompositorFrameSink::OnBeginFrame(
194 const cc::BeginFrameArgs& args) {
195 UpdateNeedsBeginFramesInternal();
196 last_begin_frame_args_ = args;
197 if (client_)
198 client_->OnBeginFrame(args);
199 }
200
201 const cc::BeginFrameArgs&
202 ServerWindowCompositorFrameSink::LastUsedBeginFrameArgs() const {
203 return last_begin_frame_args_;
204 }
205
206 void ServerWindowCompositorFrameSink::OnBeginFrameSourcePausedChanged(
207 bool paused) {}
208
209 void ServerWindowCompositorFrameSink::UpdateNeedsBeginFramesInternal() {
210 if (!begin_frame_source_)
211 return;
212
213 if (needs_begin_frame_ == added_frame_observer_)
214 return;
215
216 added_frame_observer_ = needs_begin_frame_;
217 if (needs_begin_frame_)
218 begin_frame_source_->AddObserver(this);
219 else
220 begin_frame_source_->RemoveObserver(this);
180 } 221 }
181 222
182 } // namespace ws 223 } // namespace ws
183 } // namespace ui 224 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/server_window_compositor_frame_sink.h ('k') | services/ui/ws/server_window_compositor_frame_sink_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698