summarylogtreecommitdiffstats
path: root/displaylink.patch
blob: e0327cb7f477fd754e7481997ccd8d77d7822298 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
diff --unified --recursive --text hyprland-test/src/hyprland-source/subprojects/wlroots/render/egl.c hyprland-git/src/hyprland-source/subprojects/wlroots/render/egl.c
--- render/egl.c	2023-05-14 11:18:56.598893482 +1000
+++ render/egl.c	2022-10-23 11:16:25.923036282 +1000
@@ -492,25 +492,41 @@
 }
 
 static int open_render_node(int drm_fd) {
-	char *render_name = drmGetRenderDeviceNameFromFd(drm_fd);
-	if (render_name == NULL) {
-		// This can happen on split render/display platforms, fallback to
-		// primary node
-		render_name = drmGetPrimaryDeviceNameFromFd(drm_fd);
-		if (render_name == NULL) {
-			wlr_log_errno(WLR_ERROR, "drmGetPrimaryDeviceNameFromFd failed");
-			return -1;
-		}
-		wlr_log(WLR_DEBUG, "DRM device '%s' has no render node, "
-			"falling back to primary node", render_name);
-	}
-
-	int render_fd = open(render_name, O_RDWR | O_CLOEXEC);
-	if (render_fd < 0) {
-		wlr_log_errno(WLR_ERROR, "Failed to open DRM node '%s'", render_name);
-	}
-	free(render_name);
-	return render_fd;
+    char* render_name = drmGetRenderDeviceNameFromFd(drm_fd);
+    if (render_name == NULL) {
+        // This can happen on split render/display platforms, fallback to
+        // primary node
+        render_name = drmGetPrimaryDeviceNameFromFd(drm_fd);
+        if (render_name == NULL) {
+            wlr_log_errno(WLR_ERROR, "drmGetPrimaryDeviceNameFromFd failed");
+            return -1;
+        }
+        wlr_log(WLR_DEBUG,
+                "DRM device '%s' has no render node, "
+                "falling back to primary node",
+                render_name);
+
+        drmVersion* render_version = drmGetVersion(drm_fd);
+        if (render_version != NULL && render_version->name != NULL) {
+            wlr_log(WLR_DEBUG, "DRM device version.name '%s'", render_version->name);
+            if (strcmp(render_version->name, "evdi") == 0) {
+                free(render_name);
+                render_name = malloc(sizeof(char) * 15);
+                strcpy(render_name, "/dev/dri/card0");
+            }
+
+            drmFreeVersion(render_version);
+        }
+    }
+
+    wlr_log(WLR_DEBUG, "open_render_node() DRM device '%s'", render_name);
+
+    int render_fd = open(render_name, O_RDWR | O_CLOEXEC);
+    if (render_fd < 0) {
+        wlr_log_errno(WLR_ERROR, "Failed to open DRM node '%s'", render_name);
+    }
+    free(render_name);
+    return render_fd;
 }
 
 struct wlr_egl *wlr_egl_create_with_drm_fd(int drm_fd) {