Try to use drm render nodes.
authorAbrahm Scully <abrahm.scully@gmail.com>
Thu, 19 Jun 2014 02:28:42 +0000 (22:28 -0400)
committerZhigang Gong <zhigang.gong@intel.com>
Thu, 19 Jun 2014 08:19:52 +0000 (16:19 +0800)
Allows non-root user to run without X.
Works on Fedora 20 with render nodes enabled.

Signed-off-by: Abrahm Scully <abrahm.scully@gmail.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
src/intel/intel_driver.c
src/intel/intel_driver.h

index f0e860c..4a33661 100644 (file)
@@ -222,6 +222,18 @@ intel_driver_open(intel_driver_t *intel, cl_context_prop props)
   }
 
   if(!intel_driver_is_active(intel)) {
+    printf("Trying to open render node...\n");
+    char card_name[20];
+    for(cardi = 0; cardi < 16; cardi++) {
+      sprintf(card_name, "/dev/dri/renderD%d", 128+cardi);
+      if(intel_driver_init_render(intel, card_name)) {
+        printf("Success at %s.\n", card_name);
+        break;
+      }
+    }
+  }
+
+  if(!intel_driver_is_active(intel)) {
     printf("Trying to open directly...\n");
     char card_name[20];
     for(cardi = 0; cardi < 16; cardi++) {
@@ -232,6 +244,7 @@ intel_driver_open(intel_driver_t *intel, cl_context_prop props)
       }
     }
   }
+
   if(!intel_driver_is_active(intel)) {
     printf("Device open failed\n");
     exit(-1);
@@ -324,6 +337,24 @@ intel_driver_init_master(intel_driver_t *driver, const char* dev_name)
   return 1;
 }
 
+LOCAL int
+intel_driver_init_render(intel_driver_t *driver, const char* dev_name)
+{
+  int dev_fd;
+
+  // usually dev_name = "/dev/dri/renderD%d"
+  dev_fd = open(dev_name, O_RDWR);
+  if (dev_fd == -1) {
+    printf("open(\"%s\", O_RDWR) failed: %s\n", dev_name, strerror(errno));
+    return 0;
+  }
+
+  intel_driver_init(driver, dev_fd);
+  driver->master = 1;
+
+  return 1;
+}
+
 LOCAL int 
 intel_driver_terminate(intel_driver_t *driver)
 {
index 34efbbb..1ad0500 100644 (file)
@@ -106,6 +106,9 @@ extern int intel_driver_init_shared(intel_driver_t*, struct dri_state*);
  */
 extern int intel_driver_init_master(intel_driver_t*, const char* dev_name);
 
+/* init driver for render node */
+extern int intel_driver_init_render(intel_driver_t*, const char* dev_name);
+
 /* terminate driver and all underlying structures */
 extern int intel_driver_terminate(intel_driver_t*);