From b898bddb63d1069562b0e45ddf8d87e18f456cdb Mon Sep 17 00:00:00 2001
From: dec05eba <dec05eba@protonmail.com>
Date: Sat, 22 Jul 2023 04:56:50 +0200
Subject: Hide cursor when it's on another display 2

---
 src/capture/kms_cuda.c  | 16 +++++++++++++---
 src/capture/kms_vaapi.c | 23 +++++++++++++++++------
 2 files changed, 30 insertions(+), 9 deletions(-)

(limited to 'src/capture')

diff --git a/src/capture/kms_cuda.c b/src/capture/kms_cuda.c
index d74cbee..e6fa42f 100644
--- a/src/capture/kms_cuda.c
+++ b/src/capture/kms_cuda.c
@@ -234,12 +234,22 @@ static bool gsr_capture_kms_cuda_should_stop(gsr_capture *cap, bool *err) {
     return false;
 }
 
+/* Prefer non combined planes */
 static gsr_kms_response_fd* find_drm_by_connector_id(gsr_kms_response *kms_response, uint32_t connector_id) {
+    int index_combined = -1;
     for(int i = 0; i < kms_response->num_fds; ++i) {
-        if(kms_response->fds[i].connector_id == connector_id && !kms_response->fds[i].is_cursor)
-            return &kms_response->fds[i];
+        if(kms_response->fds[i].connector_id == connector_id && !kms_response->fds[i].is_cursor) {
+            if(kms_response->fds[i].is_combined_plane)
+                index_combined = i;
+            else
+                return &kms_response->fds[i];
+        }
     }
-    return NULL;
+
+    if(index_combined != -1)
+        return &kms_response->fds[index_combined];
+    else
+        return NULL;
 }
 
 static gsr_kms_response_fd* find_first_combined_drm(gsr_kms_response *kms_response) {
diff --git a/src/capture/kms_vaapi.c b/src/capture/kms_vaapi.c
index 2a538c5..e49c4d6 100644
--- a/src/capture/kms_vaapi.c
+++ b/src/capture/kms_vaapi.c
@@ -338,12 +338,22 @@ static bool gsr_capture_kms_vaapi_should_stop(gsr_capture *cap, bool *err) {
     return false;
 }
 
+/* Prefer non combined planes */
 static gsr_kms_response_fd* find_drm_by_connector_id(gsr_kms_response *kms_response, uint32_t connector_id) {
+    int index_combined = -1;
     for(int i = 0; i < kms_response->num_fds; ++i) {
-        if(kms_response->fds[i].connector_id == connector_id && !kms_response->fds[i].is_cursor)
-            return &kms_response->fds[i];
+        if(kms_response->fds[i].connector_id == connector_id && !kms_response->fds[i].is_cursor) {
+            if(kms_response->fds[i].is_combined_plane)
+                index_combined = i;
+            else
+                return &kms_response->fds[i];
+        }
     }
-    return NULL;
+
+    if(index_combined != -1)
+        return &kms_response->fds[index_combined];
+    else
+        return NULL;
 }
 
 static gsr_kms_response_fd* find_first_combined_drm(gsr_kms_response *kms_response) {
@@ -453,15 +463,16 @@ static int gsr_capture_kms_vaapi_capture(gsr_capture *cap, AVFrame *frame) {
         }
 
         cursor_drm_fd = find_cursor_drm(&cap_kms->kms_response);
-        /* Hide cursor when it's on another display */
-        if(cursor_drm_fd && drm_fd && cursor_drm_fd->connector_id != drm_fd->connector_id)
-            cursor_drm_fd = NULL;
         capture_is_combined_plane = (drm_fd && drm_fd->is_combined_plane) || count_non_cursor_planes(&cap_kms->kms_response) == 1;
     }
 
     if(!drm_fd)
         return -1;
 
+    /* Hide cursor when it's on another display */
+    if(!capture_is_combined_plane && cursor_drm_fd && cursor_drm_fd->connector_id != drm_fd->connector_id)
+        cursor_drm_fd = NULL;
+
     // TODO: This causes a crash sometimes on steam deck, why? is it a driver bug? a vaapi pure version doesn't cause a crash.
     // Even ffmpeg kmsgrab causes this crash. The error is:
     // amdgpu: Failed to allocate a buffer:
-- 
cgit v1.2.3-70-g09d2