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

Side by Side Diff: services/ui/gpu/gpu_main.cc

Issue 2942283002: viz: Use a simple GpuMemoryBufferManager implementation. (Closed)
Patch Set: Created 3 years, 6 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/gpu/gpu_main.h ('k') | services/ui/gpu/gpu_service.h » ('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/gpu/gpu_main.h" 5 #include "services/ui/gpu/gpu_main.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/power_monitor/power_monitor_device_source.h" 10 #include "base/power_monitor/power_monitor_device_source.h"
11 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
12 #include "components/viz/common/server_gpu_memory_buffer_manager.h" 12 #include "components/viz/common/server_gpu_memory_buffer_manager.h"
13 #include "components/viz/service/display_compositor/gpu_display_provider.h" 13 #include "components/viz/service/display_compositor/gpu_display_provider.h"
14 #include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" 14 #include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h"
15 #include "gpu/command_buffer/common/activity_flags.h" 15 #include "gpu/command_buffer/common/activity_flags.h"
16 #include "gpu/ipc/client/gpu_memory_buffer_impl.h"
16 #include "gpu/ipc/common/gpu_memory_buffer_support.h" 17 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
17 #include "gpu/ipc/gpu_in_process_thread_service.h" 18 #include "gpu/ipc/gpu_in_process_thread_service.h"
18 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" 19 #include "gpu/ipc/service/gpu_memory_buffer_factory.h"
19 #include "gpu/ipc/service/gpu_watchdog_thread.h" 20 #include "gpu/ipc/service/gpu_watchdog_thread.h"
20 #include "services/ui/gpu/gpu_service.h" 21 #include "services/ui/gpu/gpu_service.h"
21 22
22 #if defined(USE_OZONE) 23 #if defined(USE_OZONE)
23 #include "ui/ozone/public/ozone_platform.h" 24 #include "ui/ozone/public/ozone_platform.h"
24 #endif 25 #endif
25 26
(...skipping 11 matching lines...) Expand all
37 base::MessageLoop::TYPE_DEFAULT); 38 base::MessageLoop::TYPE_DEFAULT);
38 } 39 }
39 #endif // defined(USE_X11) 40 #endif // defined(USE_X11)
40 41
41 #if defined(OS_MACOSX) 42 #if defined(OS_MACOSX)
42 std::unique_ptr<base::MessagePump> CreateMessagePumpMac() { 43 std::unique_ptr<base::MessagePump> CreateMessagePumpMac() {
43 return base::MakeUnique<base::MessagePumpCFRunLoop>(); 44 return base::MakeUnique<base::MessagePumpCFRunLoop>();
44 } 45 }
45 #endif // defined(OS_MACOSX) 46 #endif // defined(OS_MACOSX)
46 47
48 class InProcessGpuMemoryBufferManager : public gpu::GpuMemoryBufferManager {
Fady Samuel 2017/06/16 22:33:17 Move this to a separate file please
49 public:
50 InProcessGpuMemoryBufferManager(gpu::GpuChannelManager* channel_manager,
51 gpu::GpuMemoryBufferFactory* memory_factory)
52 : client_id_(1),
53 channel_manager_(channel_manager),
54 memory_factory_(memory_factory),
55 weak_factory_(this) {
56 weak_ptr_ = weak_factory_.GetWeakPtr();
57 }
58
59 ~InProcessGpuMemoryBufferManager() override {}
60
61 private:
62 void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
63 int client_id,
64 const gpu::SyncToken& sync_token) {
65 channel_manager_->DestroyGpuMemoryBuffer(id, client_id, sync_token);
66 }
67
68 // gpu::GpuMemoryBufferManager:
69 std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
70 const gfx::Size& size,
71 gfx::BufferFormat format,
72 gfx::BufferUsage usage,
73 gpu::SurfaceHandle surface_handle) override {
74 gfx::GpuMemoryBufferId id(next_gpu_memory_id_++);
75 gfx::GpuMemoryBufferHandle buffer_handle =
76 memory_factory_->CreateGpuMemoryBuffer(id, size, format, usage,
77 client_id_, surface_handle);
78 return gpu::GpuMemoryBufferImpl::CreateFromHandle(
79 buffer_handle, size, format, usage,
80 base::Bind(&InProcessGpuMemoryBufferManager::DestroyGpuMemoryBuffer,
81 weak_ptr_, id, client_id_));
82 }
83
84 void SetDestructionSyncToken(gfx::GpuMemoryBuffer* buffer,
85 const gpu::SyncToken& sync_token) override {
86 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token(
87 sync_token);
88 }
89
90 const int client_id_;
91 int next_gpu_memory_id_ = 1;
92 gpu::GpuChannelManager* channel_manager_;
93 gpu::GpuMemoryBufferFactory* memory_factory_;
94 base::WeakPtr<InProcessGpuMemoryBufferManager> weak_ptr_;
95 base::WeakPtrFactory<InProcessGpuMemoryBufferManager> weak_factory_;
96 DISALLOW_COPY_AND_ASSIGN(InProcessGpuMemoryBufferManager);
97 };
98
47 } // namespace 99 } // namespace
48 100
49 namespace ui { 101 namespace ui {
50 102
51 GpuMain::GpuMain(mojom::GpuMainRequest request) 103 GpuMain::GpuMain(mojom::GpuMainRequest request)
52 : gpu_thread_("GpuThread"), 104 : gpu_thread_("GpuThread"),
53 io_thread_("GpuIOThread"), 105 io_thread_("GpuIOThread"),
54 compositor_thread_("DisplayCompositorThread"), 106 compositor_thread_("DisplayCompositorThread"),
55 power_monitor_(base::MakeUnique<base::PowerMonitorDeviceSource>()), 107 power_monitor_(base::MakeUnique<base::PowerMonitorDeviceSource>()),
56 binding_(this) { 108 binding_(this) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 cc::mojom::FrameSinkManagerRequest request, 220 cc::mojom::FrameSinkManagerRequest request,
169 cc::mojom::FrameSinkManagerClientPtrInfo client_info) { 221 cc::mojom::FrameSinkManagerClientPtrInfo client_info) {
170 DCHECK(!gpu_command_service_); 222 DCHECK(!gpu_command_service_);
171 DCHECK(gpu_service_); 223 DCHECK(gpu_service_);
172 DCHECK(gpu_thread_task_runner_->BelongsToCurrentThread()); 224 DCHECK(gpu_thread_task_runner_->BelongsToCurrentThread());
173 gpu_command_service_ = new gpu::GpuInProcessThreadService( 225 gpu_command_service_ = new gpu::GpuInProcessThreadService(
174 gpu_thread_task_runner_, gpu_service_->sync_point_manager(), 226 gpu_thread_task_runner_, gpu_service_->sync_point_manager(),
175 gpu_service_->mailbox_manager(), gpu_service_->share_group()); 227 gpu_service_->mailbox_manager(), gpu_service_->share_group());
176 228
177 gpu::ImageFactory* image_factory = gpu_service_->gpu_image_factory(); 229 gpu::ImageFactory* image_factory = gpu_service_->gpu_image_factory();
178
179 // If the FrameSinkManager creation was delayed because GpuService had not
180 // been created yet, then this is called, in gpu thread, right after
181 // GpuService is created.
182 mojom::GpuServicePtr gpu_service;
183 BindGpuInternalOnGpuThread(mojo::MakeRequest(&gpu_service));
184 compositor_thread_task_runner_->PostTask( 230 compositor_thread_task_runner_->PostTask(
185 FROM_HERE, base::Bind(&GpuMain::CreateFrameSinkManagerOnCompositorThread, 231 FROM_HERE, base::Bind(&GpuMain::CreateFrameSinkManagerOnCompositorThread,
186 base::Unretained(this), image_factory, 232 base::Unretained(this), image_factory,
187 base::Passed(gpu_service.PassInterface()),
188 base::Passed(std::move(request)), 233 base::Passed(std::move(request)),
189 base::Passed(std::move(client_info)))); 234 base::Passed(std::move(client_info))));
190 } 235 }
191 236
192 void GpuMain::CreateFrameSinkManagerOnCompositorThread( 237 void GpuMain::CreateFrameSinkManagerOnCompositorThread(
193 gpu::ImageFactory* image_factory, 238 gpu::ImageFactory* image_factory,
194 mojom::GpuServicePtrInfo gpu_service_info,
195 cc::mojom::FrameSinkManagerRequest request, 239 cc::mojom::FrameSinkManagerRequest request,
196 cc::mojom::FrameSinkManagerClientPtrInfo client_info) { 240 cc::mojom::FrameSinkManagerClientPtrInfo client_info) {
197 DCHECK(!frame_sink_manager_); 241 DCHECK(!frame_sink_manager_);
198 cc::mojom::FrameSinkManagerClientPtr client; 242 cc::mojom::FrameSinkManagerClientPtr client;
199 client.Bind(std::move(client_info)); 243 client.Bind(std::move(client_info));
200 244
201 gpu_internal_.Bind(std::move(gpu_service_info));
202
203 display_provider_ = base::MakeUnique<viz::GpuDisplayProvider>( 245 display_provider_ = base::MakeUnique<viz::GpuDisplayProvider>(
204 gpu_command_service_, 246 gpu_command_service_,
205 base::MakeUnique<viz::ServerGpuMemoryBufferManager>(gpu_internal_.get(), 247 base::MakeUnique<InProcessGpuMemoryBufferManager>(
206 1 /* client_id */), 248 gpu_service_->gpu_channel_manager(),
249 gpu_service_->gpu_memory_buffer_factory()),
207 image_factory); 250 image_factory);
208 251
209 frame_sink_manager_ = base::MakeUnique<viz::MojoFrameSinkManager>( 252 frame_sink_manager_ = base::MakeUnique<viz::MojoFrameSinkManager>(
210 true, display_provider_.get()); 253 true, display_provider_.get());
211 frame_sink_manager_->BindPtrAndSetClient(std::move(request), 254 frame_sink_manager_->BindPtrAndSetClient(std::move(request),
212 std::move(client)); 255 std::move(client));
213 } 256 }
214 257
215 void GpuMain::TearDownOnCompositorThread() { 258 void GpuMain::TearDownOnCompositorThread() {
216 frame_sink_manager_.reset(); 259 frame_sink_manager_.reset();
217 display_provider_.reset(); 260 display_provider_.reset();
218 gpu_internal_.reset();
219 } 261 }
220 262
221 void GpuMain::TearDownOnGpuThread() { 263 void GpuMain::TearDownOnGpuThread() {
222 binding_.Close(); 264 binding_.Close();
223 gpu_service_.reset(); 265 gpu_service_.reset();
224 gpu_memory_buffer_factory_.reset(); 266 gpu_memory_buffer_factory_.reset();
225 gpu_init_.reset(); 267 gpu_init_.reset();
226 } 268 }
227 269
228 void GpuMain::CreateGpuServiceOnGpuThread( 270 void GpuMain::CreateGpuServiceOnGpuThread(
229 mojom::GpuServiceRequest request, 271 mojom::GpuServiceRequest request,
230 mojom::GpuHostPtr gpu_host, 272 mojom::GpuHostPtr gpu_host,
231 const gpu::GpuPreferences& preferences, 273 const gpu::GpuPreferences& preferences,
232 gpu::GpuProcessActivityFlags activity_flags) { 274 gpu::GpuProcessActivityFlags activity_flags) {
233 gpu_service_->UpdateGPUInfoFromPreferences(preferences); 275 gpu_service_->UpdateGPUInfoFromPreferences(preferences);
234 gpu_service_->InitializeWithHost(std::move(gpu_host), 276 gpu_service_->InitializeWithHost(std::move(gpu_host),
235 std::move(activity_flags)); 277 std::move(activity_flags));
236 gpu_service_->Bind(std::move(request)); 278 gpu_service_->Bind(std::move(request));
237 279
238 if (pending_frame_sink_manager_request_.is_pending()) { 280 if (pending_frame_sink_manager_request_.is_pending()) {
239 CreateFrameSinkManagerInternal( 281 CreateFrameSinkManagerInternal(
240 std::move(pending_frame_sink_manager_request_), 282 std::move(pending_frame_sink_manager_request_),
241 std::move(pending_frame_sink_manager_client_info_)); 283 std::move(pending_frame_sink_manager_client_info_));
242 } 284 }
243 } 285 }
244 286
245 void GpuMain::BindGpuInternalOnGpuThread(mojom::GpuServiceRequest request) {
246 gpu_service_->Bind(std::move(request));
247 }
248
249 void GpuMain::PreSandboxStartup() { 287 void GpuMain::PreSandboxStartup() {
250 // TODO(sad): https://crbug.com/645602 288 // TODO(sad): https://crbug.com/645602
251 } 289 }
252 290
253 bool GpuMain::EnsureSandboxInitialized( 291 bool GpuMain::EnsureSandboxInitialized(
254 gpu::GpuWatchdogThread* watchdog_thread) { 292 gpu::GpuWatchdogThread* watchdog_thread) {
255 // TODO(sad): https://crbug.com/645602 293 // TODO(sad): https://crbug.com/645602
256 return true; 294 return true;
257 } 295 }
258 296
259 } // namespace ui 297 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/gpu/gpu_main.h ('k') | services/ui/gpu/gpu_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698