winsys/radeon: share winsys between different fd's
authorChristian König <christian.koenig@amd.com>
Sat, 21 Sep 2013 10:25:13 +0000 (12:25 +0200)
committerChristian König <christian.koenig@amd.com>
Sun, 22 Sep 2013 08:33:20 +0000 (10:33 +0200)
Share the winsys between different fd's if they point to the same device.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c

index 27bf3483d7de2d9d6511aebe3f71cce5b8805002..61f091323f4d334e3ff3e12ac3f486585cacbf27 100644 (file)
@@ -41,6 +41,9 @@
 
 #include <xf86drm.h>
 #include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
 /*
  * this are copy from radeon_drm, once an updated libdrm is released
@@ -519,12 +522,24 @@ static uint64_t radeon_query_value(struct radeon_winsys *rws,
 
 static unsigned hash_fd(void *key)
 {
-    return pointer_to_intptr(key);
+    int fd = pointer_to_intptr(key);
+    struct stat stat;
+    fstat(fd, &stat);
+
+    return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
 }
 
 static int compare_fd(void *key1, void *key2)
 {
-    return pointer_to_intptr(key1) != pointer_to_intptr(key2);
+    int fd1 = pointer_to_intptr(key1);
+    int fd2 = pointer_to_intptr(key2);
+    struct stat stat1, stat2;
+    fstat(fd1, &stat1);
+    fstat(fd2, &stat2);
+
+    return stat1.st_dev != stat2.st_dev ||
+           stat1.st_ino != stat2.st_ino ||
+           stat1.st_rdev != stat2.st_rdev;
 }
 
 void radeon_drm_ws_queue_cs(struct radeon_drm_winsys *ws, struct radeon_drm_cs *cs)