aboutsummaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-rw-r--r--render/pixman/pixel_format.c11
-rw-r--r--render/pixman/renderer.c12
2 files changed, 23 insertions, 0 deletions
diff --git a/render/pixman/pixel_format.c b/render/pixman/pixel_format.c
index a57c6c34..166f8580 100644
--- a/render/pixman/pixel_format.c
+++ b/render/pixman/pixel_format.c
@@ -49,6 +49,17 @@ pixman_format_code_t get_pixman_format_from_drm(uint32_t fmt) {
return 0;
}
+uint32_t get_drm_format_from_pixman(pixman_format_code_t fmt) {
+ for (size_t i = 0; i < sizeof(formats) / sizeof(*formats); ++i) {
+ if (formats[i].pixman_format == fmt) {
+ return formats[i].drm_format;
+ }
+ }
+
+ wlr_log(WLR_ERROR, "pixman format 0x%"PRIX32" has no drm equivalent", fmt);
+ return DRM_FORMAT_INVALID;
+}
+
const uint32_t *get_pixman_drm_formats(size_t *len) {
static uint32_t drm_formats[sizeof(formats) / sizeof(formats[0])];
*len = sizeof(formats) / sizeof(formats[0]);
diff --git a/render/pixman/renderer.c b/render/pixman/renderer.c
index 5e5deaa2..16541e50 100644
--- a/render/pixman/renderer.c
+++ b/render/pixman/renderer.c
@@ -369,6 +369,17 @@ static void pixman_destroy(struct wlr_renderer *wlr_renderer) {
free(renderer);
}
+static uint32_t pixman_preferred_read_format(
+ struct wlr_renderer *wlr_renderer) {
+ struct wlr_pixman_renderer *renderer = get_renderer(wlr_renderer);
+ struct wlr_pixman_buffer *buffer = renderer->current_buffer;
+
+ pixman_format_code_t pixman_format = pixman_image_get_format(
+ buffer->image);
+
+ return get_drm_format_from_pixman(pixman_format);
+}
+
static const struct wlr_renderer_impl renderer_impl = {
.begin = pixman_begin,
.clear = pixman_clear,
@@ -380,6 +391,7 @@ static const struct wlr_renderer_impl renderer_impl = {
.texture_from_pixels = pixman_texture_from_pixels,
.bind_buffer = pixman_bind_buffer,
.destroy = pixman_destroy,
+ .preferred_read_format = pixman_preferred_read_format,
};
struct wlr_renderer *wlr_pixman_renderer_create(void) {