Hide cursor when it's on another display 2

This commit is contained in:
dec05eba 2023-07-22 04:56:50 +02:00
parent 4e8c47a154
commit b898bddb63
2 changed files with 30 additions and 9 deletions

View File

@ -234,12 +234,22 @@ static bool gsr_capture_kms_cuda_should_stop(gsr_capture *cap, bool *err) {
return false; 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) { 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) { 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) 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].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) { static gsr_kms_response_fd* find_first_combined_drm(gsr_kms_response *kms_response) {

View File

@ -338,12 +338,22 @@ static bool gsr_capture_kms_vaapi_should_stop(gsr_capture *cap, bool *err) {
return false; 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) { 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) { 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) 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].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) { 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); 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; capture_is_combined_plane = (drm_fd && drm_fd->is_combined_plane) || count_non_cursor_planes(&cap_kms->kms_response) == 1;
} }
if(!drm_fd) if(!drm_fd)
return -1; 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. // 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: // Even ffmpeg kmsgrab causes this crash. The error is:
// amdgpu: Failed to allocate a buffer: // amdgpu: Failed to allocate a buffer: