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 |