Documentation for <wlr/render/drm_format_set.h>

Back to index

Table of contents

struct wlr_drm_format

struct wlr_drm_format {
	// The actual DRM format, from `drm_fourcc.h`
	uint32_t format;
	// The number of modifiers
	size_t len;
	// The capacity of the array; do not use.
	size_t capacity;
	// The actual modifiers
	uint64_t modifiers[];
};

A single DRM format, with a set of modifiers attached.

struct wlr_drm_format_set

struct wlr_drm_format_set {
	// The number of formats
	size_t len;
	// The capacity of the array; private to wlroots
	size_t capacity;
	// A pointer to an array of `struct wlr_drm_format *` of length `len`.
	struct wlr_drm_format **formats;
};

A set of DRM formats and modifiers.

This is used to describe the supported format + modifier combinations. For instance, backends will report the set they can display, and renderers will report the set they can render to. For a more general overview of formats and modifiers, see: https://lore.kernel.org/dri-devel/20210905122742.86029-1-daniels@collabora.com/

For compatibility with legacy drivers which don't support explicit modifiers, the special modifier DRM_FORMAT_MOD_INVALID is used to indicate that implicit modifiers are supported. Legacy drivers can also support the DRM_FORMAT_MOD_LINEAR modifier, which forces the buffer to have a linear layout.

Users must not assume that implicit modifiers are supported unless INVALID is listed in the modifier list.

wlr_drm_format_set_add()

bool wlr_drm_format_set_add(​struct wlr_drm_format_set *set, uint32_t format, uint64_t modifier);

wlr_drm_format_set_finish()

void wlr_drm_format_set_finish(​struct wlr_drm_format_set *set);

Free all of the DRM formats in the set, making the set empty. Does not free the set itself.

wlr_drm_format_set_get()

const struct wlr_drm_format *wlr_drm_format_set_get(​const struct wlr_drm_format_set *set, uint32_t format);

Return a pointer to a member of this struct wlr_drm_format_set of format `format`, or NULL if none exists.

wlr_drm_format_set_has()

bool wlr_drm_format_set_has(​const struct wlr_drm_format_set *set, uint32_t format, uint64_t modifier);

wlr_drm_format_set_intersect()

bool wlr_drm_format_set_intersect(​struct wlr_drm_format_set *dst, const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b);

Intersect two DRM format sets `a` and `b`, storing in the destination set `dst` the format + modifier pairs which are in both source sets.

Returns false on failure or when the intersection is empty.