swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mlibswc/drm.c | 41+++++++++++++++++++++++++++++++++++++++--
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))) {