generic: query DRI information via libdrm

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2021-02-15 18:44:40 +02:00
parent 742ab11442
commit 56c95fe457
5 changed files with 61 additions and 84 deletions

View file

@ -47,6 +47,14 @@ set_package_properties(OpenGLES PROPERTIES
PURPOSE "OpenGL ES info module" PURPOSE "OpenGL ES info module"
) )
macro_optional_find_package(LibDRM)
set_package_properties(LibDRM PROPERTIES
DESCRIPTION "Userspace interface to kernel DRM services"
URL "https://dri.freedesktop.org/wiki/"
TYPE OPTIONAL
PURPOSE "OpenGL info module"
)
macro_optional_find_package(UDev) macro_optional_find_package(UDev)
set_package_properties(UDev PROPERTIES set_package_properties(UDev PROPERTIES
DESCRIPTION "The UDev Libraries" DESCRIPTION "The UDev Libraries"

View file

@ -9,6 +9,7 @@ add_subdirectory( nics )
add_feature_info("OpenGL support" OPENGL_FOUND "View OpenGL details in kinfocenter." ) add_feature_info("OpenGL support" OPENGL_FOUND "View OpenGL details in kinfocenter." )
add_feature_info("OpenGL/ES support" OPENGLES_FOUND "View OpenGL ES2.0 details in kinfocenter." ) add_feature_info("OpenGL/ES support" OPENGLES_FOUND "View OpenGL ES2.0 details in kinfocenter." )
add_feature_info("DRM support" LIBDRM_FOUND "View 3D acceleration details in kinfocenter." )
if((OPENGL_FOUND AND OPENGL_GLU_FOUND) OR OPENGLES_FOUND) if((OPENGL_FOUND AND OPENGL_GLU_FOUND) OR OPENGLES_FOUND)
add_subdirectory( opengl ) add_subdirectory( opengl )

View file

@ -1,10 +1,15 @@
if(OPENGL_FOUND AND OPENGL_GLU_FOUND) if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
include_directories( ${OPENGL_INCLUDE_DIR} ${OPENGL_GLU_INCLUDE_DIR} ) include_directories(${OPENGL_INCLUDE_DIR} ${OPENGL_GLU_INCLUDE_DIR})
endif()
if(LIBDRM_FOUND)
set(KCM_ENABLE_DRM TRUE)
include_directories(${LIBDRM_INCLUDE_DIR})
endif() endif()
if(OPENGLES_FOUND) if(OPENGLES_FOUND)
set(KCM_ENABLE_OPENGLES TRUE) set(KCM_ENABLE_OPENGLES TRUE)
include_directories( ${OPENGLES_INCLUDE_DIR} ) include_directories(${OPENGLES_INCLUDE_DIR})
endif() endif()
########### next target ############### ########### next target ###############
@ -22,11 +27,15 @@ if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
target_link_libraries(kcm_opengl ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) target_link_libraries(kcm_opengl ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})
endif() endif()
if(LIBDRM_FOUND)
target_link_libraries(kcm_opengl ${LIBDRM_LIBRARIES})
endif()
if(OPENGLES_FOUND) if(OPENGLES_FOUND)
target_link_libraries(kcm_opengl ${OPENGLES_LIBRARIES}) target_link_libraries(kcm_opengl ${OPENGLES_LIBRARIES})
endif() endif()
configure_file(openglconfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/openglconfig.h ) configure_file(openglconfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/openglconfig.h)
install(TARGETS kcm_opengl DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) install(TARGETS kcm_opengl DESTINATION ${KDE4_PLUGIN_INSTALL_DIR})

View file

@ -23,10 +23,6 @@
#include "opengl.h" #include "opengl.h"
#include <QRegExp>
#include <QFile>
#include <QTextStream>
#include <KPluginFactory> #include <KPluginFactory>
#include <KPluginLoader> #include <KPluginLoader>
@ -35,6 +31,7 @@
#include <klocale.h> #include <klocale.h>
#include <kmessagebox.h> #include <kmessagebox.h>
#include <kdebug.h> #include <kdebug.h>
#include <qplatformdefs.h>
// X11 includes // X11 includes
#include <X11/Xlib.h> #include <X11/Xlib.h>
@ -42,6 +39,10 @@
#include <openglconfig.h> #include <openglconfig.h>
#ifdef KCM_ENABLE_DRM
#include <xf86drm.h>
#endif
#ifdef KCM_ENABLE_OPENGLES #ifdef KCM_ENABLE_OPENGLES
#include <EGL/egl.h> #include <EGL/egl.h>
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
@ -146,94 +147,52 @@ static struct glinfo {
static struct { static struct {
QString module, QString module,
pci,
vendor, vendor,
device, device,
subvendor,
rev; rev;
} dri_info; } dri_info;
static int ReadPipe(QString FileName, QStringList &list) #if defined(KCM_ENABLE_DRM)
{
FILE *pipe;
if ((pipe = popen(FileName.toAscii().data(), "r")) == NULL) {
return 0;
}
QTextStream t(pipe, QIODevice::ReadOnly);
while (!t.atEnd()) list.append(t.readLine());
if (pclose(pipe) != 0) {
list.clear();
return 0;
}
return list.count();
}
#if defined(Q_OS_LINUX)
#define INFO_DRI "/proc/dri/0/name"
static bool get_dri_device() static bool get_dri_device()
{ {
QFile file; const int driAvail = drmAvailable();
file.setFileName(INFO_DRI); // qDebug() << "driAvail" << driAvail;
if (!file.exists() || !file.open(QIODevice::ReadOnly)) if (!driAvail) {
return false; return false;
QTextStream stream(&file);
QString line = stream.readLine();
if (!line.isEmpty()) {
dri_info.module = line.mid(0, line.indexOf(0x20));
// possible formats, for regression testing
// line = " PCI:01:00:0";
// line = " pci:0000:01:00.0"
QRegExp rx = QRegExp("\\b[Pp][Cc][Ii][:]([0-9a-fA-F]+[:])?([0-9a-fA-F]+[:][0-9a-fA-F]+[:.][0-9a-fA-F]+)\\b");
if (rx.indexIn(line)>0) {
dri_info.pci = rx.cap(2);
int end = dri_info.pci.lastIndexOf(':');
int end2 = dri_info.pci.lastIndexOf('.');
if (end2>end) end=end2;
dri_info.pci[end]='.';
QString cmd = QString("lspci -m -v -s ") + dri_info.pci;
QStringList pci_info;
int num;
if (((num = ReadPipe(cmd, pci_info)) ||
(num = ReadPipe("/sbin/"+cmd, pci_info)) ||
(num = ReadPipe("/usr/sbin/"+cmd, pci_info)) ||
(num = ReadPipe("/usr/local/sbin/"+cmd, pci_info))) && num>=7) {
for (int i=2; i<=6; i++) {
line = pci_info[i];
line.remove(QRegExp("[^:]*:[ ]*"));
switch (i){
case 2: dri_info.vendor = line; break;
case 3: dri_info.device = line; break;
case 4: dri_info.subvendor = line; break;
case 6: dri_info.rev = line; break;
}
}
return true;
}
}
} }
return false; char driDevBuff[128];
} snprintf(driDevBuff, sizeof(driDevBuff), DRM_DEV_NAME, DRM_DIR_NAME, 0);
#ifdef O_CLOEXEC
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_DRAGONFLY) int driFd = QT_OPEN(driDevBuff, O_RDWR | O_CLOEXEC, 0);
#else
static bool get_dri_device() { int driFd = QT_OPEN(driDevBuff, O_RDWR, 0);
#endif
QStringList pci_info; if (driFd < 0) {
if (ReadPipe("sysctl -n hw.dri.0.name",pci_info)) { kWarning() << "get_dri_device: QT_OPEN() fail";
dri_info.module = pci_info[0].mid(0, pci_info[0].indexOf(0x20)); return false;
return true;
} }
return false;
drmVersionPtr driVer = drmGetVersion(driFd);
if (!driVer) {
kWarning() << "get_dri_device: drmGetVersion() fail";
drmClose(driFd);
return false;
}
const char* driBus = drmGetBusid(driFd);
dri_info.module = QString::fromLatin1(driVer->name, driVer->name_len);
dri_info.vendor = QString::fromLatin1(driVer->desc, driVer->desc_len);
dri_info.device = QString::fromLatin1(driBus);
dri_info.rev = QString::fromLatin1("%1.%2.%3").arg(driVer->version_major).arg(driVer->version_minor).arg(driVer->version_patchlevel);
drmFreeBusid(driBus);
drmFreeVersion(driVer);
drmClose(driFd);
return true;
} }
#else #else
@ -564,7 +523,6 @@ static QTreeWidgetItem *print_screen_info(QTreeWidgetItem *l1, QTreeWidgetItem *
l2->setExpanded(true); l2->setExpanded(true);
l3 = newItem(l2, l3, i18n("Vendor"), dri_info.vendor); l3 = newItem(l2, l3, i18n("Vendor"), dri_info.vendor);
l3 = newItem(l2, l3, i18n("Device"), dri_info.device); l3 = newItem(l2, l3, i18n("Device"), dri_info.device);
l3 = newItem(l2, l3, i18n("Subvendor"), dri_info.subvendor);
l3 = newItem(l2, l3, i18n("Revision"), dri_info.rev); l3 = newItem(l2, l3, i18n("Revision"), dri_info.rev);
} else { } else {
l2 = newItem(l1, l2, i18n("3D Accelerator"), i18n("unknown")); l2 = newItem(l1, l2, i18n("3D Accelerator"), i18n("unknown"));

View file

@ -22,6 +22,7 @@
#ifndef OPENGLCONFIG_H #ifndef OPENGLCONFIG_H
#define OPENGLCONFIG_H #define OPENGLCONFIG_H
#cmakedefine KCM_ENABLE_DRM
#cmakedefine KCM_ENABLE_OPENGLES #cmakedefine KCM_ENABLE_OPENGLES
#endif #endif