aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/render/pixel_format.h23
-rw-r--r--render/meson.build1
-rw-r--r--render/pixel_format.c30
3 files changed, 54 insertions, 0 deletions
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 <wayland-server-protocol.h>
+
+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 <drm_fourcc.h>
+#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;
+}