| Index: chrome/gpu/gpu_thread.cc
|
| ===================================================================
|
| --- chrome/gpu/gpu_thread.cc (revision 66118)
|
| +++ chrome/gpu/gpu_thread.cc (working copy)
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "app/gfx/gl/gl_context.h"
|
| #include "base/command_line.h"
|
| +#include "base/worker_pool.h"
|
| #include "build/build_config.h"
|
| #include "chrome/common/child_process.h"
|
| #include "chrome/common/child_process_logging.h"
|
| @@ -16,6 +17,10 @@
|
| #include "chrome/gpu/gpu_info_collector.h"
|
| #include "ipc/ipc_channel_handle.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include "app/win_util.h"
|
| +#endif
|
| +
|
| #if defined(TOOLKIT_USES_GTK)
|
| #include <gtk/gtk.h>
|
| #include "app/x11_util.h"
|
| @@ -44,6 +49,18 @@
|
| gpu_info_collector::CollectGraphicsInfo(&gpu_info_);
|
| child_process_logging::SetGpuInfo(gpu_info_);
|
|
|
| +#if defined(OS_WIN)
|
| + // Asynchronously collect the DirectX diagnostics because this can take a
|
| + // couple of seconds.
|
| + if (!WorkerPool::PostTask(
|
| + FROM_HERE,
|
| + NewRunnableFunction(&GpuThread::CollectDxDiagnostics, this),
|
| + true)) {
|
| + // Flag GPU info as complete if the DirectX diagnostics cannot be collected.
|
| + gpu_info_.SetProgress(GPUInfo::kComplete);
|
| + }
|
| +#endif
|
| +
|
| // Record initialization only after collecting the GPU info because that can
|
| // take a significant amount of time.
|
| gpu_info_.SetInitializationTime(base::Time::Now() - process_start_time);
|
| @@ -118,3 +135,26 @@
|
| for (;;)
|
| PlatformThread::Sleep(1000);
|
| }
|
| +
|
| +#if defined(OS_WIN)
|
| +
|
| +// Runs on a worker thread. The GpuThread never terminates voluntarily so it is
|
| +// safe to assume that its message loop is valid.
|
| +void GpuThread::CollectDxDiagnostics(GpuThread* thread) {
|
| + win_util::ScopedCOMInitializer com_initializer;
|
| +
|
| + DxDiagNode node;
|
| + gpu_info_collector::GetDxDiagnostics(&node);
|
| +
|
| + thread->message_loop()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableFunction(&GpuThread::SetDxDiagnostics, thread, node));
|
| +}
|
| +
|
| +// Runs on the GPU thread.
|
| +void GpuThread::SetDxDiagnostics(GpuThread* thread, const DxDiagNode& node) {
|
| + thread->gpu_info_.SetDxDiagnostics(node);
|
| + thread->gpu_info_.SetProgress(GPUInfo::kComplete);
|
| +}
|
| +
|
| +#endif
|
|
|