render/drm_format_set: add wlr_drm_format_{create,add}
This commit is contained in:
		
							parent
							
								
									253f447329
								
							
						
					
					
						commit
						d37214cb16
					
				|  | @ -3,6 +3,8 @@ | ||||||
| 
 | 
 | ||||||
| #include <wlr/render/drm_format_set.h> | #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); | struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format); | ||||||
| /**
 | /**
 | ||||||
|  * Intersect modifiers for two DRM formats. |  * Intersect modifiers for two DRM formats. | ||||||
|  |  | ||||||
|  | @ -60,10 +60,54 @@ 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, | bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format, | ||||||
| 		uint64_t modifier) { | 		uint64_t modifier) { | ||||||
| 	assert(format != DRM_FORMAT_INVALID); | 	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) { | 	if (ptr) { | ||||||
| 		struct wlr_drm_format *fmt = *ptr; | 		return wlr_drm_format_add(ptr, modifier); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	struct wlr_drm_format *fmt = wlr_drm_format_create(format); | ||||||
|  | 	if (!fmt) { | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 	if (!wlr_drm_format_add(&fmt, modifier)) { | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (set->len == set->cap) { | ||||||
|  | 		size_t new = set->cap ? set->cap * 2 : 4; | ||||||
|  | 
 | ||||||
|  | 		struct wlr_drm_format **tmp = realloc(set->formats, | ||||||
|  | 			sizeof(*fmt) + sizeof(fmt->modifiers[0]) * new); | ||||||
|  | 		if (!tmp) { | ||||||
|  | 			wlr_log_errno(WLR_ERROR, "Allocation failed"); | ||||||
|  | 			free(fmt); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		set->cap = new; | ||||||
|  | 		set->formats = tmp; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	set->formats[set->len++] = fmt; | ||||||
|  | 	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) { | 	if (modifier == DRM_FORMAT_MOD_INVALID) { | ||||||
| 		return true; | 		return true; | ||||||
|  | @ -85,48 +129,13 @@ bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format, | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		fmt->cap = cap; | 		fmt->cap = cap; | ||||||
| 			*ptr = fmt; | 		*fmt_ptr = fmt; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	fmt->modifiers[fmt->len++] = modifier; | 	fmt->modifiers[fmt->len++] = modifier; | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 	size_t cap = modifier != DRM_FORMAT_MOD_INVALID ? 4 : 0; |  | ||||||
| 
 |  | ||||||
| 	struct wlr_drm_format *fmt = |  | ||||||
| 		calloc(1, sizeof(*fmt) + sizeof(fmt->modifiers[0]) * cap); |  | ||||||
| 	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 (set->len == set->cap) { |  | ||||||
| 		size_t new = set->cap ? set->cap * 2 : 4; |  | ||||||
| 
 |  | ||||||
| 		struct wlr_drm_format **tmp = realloc(set->formats, |  | ||||||
| 			sizeof(*fmt) + sizeof(fmt->modifiers[0]) * new); |  | ||||||
| 		if (!tmp) { |  | ||||||
| 			wlr_log_errno(WLR_ERROR, "Allocation failed"); |  | ||||||
| 			free(fmt); |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		set->cap = new; |  | ||||||
| 		set->formats = tmp; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	set->formats[set->len++] = fmt; |  | ||||||
| 	return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) { | struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) { | ||||||
| 	assert(format->len <= format->cap); | 	assert(format->len <= format->cap); | ||||||
| 	size_t format_size = sizeof(struct wlr_drm_format) + | 	size_t format_size = sizeof(struct wlr_drm_format) + | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue