aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2023-07-10 01:29:43 +0200
committerdec05eba <dec05eba@protonmail.com>2023-07-10 01:29:43 +0200
commitd6d17e55e0fd9aeebc418b2c7b9f25b99492b9dc (patch)
treed076c99d12d0393523906fa93bfcf20d10e78ce6
parentf38ed36271ab417fbff005452e721a57c53641fe (diff)
Attempt to make active card detection more robust
-rw-r--r--src/utils.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/utils.c b/src/utils.c
index 0c57a4f..22b29af 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -4,8 +4,9 @@
#include <string.h>
#include <stdio.h>
#include <unistd.h>
-#include <xf86drmMode.h>
#include <fcntl.h>
+#include <xf86drmMode.h>
+#include <xf86drm.h>
double clock_get_monotonic_seconds(void) {
struct timespec ts;
@@ -115,15 +116,32 @@ bool gsr_get_valid_card_path(char *output) {
if(fd == -1)
continue;
- bool is_display_card = false;
- drmModeResPtr resources = drmModeGetResources(fd);
- if(resources) {
- is_display_card = true;
- drmModeFreeResources(resources);
+ drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+
+ drmModePlaneResPtr planes = drmModeGetPlaneResources(fd);
+ if(!planes) {
+ close(fd);
+ continue;
+ }
+
+ bool found_screen_card = false;
+ for(uint32_t i = 0; i < planes->count_planes; ++i) {
+ drmModePlanePtr plane = drmModeGetPlane(fd, planes->planes[i]);
+ if(!plane)
+ continue;
+
+ if(plane->fb_id)
+ found_screen_card = true;
+
+ drmModeFreePlane(plane);
+
+ if(found_screen_card)
+ break;
}
+
close(fd);
- if(is_display_card)
+ if(found_screen_card)
return true;
}
return false;