aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2023-05-10 16:00:22 -0400
committerSimon Ser <contact@emersion.fr>2023-05-11 18:24:43 +0200
commit340700cb7085aff743f929845604ef95feb5820e (patch)
tree609306998e1fca465f33fb956228d730770f2efc
parent099a147439b5b20d466316ae3dc8215f30ff3c1c (diff)
wlr_drm_format: Change wlr_drm_format_dup to copy
-rw-r--r--include/render/drm_format_set.h2
-rw-r--r--include/wlr/render/swapchain.h2
-rw-r--r--render/drm_format_set.c34
-rw-r--r--render/swapchain.c8
-rw-r--r--types/output/render.c7
-rw-r--r--types/output/swapchain.c2
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);
-
- 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;
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;
}