gl-renderer: split gl_renderer_do_read_pixels out of gl_renderer_do_capture
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
7bc5cf9ca6
commit
4a271bdaae
|
@ -818,33 +818,23 @@ gl_renderer_create_fbo(struct weston_output *output,
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
|
gl_renderer_do_read_pixels(struct gl_renderer *gr,
|
||||||
const struct weston_geometry *rect)
|
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;
|
void *read_target;
|
||||||
int32_t stride;
|
|
||||||
pixman_image_t *tmp = NULL;
|
pixman_image_t *tmp = NULL;
|
||||||
|
|
||||||
assert(fmt->gl_type != 0);
|
assert(fmt->gl_type != 0);
|
||||||
assert(fmt->gl_format != 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);
|
glPixelStorei(GL_PACK_ALIGNMENT, 4);
|
||||||
|
|
||||||
shm_pixels = wl_shm_buffer_get_data(shm);
|
|
||||||
|
|
||||||
if (gr->has_pack_reverse) {
|
if (gr->has_pack_reverse) {
|
||||||
/* Make glReadPixels() return top row first. */
|
/* Make glReadPixels() return top row first. */
|
||||||
glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
|
glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
|
||||||
read_target = shm_pixels;
|
read_target = pixels;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* glReadPixels() returns bottom row first. We need to
|
* 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);
|
read_target = pixman_image_get_data(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_shm_buffer_begin_access(shm);
|
|
||||||
|
|
||||||
glReadPixels(rect->x, rect->y, rect->width, rect->height,
|
glReadPixels(rect->x, rect->y, rect->width, rect->height,
|
||||||
fmt->gl_format, fmt->gl_type, read_target);
|
fmt->gl_format, fmt->gl_type, read_target);
|
||||||
|
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
pixman_image_t *shm_image;
|
pixman_image_t *image;
|
||||||
pixman_transform_t flip;
|
pixman_transform_t flip;
|
||||||
|
|
||||||
shm_image = pixman_image_create_bits_no_clear(fmt->pixman_format,
|
image = pixman_image_create_bits_no_clear(fmt->pixman_format,
|
||||||
rect->width,
|
rect->width,
|
||||||
rect->height,
|
rect->height,
|
||||||
shm_pixels,
|
pixels, stride);
|
||||||
stride);
|
abort_oom_if_null(image);
|
||||||
abort_oom_if_null(shm_image);
|
|
||||||
|
|
||||||
pixman_transform_init_scale(&flip, pixman_fixed_1,
|
pixman_transform_init_scale(&flip, pixman_fixed_1,
|
||||||
pixman_fixed_minus_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,
|
pixman_image_composite32(PIXMAN_OP_SRC,
|
||||||
tmp, /* src */
|
tmp, /* src */
|
||||||
NULL, /* mask */
|
NULL, /* mask */
|
||||||
shm_image, /* dest */
|
image, /* dest */
|
||||||
0, 0, /* src x,y */
|
0, 0, /* src x,y */
|
||||||
0, 0, /* mask x,y */
|
0, 0, /* mask x,y */
|
||||||
0, 0, /* dest x,y */
|
0, 0, /* dest x,y */
|
||||||
rect->width, rect->height);
|
rect->width, rect->height);
|
||||||
|
|
||||||
pixman_image_unref(shm_image);
|
pixman_image_unref(image);
|
||||||
pixman_image_unref(tmp);
|
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);
|
wl_shm_buffer_end_access(shm);
|
||||||
|
|
||||||
return true;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue