[mutter/gnome-41] screen-cast/monitor-stream: Immediately record scanout frames
- From: Robert Mader <rmader src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-41] screen-cast/monitor-stream: Immediately record scanout frames
- Date: Fri, 7 Jan 2022 22:33:26 +0000 (UTC)
commit 67c981585f8292a9d7d2e5ca61ce22d1e685bec4
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Mon Dec 27 15:32:27 2021 -0300
screen-cast/monitor-stream: Immediately record scanout frames
When the before-paint function is executed, it's only purpose
is to check if there's any scanout queue, and immediately
record it if any.
However, since [1], we regressed in this specific case with the
introduction of an idle callback in the before-paint function.
The regression only happens when the PipeWire stream is using
DMA-BUF buffers, and it would operate as follows:
1. In before-paint, when there's a scanout available, we queue
an idle callback to capture the monitor. The idle callback
(almost always) executes after the scanout is pulled from
the stage view
2. meta_screen_cast_stream_src_maybe_record_frame() is called
by the idle callback. In the DMA-BUF case, it then runs
meta_screen_cast_monitor_stream_src_record_to_framebuffer()
3. In meta_screen_cast_monitor_stream_src_record_to_framebuffer(),
because the stage view doesn't have a scanout anymore, it
ends up calling cogl_blit_framebuffer() with the stage view
framebuffer. This is the regression bug.
This regression presents itself in the form of the screencast
stream showing the desktop when there's an unredirected fullscreen
application window running.
Revert before-paint - and only that - back to immediately capturing
any available scanout. Only record these frames when the target
buffer is a DMA-BUF handle. Nothing is captured on before-paint if
the stream is not using DMA-BUF, since the regular paint routine
will handle these frames regularly post-paint.
[1] https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1914
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2186>
(cherry picked from commit 77d5c8c928ca07825a6a1b5df207a5bea5468e7e)
src/backends/meta-screen-cast-monitor-stream-src.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
---
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c
b/src/backends/meta-screen-cast-monitor-stream-src.c
index 82d3862c9a..3075009017 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -162,6 +162,7 @@ before_stage_painted (MetaStage *stage,
MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data);
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
+ MetaScreenCastRecordFlag flags;
if (monitor_src->maybe_record_idle_id)
return;
@@ -169,10 +170,8 @@ before_stage_painted (MetaStage *stage,
if (!clutter_stage_view_peek_scanout (view))
return;
- monitor_src->maybe_record_idle_id = g_idle_add (maybe_record_frame_on_idle,
- src);
- g_source_set_name_by_id (monitor_src->maybe_record_idle_id,
- "[mutter] maybe_record_frame_on_idle [monitor-src]");
+ flags = META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY;
+ meta_screen_cast_stream_src_maybe_record_frame (src, flags);
}
static MetaBackend *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]