mirror of
https://github.com/hyprwm/aquamarine.git
synced 2026-01-04 09:50:13 +01:00
core: add a rendernode fallback
if no matching rendernode is found, fallback to first available.
This commit is contained in:
parent
868214c1b7
commit
dfedd67148
1 changed files with 40 additions and 13 deletions
|
|
@ -165,13 +165,8 @@ void Aquamarine::CSessionDevice::resolveMatchingRenderNode(struct udev_device* c
|
||||||
if (!cardDevice)
|
if (!cardDevice)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto pciParent = udev_device_get_parent_with_subsystem_devtype(cardDevice, "pci", nullptr);
|
auto pciParent = udev_device_get_parent_with_subsystem_devtype(cardDevice, "pci", nullptr);
|
||||||
if (!pciParent)
|
const auto* pciSyspath = pciParent ? udev_device_get_syspath(pciParent) : nullptr;
|
||||||
return;
|
|
||||||
|
|
||||||
const char* pciSyspath = udev_device_get_syspath(pciParent);
|
|
||||||
if (!pciSyspath)
|
|
||||||
return;
|
|
||||||
|
|
||||||
struct udev_enumerate* enumerate = udev_enumerate_new(session->udevHandle);
|
struct udev_enumerate* enumerate = udev_enumerate_new(session->udevHandle);
|
||||||
if (!enumerate)
|
if (!enumerate)
|
||||||
|
|
@ -183,25 +178,30 @@ void Aquamarine::CSessionDevice::resolveMatchingRenderNode(struct udev_device* c
|
||||||
struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
|
struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
|
||||||
struct udev_list_entry* entry = nullptr;
|
struct udev_list_entry* entry = nullptr;
|
||||||
|
|
||||||
|
bool matched = false;
|
||||||
|
|
||||||
udev_list_entry_foreach(entry, devices) {
|
udev_list_entry_foreach(entry, devices) {
|
||||||
const char* path = udev_list_entry_get_name(entry);
|
const auto* path = udev_list_entry_get_name(entry);
|
||||||
struct udev_device* dev = udev_device_new_from_syspath(session->udevHandle, path);
|
auto dev = udev_device_new_from_syspath(session->udevHandle, path);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const char* devnode = udev_device_get_devnode(dev);
|
const auto* devnode = udev_device_get_devnode(dev);
|
||||||
const char* devtype = udev_device_get_devtype(dev);
|
const auto* devtype = udev_device_get_devtype(dev);
|
||||||
|
|
||||||
if (!devnode || !devtype || strcmp(devtype, "drm_minor") != 0 || !strstr(devnode, "renderD")) {
|
if (!devnode || !devtype || strcmp(devtype, "drm_minor") != 0 || !strstr(devnode, "renderD")) {
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct udev_device* devParent = udev_device_get_parent_with_subsystem_devtype(dev, "pci", nullptr);
|
auto devParent = udev_device_get_parent_with_subsystem_devtype(dev, "pci", nullptr);
|
||||||
if (devParent && strcmp(udev_device_get_syspath(devParent), pciSyspath) == 0) {
|
if (devParent && pciSyspath && strcmp(udev_device_get_syspath(devParent), pciSyspath) == 0) {
|
||||||
renderNodeFd = open(devnode, O_RDWR | O_CLOEXEC);
|
renderNodeFd = open(devnode, O_RDWR | O_CLOEXEC);
|
||||||
if (renderNodeFd < 0)
|
if (renderNodeFd < 0)
|
||||||
session->backend->log(AQ_LOG_WARNING, std::format("drm: Failed to open matching render node {}", devnode));
|
session->backend->log(AQ_LOG_WARNING, std::format("drm: Failed to open matching render node {}", devnode));
|
||||||
|
else
|
||||||
|
matched = true;
|
||||||
|
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -209,6 +209,33 @@ void Aquamarine::CSessionDevice::resolveMatchingRenderNode(struct udev_device* c
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!matched) {
|
||||||
|
// fallback to the first render node
|
||||||
|
udev_list_entry_foreach(entry, devices) {
|
||||||
|
const auto* path = udev_list_entry_get_name(entry);
|
||||||
|
auto dev = udev_device_new_from_syspath(session->udevHandle, path);
|
||||||
|
if (!dev)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const auto* devnode = udev_device_get_devnode(dev);
|
||||||
|
const auto* devtype = udev_device_get_devtype(dev);
|
||||||
|
|
||||||
|
if (!devnode || !devtype || strcmp(devtype, "drm_minor") != 0 || !strstr(devnode, "renderD")) {
|
||||||
|
udev_device_unref(dev);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderNodeFd = open(devnode, O_RDWR | O_CLOEXEC);
|
||||||
|
if (renderNodeFd >= 0) {
|
||||||
|
session->backend->log(AQ_LOG_WARNING, std::format("drm: No matching render node for {}, falling back to {}", path, devnode));
|
||||||
|
udev_device_unref(dev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
udev_device_unref(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
udev_enumerate_unref(enumerate);
|
udev_enumerate_unref(enumerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue