aboutsummaryrefslogtreecommitdiff
path: root/render/drm_format_set.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/drm_format_set.c')
-rw-r--r--render/drm_format_set.c34
1 files changed, 19 insertions, 15 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;