commit f5f7b0704c1f8f93c03bd09d449296f318817a3e
parent 6b9d93c8ffc1b7d09a4bdb6b23e245cabedcae33
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Thu, 13 May 2021 12:24:10 -0500
drm: use default render node if none exist for primary card
Diffstat:
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/libswc/drm.c b/libswc/drm.c
@@ -172,6 +172,37 @@ find_primary_drm_device(char *path, size_t size)
return true;
}
+static int
+select_render_node(const struct dirent *entry)
+{
+ unsigned num;
+ return sscanf(entry->d_name, "renderD%u", &num) == 1;
+}
+
+static bool
+find_render_node(char *path, size_t size)
+{
+ struct dirent **nodes;
+ int num_nodes;
+ unsigned i;
+
+ num_nodes = scandir("/dev/dri", &nodes, &select_render_node, &alphasort);
+
+ if (num_nodes == -1)
+ return false;
+
+ if (snprintf(path, size, "/dev/dri/%s", nodes[0]->d_name) >= size)
+ return false;
+
+ for (i = 0; i < num_nodes; ++i) {
+ free(nodes[i]);
+ }
+
+ free(nodes);
+
+ return true;
+}
+
static bool
find_available_crtc(drmModeRes *resources, drmModeConnector *connector, uint32_t taken_crtcs, int *crtc_index)
{
@@ -270,8 +301,14 @@ drm_initialize(void)
drm.path = drmGetRenderDeviceNameFromFd(swc.drm->fd);
if (!drm.path) {
- ERROR("Could not determine render node path\n");
- goto error1;
+ if (!find_render_node(render, sizeof(render))) {
+ ERROR("Could not find default render node\n");
+ goto error1;
+ }
+ if (!(drm.path = strdup(render))) {
+ ERROR("Couldn't copy render node path\n");
+ goto error1;
+ }
}
if (!(swc.drm->context = wld_drm_create_context(swc.drm->fd))) {