Moving gpu_info to common so that it can be used by param traits. Pulling the collection out into a separate class.
BUG=38736
TEST=existing unittests
Review URL: http://codereview.chromium.org/2914001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51967 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/gpu/gpu_info_collector_win.cc b/chrome/gpu/gpu_info_collector_win.cc
new file mode 100644
index 0000000..07b7c5be
--- /dev/null
+++ b/chrome/gpu/gpu_info_collector_win.cc
@@ -0,0 +1,108 @@
+// Copyright (c) 2006-2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/gpu/gpu_info_collector.h"
+
+#include <windows.h>
+#include <d3d9.h>
+
+#include "base/logging.h"
+#include "base/scoped_native_library.h"
+#include "base/string_util.h"
+
+namespace gpu_info_collector {
+
+bool CollectGraphicsInfo(GPUInfo& gpu_info) {
+ FilePath d3d_path(base::GetNativeLibraryName(L"d3d9"));
+ base::ScopedNativeLibrary d3dlib(d3d_path);
+
+ typedef IDirect3D9* (WINAPI *Direct3DCreate9Proc)(UINT);
+ Direct3DCreate9Proc d3d_create_proc =
+ static_cast<Direct3DCreate9Proc>(
+ d3dlib.GetFunctionPointer("Direct3DCreate9"));
+
+ if (!d3d_create_proc) {
+ return false;
+ }
+ IDirect3D9 *d3d = d3d_create_proc(D3D_SDK_VERSION);
+ if (!d3d) {
+ return false;
+ }
+ return CollectGraphicsInfoD3D(d3d, gpu_info);
+}
+
+bool CollectGraphicsInfoD3D(IDirect3D9* d3d,
+ GPUInfo& gpu_info) {
+ // Get device information
+ D3DADAPTER_IDENTIFIER9 identifier;
+ HRESULT hr = d3d->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &identifier);
+ if (hr != D3D_OK) {
+ d3d->Release();
+ return false;
+ }
+ uint32 vendor_id = identifier.VendorId;
+ uint32 device_id = identifier.DeviceId;
+
+ // Get version information
+ D3DCAPS9 d3d_caps;
+ HRESULT caps_result = d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,
+ D3DDEVTYPE_HAL,
+ &d3d_caps);
+ if (caps_result != D3D_OK) {
+ d3d->Release();
+ return false;
+ }
+ uint32 driver_major_version_hi = HIWORD(identifier.DriverVersion.HighPart);
+ uint32 driver_major_version_lo = LOWORD(identifier.DriverVersion.HighPart);
+ uint32 driver_minor_version_hi = HIWORD(identifier.DriverVersion.LowPart);
+ uint32 driver_minor_version_lo = LOWORD(identifier.DriverVersion.LowPart);
+ std::wstring driver_version = StringPrintf(L"%d.%d.%d.%d",
+ driver_major_version_hi,
+ driver_major_version_lo,
+ driver_minor_version_hi,
+ driver_minor_version_lo);
+ d3d->Release();
+
+ // Get shader versions
+ uint32 pixel_shader_version = d3d_caps.PixelShaderVersion;
+ uint32 vertex_shader_version = d3d_caps.VertexShaderVersion;
+
+ gpu_info.SetGraphicsInfo(vendor_id, device_id, driver_version,
+ pixel_shader_version, vertex_shader_version);
+ return true;
+}
+
+bool CollectGraphicsInfoGL(GPUInfo& gpu_info) {
+ // Taken from http://developer.nvidia.com/object/device_ids.html
+ DISPLAY_DEVICE dd;
+ dd.cb = sizeof(DISPLAY_DEVICE);
+ int i = 0;
+ std::wstring id;
+ for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); ++i) {
+ if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
+ id = dd.DeviceID;
+ break;
+ }
+ }
+ if (id.empty()) {
+ return false;
+ }
+ uint32 vendor_id;
+ uint32 device_id;
+ std::wstring vendorid = id.substr(8, 4);
+ std::wstring deviceid = id.substr(17, 4);
+ swscanf_s(vendorid.c_str(), L"%x", &vendor_id);
+ swscanf_s(deviceid.c_str(), L"%x", &device_id);
+
+ std::wstring driver_version = L"";
+ uint32 pixel_shader_version = 0;
+ uint32 vertex_shader_version = 0;
+ gpu_info.SetGraphicsInfo(vendor_id, device_id, driver_version,
+ pixel_shader_version, vertex_shader_version);
+ return true;
+
+ // TODO(rlp): Add driver and pixel versions
+}
+
+} // namespace gpu_info_collector