Edit

kc3-lang/angle/src/gpu_info_util/SystemInfo_linux.cpp

Branch :

  • Show log

    Commit

  • Author : Daksh Idnani
    Date : 2019-08-22 21:12:08
    Hash : 5ec04880
    Message : Reland "Make Mac SystemInfo reflect the currently active GPU on dual GPU machines" This reverts commit 58940f67acd5b89f1c338b134a596864595fcdca. Reason for revert: pixel test failures have been triaged in Gold. Relanding. Original change's description: > Revert "Make Mac SystemInfo reflect the currently active GPU on dual GPU machines" > > This reverts commit 720a8bab0eca86e5b9b8c07c200a217fb2c65755. > > Reason for revert: pixel test failures per http://crbug.com/984780#c13 > > Original change's description: > > Make Mac SystemInfo reflect the currently active GPU on dual GPU machines > > > > Currently, the GetSystemInfo() function (in gpu_info_util/SystemInfo_mac.mm) > > on dual GPU Macs always updates the active GPU field of the SystemInfo > > instance to the first non-Intel GPU it finds. This change overrides the > > activeGPUIndex field of the SystemInfo instance to reflect the current GPU > > instead of the non-intel GPU. > > > > Bug: 985486, 984780, angleproject:3701 > > Change-Id: Ia93f38f4a2f7728c05e99c83a940722bd3808766 > > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1752334 > > Commit-Queue: Kenneth Russell <kbr@chromium.org> > > Reviewed-by: Zhenyao Mo <zmo@chromium.org> > > Reviewed-by: Kenneth Russell <kbr@chromium.org> > > TBR=zmo@chromium.org,geofflang@chromium.org,kbr@chromium.org,dakshidnani@google.com > > Change-Id: Iacf4b8433ac1aa4d30c51f08ddfc6489af440cc4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: 985486, 984780, angleproject:3701 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1757373 > Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> > Commit-Queue: Jonah Ryan-Davis <jonahr@google.com> Bug: 985486, 984780, angleproject:3701 Change-Id: I8f2f26f68329a2826a92742c46471b8c092b36ed Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1765963 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>

  • src/gpu_info_util/SystemInfo_linux.cpp
  • //
    // Copyright 2013 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // SystemInfo_linux.cpp: implementation of the Linux-specific parts of SystemInfo.h
    
    #include "gpu_info_util/SystemInfo_internal.h"
    
    #include <cstring>
    #include <fstream>
    
    #include "common/angleutils.h"
    #include "common/debug.h"
    
    namespace angle
    {
    
    namespace
    {
    
    bool ReadWholeFile(const char *filename, std::string *content)
    {
        std::ifstream file(filename);
    
        if (!file)
        {
            return false;
        }
    
        *content = std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
        return true;
    }
    
    // Scan /sys/module/amdgpu/version.
    bool GetAMDBrahmaDriverVersion(std::string *version)
    {
        *version = "";
        std::string content;
    
        return ReadWholeFile("/sys/module/amdgpu/version", &content) &&
               ParseAMDBrahmaDriverVersion(content, version);
    }
    
    // Scan /etc/ati/amdpcsdb.default for "ReleaseVersion".
    bool GetAMDCatalystDriverVersion(std::string *version)
    {
        *version = "";
        std::string content;
    
        return ReadWholeFile("/etc/ati/amdpcsdb.default", &content) &&
               ParseAMDCatalystDriverVersion(content, version);
    }
    
    }  // anonymous namespace
    
    #if !defined(GPU_INFO_USE_X11)
    bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version)
    {
        return false;
    }
    #endif
    
    #if !defined(GPU_INFO_USE_LIBPCI)
    bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices)
    {
        return false;
    }
    #endif
    
    bool GetSystemInfo(SystemInfo *info)
    {
        if (!GetPCIDevicesWithLibPCI(&(info->gpus)))
        {
            return false;
        }
    
        if (info->gpus.size() == 0)
        {
            return false;
        }
    
        GetDualGPUInfo(info);
    
        for (size_t i = 0; i < info->gpus.size(); ++i)
        {
            GPUDeviceInfo *gpu = &info->gpus[i];
    
            // New GPUs might be added inside this loop, don't query for their driver version again
            if (!gpu->driverVendor.empty())
            {
                continue;
            }
    
            if (IsAMD(gpu->vendorId))
            {
                std::string version;
                if (GetAMDBrahmaDriverVersion(&version))
                {
                    gpu->driverVendor  = "AMD (Brahma)";
                    gpu->driverVersion = std::move(version);
                }
                else if (GetAMDCatalystDriverVersion(&version))
                {
                    gpu->driverVendor  = "AMD (Catalyst)";
                    gpu->driverVersion = std::move(version);
                }
            }
    
            if (IsNVIDIA(gpu->vendorId))
            {
                std::string version;
                if (GetNvidiaDriverVersionWithXNVCtrl(&version))
                {
                    gpu->driverVendor  = "Nvidia";
                    gpu->driverVersion = std::move(version);
                }
            }
    
            // In dual-GPU cases the PCI scan sometimes only gives us the Intel GPU. If we are able to
            // query for the Nvidia driver version, it means there was hidden Nvidia GPU, so we add it
            // to the list.
            if (IsIntel(gpu->vendorId) && info->gpus.size() == 1)
            {
                std::string version;
                if (GetNvidiaDriverVersionWithXNVCtrl(&version))
                {
                    GPUDeviceInfo nvidiaInfo;
                    nvidiaInfo.vendorId = kVendorID_NVIDIA;
                    nvidiaInfo.deviceId = 0;
                    gpu->driverVendor   = "Nvidia";
                    gpu->driverVersion  = std::move(version);
    
                    info->gpus.emplace_back(std::move(nvidiaInfo));
                    info->isOptimus = true;
                }
            }
        }
    
        return true;
    }
    
    }  // namespace angle