Home | History | Annotate | Download | only in gpu
      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