render/pixel-format: add support for block-based formats

Some formats like sub-sampled YCbCr use a block of bytes to
store the color values for more than one pixel. Update our format
table to be able to handle such formats.
This commit is contained in:
Simon Ser 2023-05-08 22:17:26 +02:00
parent 78a1ac540e
commit 96f3f3c92e
9 changed files with 117 additions and 56 deletions

View file

@ -7,6 +7,13 @@
* Information about a pixel format.
*
* A pixel format is identified via its DRM four character code (see <drm_fourcc.h>).
*
* Simple formats have a block size of 1×1 pixels and bytes_per_block contains
* the number of bytes per pixel (including padding).
*
* Tiled formats (e.g. sub-sampled YCbCr) are described with a block size
* greater than 1×1 pixels. A block is a rectangle of pixels which are stored
* next to each other in a byte-aligned memory region.
*/
struct wlr_pixel_format_info {
uint32_t drm_format;
@ -16,8 +23,10 @@ struct wlr_pixel_format_info {
*/
uint32_t opaque_substitute;
/* Bits per pixels */
uint32_t bpp;
/* Bytes per block (including padding) */
uint32_t bytes_per_block;
/* Size of a block in pixels (zero for 1×1) */
uint32_t block_width, block_height;
/* True if the format has an alpha channel */
bool has_alpha;
@ -29,6 +38,14 @@ struct wlr_pixel_format_info {
* NULL is returned if the pixel format is unknown.
*/
const struct wlr_pixel_format_info *drm_get_pixel_format_info(uint32_t fmt);
/**
* Get the number of pixels per block for a pixel format.
*/
uint32_t pixel_format_info_pixels_per_block(const struct wlr_pixel_format_info *info);
/**
* Get the minimum stride for a given pixel format and width.
*/
int32_t pixel_format_info_min_stride(const struct wlr_pixel_format_info *info, int32_t width);
/**
* Check whether a stride is large enough for a given pixel format and width.
*/