commit 20c1856
Michael Forney
·
2018-11-10 08:34:10 +0000 UTC
parent 600a874
drm: Use libdrm utility function to get render node device name Fixes #46.
1 files changed,
+8,
-22
+8,
-22
1@@ -47,7 +47,7 @@
2 struct swc_drm swc_drm;
3
4 static struct {
5- char path[128];
6+ char *path;
7
8 uint32_t taken_ids;
9
10@@ -252,38 +252,23 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
11 bool
12 drm_initialize(void)
13 {
14- struct stat master, render;
15+ char primary[128];
16
17- if (!find_primary_drm_device(drm.path, sizeof(drm.path))) {
18+ if (!find_primary_drm_device(primary, sizeof(primary))) {
19 ERROR("Could not find DRM device\n");
20 goto error0;
21 }
22
23 drm.taken_ids = 0;
24- swc.drm->fd = launch_open_device(drm.path, O_RDWR | O_CLOEXEC);
25-
26+ swc.drm->fd = launch_open_device(primary, O_RDWR | O_CLOEXEC);
27 if (swc.drm->fd == -1) {
28 ERROR("Could not open DRM device at %s\n", drm.path);
29 goto error0;
30 }
31
32- if (fstat(swc.drm->fd, &master) != 0) {
33- ERROR("Could not fstat DRM FD: %s\n", strerror(errno));
34- goto error1;
35- }
36-
37- if (snprintf(drm.path, sizeof(drm.path), "/dev/dri/renderD%d", minor(master.st_rdev) + 0x80) >= sizeof(drm.path)) {
38- ERROR("Render node path is too long");
39- goto error1;
40- }
41-
42- if (stat(drm.path, &render) != 0) {
43- ERROR("stat %s failed (does your kernel support render nodes?): %s\n", drm.path, strerror(errno));
44- goto error1;
45- }
46-
47- if (master.st_mode != render.st_mode || minor(master.st_rdev) + 0x80 != minor(render.st_rdev)) {
48- ERROR("Render node does not have expected mode or minor number\n");
49+ drm.path = drmGetRenderDeviceNameFromFd(swc.drm->fd);
50+ if (!drm.path) {
51+ ERROR("Could not determine render node path\n");
52 goto error1;
53 }
54
55@@ -335,6 +320,7 @@ drm_finalize(void)
56 wl_event_source_remove(drm.event_source);
57 wld_destroy_renderer(swc.drm->renderer);
58 wld_destroy_context(swc.drm->context);
59+ free(drm.path);
60 close(swc.drm->fd);
61 }
62