diff options
| author | eonphi <eonphi@fastmail.com> | 2026-02-11 23:48:46 +0100 |
|---|---|---|
| committer | dec05eba <dec05eba@protonmail.com> | 2026-02-12 00:41:21 +0100 |
| commit | 4a4af85b6d2b95074635aea586a598409b89cf8b (patch) | |
| tree | 6714fc604bc24d31dce8f57294ee9c8e70d10a57 | |
| parent | 8f7608e7eec14edeb31e2538d217e35802d1ad10 (diff) | |
attempt EGLImage without modifiers when last failed
| -rw-r--r-- | include/pipewire_video.h | 1 | ||||
| -rw-r--r-- | src/pipewire_video.c | 9 |
2 files changed, 9 insertions, 1 deletions
diff --git a/include/pipewire_video.h b/include/pipewire_video.h index 8722d21..4b898f1 100644 --- a/include/pipewire_video.h +++ b/include/pipewire_video.h @@ -106,6 +106,7 @@ typedef struct { bool no_modifiers_fallback; bool external_texture_fallback; + uint64_t renegotiated_modifier; uint64_t modifiers[GSR_PIPEWIRE_VIDEO_MAX_MODIFIERS]; size_t num_modifiers; diff --git a/src/pipewire_video.c b/src/pipewire_video.c index 2550525..bf841bc 100644 --- a/src/pipewire_video.c +++ b/src/pipewire_video.c @@ -687,6 +687,7 @@ bool gsr_pipewire_video_init(gsr_pipewire_video *self, int pipewire_fd, uint32_t self->video_info.fps_num = fps; self->video_info.fps_den = 1; self->cursor.visible = capture_cursor; + self->renegotiated_modifier = DRM_FORMAT_MOD_INVALID; if(!gsr_pipewire_video_setup_stream(self)) { gsr_pipewire_video_deinit(self); @@ -792,8 +793,14 @@ static EGLImage gsr_pipewire_video_create_egl_image_with_fallback(gsr_pipewire_v fprintf(stderr, "gsr error: gsr_pipewire_video_create_egl_image_with_fallback: failed to create egl image with modifiers, trying without modifiers\n"); self->no_modifiers_fallback = true; image = gsr_pipewire_video_create_egl_image(self, fds, offsets, pitches, modifiers, false); + } else if(self->renegotiated_modifier == self->format.info.raw.modifier) { + fprintf(stderr, "gsr error: gsr_pipewire_video_create_egl_image_with_fallback: modifier 0x%" PRIx64 " failed again after renegotiation, trying without modifiers as last resort\n", self->format.info.raw.modifier); + image = gsr_pipewire_video_create_egl_image(self, fds, offsets, pitches, modifiers, false); + if(image) + self->no_modifiers_fallback = true; } else { - fprintf(stderr, "gsr error: gsr_pipewire_video_create_egl_image_with_fallback: failed to create egl image with modifiers, renegotiating with a different modifier\n"); + fprintf(stderr, "gsr error: gsr_pipewire_video_create_egl_image_with_fallback: failed to create egl image with modifier 0x%" PRIx64 ", renegotiating with a different modifier\n", self->format.info.raw.modifier); + self->renegotiated_modifier = self->format.info.raw.modifier; self->negotiated = false; pw_thread_loop_lock(self->thread_loop); gsr_pipewire_video_remove_modifier(self, self->format.info.raw.modifier); |
