diff --git a/include/render/pixel_format.h b/include/render/pixel_format.h new file mode 100644 index 00000000..8814bd82 --- /dev/null +++ b/include/render/pixel_format.h @@ -0,0 +1,23 @@ +#ifndef RENDER_PIXEL_FORMAT_H +#define RENDER_PIXEL_FORMAT_H + +#include + +struct wlr_pixel_format_info { + uint32_t drm_format; + + /* Equivalent of the format if it has an alpha channel, + * DRM_FORMAT_INVALID (0) if NA + */ + uint32_t opaque_substitute; + + /* Bits per pixels */ + uint32_t bpp; + + /* True if the format has an alpha channel */ + bool has_alpha; +}; + +const struct wlr_pixel_format_info *drm_get_pixel_format_info(uint32_t fmt); + +#endif diff --git a/render/meson.build b/render/meson.build index 644c2e21..0b75c5e1 100644 --- a/render/meson.build +++ b/render/meson.build @@ -5,6 +5,7 @@ wlr_files += files( 'drm_format_set.c', 'gbm_allocator.c', 'shm_format.c', + 'pixel_format.c', 'swapchain.c', 'wlr_renderer.c', 'wlr_texture.c', diff --git a/render/pixel_format.c b/render/pixel_format.c new file mode 100644 index 00000000..4c4df3bc --- /dev/null +++ b/render/pixel_format.c @@ -0,0 +1,30 @@ +#include +#include "render/pixel_format.h" + +static const struct wlr_pixel_format_info pixel_format_info[] = { + { + .drm_format = DRM_FORMAT_XRGB8888, + .opaque_substitute = DRM_FORMAT_INVALID, + .bpp = 32, + .has_alpha = false, + }, + { + .drm_format = DRM_FORMAT_ARGB8888, + .opaque_substitute = DRM_FORMAT_XRGB8888, + .bpp = 32, + .has_alpha = true, + } +}; + +static const size_t pixel_format_info_size = + sizeof(pixel_format_info) / sizeof(pixel_format_info[0]); + +const struct wlr_pixel_format_info *drm_get_pixel_format_info(uint32_t fmt) { + for (size_t i = 0; i < pixel_format_info_size; ++i) { + if (pixel_format_info[i].drm_format == fmt) { + return &pixel_format_info[i]; + } + } + + return NULL; +}