212 lines
7.4 KiB
Diff
212 lines
7.4 KiB
Diff
From 24203b9306d75c3209969a6fdbb363afa51e15fd Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
|
Date: Fri, 13 Feb 2026 11:20:51 +0100
|
|
Subject: [PATCH] Revert "mdk: Use PipeWire damage region for minimizing
|
|
redraws"
|
|
|
|
This reverts commit fc337eb0b81740388f6e4496c87dbd4b3a578439.
|
|
---
|
|
mdk/mdk-stream.c | 117 ++++-------------------------------------------
|
|
1 file changed, 9 insertions(+), 108 deletions(-)
|
|
|
|
diff --git a/mdk/mdk-stream.c b/mdk/mdk-stream.c
|
|
index 979f89b834..96b31ea34f 100644
|
|
--- a/mdk/mdk-stream.c
|
|
+++ b/mdk/mdk-stream.c
|
|
@@ -396,8 +396,7 @@ on_stream_param_changed (void *user_data,
|
|
MdkStream *stream = MDK_STREAM (user_data);
|
|
uint8_t params_buffer[1024];
|
|
struct spa_pod_builder pod_builder;
|
|
- const struct spa_pod *params[4];
|
|
- const size_t meta_region_size = sizeof (struct spa_meta_region);
|
|
+ const struct spa_pod *params[3];
|
|
int result;
|
|
|
|
if (!format || id != SPA_PARAM_Format)
|
|
@@ -453,15 +452,6 @@ on_stream_param_changed (void *user_data,
|
|
CURSOR_META_SIZE (384, 384)),
|
|
0);
|
|
|
|
- params[3] = spa_pod_builder_add_object (
|
|
- &pod_builder,
|
|
- SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
|
|
- SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoDamage),
|
|
- SPA_PARAM_META_size, SPA_POD_CHOICE_RANGE_Int (meta_region_size * 32,
|
|
- meta_region_size * 1,
|
|
- meta_region_size * 32),
|
|
- 0);
|
|
-
|
|
pw_stream_update_params (stream->pipewire_stream,
|
|
params, G_N_ELEMENTS (params));
|
|
}
|
|
@@ -547,60 +537,6 @@ read_cursor_metadata (MdkStream *stream,
|
|
}
|
|
}
|
|
|
|
-static cairo_region_t *
|
|
-read_damage_metadata (MdkStream *stream,
|
|
- struct spa_buffer *spa_buffer)
|
|
-{
|
|
- struct spa_meta *video_damage;
|
|
- struct spa_meta_region *meta_region;
|
|
- g_autofree cairo_rectangle_int_t *cairo_rects = NULL;
|
|
- int num_rects = 0;
|
|
-
|
|
- video_damage = spa_buffer_find_meta (spa_buffer, SPA_META_VideoDamage);
|
|
- if (!video_damage)
|
|
- return NULL;
|
|
-
|
|
- meta_region = spa_meta_first (video_damage);
|
|
- if (!meta_region)
|
|
- return NULL;
|
|
-
|
|
- spa_meta_for_each (meta_region, video_damage)
|
|
- {
|
|
- if (!spa_meta_region_is_valid (meta_region))
|
|
- break;
|
|
-
|
|
- num_rects++;
|
|
- }
|
|
-
|
|
- if (!num_rects)
|
|
- return NULL;
|
|
-
|
|
- g_debug ("Stream has damage with %d rectangles", num_rects);
|
|
-
|
|
- cairo_rects = g_new (cairo_rectangle_int_t, num_rects);
|
|
- num_rects = 0;
|
|
- spa_meta_for_each (meta_region, video_damage)
|
|
- {
|
|
- if (!spa_meta_region_is_valid (meta_region))
|
|
- break;
|
|
-
|
|
- g_debug ("Stream damage rectangle %d: %ux%u +%d+%d",
|
|
- num_rects,
|
|
- meta_region->region.size.width,
|
|
- meta_region->region.size.height,
|
|
- meta_region->region.position.x,
|
|
- meta_region->region.position.y);
|
|
-
|
|
- cairo_rects[num_rects].x = meta_region->region.position.x;
|
|
- cairo_rects[num_rects].y = meta_region->region.position.y;
|
|
- cairo_rects[num_rects].width = meta_region->region.size.width;
|
|
- cairo_rects[num_rects].height = meta_region->region.size.height;
|
|
- num_rects++;
|
|
- }
|
|
-
|
|
- return cairo_region_create_rectangles (cairo_rects, num_rects);
|
|
-}
|
|
-
|
|
static void
|
|
on_stream_process (void *user_data)
|
|
{
|
|
@@ -609,7 +545,6 @@ on_stream_process (void *user_data)
|
|
struct pw_buffer *buffer = NULL;
|
|
struct spa_buffer *spa_buffer;
|
|
struct spa_meta_header *spa_header;
|
|
- cairo_region_t *damage_region = NULL;
|
|
gboolean hold_buffer = FALSE;
|
|
gboolean has_buffer;
|
|
uint32_t drm_format;
|
|
@@ -634,13 +569,11 @@ on_stream_process (void *user_data)
|
|
if (!has_buffer)
|
|
goto read_metadata;
|
|
|
|
- damage_region = read_damage_metadata (stream, spa_buffer);
|
|
-
|
|
if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf)
|
|
{
|
|
g_autoptr (GdkDmabufTextureBuilder) builder = NULL;
|
|
- g_autoptr (GError) error = NULL;
|
|
unsigned int i;
|
|
+ g_autoptr (GError) error = NULL;
|
|
|
|
if (!spa_pixel_format_to_drm_format (stream->format.info.raw.format,
|
|
&drm_format))
|
|
@@ -671,13 +604,6 @@ on_stream_process (void *user_data)
|
|
gdk_dmabuf_texture_builder_set_stride (builder, i, spa_buffer->datas[i].chunk->stride);
|
|
}
|
|
|
|
- if (GDK_IS_TEXTURE (stream->paintable))
|
|
- {
|
|
- gdk_dmabuf_texture_builder_set_update_region (builder, damage_region);
|
|
- gdk_dmabuf_texture_builder_set_update_texture (builder,
|
|
- GDK_TEXTURE (stream->paintable));
|
|
- }
|
|
-
|
|
g_clear_object (&stream->paintable);
|
|
stream->paintable =
|
|
GDK_PAINTABLE (gdk_dmabuf_texture_builder_build (builder,
|
|
@@ -703,10 +629,9 @@ on_stream_process (void *user_data)
|
|
}
|
|
else
|
|
{
|
|
- g_autoptr (GdkMemoryTextureBuilder) builder = NULL;
|
|
+ g_autoptr (GdkTexture) texture = NULL;
|
|
g_autoptr (GBytes) bytes = NULL;
|
|
GdkMemoryFormat gdk_format;
|
|
- unsigned int i;
|
|
uint8_t *map;
|
|
void *data;
|
|
uint32_t bpp;
|
|
@@ -721,29 +646,6 @@ on_stream_process (void *user_data)
|
|
goto read_metadata;
|
|
}
|
|
|
|
- builder = gdk_memory_texture_builder_new ();
|
|
- gdk_memory_texture_builder_set_width (builder,
|
|
- stream->format.info.raw.size.width);
|
|
- gdk_memory_texture_builder_set_height (builder,
|
|
- stream->format.info.raw.size.height);
|
|
- gdk_memory_texture_builder_set_format (builder,
|
|
- gdk_format);
|
|
-
|
|
- for (i = 0; i < spa_buffer->n_datas; i++)
|
|
- {
|
|
- gdk_memory_texture_builder_set_offset (builder, i,
|
|
- spa_buffer->datas[i].chunk->offset);
|
|
- gdk_memory_texture_builder_set_stride_for_plane (builder, i,
|
|
- spa_buffer->datas[i].chunk->stride);
|
|
- }
|
|
-
|
|
- if (GDK_IS_TEXTURE (stream->paintable))
|
|
- {
|
|
- gdk_memory_texture_builder_set_update_region (builder, damage_region);
|
|
- gdk_memory_texture_builder_set_update_texture (builder,
|
|
- GDK_TEXTURE (stream->paintable));
|
|
- }
|
|
-
|
|
size = spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset;
|
|
|
|
map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, spa_buffer->datas[0].fd, 0);
|
|
@@ -756,11 +658,12 @@ on_stream_process (void *user_data)
|
|
|
|
bytes = g_bytes_new (data, size);
|
|
|
|
- gdk_memory_texture_builder_set_bytes (builder, bytes);
|
|
-
|
|
- g_clear_object (&stream->paintable);
|
|
- stream->paintable =
|
|
- GDK_PAINTABLE (gdk_memory_texture_builder_build (builder));
|
|
+ texture = gdk_memory_texture_new (stream->format.info.raw.size.width,
|
|
+ stream->format.info.raw.size.height,
|
|
+ gdk_format,
|
|
+ bytes,
|
|
+ spa_buffer->datas[0].chunk->stride);
|
|
+ g_set_object (&stream->paintable, GDK_PAINTABLE (texture));
|
|
|
|
munmap (map, size);
|
|
}
|
|
@@ -789,8 +692,6 @@ read_metadata:
|
|
|
|
if (!pw_stream_is_driving (stream->pipewire_stream))
|
|
gdk_paintable_invalidate_contents (GDK_PAINTABLE (stream));
|
|
-
|
|
- g_clear_pointer (&damage_region, cairo_region_destroy);
|
|
}
|
|
|
|
static void
|
|
--
|
|
2.51.0
|
|
|