[PATCH libdrm] xf86drm: open real correct render node on non-linux
Lennart Jablonka
humm at ljabl.com
Fri Feb 7 18:16:40 UTC 2025
Tested only on OpenBSD. Before:
$ cat drm-name.c
#include <fcntl.h>
#include <stdio.h>
#include <xf86drm.h>
int
main(void)
{
int fd = open("/dev/dri/renderD128", O_RDONLY);
puts(drmGetRenderDeviceNameFromFd(fd));
puts(drmGetPrimaryDeviceNameFromFd(fd));
fd = open("/dev/dri/card0", O_RDONLY);
puts(drmGetPrimaryDeviceNameFromFd(fd));
puts(drmGetRenderDeviceNameFromFd(fd));
}
$ cc drm-name.c `pkg-config --cflags --libs libdrm`
$ ./a.out
/dev/dri/renderD256
/dev/dri/card128
/dev/dri/card0
/dev/dri/renderD128
after:
$ ./a.out
/dev/dri/renderD128
/dev/dri/card0
/dev/dri/card0
/dev/dri/renderD128
Fixes: 293b95e81531 ("xf86drm: open correct render node on non-linux")
---
xf86drm.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/xf86drm.c b/xf86drm.c
index 22214417..294f8635 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3498,6 +3498,8 @@ static char *drmGetMinorNameForFD(int fd, int type)
const char *dev_name = drmGetDeviceName(type);
unsigned int maj, min;
int n;
+ int base = drmGetMinorBase(type);
+ int renderbase = drmGetMinorBase(DRM_NODE_RENDER);
if (fstat(fd, &sbuf))
return NULL;
@@ -3511,7 +3513,10 @@ static char *drmGetMinorNameForFD(int fd, int type)
if (!dev_name)
return NULL;
- n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
+ if (min >= renderbase)
+ min -= renderbase;
+
+ n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, base + min);
if (n == -1 || n >= sizeof(buf))
return NULL;
--
2.48.0
More information about the dri-devel
mailing list