From 4a271bdaaef9609f1ec7b8d7aef82448d404016b Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Thu, 8 Jun 2023 14:51:32 +0200
Subject: [PATCH] gl-renderer: split gl_renderer_do_read_pixels out of
gl_renderer_do_capture
Signed-off-by: Philipp Zabel
---
libweston/renderer-gl/gl-renderer.c | 67 +++++++++++++++++------------
1 file changed, 40 insertions(+), 27 deletions(-)
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index 56ab52cba..210617dbe 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -818,33 +818,23 @@ gl_renderer_create_fbo(struct weston_output *output,
}
static bool
-gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
- const struct weston_geometry *rect)
+gl_renderer_do_read_pixels(struct gl_renderer *gr,
+ const struct pixel_format_info *fmt,
+ void *pixels, int stride,
+ const struct weston_geometry *rect)
{
- struct wl_shm_buffer *shm = into->shm_buffer;
- const struct pixel_format_info *fmt = into->pixel_format;
- void *shm_pixels;
void *read_target;
- int32_t stride;
pixman_image_t *tmp = NULL;
assert(fmt->gl_type != 0);
assert(fmt->gl_format != 0);
- assert(into->type == WESTON_BUFFER_SHM);
- assert(shm);
-
- stride = wl_shm_buffer_get_stride(shm);
- if (stride % 4 != 0)
- return false;
glPixelStorei(GL_PACK_ALIGNMENT, 4);
- shm_pixels = wl_shm_buffer_get_data(shm);
-
if (gr->has_pack_reverse) {
/* Make glReadPixels() return top row first. */
glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
- read_target = shm_pixels;
+ read_target = pixels;
} else {
/*
* glReadPixels() returns bottom row first. We need to
@@ -859,21 +849,18 @@ gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
read_target = pixman_image_get_data(tmp);
}
- wl_shm_buffer_begin_access(shm);
-
glReadPixels(rect->x, rect->y, rect->width, rect->height,
fmt->gl_format, fmt->gl_type, read_target);
if (tmp) {
- pixman_image_t *shm_image;
+ pixman_image_t *image;
pixman_transform_t flip;
- shm_image = pixman_image_create_bits_no_clear(fmt->pixman_format,
- rect->width,
- rect->height,
- shm_pixels,
- stride);
- abort_oom_if_null(shm_image);
+ image = pixman_image_create_bits_no_clear(fmt->pixman_format,
+ rect->width,
+ rect->height,
+ pixels, stride);
+ abort_oom_if_null(image);
pixman_transform_init_scale(&flip, pixman_fixed_1,
pixman_fixed_minus_1);
@@ -884,19 +871,45 @@ gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
pixman_image_composite32(PIXMAN_OP_SRC,
tmp, /* src */
NULL, /* mask */
- shm_image, /* dest */
+ image, /* dest */
0, 0, /* src x,y */
0, 0, /* mask x,y */
0, 0, /* dest x,y */
rect->width, rect->height);
- pixman_image_unref(shm_image);
+ pixman_image_unref(image);
pixman_image_unref(tmp);
}
+ return true;
+}
+
+static bool
+gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
+ const struct weston_geometry *rect)
+{
+ struct wl_shm_buffer *shm = into->shm_buffer;
+ const struct pixel_format_info *fmt = into->pixel_format;
+ void *shm_pixels;
+ int32_t stride;
+ bool ret;
+
+ assert(into->type == WESTON_BUFFER_SHM);
+ assert(shm);
+
+ shm_pixels = wl_shm_buffer_get_data(shm);
+
+ stride = wl_shm_buffer_get_stride(shm);
+ if (stride % 4 != 0)
+ return false;
+
+ wl_shm_buffer_begin_access(shm);
+
+ ret = gl_renderer_do_read_pixels(gr, fmt, shm_pixels, stride, rect);
+
wl_shm_buffer_end_access(shm);
- return true;
+ return ret;
}
static void