[PATCH libdrm] xf86drm: open real correct render node on non-linux

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux