From 94b41b93d96c4634e82882ea94efe0082567bc76 Mon Sep 17 00:00:00 2001 From: gongheng Date: Tue, 7 Oct 2025 13:08:27 +0800 Subject: [PATCH] Fix: [gpu-info] The gpu info not show in special platform. -- adjust the code logic to get gpu info. Log: fix issue Bug: https://pms.uniontech.com/bug-view-333969.html --- .../customgpuinfo/main.cpp | 3 +- .../src/loadinfo/deviceinterface.cpp | 35 ++++---- .../src/GenerateDevice/CustomGenerator.cpp | 13 +-- deepin-devicemanager/src/Tool/commontools.cpp | 79 +++++++++++++++++++ deepin-devicemanager/src/Tool/commontools.h | 4 + deepin-devicemanager/src/main.cpp | 8 ++ 6 files changed, 108 insertions(+), 34 deletions(-) diff --git a/deepin-devicemanager-server/customgpuinfo/main.cpp b/deepin-devicemanager-server/customgpuinfo/main.cpp index 72502513..b20d40d5 100644 --- a/deepin-devicemanager-server/customgpuinfo/main.cpp +++ b/deepin-devicemanager-server/customgpuinfo/main.cpp @@ -98,8 +98,7 @@ bool getGpuMemInfoForFTDTM(QMap &mapInfo) int main(int argc, char *argv[]) { QMap mapInfo; - if (getGpuBaseInfo(mapInfo)) { - getGpuMemInfoForFTDTM(mapInfo); + if (getGpuMemInfoForFTDTM(mapInfo)) { for (auto it = mapInfo.begin(); it != mapInfo.end(); ++it) std::cout << it.key().toStdString() << ": " << it.value().toStdString() << std::endl; return 0; diff --git a/deepin-devicemanager-server/deepin-deviceinfo/src/loadinfo/deviceinterface.cpp b/deepin-devicemanager-server/deepin-deviceinfo/src/loadinfo/deviceinterface.cpp index 89d975ec..67708560 100644 --- a/deepin-devicemanager-server/deepin-deviceinfo/src/loadinfo/deviceinterface.cpp +++ b/deepin-devicemanager-server/deepin-deviceinfo/src/loadinfo/deviceinterface.cpp @@ -61,27 +61,22 @@ void DeviceInterface::setMonitorDeviceFlag(bool flag) QString DeviceInterface::getGpuInfoByCustom(const QString &cmd, const QStringList &arguments) { - static bool firstFlag = true; - static QString gpuinfo; - if (firstFlag) { - firstFlag = false; - - QProcess process; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - if (arguments.size() > 1) { - env.insert("DISPLAY", arguments[0]); - env.insert("XAUTHORITY", arguments[1]); - } - process.setProcessEnvironment(env); - process.start(cmd, arguments); - if (!process.waitForFinished(4000)) { - qCritical() << QString("Error executing %1 :").arg(cmd) << process.errorString(); - return gpuinfo; - } - - if (process.exitCode() == 0) - gpuinfo = QString::fromLocal8Bit(process.readAllStandardOutput()); + QString gpuinfo; + QProcess process; + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + if (arguments.size() > 1) { + env.insert("DISPLAY", arguments[0]); + env.insert("XAUTHORITY", arguments[1]); } + process.setProcessEnvironment(env); + process.start(cmd, arguments); + if (!process.waitForFinished()) { + qCritical() << QString("Error executing %1 :").arg(cmd) << process.errorString(); + return gpuinfo; + } + + if (process.exitCode() == 0) + gpuinfo = QString::fromLocal8Bit(process.readAllStandardOutput()); return gpuinfo; } diff --git a/deepin-devicemanager/src/GenerateDevice/CustomGenerator.cpp b/deepin-devicemanager/src/GenerateDevice/CustomGenerator.cpp index f7f661ce..d3ab7ade 100644 --- a/deepin-devicemanager/src/GenerateDevice/CustomGenerator.cpp +++ b/deepin-devicemanager/src/GenerateDevice/CustomGenerator.cpp @@ -26,18 +26,7 @@ void CustomGenerator::generatorGpuDevice() return; } - QStringList arguments; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - QString display = env.value("DISPLAY"); - QString xauthority = env.value("XAUTHORITY"); - if (display.isEmpty() || xauthority.isEmpty()) { - qWarning() << "DISPLAY or XAUTHORITY is not set!"; - } else { - arguments << display << xauthority; - } - - QString tmpGpuInfo; - DBusInterface::getInstance()->getGpuInfoByCustom(cmd, arguments, tmpGpuInfo); + QString tmpGpuInfo = CommonTools::preGenerateGpuInfo(); if (tmpGpuInfo.isEmpty()) { qCritical() << "Failed to get gpu info by commad " << cmd; return; diff --git a/deepin-devicemanager/src/Tool/commontools.cpp b/deepin-devicemanager/src/Tool/commontools.cpp index dcebeec7..a8046d54 100644 --- a/deepin-devicemanager/src/Tool/commontools.cpp +++ b/deepin-devicemanager/src/Tool/commontools.cpp @@ -21,6 +21,14 @@ using namespace DDLog; #define ICON_SIZE_WIDTH 36 #define ICON_SIZE_HEIGHT 36 +// 名称("Name") 厂商("Vendor") 型号("Model") 版本(Version) 显存("Graphics Memory") + +constexpr char kName[] { "Name" }; +constexpr char kVendor[] { "Vendor" }; +constexpr char kModel[] { "Model" }; +constexpr char kVersion[] { "Version" }; +constexpr char kGraphicsMemory[] { "Graphics Memory" }; + QMap CommonTools::m_MapDriverIcon = { {DR_Bluetooth, QString(":/icons/deepin/builtin/icons/bluetooth.svg")} , {DR_Camera, QString(":/icons/deepin/builtin/icons/image.svg")} @@ -257,3 +265,74 @@ QString CommonTools::getGpuInfoCommandFromDConfig() cmd = dconfig->value("CommandToGetGPUInfo").toString(); return cmd; } + +QString CommonTools::preGenerateGpuInfo() +{ + static QString gpuInfo { "" }; + + if (gpuInfo.isEmpty()) { + QStringList arguments; + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + QString display = env.value("DISPLAY"); + QString xauthority = env.value("XAUTHORITY"); + if (display.isEmpty() || xauthority.isEmpty()) { + qCritical() << "DISPLAY or XAUTHORITY is not set!"; + } else { + arguments << display << xauthority; + } + + QDBusInterface iface("org.deepin.DeviceInfo", + "/org/deepin/DeviceInfo", + "org.deepin.DeviceInfo", + QDBusConnection::systemBus()); + if (iface.isValid()) { + QDBusReply replyList = iface.call("getGpuInfoByCustom", arguments, gpuInfo); + if (replyList.isValid()) { + gpuInfo = replyList.value(); + } else { + qCritical() << "Error: failed to call dbus to get gpu memery info! "; + } + } + + QMap mapInfo; + if (getGpuBaseInfo(mapInfo)) { + for (auto it = mapInfo.begin(); it != mapInfo.end(); ++it) { + QString tmpInfo = it.key() + ": " + it.value() + "\n"; + gpuInfo.append(tmpInfo); + } + } + } + + return gpuInfo; +} + +bool CommonTools::getGpuBaseInfo(QMap &mapInfo) +{ + QProcess process; + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + process.setProcessEnvironment(env); + process.start("/usr/bin/glxinfo", QStringList() << "-B"); + if (!process.waitForFinished()) { + qCritical() << "Error executing glxinfo:" << process.errorString(); + return false; + } + + QString output = QString::fromLocal8Bit(process.readAllStandardOutput()); + QStringList lines = output.split('\n'); + QRegularExpression regex("^([^:]+):\\s*(.+)$"); + for (const QString &line : lines) { + QRegularExpressionMatch match = regex.match(line); + if (match.hasMatch()) { + QString key = match.captured(1).trimmed(); + QString value = match.captured(2).trimmed(); + if (key == "OpenGL renderer string") { + mapInfo.insert(kName, value); + mapInfo.insert(kModel, value); + } else if (key == "OpenGL vendor string") { + mapInfo.insert(kVendor, value); + } + } + } + + return true; +} diff --git a/deepin-devicemanager/src/Tool/commontools.h b/deepin-devicemanager/src/Tool/commontools.h index c92a905d..915d5f99 100644 --- a/deepin-devicemanager/src/Tool/commontools.h +++ b/deepin-devicemanager/src/Tool/commontools.h @@ -80,6 +80,10 @@ class CommonTools : public QObject static void parseEDID(const QStringList &allEDIDS, const QString &input, bool isHW = true); static QString getGpuInfoCommandFromDConfig(); + static QString preGenerateGpuInfo(); + +private: + static bool getGpuBaseInfo(QMap &mapInfo); signals: diff --git a/deepin-devicemanager/src/main.cpp b/deepin-devicemanager/src/main.cpp index 95cda6b8..62f41ab4 100644 --- a/deepin-devicemanager/src/main.cpp +++ b/deepin-devicemanager/src/main.cpp @@ -10,6 +10,8 @@ #include "DebugTimeManager.h" #include "SingleDeviceManager.h" #include "DDLog.h" +#include "commontools.h" + #include #include #include @@ -110,6 +112,12 @@ int main(int argc, char *argv[]) if (dbus.registerService("com.deepin.DeviceManagerNotify")) { dbus.registerObject("/com/deepin/DeviceManagerNotify", &app, QDBusConnection::ExportScriptableSlots); app.parseCmdLine(); + + QString cmd = CommonTools::getGpuInfoCommandFromDConfig(); + if (!cmd.isEmpty()) { + CommonTools::preGenerateGpuInfo(); + } + app.activateWindow(); return app.exec(); } else {