15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef GPU_CONFIG_GPU_INFO_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define GPU_CONFIG_GPU_INFO_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides access to the GPU information for the system
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on which chrome is currently running.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/version.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/dx_diag_node.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_performance_stats.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/gpu_export.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct GPU_EXPORT GPUInfo {
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct GPU_EXPORT GPUDevice {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GPUDevice();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~GPUDevice();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The DWORD (uint32) representing the graphics card vendor id.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 vendor_id;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The DWORD (uint32) representing the graphics card device id.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Device ids are unique to vendor, not to one another.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 device_id;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The strings that describe the GPU.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In Linux these strings are obtained through libpci.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In Win/MacOSX, these two strings are not filled at the moment.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string vendor_string;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string device_string;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUInfo();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GPUInfo();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether more GPUInfo fields might be collected in the future.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finalized;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The amount of time taken to get from the process starting to the message
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop being pumped.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta initialization_time;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computer has NVIDIA Optimus
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool optimus;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computer has AMD Dynamic Switchable Graphics
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool amd_switchable;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lenovo dCute is installed. http://crbug.com/181665.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool lenovo_dcute;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version of DisplayLink driver installed. Zero if not installed.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // http://crbug.com/177611.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Version display_link_version;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Primary GPU, for exmaple, the discrete GPU in a dual GPU machine.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUDevice gpu;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Secondary GPUs, for example, the integrated GPU in a dual GPU machine.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GPUDevice> secondary_gpus;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // On Windows, the unique identifier of the adapter the GPU process uses.
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The default is zero, which makes the browser process create its D3D device
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // on the primary adapter. Note that the primary adapter can change at any
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // time so it is better to specify a particular LUID. Note that valid LUIDs
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // are always non-zero.
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  uint64 adapter_luid;
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The vendor of the graphics driver currently installed.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string driver_vendor;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The version of the graphics driver currently installed.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string driver_version;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The date of the graphics driver currently installed.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string driver_date;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The version of the pixel/fragment shader used by the gpu.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pixel_shader_version;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The version of the vertex shader used by the gpu.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string vertex_shader_version;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The machine model identifier with format "name major.minor".
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Name should not contain any whitespaces.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string machine_model;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The version of OpenGL we are using.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(zmo): should be able to tell if it's GL or GLES.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gl_version;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GL_VERSION string.  "" if we are not using OpenGL.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gl_version_string;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GL_VENDOR string.  "" if we are not using OpenGL.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gl_vendor;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GL_RENDERER string.  "" if we are not using OpenGL.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gl_renderer;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GL_EXTENSIONS string.  "" if we are not using OpenGL.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string gl_extensions;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // GL window system binding vendor.  "" if not available.
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string gl_ws_vendor;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // GL window system binding version.  "" if not available.
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string gl_ws_version;
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // GL window system binding extensions.  "" if not available.
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string gl_ws_extensions;
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // GL reset notification strategy as defined by GL_ARB_robustness. 0 if GPU
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // reset detection or notification not available.
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint32 gl_reset_notification_strategy;
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The device semantics, i.e. whether the Vista and Windows 7 specific
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // semantics are available.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_lose_context;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // By default all values are 0.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuPerformanceStats performance_stats;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool software_rendering;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the gpu process is running in a sandbox.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sandboxed;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The information returned by the DirectX Diagnostics Tool.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DxDiagNode dx_diagnostics;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // GPU_CONFIG_GPU_INFO_H_
148