summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2013-11-12 20:36:13 -0800
committerChad Versace <chad.versace@linux.intel.com>2013-11-14 10:07:09 -0800
commit185ee9e5f73701d68f45d2ea85aa5c0486cccefb (patch)
tree0b1b7728456dd51423345f92a0fa6cfc639e5bbd /src
parentd77f0fee015c354c0cde3cf6e2881a75bef4e6eb (diff)
gbm: try to open a render node before the card device
Since render nodes allow rendering which should not interact with the window system, we attempt to use render nodes first when a gbm device is not directly specified. The main difference as far as gbm is concerned is that render nodes don't require drm master authentication. Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/waffle/gbm/wgbm_display.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/waffle/gbm/wgbm_display.c b/src/waffle/gbm/wgbm_display.c
index df94115..070ce70 100644
--- a/src/waffle/gbm/wgbm_display.c
+++ b/src/waffle/gbm/wgbm_display.c
@@ -65,7 +65,7 @@ wgbm_display_destroy(struct wcore_display *wc_self)
}
static int
-wgbm_get_fd(void)
+wgbm_get_default_fd_for_pattern(const char *pattern)
{
struct udev *ud;
struct udev_enumerate *en;
@@ -77,7 +77,7 @@ wgbm_get_fd(void)
ud = udev_new();
en = udev_enumerate_new(ud);
udev_enumerate_add_match_subsystem(en, "drm");
- udev_enumerate_add_match_sysname(en, "card[0-9]*");
+ udev_enumerate_add_match_sysname(en, pattern);
udev_enumerate_scan_devices(en);
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(en)) {
@@ -94,6 +94,21 @@ wgbm_get_fd(void)
return -1;
}
+static int
+wgbm_get_default_fd(void)
+{
+ int fd;
+
+ // Try opening render node first
+ fd = wgbm_get_default_fd_for_pattern("renderD[0-9]*");
+ if (fd >= 0)
+ return fd;
+
+ // If render nodes are not supported, then fall back to the card
+ fd = wgbm_get_default_fd_for_pattern("card[0-9]*");
+ return fd;
+}
+
struct wcore_display*
wgbm_display_connect(struct wcore_platform *wc_plat,
const char *name)
@@ -109,7 +124,7 @@ wgbm_display_connect(struct wcore_platform *wc_plat,
if (name != NULL) {
fd = open(name, O_RDWR | O_CLOEXEC);
} else {
- fd = wgbm_get_fd();
+ fd = wgbm_get_default_fd();
}
if (fd < 0) {