1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "components/metrics/gpu/gpu_metrics_provider.h" 6 7 #include "components/metrics/proto/system_profile.pb.h" 8 #include "content/public/browser/gpu_data_manager.h" 9 #include "gpu/config/gpu_info.h" 10 #include "ui/gfx/screen.h" 11 12 namespace metrics { 13 14 #if defined(OS_WIN) 15 16 #include <windows.h> 17 18 namespace { 19 20 struct ScreenDPIInformation { 21 double max_dpi_x; 22 double max_dpi_y; 23 }; 24 25 // Called once for each connected monitor. 26 BOOL CALLBACK GetMonitorDPICallback(HMONITOR, HDC hdc, LPRECT, LPARAM dwData) { 27 const double kMillimetersPerInch = 25.4; 28 ScreenDPIInformation* screen_info = 29 reinterpret_cast<ScreenDPIInformation*>(dwData); 30 // Size of screen, in mm. 31 DWORD size_x = GetDeviceCaps(hdc, HORZSIZE); 32 DWORD size_y = GetDeviceCaps(hdc, VERTSIZE); 33 double dpi_x = (size_x > 0) ? 34 GetDeviceCaps(hdc, HORZRES) / (size_x / kMillimetersPerInch) : 0; 35 double dpi_y = (size_y > 0) ? 36 GetDeviceCaps(hdc, VERTRES) / (size_y / kMillimetersPerInch) : 0; 37 screen_info->max_dpi_x = std::max(dpi_x, screen_info->max_dpi_x); 38 screen_info->max_dpi_y = std::max(dpi_y, screen_info->max_dpi_y); 39 return TRUE; 40 } 41 42 void WriteScreenDPIInformationProto(SystemProfileProto::Hardware* hardware) { 43 HDC desktop_dc = GetDC(NULL); 44 if (desktop_dc) { 45 ScreenDPIInformation si = {0, 0}; 46 if (EnumDisplayMonitors(desktop_dc, NULL, GetMonitorDPICallback, 47 reinterpret_cast<LPARAM>(&si))) { 48 hardware->set_max_dpi_x(si.max_dpi_x); 49 hardware->set_max_dpi_y(si.max_dpi_y); 50 } 51 ReleaseDC(GetDesktopWindow(), desktop_dc); 52 } 53 } 54 55 } // namespace 56 57 #endif // defined(OS_WIN) 58 59 GPUMetricsProvider::GPUMetricsProvider() { 60 } 61 62 GPUMetricsProvider::~GPUMetricsProvider() { 63 } 64 65 void GPUMetricsProvider::ProvideSystemProfileMetrics( 66 SystemProfileProto* system_profile_proto) { 67 SystemProfileProto::Hardware* hardware = 68 system_profile_proto->mutable_hardware(); 69 70 const gpu::GPUInfo& gpu_info = 71 content::GpuDataManager::GetInstance()->GetGPUInfo(); 72 SystemProfileProto::Hardware::Graphics* gpu = 73 hardware->mutable_gpu(); 74 gpu->set_vendor_id(gpu_info.gpu.vendor_id); 75 gpu->set_device_id(gpu_info.gpu.device_id); 76 gpu->set_driver_version(gpu_info.driver_version); 77 gpu->set_driver_date(gpu_info.driver_date); 78 SystemProfileProto::Hardware::Graphics::PerformanceStatistics* 79 gpu_performance = gpu->mutable_performance_statistics(); 80 gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); 81 gpu_performance->set_gaming_score(gpu_info.performance_stats.gaming); 82 gpu_performance->set_overall_score(gpu_info.performance_stats.overall); 83 gpu->set_gl_vendor(gpu_info.gl_vendor); 84 gpu->set_gl_renderer(gpu_info.gl_renderer); 85 86 const gfx::Size display_size = GetScreenSize(); 87 hardware->set_primary_screen_width(display_size.width()); 88 hardware->set_primary_screen_height(display_size.height()); 89 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); 90 hardware->set_screen_count(GetScreenCount()); 91 92 #if defined(OS_WIN) 93 WriteScreenDPIInformationProto(hardware); 94 #endif 95 } 96 97 gfx::Size GPUMetricsProvider::GetScreenSize() const { 98 return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().GetSizeInPixel(); 99 } 100 101 float GPUMetricsProvider::GetScreenDeviceScaleFactor() const { 102 return gfx::Screen::GetNativeScreen()-> 103 GetPrimaryDisplay().device_scale_factor(); 104 } 105 106 int GPUMetricsProvider::GetScreenCount() const { 107 // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 108 return gfx::Screen::GetNativeScreen()->GetNumDisplays(); 109 } 110 111 } // namespace metrics 112