OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/gpu/gpu_thread.h" | 5 #include "chrome/gpu/gpu_thread.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "app/gfx/gl/gl_context.h" | 10 #include "app/gfx/gl/gl_context.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 // Load the GL implementation and locate the bindings before starting the GPU | 88 // Load the GL implementation and locate the bindings before starting the GPU |
89 // watchdog because this can take a lot of time and the GPU watchdog might | 89 // watchdog because this can take a lot of time and the GPU watchdog might |
90 // terminate the GPU process. | 90 // terminate the GPU process. |
91 if (!gfx::GLContext::InitializeOneOff()) { | 91 if (!gfx::GLContext::InitializeOneOff()) { |
92 MessageLoop::current()->Quit(); | 92 MessageLoop::current()->Quit(); |
93 return; | 93 return; |
94 } | 94 } |
95 gpu_info_collector::CollectGraphicsInfo(&gpu_info_); | 95 gpu_info_collector::CollectGraphicsInfo(&gpu_info_); |
96 child_process_logging::SetGpuInfo(gpu_info_); | 96 child_process_logging::SetGpuInfo(gpu_info_); |
97 | 97 |
| 98 #if defined(OS_WIN) |
| 99 // Asynchronously collect the DirectX diagnostics because this can take a |
| 100 // couple of seconds. |
| 101 if (!base::WorkerPool::PostTask( |
| 102 FROM_HERE, |
| 103 NewRunnableFunction(&GpuThread::CollectDxDiagnostics, this), |
| 104 true)) { |
| 105 // Flag GPU info as complete if the DirectX diagnostics cannot be collected. |
| 106 gpu_info_.SetProgress(GPUInfo::kComplete); |
| 107 } |
| 108 #endif |
| 109 |
98 // Record initialization only after collecting the GPU info because that can | 110 // Record initialization only after collecting the GPU info because that can |
99 // take a significant amount of time. | 111 // take a significant amount of time. |
100 gpu_info_.SetInitializationTime(base::Time::Now() - process_start_time_); | 112 gpu_info_.SetInitializationTime(base::Time::Now() - process_start_time_); |
101 | 113 |
102 // Note that kNoSandbox will also disable the GPU sandbox. | 114 // Note that kNoSandbox will also disable the GPU sandbox. |
103 bool no_gpu_sandbox = CommandLine::ForCurrentProcess()->HasSwitch( | 115 bool no_gpu_sandbox = CommandLine::ForCurrentProcess()->HasSwitch( |
104 switches::kNoGpuSandbox); | 116 switches::kNoGpuSandbox); |
105 if (!no_gpu_sandbox) { | 117 if (!no_gpu_sandbox) { |
106 if (!InitializeGpuSandbox()) { | 118 if (!InitializeGpuSandbox()) { |
107 LOG(ERROR) << "Failed to initialize the GPU sandbox"; | 119 LOG(ERROR) << "Failed to initialize the GPU sandbox"; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 gpu_channels_.erase(iter); | 201 gpu_channels_.erase(iter); |
190 return; | 202 return; |
191 } | 203 } |
192 } | 204 } |
193 } | 205 } |
194 | 206 |
195 void GpuThread::OnSynchronize() { | 207 void GpuThread::OnSynchronize() { |
196 Send(new GpuHostMsg_SynchronizeReply()); | 208 Send(new GpuHostMsg_SynchronizeReply()); |
197 } | 209 } |
198 | 210 |
199 void GpuThread::OnCollectGraphicsInfo(GPUInfo::Level level) { | 211 void GpuThread::OnCollectGraphicsInfo() { |
200 #if defined(OS_WIN) | |
201 if (level == GPUInfo::kComplete && gpu_info_.level() <= GPUInfo::kPartial) { | |
202 // Prevent concurrent collection of DirectX diagnostics. | |
203 gpu_info_.SetLevel(GPUInfo::kCompleting); | |
204 | |
205 // Asynchronously collect the DirectX diagnostics because this can take a | |
206 // couple of seconds. | |
207 if (!base::WorkerPool::PostTask( | |
208 FROM_HERE, | |
209 NewRunnableFunction(&GpuThread::CollectDxDiagnostics, this), | |
210 true)) { | |
211 | |
212 // Flag GPU info as complete if the DirectX diagnostics cannot be | |
213 // collected. | |
214 gpu_info_.SetLevel(GPUInfo::kComplete); | |
215 } | |
216 } | |
217 #endif | |
218 | |
219 Send(new GpuHostMsg_GraphicsInfoCollected(gpu_info_)); | 212 Send(new GpuHostMsg_GraphicsInfoCollected(gpu_info_)); |
220 } | 213 } |
221 | 214 |
222 #if defined(OS_MACOSX) | 215 #if defined(OS_MACOSX) |
223 void GpuThread::OnAcceleratedSurfaceBuffersSwappedACK( | 216 void GpuThread::OnAcceleratedSurfaceBuffersSwappedACK( |
224 int renderer_id, int32 route_id, uint64 swap_buffers_count) { | 217 int renderer_id, int32 route_id, uint64 swap_buffers_count) { |
225 GpuChannelMap::const_iterator iter = gpu_channels_.find(renderer_id); | 218 GpuChannelMap::const_iterator iter = gpu_channels_.find(renderer_id); |
226 if (iter == gpu_channels_.end()) | 219 if (iter == gpu_channels_.end()) |
227 return; | 220 return; |
228 scoped_refptr<GpuChannel> channel = iter->second; | 221 scoped_refptr<GpuChannel> channel = iter->second; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 gpu_info_collector::GetDxDiagnostics(&node); | 255 gpu_info_collector::GetDxDiagnostics(&node); |
263 | 256 |
264 thread->message_loop()->PostTask( | 257 thread->message_loop()->PostTask( |
265 FROM_HERE, | 258 FROM_HERE, |
266 NewRunnableFunction(&GpuThread::SetDxDiagnostics, thread, node)); | 259 NewRunnableFunction(&GpuThread::SetDxDiagnostics, thread, node)); |
267 } | 260 } |
268 | 261 |
269 // Runs on the GPU thread. | 262 // Runs on the GPU thread. |
270 void GpuThread::SetDxDiagnostics(GpuThread* thread, const DxDiagNode& node) { | 263 void GpuThread::SetDxDiagnostics(GpuThread* thread, const DxDiagNode& node) { |
271 thread->gpu_info_.SetDxDiagnostics(node); | 264 thread->gpu_info_.SetDxDiagnostics(node); |
272 thread->gpu_info_.SetLevel(GPUInfo::kComplete); | 265 thread->gpu_info_.SetProgress(GPUInfo::kComplete); |
273 } | 266 } |
274 | 267 |
275 #endif | 268 #endif |
OLD | NEW |