OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/gpu/gpu_child_thread.h" | 5 #include "content/gpu/gpu_child_thread.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 // The GPU process must never send a synchronous IPC message to the browser | 227 // The GPU process must never send a synchronous IPC message to the browser |
228 // process. This could result in deadlock. | 228 // process. This could result in deadlock. |
229 DCHECK(!msg->is_sync()); | 229 DCHECK(!msg->is_sync()); |
230 | 230 |
231 return ChildThreadImpl::Send(msg); | 231 return ChildThreadImpl::Send(msg); |
232 } | 232 } |
233 | 233 |
234 bool GpuChildThread::OnControlMessageReceived(const IPC::Message& msg) { | 234 bool GpuChildThread::OnControlMessageReceived(const IPC::Message& msg) { |
235 bool handled = true; | 235 bool handled = true; |
236 IPC_BEGIN_MESSAGE_MAP(GpuChildThread, msg) | 236 IPC_BEGIN_MESSAGE_MAP(GpuChildThread, msg) |
237 IPC_MESSAGE_HANDLER(GpuMsg_CollectGraphicsInfo, OnCollectGraphicsInfo) | |
238 IPC_MESSAGE_HANDLER(GpuMsg_GpuSwitched, OnGpuSwitched) | 237 IPC_MESSAGE_HANDLER(GpuMsg_GpuSwitched, OnGpuSwitched) |
239 IPC_MESSAGE_UNHANDLED(handled = false) | 238 IPC_MESSAGE_UNHANDLED(handled = false) |
240 IPC_END_MESSAGE_MAP() | 239 IPC_END_MESSAGE_MAP() |
241 | 240 |
242 return handled; | 241 return handled; |
243 } | 242 } |
244 | 243 |
245 bool GpuChildThread::OnMessageReceived(const IPC::Message& msg) { | 244 bool GpuChildThread::OnMessageReceived(const IPC::Message& msg) { |
246 if (ChildThreadImpl::OnMessageReceived(msg)) | 245 if (ChildThreadImpl::OnMessageReceived(msg)) |
247 return true; | 246 return true; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 | 309 |
311 GetInterfaceRegistry()->ResumeBinding(); | 310 GetInterfaceRegistry()->ResumeBinding(); |
312 } | 311 } |
313 | 312 |
314 void GpuChildThread::CreateDisplayCompositor( | 313 void GpuChildThread::CreateDisplayCompositor( |
315 cc::mojom::DisplayCompositorRequest request, | 314 cc::mojom::DisplayCompositorRequest request, |
316 cc::mojom::DisplayCompositorClientPtr client) { | 315 cc::mojom::DisplayCompositorClientPtr client) { |
317 NOTREACHED(); | 316 NOTREACHED(); |
318 } | 317 } |
319 | 318 |
320 void GpuChildThread::OnCollectGraphicsInfo() { | |
321 if (dead_on_arrival_) | |
322 return; | |
323 | |
324 gpu::GPUInfo gpu_info(gpu_service_->gpu_info()); | |
325 #if defined(OS_MACOSX) | |
326 // gpu::CollectContextGraphicsInfo() is already called during gpu process | |
327 // initialization (see GpuInit::InitializeAndStartSandbox()) on non-mac | |
328 // platforms, and during in-browser gpu thread initialization on all platforms | |
329 // (See InProcessGpuThread::Init()). | |
330 if (!in_browser_process_) { | |
331 DCHECK_EQ(gpu::kCollectInfoNone, gpu_info.context_info_state); | |
332 gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info); | |
333 switch (result) { | |
334 case gpu::kCollectInfoFatalFailure: | |
335 LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal)."; | |
336 // TODO(piman): can we signal overall failure? | |
337 break; | |
338 case gpu::kCollectInfoNonFatalFailure: | |
339 DVLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal)."; | |
340 break; | |
341 case gpu::kCollectInfoNone: | |
342 NOTREACHED(); | |
343 break; | |
344 case gpu::kCollectInfoSuccess: | |
345 break; | |
346 } | |
347 GetContentClient()->SetGpuInfo(gpu_info); | |
348 } | |
349 #endif | |
350 | |
351 #if defined(OS_WIN) | |
352 // GPU full info collection should only happen on un-sandboxed GPU process | |
353 // or single process/in-process gpu mode on Windows. | |
354 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
355 DCHECK(command_line->HasSwitch(switches::kDisableGpuSandbox) || | |
356 in_browser_process_); | |
357 | |
358 // This is slow, but it's the only thing the unsandboxed GPU process does, | |
359 // and GpuDataManager prevents us from sending multiple collecting requests, | |
360 // so it's OK to be blocking. | |
361 gpu::GetDxDiagnostics(&gpu_info.dx_diagnostics); | |
362 gpu_info.dx_diagnostics_info_state = gpu::kCollectInfoSuccess; | |
363 #endif // OS_WIN | |
364 | |
365 gpu_service_->set_gpu_info(gpu_info); | |
366 Send(new GpuHostMsg_GraphicsInfoCollected(gpu_info)); | |
367 | |
368 #if defined(OS_WIN) | |
369 if (!in_browser_process_) { | |
370 // The unsandboxed GPU process fulfilled its duty. Rest in peace. | |
371 base::MessageLoop::current()->QuitWhenIdle(); | |
372 } | |
373 #endif // OS_WIN | |
374 } | |
375 | |
376 void GpuChildThread::OnGpuSwitched() { | 319 void GpuChildThread::OnGpuSwitched() { |
377 DVLOG(1) << "GPU: GPU has switched"; | 320 DVLOG(1) << "GPU: GPU has switched"; |
378 // Notify observers in the GPU process. | 321 // Notify observers in the GPU process. |
379 if (!in_browser_process_) | 322 if (!in_browser_process_) |
380 ui::GpuSwitchingManager::GetInstance()->NotifyGpuSwitched(); | 323 ui::GpuSwitchingManager::GetInstance()->NotifyGpuSwitched(); |
381 } | 324 } |
382 | 325 |
383 void GpuChildThread::OnDestroyGpuMemoryBuffer( | 326 void GpuChildThread::OnDestroyGpuMemoryBuffer( |
384 gfx::GpuMemoryBufferId id, | 327 gfx::GpuMemoryBufferId id, |
385 int client_id, | 328 int client_id, |
386 const gpu::SyncToken& sync_token) { | 329 const gpu::SyncToken& sync_token) { |
387 if (gpu_channel_manager()) | 330 if (gpu_channel_manager()) |
388 gpu_channel_manager()->DestroyGpuMemoryBuffer(id, client_id, sync_token); | 331 gpu_channel_manager()->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
389 } | 332 } |
390 | 333 |
391 void GpuChildThread::BindServiceFactoryRequest( | 334 void GpuChildThread::BindServiceFactoryRequest( |
392 service_manager::mojom::ServiceFactoryRequest request) { | 335 service_manager::mojom::ServiceFactoryRequest request) { |
393 DVLOG(1) << "GPU: Binding service_manager::mojom::ServiceFactoryRequest"; | 336 DVLOG(1) << "GPU: Binding service_manager::mojom::ServiceFactoryRequest"; |
394 DCHECK(service_factory_); | 337 DCHECK(service_factory_); |
395 service_factory_bindings_.AddBinding(service_factory_.get(), | 338 service_factory_bindings_.AddBinding(service_factory_.get(), |
396 std::move(request)); | 339 std::move(request)); |
397 } | 340 } |
398 | 341 |
399 } // namespace content | 342 } // namespace content |
OLD | NEW |