From ab0a07142de9124574930b0d7ea1169ce3e5ebbb Mon Sep 17 00:00:00 2001 From: columbarius Date: Wed, 25 May 2022 21:27:25 +0200 Subject: [PATCH] screencast: use wl_array for format-modifier-pairs wl_array is a better fit than wl_list. It's less intensive on memory and fits nicely with the flow of dmabuf_feedback announcing all format modifier pairs at once and reseting them on change. --- include/screencast_common.h | 3 +-- src/screencast/screencast_common.c | 6 +++--- src/screencast/wlr_screencast.c | 22 ++++++---------------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/include/screencast_common.h b/include/screencast_common.h index 92f8ea7..ae65b08 100644 --- a/include/screencast_common.h +++ b/include/screencast_common.h @@ -93,7 +93,6 @@ struct xdpw_buffer { }; struct xdpw_format_modifier_pair { - struct wl_list link; uint32_t fourcc; uint64_t modifier; }; @@ -122,7 +121,7 @@ struct xdpw_screencast_context { struct zwp_linux_dmabuf_v1 *linux_dmabuf; struct zwp_linux_dmabuf_feedback_v1 *linux_dmabuf_feedback; struct xdpw_dmabuf_feedback_data feedback_data; - struct wl_list format_modifier_pairs; + struct wl_array format_modifier_pairs; // gbm struct gbm_device *gbm; diff --git a/src/screencast/screencast_common.c b/src/screencast/screencast_common.c index 8e759a1..8c00c50 100644 --- a/src/screencast/screencast_common.c +++ b/src/screencast/screencast_common.c @@ -223,12 +223,12 @@ void xdpw_buffer_destroy(struct xdpw_buffer *buffer) { bool wlr_query_dmabuf_modifiers(struct xdpw_screencast_context *ctx, uint32_t drm_format, uint32_t num_modifiers, uint64_t *modifiers, uint32_t *max_modifiers) { - if (wl_list_empty(&ctx->format_modifier_pairs)) + if (ctx->format_modifier_pairs.size == 0) return false; struct xdpw_format_modifier_pair *fm_pair; if (num_modifiers == 0) { *max_modifiers = 0; - wl_list_for_each(fm_pair, &ctx->format_modifier_pairs, link) { + wl_array_for_each(fm_pair, &ctx->format_modifier_pairs) { if (fm_pair->fourcc == drm_format && (fm_pair->modifier == DRM_FORMAT_MOD_INVALID || gbm_device_get_format_modifier_plane_count(ctx->gbm, fm_pair->fourcc, fm_pair->modifier) > 0)) @@ -238,7 +238,7 @@ bool wlr_query_dmabuf_modifiers(struct xdpw_screencast_context *ctx, uint32_t dr } uint32_t i = 0; - wl_list_for_each(fm_pair, &ctx->format_modifier_pairs, link) { + wl_array_for_each(fm_pair, &ctx->format_modifier_pairs) { if (i == num_modifiers) break; if (fm_pair->fourcc == drm_format && diff --git a/src/screencast/wlr_screencast.c b/src/screencast/wlr_screencast.c index 32e96e9..258ae2c 100644 --- a/src/screencast/wlr_screencast.c +++ b/src/screencast/wlr_screencast.c @@ -549,28 +549,17 @@ static void wlr_remove_output(struct xdpw_wlr_output *out) { static void wlr_format_modifier_pair_add(struct xdpw_screencast_context *ctx, uint32_t format, uint64_t modifier) { struct xdpw_format_modifier_pair *fm_pair; - wl_list_for_each(fm_pair, &ctx->format_modifier_pairs, link) { + wl_array_for_each(fm_pair, &ctx->format_modifier_pairs) { if (fm_pair->fourcc == format && fm_pair->modifier == modifier) { logprint(TRACE, "wlroots: skipping duplicated format %u (%lu)", fm_pair->fourcc, fm_pair->modifier); return; } } - fm_pair = calloc(1, sizeof(struct xdpw_format_modifier_pair)); + fm_pair = wl_array_add(&ctx->format_modifier_pairs, sizeof(struct xdpw_format_modifier_pair)); fm_pair->fourcc = format; fm_pair->modifier = modifier; - logprint(TRACE, "wlroots: format %u (%lu)", fm_pair->fourcc, fm_pair->modifier); - - wl_list_insert(&ctx->format_modifier_pairs, &fm_pair->link); -} - -static void wlr_format_modifier_pair_emtpy_list(struct xdpw_screencast_context *ctx) { - struct xdpw_format_modifier_pair *fm_pair, *tmp; - wl_list_for_each_safe(fm_pair, tmp, &ctx->format_modifier_pairs, link) { - wl_list_remove(&fm_pair->link); - free(fm_pair); - } } static void linux_dmabuf_handle_modifier(void *data, @@ -616,7 +605,8 @@ static void linux_dmabuf_feedback_format_table(void *data, logprint(DEBUG, "wlroots: linux_dmabuf_feedback_format_table called"); - wlr_format_modifier_pair_emtpy_list(ctx); + wl_array_release(&ctx->format_modifier_pairs); + wl_array_init(&ctx->format_modifier_pairs); ctx->feedback_data.format_table_data = mmap(NULL , size, PROT_READ, MAP_PRIVATE, fd, 0); if (ctx->feedback_data.format_table_data == MAP_FAILED) { @@ -802,7 +792,7 @@ int xdpw_wlr_screencopy_init(struct xdpw_state *state) { wl_list_init(&ctx->screencast_instances); // initialize a list of format modifier pairs - wl_list_init(&ctx->format_modifier_pairs); + wl_array_init(&ctx->format_modifier_pairs); // retrieve registry ctx->registry = wl_display_get_registry(state->wl_display); @@ -850,7 +840,7 @@ int xdpw_wlr_screencopy_init(struct xdpw_state *state) { } void xdpw_wlr_screencopy_finish(struct xdpw_screencast_context *ctx) { - wlr_format_modifier_pair_emtpy_list(ctx); + wl_array_release(&ctx->format_modifier_pairs); struct xdpw_wlr_output *output, *tmp_o; wl_list_for_each_safe(output, tmp_o, &ctx->output_list, link) {