blob: 8d0f1a4620eadcac1e916afb8177cd5997991efc [file] [log] [blame]
From 05d15dda71acf75f9d5312adfa5d123a53fced73 Mon Sep 17 00:00:00 2001
From: Frank Henigman <fjhenigman@google.com>
Date: Fri, 19 Jun 2015 16:00:42 -0400
Subject: [PATCH] Support 'oak' board.
Try /dev/dri/cardX for X=0,1,... until one is found with modeset ability.
Try eglGetProcAddress() in addition to linux_platform_dl_sym() to look
up GL functions.
---
src/waffle/null/wnull_context.c | 2 ++
src/waffle/null/wnull_display.c | 27 ++++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/waffle/null/wnull_context.c b/src/waffle/null/wnull_context.c
index eee6806..bc2da6d 100644
--- a/src/waffle/null/wnull_context.c
+++ b/src/waffle/null/wnull_context.c
@@ -61,6 +61,8 @@ wnull_context_create(struct wcore_platform *wc_plat,
#define LOOKUP(type, name, args) \
ctx->name = linux_platform_dl_sym(plat->linux, dl, #name); \
+ if (!ctx->name) \
+ ctx->name = (void*)plat->wegl.eglGetProcAddress(#name); \
ok &= ctx->name != NULL;
GL_FUNCTIONS(LOOKUP)
#undef LOOKUP
diff --git a/src/waffle/null/wnull_display.c b/src/waffle/null/wnull_display.c
index 5ed621d..c5f7e9c 100644
--- a/src/waffle/null/wnull_display.c
+++ b/src/waffle/null/wnull_display.c
@@ -9,6 +9,7 @@
#include <dlfcn.h>
#include <fcntl.h>
#include <poll.h>
+#include <stdio.h>
#include <unistd.h>
#include <xf86drm.h>
@@ -178,6 +179,30 @@ wnull_display_destroy(struct wcore_display *wc_self)
return ok;
}
+static int kms_device_fd()
+{
+ bool has_conn = false;
+ for (int i = 0; i < 8; ++i) {
+ char path[99];
+ sprintf(path, "/dev/dri/card%d", i);
+ prt("trying %s\n", path);
+ int fd = open(path, O_RDWR | O_CLOEXEC);
+ if (fd >= 0) {
+ drmModeResPtr mr = drmModeGetResources(fd);
+ if (mr) {
+ has_conn = mr->count_connectors > 0;
+ drmModeFreeResources(mr);
+ }
+ if (has_conn) {
+ prt("using %s\n", path);
+ return fd;
+ }
+ close(fd);
+ }
+ }
+ return -1;
+}
+
struct wcore_display*
wnull_display_connect(struct wcore_platform *wc_plat,
const char *name)
@@ -192,7 +217,7 @@ wnull_display_connect(struct wcore_platform *wc_plat,
if (name != NULL)
fd = open(name, O_RDWR | O_CLOEXEC);
else
- fd = wgbm_get_default_fd_for_pattern("card[0-9]*");
+ fd = kms_device_fd();
if (fd < 0) {
wcore_errorf(WAFFLE_ERROR_UNKNOWN, "open drm file for gbm failed");
--
2.6.0.rc0.131.gf624c3d