2023-05-03 18:52:11 +02:00
|
|
|
/*
|
|
|
|
* This an unstable interface of wlroots. No guarantees are made regarding the
|
|
|
|
* future consistency of this API.
|
|
|
|
*/
|
|
|
|
#ifndef WLR_USE_UNSTABLE
|
|
|
|
#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
|
|
|
|
#endif
|
|
|
|
|
2019-04-01 18:15:56 +02:00
|
|
|
#ifndef WLR_RENDER_DRM_FORMAT_SET_H
|
|
|
|
#define WLR_RENDER_DRM_FORMAT_SET_H
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
2021-11-24 21:42:08 +01:00
|
|
|
/** A single DRM format, with a set of modifiers attached. */
|
2019-04-01 18:15:56 +02:00
|
|
|
struct wlr_drm_format {
|
2021-11-15 15:44:12 +01:00
|
|
|
// The actual DRM format, from `drm_fourcc.h`
|
2019-04-01 18:15:56 +02:00
|
|
|
uint32_t format;
|
2021-11-15 15:44:12 +01:00
|
|
|
// The number of modifiers
|
|
|
|
size_t len;
|
|
|
|
// The capacity of the array; do not use.
|
|
|
|
size_t capacity;
|
|
|
|
// The actual modifiers
|
2019-04-01 18:15:56 +02:00
|
|
|
uint64_t modifiers[];
|
|
|
|
};
|
|
|
|
|
2021-11-24 21:42:08 +01:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2019-04-01 18:15:56 +02:00
|
|
|
struct wlr_drm_format_set {
|
2021-11-15 15:44:12 +01:00
|
|
|
// 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`.
|
2019-04-01 18:15:56 +02:00
|
|
|
struct wlr_drm_format **formats;
|
|
|
|
};
|
|
|
|
|
2021-11-15 15:44:12 +01:00
|
|
|
/**
|
|
|
|
* Free all of the DRM formats in the set, making the set empty. Does not
|
|
|
|
* free the set itself.
|
|
|
|
*/
|
2019-04-01 18:15:56 +02:00
|
|
|
void wlr_drm_format_set_finish(struct wlr_drm_format_set *set);
|
|
|
|
|
2021-11-15 15:44:12 +01:00
|
|
|
/**
|
2022-05-24 18:46:59 +02:00
|
|
|
* Return a pointer to a member of this struct wlr_drm_format_set of format
|
2021-11-15 15:44:12 +01:00
|
|
|
* `format`, or NULL if none exists.
|
|
|
|
*/
|
2019-04-01 18:15:56 +02:00
|
|
|
const struct wlr_drm_format *wlr_drm_format_set_get(
|
|
|
|
const struct wlr_drm_format_set *set, uint32_t format);
|
|
|
|
|
2019-04-09 22:36:35 +02:00
|
|
|
bool wlr_drm_format_set_has(const struct wlr_drm_format_set *set,
|
|
|
|
uint32_t format, uint64_t modifier);
|
|
|
|
|
2019-04-01 18:15:56 +02:00
|
|
|
bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format,
|
|
|
|
uint64_t modifier);
|
|
|
|
|
2021-12-01 13:35:50 +01:00
|
|
|
/**
|
|
|
|
* Intersect two DRM format sets `a` and `b`, storing in the destination set
|
2023-05-04 20:16:55 +02:00
|
|
|
* `dst` the format + modifier pairs which are in both source sets. The `dst`
|
|
|
|
* must either be zeroed or initialized with other state to be replaced.
|
2021-12-01 13:35:50 +01:00
|
|
|
*
|
|
|
|
* Returns false on failure or when the intersection is empty.
|
|
|
|
*/
|
|
|
|
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);
|
|
|
|
|
2022-07-22 23:16:41 +02:00
|
|
|
/**
|
|
|
|
* Unions DRM format set `a` and `b`, storing in the destination set
|
2023-05-04 20:16:34 +02:00
|
|
|
* `dst`. The `dst` must either be zeroed or initialized with other state
|
|
|
|
* to be replaced.
|
2022-07-22 23:16:41 +02:00
|
|
|
*
|
|
|
|
* Returns false on failure.
|
|
|
|
*/
|
|
|
|
bool wlr_drm_format_set_union(struct wlr_drm_format_set *dst,
|
|
|
|
const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b);
|
2019-04-01 18:15:56 +02:00
|
|
|
#endif
|