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)#include "gpu/config/gpu_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void EnumerateGPUDevice(gpu::GPUInfo::Enumerator* enumerator,
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const gpu::GPUInfo::GPUDevice& device) {
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->BeginGPUDevice();
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddInt("vendorId", device.vendor_id);
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddInt("deviceId", device.device_id);
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  enumerator->AddBool("active", device.active);
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("vendorString", device.vendor_string);
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("deviceString", device.device_string);
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->EndGPUDevice();
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUInfo::GPUDevice::GPUDevice()
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : vendor_id(0),
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device_id(0),
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      active(false) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUInfo::GPUDevice::~GPUDevice() { }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUInfo::GPUInfo()
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : finalized(false),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      optimus(false),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      amd_switchable(false),
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      lenovo_dcute(false),
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      adapter_luid(0),
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      gl_reset_notification_strategy(0),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_lose_context(false),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      software_rendering(false),
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      direct_rendering(true),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sandboxed(false) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUInfo::~GPUInfo() { }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  struct GPUInfoKnownFields {
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool finalized;
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::TimeDelta initialization_time;
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool optimus;
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool amd_switchable;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool lenovo_dcute;
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    Version display_link_version;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GPUDevice gpu;
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::vector<GPUDevice> secondary_gpus;
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    uint64 adapter_luid;
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string driver_vendor;
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string driver_version;
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string driver_date;
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string pixel_shader_version;
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string vertex_shader_version;
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::string machine_model_name;
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::string machine_model_version;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_version_string;
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_vendor;
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_renderer;
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_extensions;
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_ws_vendor;
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_ws_version;
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string gl_ws_extensions;
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    uint32 gl_reset_notification_strategy;
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool can_lose_context;
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GpuPerformanceStats performance_stats;
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool software_rendering;
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool direct_rendering;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool sandboxed;
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DxDiagNode dx_diagnostics;
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // If this assert fails then most likely something below needs to be updated.
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Note that this assert is only approximate. If a new field is added to
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // GPUInfo which fits within the current padding then it will not be caught.
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  COMPILE_ASSERT(
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      sizeof(GPUInfo) == sizeof(GPUInfoKnownFields),
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Fields_Have_Changed_In_GPUInfo_So_Update_Below);
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Required fields (according to DevTools protocol) first.
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  enumerator->AddString("machineModelName", machine_model_name);
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  enumerator->AddString("machineModelVersion", machine_model_version);
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EnumerateGPUDevice(enumerator, gpu);
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t ii = 0; ii < secondary_gpus.size(); ++ii) {
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EnumerateGPUDevice(enumerator, secondary_gpus[ii]);
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->BeginAuxAttributes();
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("finalized", finalized);
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddTimeDeltaInSecondsF("initializationTime",
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     initialization_time);
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("optimus", optimus);
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("amdSwitchable", amd_switchable);
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("lenovoDcute", lenovo_dcute);
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (display_link_version.IsValid()) {
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    enumerator->AddString("displayLinkVersion",
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          display_link_version.GetString());
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddInt64("adapterLuid", adapter_luid);
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("driverVendor", driver_vendor);
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("driverVersion", driver_version);
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("driverDate", driver_date);
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("pixelShaderVersion", pixel_shader_version);
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("vertexShaderVersion", vertex_shader_version);
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glVersion", gl_version);
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glVendor", gl_vendor);
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glRenderer", gl_renderer);
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glExtensions", gl_extensions);
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glWsVendor", gl_ws_vendor);
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glWsVersion", gl_ws_version);
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddString("glWsExtensions", gl_ws_extensions);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddInt(
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "glResetNotificationStrategy",
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      static_cast<int>(gl_reset_notification_strategy));
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("can_lose_context", can_lose_context);
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(kbr): add performance_stats.
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("softwareRendering", software_rendering);
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enumerator->AddBool("directRendering", direct_rendering);
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->AddBool("sandboxed", sandboxed);
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(kbr): add dx_diagnostics on Windows.
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enumerator->EndAuxAttributes();
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
135