aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoreonphi <eonphi@fastmail.com>2026-02-11 23:48:46 +0100
committerdec05eba <dec05eba@protonmail.com>2026-02-12 00:41:21 +0100
commit4a4af85b6d2b95074635aea586a598409b89cf8b (patch)
tree6714fc604bc24d31dce8f57294ee9c8e70d10a57
parent8f7608e7eec14edeb31e2538d217e35802d1ad10 (diff)
attempt EGLImage without modifiers when last failed
-rw-r--r--include/pipewire_video.h1
-rw-r--r--src/pipewire_video.c9
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);