From b898bddb63d1069562b0e45ddf8d87e18f456cdb Mon Sep 17 00:00:00 2001 From: dec05eba 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(-) 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