diff options
| -rw-r--r-- | include/render/drm_format_set.h | 2 | ||||
| -rw-r--r-- | render/drm_format_set.c | 87 | 
2 files changed, 50 insertions, 39 deletions
| diff --git a/include/render/drm_format_set.h b/include/render/drm_format_set.h index 78b70e9b..c438722b 100644 --- a/include/render/drm_format_set.h +++ b/include/render/drm_format_set.h @@ -3,6 +3,8 @@  #include <wlr/render/drm_format_set.h> +struct wlr_drm_format *wlr_drm_format_create(uint32_t format); +bool wlr_drm_format_add(struct wlr_drm_format **fmt_ptr, uint64_t modifier);  struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format);  /**   * Intersect modifiers for two DRM formats. diff --git a/render/drm_format_set.c b/render/drm_format_set.c index a4c31494..634d9070 100644 --- a/render/drm_format_set.c +++ b/render/drm_format_set.c @@ -60,52 +60,18 @@ bool wlr_drm_format_set_has(const struct wlr_drm_format_set *set,  bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format,  		uint64_t modifier) {  	assert(format != DRM_FORMAT_INVALID); -	struct wlr_drm_format **ptr = format_set_get_ref(set, format); +	struct wlr_drm_format **ptr = format_set_get_ref(set, format);  	if (ptr) { -		struct wlr_drm_format *fmt = *ptr; - -		if (modifier == DRM_FORMAT_MOD_INVALID) { -			return true; -		} - -		for (size_t i = 0; i < fmt->len; ++i) { -			if (fmt->modifiers[i] == modifier) { -				return true; -			} -		} - -		if (fmt->len == fmt->cap) { -			size_t cap = fmt->cap ? fmt->cap * 2 : 4; - -			fmt = realloc(fmt, sizeof(*fmt) + sizeof(fmt->modifiers[0]) * cap); -			if (!fmt) { -				wlr_log_errno(WLR_ERROR, "Allocation failed"); -				return false; -			} - -			fmt->cap = cap; -			*ptr = fmt; -		} - -		fmt->modifiers[fmt->len++] = modifier; -		return true; +		return wlr_drm_format_add(ptr, modifier);  	} -	size_t cap = modifier != DRM_FORMAT_MOD_INVALID ? 4 : 0; - -	struct wlr_drm_format *fmt = -		calloc(1, sizeof(*fmt) + sizeof(fmt->modifiers[0]) * cap); +	struct wlr_drm_format *fmt = wlr_drm_format_create(format);  	if (!fmt) { -		wlr_log_errno(WLR_ERROR, "Allocation failed");  		return false;  	} - -	fmt->format = format; -	if (cap) { -		fmt->cap = cap; -		fmt->len = 1; -		fmt->modifiers[0] = modifier; +	if (!wlr_drm_format_add(&fmt, modifier)) { +		return false;  	}  	if (set->len == set->cap) { @@ -127,6 +93,49 @@ bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format,  	return true;  } +struct wlr_drm_format *wlr_drm_format_create(uint32_t format) { +	size_t cap = 4; +	struct wlr_drm_format *fmt = +		calloc(1, sizeof(*fmt) + sizeof(fmt->modifiers[0]) * cap); +	if (!fmt) { +		wlr_log_errno(WLR_ERROR, "Allocation failed"); +		return NULL; +	} +	fmt->format = format; +	fmt->cap = cap; +	return fmt; +} + +bool wlr_drm_format_add(struct wlr_drm_format **fmt_ptr, uint64_t modifier) { +	struct wlr_drm_format *fmt = *fmt_ptr; + +	if (modifier == DRM_FORMAT_MOD_INVALID) { +		return true; +	} + +	for (size_t i = 0; i < fmt->len; ++i) { +		if (fmt->modifiers[i] == modifier) { +			return true; +		} +	} + +	if (fmt->len == fmt->cap) { +		size_t cap = fmt->cap ? fmt->cap * 2 : 4; + +		fmt = realloc(fmt, sizeof(*fmt) + sizeof(fmt->modifiers[0]) * cap); +		if (!fmt) { +			wlr_log_errno(WLR_ERROR, "Allocation failed"); +			return false; +		} + +		fmt->cap = cap; +		*fmt_ptr = fmt; +	} + +	fmt->modifiers[fmt->len++] = modifier; +	return true; +} +  struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) {  	assert(format->len <= format->cap);  	size_t format_size = sizeof(struct wlr_drm_format) + | 
