OLD | NEW |
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_service.h" | 5 #include "services/ui/gpu/gpu_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/crash_logging.h" | 8 #include "base/debug/crash_logging.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| 11 #include "base/message_loop/message_loop.h" |
11 #include "base/threading/thread_task_runner_handle.h" | 12 #include "base/threading/thread_task_runner_handle.h" |
12 #include "build/build_config.h" | 13 #include "build/build_config.h" |
13 #include "cc/output/in_process_context_provider.h" | 14 #include "cc/output/in_process_context_provider.h" |
14 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | 15 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
15 #include "gpu/command_buffer/service/gpu_switches.h" | 16 #include "gpu/command_buffer/service/gpu_switches.h" |
16 #include "gpu/command_buffer/service/sync_point_manager.h" | 17 #include "gpu/command_buffer/service/sync_point_manager.h" |
17 #include "gpu/config/gpu_info_collector.h" | 18 #include "gpu/config/gpu_info_collector.h" |
18 #include "gpu/config/gpu_switches.h" | 19 #include "gpu/config/gpu_switches.h" |
19 #include "gpu/config/gpu_util.h" | 20 #include "gpu/config/gpu_util.h" |
20 #include "gpu/ipc/common/gpu_memory_buffer_support.h" | 21 #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 void GpuService::GetVideoMemoryUsageStats( | 183 void GpuService::GetVideoMemoryUsageStats( |
183 const GetVideoMemoryUsageStatsCallback& callback) { | 184 const GetVideoMemoryUsageStatsCallback& callback) { |
184 gpu::VideoMemoryUsageStats video_memory_usage_stats; | 185 gpu::VideoMemoryUsageStats video_memory_usage_stats; |
185 if (gpu_channel_manager_) { | 186 if (gpu_channel_manager_) { |
186 gpu_channel_manager_->gpu_memory_manager()->GetVideoMemoryUsageStats( | 187 gpu_channel_manager_->gpu_memory_manager()->GetVideoMemoryUsageStats( |
187 &video_memory_usage_stats); | 188 &video_memory_usage_stats); |
188 } | 189 } |
189 callback.Run(video_memory_usage_stats); | 190 callback.Run(video_memory_usage_stats); |
190 } | 191 } |
191 | 192 |
| 193 void GpuService::RequestCompleteGpuInfo( |
| 194 const RequestCompleteGpuInfoCallback& callback) { |
| 195 UpdateGpuInfoPlatform(); |
| 196 callback.Run(gpu_info_); |
| 197 #if defined(OS_WIN) |
| 198 if (!in_host_process_) { |
| 199 // The unsandboxed GPU process fulfilled its duty. Rest in peace. |
| 200 base::MessageLoop::current()->QuitWhenIdle(); |
| 201 } |
| 202 #endif |
| 203 } |
| 204 |
| 205 #if defined(OS_MACOSX) |
| 206 void GpuService::UpdateGpuInfoPlatform() { |
| 207 // gpu::CollectContextGraphicsInfo() is already called during gpu process |
| 208 // initialization (see GpuInit::InitializeAndStartSandbox()) on non-mac |
| 209 // platforms, and during in-browser gpu thread initialization on all platforms |
| 210 // (See InProcessGpuThread::Init()). |
| 211 if (in_host_process_) |
| 212 return; |
| 213 |
| 214 DCHECK_EQ(gpu::kCollectInfoNone, gpu_info_.context_info_state); |
| 215 gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info_); |
| 216 switch (result) { |
| 217 case gpu::kCollectInfoFatalFailure: |
| 218 LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal)."; |
| 219 // TODO(piman): can we signal overall failure? |
| 220 break; |
| 221 case gpu::kCollectInfoNonFatalFailure: |
| 222 DVLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal)."; |
| 223 break; |
| 224 case gpu::kCollectInfoNone: |
| 225 NOTREACHED(); |
| 226 break; |
| 227 case gpu::kCollectInfoSuccess: |
| 228 break; |
| 229 } |
| 230 gpu::SetKeysForCrashLogging(gpu_info_); |
| 231 } |
| 232 #elif defined(OS_WIN) |
| 233 void GpuService::UpdateGpuInfoPlatform() { |
| 234 // GPU full info collection should only happen on un-sandboxed GPU process |
| 235 // or single process/in-process gpu mode on Windows. |
| 236 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| 237 DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process_); |
| 238 |
| 239 // This is slow, but it's the only thing the unsandboxed GPU process does, |
| 240 // and GpuDataManager prevents us from sending multiple collecting requests, |
| 241 // so it's OK to be blocking. |
| 242 gpu::GetDxDiagnostics(&gpu_info_.dx_diagnostics); |
| 243 gpu_info_.dx_diagnostics_info_state = gpu::kCollectInfoSuccess; |
| 244 } |
| 245 #else |
| 246 void GpuService::UpdateGpuInfoPlatform() {} |
| 247 #endif |
| 248 |
192 void GpuService::DidCreateOffscreenContext(const GURL& active_url) { | 249 void GpuService::DidCreateOffscreenContext(const GURL& active_url) { |
193 (*gpu_host_)->DidCreateOffscreenContext(active_url); | 250 (*gpu_host_)->DidCreateOffscreenContext(active_url); |
194 } | 251 } |
195 | 252 |
196 void GpuService::DidDestroyChannel(int client_id) { | 253 void GpuService::DidDestroyChannel(int client_id) { |
197 media_gpu_channel_manager_->RemoveChannel(client_id); | 254 media_gpu_channel_manager_->RemoveChannel(client_id); |
198 (*gpu_host_)->DidDestroyChannel(client_id); | 255 (*gpu_host_)->DidDestroyChannel(client_id); |
199 } | 256 } |
200 | 257 |
201 void GpuService::DidDestroyOffscreenContext(const GURL& active_url) { | 258 void GpuService::DidDestroyOffscreenContext(const GURL& active_url) { |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 NOTREACHED() << "Java exception not supported on this platform."; | 370 NOTREACHED() << "Java exception not supported on this platform."; |
314 #endif | 371 #endif |
315 } | 372 } |
316 | 373 |
317 void GpuService::Stop(const StopCallback& callback) { | 374 void GpuService::Stop(const StopCallback& callback) { |
318 base::MessageLoop::current()->QuitWhenIdle(); | 375 base::MessageLoop::current()->QuitWhenIdle(); |
319 callback.Run(); | 376 callback.Run(); |
320 } | 377 } |
321 | 378 |
322 } // namespace ui | 379 } // namespace ui |
OLD | NEW |