Chromium Code Reviews| Index: chrome/browser/metrics/gpu_metrics_provider.cc |
| diff --git a/chrome/browser/metrics/gpu_metrics_provider.cc b/chrome/browser/metrics/gpu_metrics_provider.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f9c4251ade0c680b252bb486910ab30e0e0d7ed4 |
| --- /dev/null |
| +++ b/chrome/browser/metrics/gpu_metrics_provider.cc |
| @@ -0,0 +1,104 @@ |
| +// Copyright 2014 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/browser/metrics/gpu_metrics_provider.h" |
| + |
| +#include "components/metrics/proto/system_profile.pb.h" |
| +#include "content/public/browser/gpu_data_manager.h" |
| +#include "gpu/config/gpu_info.h" |
| +#include "ui/gfx/screen.h" |
| + |
| +#if defined(OS_WIN) |
| + |
| +#include <windows.h> |
| + |
| +struct ScreenDPIInformation { |
| + double max_dpi_x; |
| + double max_dpi_y; |
| +}; |
| + |
| +// Called once for each connected monitor. |
| +BOOL CALLBACK GetMonitorDPICallback(HMONITOR, HDC hdc, LPRECT, LPARAM dwData) { |
| + const double kMillimetersPerInch = 25.4; |
| + ScreenDPIInformation* screen_info = |
| + reinterpret_cast<ScreenDPIInformation*>(dwData); |
| + // Size of screen, in mm. |
| + DWORD size_x = GetDeviceCaps(hdc, HORZSIZE); |
| + DWORD size_y = GetDeviceCaps(hdc, VERTSIZE); |
| + double dpi_x = (size_x > 0) ? |
| + GetDeviceCaps(hdc, HORZRES) / (size_x / kMillimetersPerInch) : 0; |
| + double dpi_y = (size_y > 0) ? |
| + GetDeviceCaps(hdc, VERTRES) / (size_y / kMillimetersPerInch) : 0; |
| + screen_info->max_dpi_x = std::max(dpi_x, screen_info->max_dpi_x); |
| + screen_info->max_dpi_y = std::max(dpi_y, screen_info->max_dpi_y); |
| + return TRUE; |
| +} |
| + |
| +void WriteScreenDPIInformationProto(SystemProfileProto::Hardware* hardware) { |
| + HDC desktop_dc = GetDC(NULL); |
| + if (desktop_dc) { |
| + ScreenDPIInformation si = {0, 0}; |
| + if (EnumDisplayMonitors(desktop_dc, NULL, GetMonitorDPICallback, |
| + reinterpret_cast<LPARAM>(&si))) { |
| + hardware->set_max_dpi_x(si.max_dpi_x); |
| + hardware->set_max_dpi_y(si.max_dpi_y); |
| + } |
| + ReleaseDC(GetDesktopWindow(), desktop_dc); |
| + } |
| +} |
| + |
| +#endif // defined(OS_WIN) |
| + |
| +GPUMetricsProvider::GPUMetricsProvider() { |
| +} |
| + |
| +GPUMetricsProvider::~GPUMetricsProvider() { |
| +} |
| + |
| +void GPUMetricsProvider::ProvideSystemProfileMetrics( |
| + metrics::SystemProfileProto* system_profile_proto) { |
| + metrics::SystemProfileProto::Hardware* hardware = |
| + system_profile_proto->mutable_hardware(); |
| + |
| + const gpu::GPUInfo& gpu_info = |
| + content::GpuDataManager::GetInstance()->GetGPUInfo(); |
| + metrics::SystemProfileProto::Hardware::Graphics* gpu = |
| + hardware->mutable_gpu(); |
| + gpu->set_vendor_id(gpu_info.gpu.vendor_id); |
| + gpu->set_device_id(gpu_info.gpu.device_id); |
| + gpu->set_driver_version(gpu_info.driver_version); |
| + gpu->set_driver_date(gpu_info.driver_date); |
| + metrics::SystemProfileProto::Hardware::Graphics::PerformanceStatistics* |
| + gpu_performance = gpu->mutable_performance_statistics(); |
| + gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); |
| + gpu_performance->set_gaming_score(gpu_info.performance_stats.gaming); |
| + gpu_performance->set_overall_score(gpu_info.performance_stats.overall); |
| + gpu->set_gl_vendor(gpu_info.gl_vendor); |
| + gpu->set_gl_renderer(gpu_info.gl_renderer); |
| + |
| + const gfx::Size display_size = GetScreenSize(); |
| + hardware->set_primary_screen_width(display_size.width()); |
| + hardware->set_primary_screen_height(display_size.height()); |
| + hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); |
| + hardware->set_screen_count(GetScreenCount()); |
| + |
| +#if defined(OS_WIN) |
| + WriteScreenDPIInformationProto(hardware); |
| +#endif |
| +} |
| + |
| +gfx::Size GPUMetricsProvider::GetScreenSize() const { |
| + return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().GetSizeInPixel(); |
| +} |
| + |
| +float GPUMetricsProvider::GetScreenDeviceScaleFactor() const { |
| + return gfx::Screen::GetNativeScreen() |
| + ->GetPrimaryDisplay() |
| + .device_scale_factor(); |
|
Alexei Svitkine (slow)
2014/05/20 14:23:30
FWIW, I like the previous wrapping better. But if
blundell
2014/05/20 14:32:53
Agreed. Changed.
On 2014/05/20 14:23:30, Alexei S
|
| +} |
| + |
| +int GPUMetricsProvider::GetScreenCount() const { |
| + // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 |
| + return gfx::Screen::GetNativeScreen()->GetNumDisplays(); |
| +} |