| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "gpu/config/gpu_info_collector.h" | 5 #include "gpu/config/gpu_info_collector.h" |
| 6 | 6 |
| 7 // This has to be included before windows.h. | 7 // This has to be included before windows.h. |
| 8 #include "third_party/re2/re2/re2.h" | 8 #include "third_party/re2/re2/re2.h" |
| 9 | 9 |
| 10 #include <windows.h> | 10 #include <windows.h> |
| 11 #include <d3d9.h> | 11 #include <d3d9.h> |
| 12 #include <d3d11.h> | 12 #include <d3d11.h> |
| 13 #include <dxgi.h> | 13 #include <dxgi.h> |
| 14 #include <setupapi.h> | 14 #include <setupapi.h> |
| 15 | 15 |
| 16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
| 17 #include "base/debug/trace_event.h" | 17 #include "base/debug/trace_event.h" |
| 18 #include "base/file_util.h" | 18 #include "base/file_util.h" |
| 19 #include "base/files/file_enumerator.h" | 19 #include "base/files/file_enumerator.h" |
| 20 #include "base/files/file_path.h" | 20 #include "base/files/file_path.h" |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/message_loop/message_loop.h" | 22 #include "base/message_loop/message_loop.h" |
| 23 #include "base/metrics/field_trial.h" | 23 #include "base/metrics/field_trial.h" |
| 24 #include "base/metrics/histogram.h" | 24 #include "base/metrics/histogram.h" |
| 25 #include "base/scoped_native_library.h" | 25 #include "base/scoped_native_library.h" |
| 26 #include "base/strings/string16.h" | 26 #include "base/strings/string16.h" |
| 27 #include "base/strings/string_number_conversions.h" | 27 #include "base/strings/string_number_conversions.h" |
| 28 #include "base/strings/string_util.h" | 28 #include "base/strings/string_util.h" |
| 29 #include "base/strings/stringprintf.h" | 29 #include "base/strings/stringprintf.h" |
| 30 #include "base/strings/utf_string_conversions.h" |
| 30 #include "base/threading/thread.h" | 31 #include "base/threading/thread.h" |
| 31 #include "base/threading/worker_pool.h" | 32 #include "base/threading/worker_pool.h" |
| 32 #include "base/win/registry.h" | 33 #include "base/win/registry.h" |
| 33 #include "base/win/scoped_com_initializer.h" | 34 #include "base/win/scoped_com_initializer.h" |
| 34 #include "base/win/scoped_comptr.h" | 35 #include "base/win/scoped_comptr.h" |
| 35 #include "base/win/windows_version.h" | 36 #include "base/win/windows_version.h" |
| 36 #include "third_party/libxml/chromium/libxml_utils.h" | 37 #include "third_party/libxml/chromium/libxml_utils.h" |
| 37 #include "ui/gl/gl_implementation.h" | 38 #include "ui/gl/gl_implementation.h" |
| 38 #include "ui/gl/gl_surface_egl.h" | 39 #include "ui/gl/gl_surface_egl.h" |
| 39 | 40 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 if (key.OpenKey(L"DisplayLink", KEY_READ | KEY_WOW64_64KEY)) | 180 if (key.OpenKey(L"DisplayLink", KEY_READ | KEY_WOW64_64KEY)) |
| 180 return Version(); | 181 return Version(); |
| 181 | 182 |
| 182 if (key.OpenKey(L"Core", KEY_READ | KEY_WOW64_64KEY)) | 183 if (key.OpenKey(L"Core", KEY_READ | KEY_WOW64_64KEY)) |
| 183 return Version(); | 184 return Version(); |
| 184 | 185 |
| 185 base::string16 version; | 186 base::string16 version; |
| 186 if (key.ReadValue(L"Version", &version)) | 187 if (key.ReadValue(L"Version", &version)) |
| 187 return Version(); | 188 return Version(); |
| 188 | 189 |
| 189 return Version(WideToASCII(version)); | 190 return Version(base::UTF16ToASCII(version)); |
| 190 } | 191 } |
| 191 | 192 |
| 192 // Returns whether Lenovo dCute is installed. | 193 // Returns whether Lenovo dCute is installed. |
| 193 bool IsLenovoDCuteInstalled() { | 194 bool IsLenovoDCuteInstalled() { |
| 194 base::win::RegKey key; | 195 base::win::RegKey key; |
| 195 | 196 |
| 196 if (key.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE", KEY_READ | KEY_WOW64_64KEY)) | 197 if (key.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE", KEY_READ | KEY_WOW64_64KEY)) |
| 197 return false; | 198 return false; |
| 198 | 199 |
| 199 if (key.OpenKey(L"Lenovo", KEY_READ | KEY_WOW64_64KEY)) | 200 if (key.OpenKey(L"Lenovo", KEY_READ | KEY_WOW64_64KEY)) |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 driver_key += value; | 401 driver_key += value; |
| 401 LONG result = RegOpenKeyExW( | 402 LONG result = RegOpenKeyExW( |
| 402 HKEY_LOCAL_MACHINE, driver_key.c_str(), 0, KEY_QUERY_VALUE, &key); | 403 HKEY_LOCAL_MACHINE, driver_key.c_str(), 0, KEY_QUERY_VALUE, &key); |
| 403 if (result == ERROR_SUCCESS) { | 404 if (result == ERROR_SUCCESS) { |
| 404 DWORD dwcb_data = sizeof(value); | 405 DWORD dwcb_data = sizeof(value); |
| 405 std::string driver_version; | 406 std::string driver_version; |
| 406 result = RegQueryValueExW( | 407 result = RegQueryValueExW( |
| 407 key, L"DriverVersion", NULL, NULL, | 408 key, L"DriverVersion", NULL, NULL, |
| 408 reinterpret_cast<LPBYTE>(value), &dwcb_data); | 409 reinterpret_cast<LPBYTE>(value), &dwcb_data); |
| 409 if (result == ERROR_SUCCESS) | 410 if (result == ERROR_SUCCESS) |
| 410 driver_version = WideToASCII(std::wstring(value)); | 411 driver_version = base::UTF16ToASCII(std::wstring(value)); |
| 411 | 412 |
| 412 std::string driver_date; | 413 std::string driver_date; |
| 413 dwcb_data = sizeof(value); | 414 dwcb_data = sizeof(value); |
| 414 result = RegQueryValueExW( | 415 result = RegQueryValueExW( |
| 415 key, L"DriverDate", NULL, NULL, | 416 key, L"DriverDate", NULL, NULL, |
| 416 reinterpret_cast<LPBYTE>(value), &dwcb_data); | 417 reinterpret_cast<LPBYTE>(value), &dwcb_data); |
| 417 if (result == ERROR_SUCCESS) | 418 if (result == ERROR_SUCCESS) |
| 418 driver_date = WideToASCII(std::wstring(value)); | 419 driver_date = base::UTF16ToASCII(std::wstring(value)); |
| 419 | 420 |
| 420 std::string driver_vendor; | 421 std::string driver_vendor; |
| 421 dwcb_data = sizeof(value); | 422 dwcb_data = sizeof(value); |
| 422 result = RegQueryValueExW( | 423 result = RegQueryValueExW( |
| 423 key, L"ProviderName", NULL, NULL, | 424 key, L"ProviderName", NULL, NULL, |
| 424 reinterpret_cast<LPBYTE>(value), &dwcb_data); | 425 reinterpret_cast<LPBYTE>(value), &dwcb_data); |
| 425 if (result == ERROR_SUCCESS) { | 426 if (result == ERROR_SUCCESS) { |
| 426 driver_vendor = WideToASCII(std::wstring(value)); | 427 driver_vendor = base::UTF16ToASCII(std::wstring(value)); |
| 427 if (driver_vendor == "Advanced Micro Devices, Inc." || | 428 if (driver_vendor == "Advanced Micro Devices, Inc." || |
| 428 driver_vendor == "ATI Technologies Inc.") { | 429 driver_vendor == "ATI Technologies Inc.") { |
| 429 // We are conservative and assume that in the absence of a clear | 430 // We are conservative and assume that in the absence of a clear |
| 430 // signal the videocard is assumed to be switchable. Additionally, | 431 // signal the videocard is assumed to be switchable. Additionally, |
| 431 // some switchable systems with Intel GPUs aren't correctly | 432 // some switchable systems with Intel GPUs aren't correctly |
| 432 // detected, so always count them. | 433 // detected, so always count them. |
| 433 AMDVideoCardType amd_card_type = GetAMDVideocardType(); | 434 AMDVideoCardType amd_card_type = GetAMDVideocardType(); |
| 434 gpu_info->amd_switchable = (gpu_info->gpu.vendor_id == 0x8086) || | 435 gpu_info->amd_switchable = (gpu_info->gpu.vendor_id == 0x8086) || |
| 435 (amd_card_type != STANDALONE); | 436 (amd_card_type != STANDALONE); |
| 436 } | 437 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { | 531 if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { |
| 531 id = dd.DeviceID; | 532 id = dd.DeviceID; |
| 532 break; | 533 break; |
| 533 } | 534 } |
| 534 } | 535 } |
| 535 | 536 |
| 536 if (id.length() > 20) { | 537 if (id.length() > 20) { |
| 537 int vendor = 0, device = 0; | 538 int vendor = 0, device = 0; |
| 538 std::wstring vendor_string = id.substr(8, 4); | 539 std::wstring vendor_string = id.substr(8, 4); |
| 539 std::wstring device_string = id.substr(17, 4); | 540 std::wstring device_string = id.substr(17, 4); |
| 540 base::HexStringToInt(WideToASCII(vendor_string), &vendor); | 541 base::HexStringToInt(base::UTF16ToASCII(vendor_string), &vendor); |
| 541 base::HexStringToInt(WideToASCII(device_string), &device); | 542 base::HexStringToInt(base::UTF16ToASCII(device_string), &device); |
| 542 *vendor_id = vendor; | 543 *vendor_id = vendor; |
| 543 *device_id = device; | 544 *device_id = device; |
| 544 return kGpuIDSuccess; | 545 return kGpuIDSuccess; |
| 545 } | 546 } |
| 546 return kGpuIDFailure; | 547 return kGpuIDFailure; |
| 547 } | 548 } |
| 548 | 549 |
| 549 bool CollectBasicGraphicsInfo(GPUInfo* gpu_info) { | 550 bool CollectBasicGraphicsInfo(GPUInfo* gpu_info) { |
| 550 TRACE_EVENT0("gpu", "CollectPreliminaryGraphicsInfo"); | 551 TRACE_EVENT0("gpu", "CollectPreliminaryGraphicsInfo"); |
| 551 | 552 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 break; | 586 break; |
| 586 } | 587 } |
| 587 } | 588 } |
| 588 | 589 |
| 589 if (id.length() <= 20) | 590 if (id.length() <= 20) |
| 590 return false; | 591 return false; |
| 591 | 592 |
| 592 int vendor_id = 0, device_id = 0; | 593 int vendor_id = 0, device_id = 0; |
| 593 base::string16 vendor_id_string = id.substr(8, 4); | 594 base::string16 vendor_id_string = id.substr(8, 4); |
| 594 base::string16 device_id_string = id.substr(17, 4); | 595 base::string16 device_id_string = id.substr(17, 4); |
| 595 base::HexStringToInt(WideToASCII(vendor_id_string), &vendor_id); | 596 base::HexStringToInt(base::UTF16ToASCII(vendor_id_string), &vendor_id); |
| 596 base::HexStringToInt(WideToASCII(device_id_string), &device_id); | 597 base::HexStringToInt(base::UTF16ToASCII(device_id_string), &device_id); |
| 597 gpu_info->gpu.vendor_id = vendor_id; | 598 gpu_info->gpu.vendor_id = vendor_id; |
| 598 gpu_info->gpu.device_id = device_id; | 599 gpu_info->gpu.device_id = device_id; |
| 599 // TODO(zmo): we only need to call CollectDriverInfoD3D() if we use ANGLE. | 600 // TODO(zmo): we only need to call CollectDriverInfoD3D() if we use ANGLE. |
| 600 if (!CollectDriverInfoD3D(id, gpu_info)) | 601 if (!CollectDriverInfoD3D(id, gpu_info)) |
| 601 return false; | 602 return false; |
| 602 | 603 |
| 603 // Collect basic information about supported D3D11 features. Delay for 45 | 604 // Collect basic information about supported D3D11 features. Delay for 45 |
| 604 // seconds so as not to regress performance tests. | 605 // seconds so as not to regress performance tests. |
| 605 if (D3D11ShouldWork(*gpu_info)) { | 606 if (D3D11ShouldWork(*gpu_info)) { |
| 606 // This is on a field trial so we can turn it off easily if it blows up | 607 // This is on a field trial so we can turn it off easily if it blows up |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 basic_gpu_info->software_rendering = true; | 645 basic_gpu_info->software_rendering = true; |
| 645 return; | 646 return; |
| 646 } | 647 } |
| 647 | 648 |
| 648 MergeGPUInfoGL(basic_gpu_info, context_gpu_info); | 649 MergeGPUInfoGL(basic_gpu_info, context_gpu_info); |
| 649 | 650 |
| 650 basic_gpu_info->dx_diagnostics = context_gpu_info.dx_diagnostics; | 651 basic_gpu_info->dx_diagnostics = context_gpu_info.dx_diagnostics; |
| 651 } | 652 } |
| 652 | 653 |
| 653 } // namespace gpu | 654 } // namespace gpu |
| OLD | NEW |