From 340700cb7085aff743f929845604ef95feb5820e Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Wed, 10 May 2023 16:00:22 -0400 Subject: [PATCH] wlr_drm_format: Change wlr_drm_format_dup to copy --- include/render/drm_format_set.h | 2 +- include/wlr/render/swapchain.h | 2 +- render/drm_format_set.c | 34 ++++++++++++++++++--------------- render/swapchain.c | 8 +++----- types/output/render.c | 7 ++++++- types/output/swapchain.c | 2 +- 6 files changed, 31 insertions(+), 24 deletions(-) diff --git a/include/render/drm_format_set.h b/include/render/drm_format_set.h index 8734ea7a..1ffc2a90 100644 --- a/include/render/drm_format_set.h +++ b/include/render/drm_format_set.h @@ -6,7 +6,7 @@ void wlr_drm_format_init(struct wlr_drm_format *fmt, uint32_t format); bool wlr_drm_format_has(const struct wlr_drm_format *fmt, uint64_t modifier); bool wlr_drm_format_add(struct wlr_drm_format *fmt, uint64_t modifier); -struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format); +bool wlr_drm_format_copy(struct wlr_drm_format *dst, const struct wlr_drm_format *src); /** * Intersect modifiers for two DRM formats. * diff --git a/include/wlr/render/swapchain.h b/include/wlr/render/swapchain.h index 38b1fb8b..8bb8afc9 100644 --- a/include/wlr/render/swapchain.h +++ b/include/wlr/render/swapchain.h @@ -19,7 +19,7 @@ struct wlr_swapchain { struct wlr_allocator *allocator; // NULL if destroyed int width, height; - struct wlr_drm_format *format; + struct wlr_drm_format format; struct wlr_swapchain_slot slots[WLR_SWAPCHAIN_CAP]; diff --git a/render/drm_format_set.c b/render/drm_format_set.c index 52603db7..ee9b1b2c 100644 --- a/render/drm_format_set.c +++ b/render/drm_format_set.c @@ -130,26 +130,22 @@ bool wlr_drm_format_add(struct wlr_drm_format *fmt, uint64_t modifier) { return true; } -struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) { - assert(format->len <= format->capacity); +bool wlr_drm_format_copy(struct wlr_drm_format *dst, const struct wlr_drm_format *src) { + assert(src->len <= src->capacity); - uint64_t *modifiers = malloc(sizeof(*format->modifiers) * format->capacity); + uint64_t *modifiers = malloc(sizeof(*modifiers) * src->len); if (!modifiers) { - return NULL; + return false; } - memcpy(modifiers, format->modifiers, sizeof(*format->modifiers) * format->len); + memcpy(modifiers, src->modifiers, sizeof(*modifiers) * src->len); - struct wlr_drm_format *dst = calloc(1, sizeof(*dst)); - if (!dst) { - return NULL; - } - - dst->capacity = format->capacity; - dst->len = format->len; + wlr_drm_format_finish(dst); + dst->capacity = src->len; + dst->len = src->len; + dst->format = src->format; dst->modifiers = modifiers; - - return dst; + return true; } bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_drm_format_set *src) { @@ -166,7 +162,15 @@ bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_dr size_t i; for (i = 0; i < src->len; i++) { - out.formats[out.len] = wlr_drm_format_dup(src->formats[i]); + struct wlr_drm_format *fmt = calloc(1, sizeof(*fmt)); + if (!fmt) { + wlr_drm_format_set_finish(&out); + return false; + } + + wlr_drm_format_copy(fmt, src->formats[i]); + + out.formats[out.len] = fmt; if (out.formats[out.len] == NULL) { wlr_drm_format_set_finish(&out); return false; diff --git a/render/swapchain.c b/render/swapchain.c index a15ac7f9..f72e722c 100644 --- a/render/swapchain.c +++ b/render/swapchain.c @@ -26,8 +26,7 @@ struct wlr_swapchain *wlr_swapchain_create( swapchain->width = width; swapchain->height = height; - swapchain->format = wlr_drm_format_dup(format); - if (swapchain->format == NULL) { + if (!wlr_drm_format_copy(&swapchain->format, format)) { free(swapchain); return NULL; } @@ -54,8 +53,7 @@ void wlr_swapchain_destroy(struct wlr_swapchain *swapchain) { slot_reset(&swapchain->slots[i]); } wl_list_remove(&swapchain->allocator_destroy.link); - wlr_drm_format_finish(swapchain->format); - free(swapchain->format); + wlr_drm_format_finish(&swapchain->format); free(swapchain); } @@ -107,7 +105,7 @@ struct wlr_buffer *wlr_swapchain_acquire(struct wlr_swapchain *swapchain, wlr_log(WLR_DEBUG, "Allocating new swapchain buffer"); free_slot->buffer = wlr_allocator_create_buffer(swapchain->allocator, - swapchain->width, swapchain->height, swapchain->format); + swapchain->width, swapchain->height, &swapchain->format); if (free_slot->buffer == NULL) { wlr_log(WLR_ERROR, "Failed to allocate buffer"); return NULL; diff --git a/types/output/render.c b/types/output/render.c index c33103da..e4ab0400 100644 --- a/types/output/render.c +++ b/types/output/render.c @@ -210,8 +210,13 @@ struct wlr_drm_format *output_pick_format(struct wlr_output *output, } format = wlr_drm_format_intersect(display_format, render_format); } else { + format = calloc(1, sizeof(*format)); + if (!format) { + return false; + } + // The output can display any format - format = wlr_drm_format_dup(render_format); + wlr_drm_format_copy(format, render_format); } if (format == NULL) { diff --git a/types/output/swapchain.c b/types/output/swapchain.c index 8db454e2..9403ec2b 100644 --- a/types/output/swapchain.c +++ b/types/output/swapchain.c @@ -76,7 +76,7 @@ bool wlr_output_configure_primary_swapchain(struct wlr_output *output, struct wlr_swapchain *old_swapchain = *swapchain_ptr; if (old_swapchain != NULL && old_swapchain->width == width && old_swapchain->height == height && - old_swapchain->format->format == output->render_format) { + old_swapchain->format.format == output->render_format) { return true; }