15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gpu/config/gpu_info_collector_linux.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libXNVCtrl/NVCtrl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libXNVCtrl/NVCtrlLib.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/x/x11_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu {
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use NVCtrl extention to query NV driver version.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return empty string on failing.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CollectDriverVersionNVidia() {
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Display* display = gfx::GetXDisplay();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!display) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "XOpenDisplay failed.";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int event_base = 0, error_base = 0;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!XNVCTRLQueryExtension(display, &event_base, &error_base)) {
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(1) << "NVCtrl extension does not exist.";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int screen_count = ScreenCount(display);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int screen = 0; screen < screen_count; ++screen) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* buffer = NULL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (XNVCTRLIsNvScreen(display, screen) &&
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        XNVCTRLQueryStringAttribute(display, screen, 0,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NV_CTRL_STRING_NVIDIA_DRIVER_VERSION,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &buffer)) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string driver_version(buffer);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      XFree(buffer);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return driver_version;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
44