OLD | NEW |
---|---|
(Empty) | |
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 "chrome/browser/metrics/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 #if defined(OS_WIN) | |
13 | |
14 #include <windows.h> | |
15 | |
16 struct ScreenDPIInformation { | |
17 double max_dpi_x; | |
18 double max_dpi_y; | |
19 }; | |
20 | |
21 // Called once for each connected monitor. | |
22 BOOL CALLBACK GetMonitorDPICallback(HMONITOR, HDC hdc, LPRECT, LPARAM dwData) { | |
23 const double kMillimetersPerInch = 25.4; | |
24 ScreenDPIInformation* screen_info = | |
25 reinterpret_cast<ScreenDPIInformation*>(dwData); | |
26 // Size of screen, in mm. | |
27 DWORD size_x = GetDeviceCaps(hdc, HORZSIZE); | |
28 DWORD size_y = GetDeviceCaps(hdc, VERTSIZE); | |
29 double dpi_x = (size_x > 0) ? | |
30 GetDeviceCaps(hdc, HORZRES) / (size_x / kMillimetersPerInch) : 0; | |
31 double dpi_y = (size_y > 0) ? | |
32 GetDeviceCaps(hdc, VERTRES) / (size_y / kMillimetersPerInch) : 0; | |
33 screen_info->max_dpi_x = std::max(dpi_x, screen_info->max_dpi_x); | |
34 screen_info->max_dpi_y = std::max(dpi_y, screen_info->max_dpi_y); | |
35 return TRUE; | |
36 } | |
37 | |
38 void WriteScreenDPIInformationProto(SystemProfileProto::Hardware* hardware) { | |
39 HDC desktop_dc = GetDC(NULL); | |
40 if (desktop_dc) { | |
41 ScreenDPIInformation si = {0, 0}; | |
42 if (EnumDisplayMonitors(desktop_dc, NULL, GetMonitorDPICallback, | |
43 reinterpret_cast<LPARAM>(&si))) { | |
44 hardware->set_max_dpi_x(si.max_dpi_x); | |
45 hardware->set_max_dpi_y(si.max_dpi_y); | |
46 } | |
47 ReleaseDC(GetDesktopWindow(), desktop_dc); | |
48 } | |
49 } | |
Ilya Sherman
2014/05/20 14:40:27
nit: Should this all be in an anonymous namespace?
blundell
2014/05/20 14:59:11
Done.
| |
50 | |
51 #endif // defined(OS_WIN) | |
52 | |
53 GPUMetricsProvider::GPUMetricsProvider() { | |
54 } | |
55 | |
56 GPUMetricsProvider::~GPUMetricsProvider() { | |
57 } | |
58 | |
59 void GPUMetricsProvider::ProvideSystemProfileMetrics( | |
60 metrics::SystemProfileProto* system_profile_proto) { | |
61 metrics::SystemProfileProto::Hardware* hardware = | |
62 system_profile_proto->mutable_hardware(); | |
63 | |
64 const gpu::GPUInfo& gpu_info = | |
65 content::GpuDataManager::GetInstance()->GetGPUInfo(); | |
66 metrics::SystemProfileProto::Hardware::Graphics* gpu = | |
67 hardware->mutable_gpu(); | |
68 gpu->set_vendor_id(gpu_info.gpu.vendor_id); | |
69 gpu->set_device_id(gpu_info.gpu.device_id); | |
70 gpu->set_driver_version(gpu_info.driver_version); | |
71 gpu->set_driver_date(gpu_info.driver_date); | |
72 metrics::SystemProfileProto::Hardware::Graphics::PerformanceStatistics* | |
73 gpu_performance = gpu->mutable_performance_statistics(); | |
74 gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); | |
75 gpu_performance->set_gaming_score(gpu_info.performance_stats.gaming); | |
76 gpu_performance->set_overall_score(gpu_info.performance_stats.overall); | |
77 gpu->set_gl_vendor(gpu_info.gl_vendor); | |
78 gpu->set_gl_renderer(gpu_info.gl_renderer); | |
79 | |
80 const gfx::Size display_size = GetScreenSize(); | |
81 hardware->set_primary_screen_width(display_size.width()); | |
82 hardware->set_primary_screen_height(display_size.height()); | |
83 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); | |
84 hardware->set_screen_count(GetScreenCount()); | |
85 | |
86 #if defined(OS_WIN) | |
87 WriteScreenDPIInformationProto(hardware); | |
88 #endif | |
89 } | |
90 | |
91 gfx::Size GPUMetricsProvider::GetScreenSize() const { | |
92 return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().GetSizeInPixel(); | |
93 } | |
94 | |
95 float GPUMetricsProvider::GetScreenDeviceScaleFactor() const { | |
96 return gfx::Screen::GetNativeScreen()-> | |
97 GetPrimaryDisplay().device_scale_factor(); | |
98 } | |
99 | |
100 int GPUMetricsProvider::GetScreenCount() const { | |
101 // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 | |
102 return gfx::Screen::GetNativeScreen()->GetNumDisplays(); | |
103 } | |
OLD | NEW |