Edit

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

Branch :

  • Show log

    Commit

  • Author : Xiaoxuan Liu
    Date : 2021-03-03 17:56:07
    Hash : ed4f7cb6
    Message : Reland "Reland "Add support for Linux GPU info with Vulkan backend"" This is a reland of 9a8397327f9aac278f4bd1f5ab9094eec7e7798b Chrome Linux crash issue could be fixed in 0615bbde39ca42e27eb764b2b4986b21ab602ce9, let's reland this now. Original change's description: > Reland "Add support for Linux GPU info with Vulkan backend" > > This is a reland of 5c09c1f882f15e1a77577f1a62d861355aac90a4 > > Extra change: Add new ANGLE_HAS_VULKAN_SYSTEM_INFO compile > variable for GetSystemInfoVulkan() in linux platform. > > Original change's description: > > Add support for Linux GPU info with Vulkan backend > > > > 1. Add support for Linux GPU info with vulkan backend: for > > dev board without PCI support, try vulkan backend to get > > GPU info. > > 2. Fix getVulkanInstance() issue when loading non-exist lib: > > return NULL instance if open lib failed. > > > > Bug: angleproject:5717 > > Change-Id: I03c11da25a8787496d098f6c9d6b4c53701383e4 > > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2734375 > > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > > Reviewed-by: Jamie Madill <jmadill@chromium.org> > > Commit-Queue: Jamie Madill <jmadill@chromium.org> > > Bug: angleproject:5717 > Change-Id: Iaaab8f512b6ec1d524d7ebb3b4252fec3cfe7dc3 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2739097 > Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> Bug: angleproject:5717 Change-Id: Iad6736f9137b7e9640c97fa2b9eded3fd37ac88f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2821410 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@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)))
        {
    #if defined(ANGLE_HAS_VULKAN_SYSTEM_INFO)
            // Try vulkan backend to get GPU info
            return GetSystemInfoVulkan(info);
    #else
            return false;
    #endif  // defined(ANGLE_HAS_VULKAN_SYSTEM_INFO)
        }
    
        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