diff options
Diffstat (limited to 'render')
-rw-r--r-- | render/drm_format_set.c | 34 | ||||
-rw-r--r-- | render/swapchain.c | 8 |
2 files changed, 22 insertions, 20 deletions
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); - - struct wlr_drm_format *dst = calloc(1, sizeof(*dst)); - if (!dst) { - return NULL; - } + memcpy(modifiers, src->modifiers, sizeof(*modifiers) * src->len); - 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; |