screenshooter: Use the renderer function for reading out pixels
This also changes the compositor's read_format to a pixman format.
This commit is contained in:
parent
a95b2d6d41
commit
f9e710b57c
@ -353,7 +353,7 @@ struct weston_compositor {
|
|||||||
PFNEGLDESTROYIMAGEKHRPROC destroy_image;
|
PFNEGLDESTROYIMAGEKHRPROC destroy_image;
|
||||||
|
|
||||||
int has_unpack_subimage;
|
int has_unpack_subimage;
|
||||||
GLenum read_format;
|
pixman_format_code_t read_format;
|
||||||
|
|
||||||
PFNEGLBINDWAYLANDDISPLAYWL bind_display;
|
PFNEGLBINDWAYLANDDISPLAYWL bind_display;
|
||||||
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
|
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
|
||||||
|
@ -1751,9 +1751,9 @@ gles2_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strstr(extensions, "GL_EXT_read_format_bgra"))
|
if (strstr(extensions, "GL_EXT_read_format_bgra"))
|
||||||
ec->read_format = GL_BGRA_EXT;
|
ec->read_format = PIXMAN_a8r8g8b8;
|
||||||
else
|
else
|
||||||
ec->read_format = GL_RGBA;
|
ec->read_format = PIXMAN_a8b8g8r8;
|
||||||
|
|
||||||
if (strstr(extensions, "GL_EXT_unpack_subimage"))
|
if (strstr(extensions, "GL_EXT_unpack_subimage"))
|
||||||
ec->has_unpack_subimage = 1;
|
ec->has_unpack_subimage = 1;
|
||||||
|
@ -112,10 +112,10 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
output->compositor->renderer->read_pixels(output,
|
||||||
glReadPixels(0, 0, output->current->width, output->current->height,
|
output->compositor->read_format, pixels,
|
||||||
output->compositor->read_format,
|
0, 0, output->current->width,
|
||||||
GL_UNSIGNED_BYTE, pixels);
|
output->current->height);
|
||||||
|
|
||||||
stride = wl_shm_buffer_get_stride(l->buffer);
|
stride = wl_shm_buffer_get_stride(l->buffer);
|
||||||
|
|
||||||
@ -123,10 +123,10 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data)
|
|||||||
s = pixels + stride * (l->buffer->height - 1);
|
s = pixels + stride * (l->buffer->height - 1);
|
||||||
|
|
||||||
switch (output->compositor->read_format) {
|
switch (output->compositor->read_format) {
|
||||||
case GL_BGRA_EXT:
|
case PIXMAN_a8r8g8b8:
|
||||||
copy_bgra_yflip(d, s, output->current->height, stride);
|
copy_bgra_yflip(d, s, output->current->height, stride);
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case PIXMAN_a8b8g8r8:
|
||||||
copy_rgba_yflip(d, s, output->current->height, stride);
|
copy_rgba_yflip(d, s, output->current->height, stride);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -299,10 +299,10 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data)
|
|||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
width = r[i].x2 - r[i].x1;
|
width = r[i].x2 - r[i].x1;
|
||||||
height = r[i].y2 - r[i].y1;
|
height = r[i].y2 - r[i].y1;
|
||||||
glReadPixels(r[i].x1, output->current->height - r[i].y2,
|
output->compositor->renderer->read_pixels(output,
|
||||||
width, height,
|
output->compositor->read_format, recorder->rect,
|
||||||
output->compositor->read_format,
|
r[i].x1, output->current->height - r[i].y2,
|
||||||
GL_UNSIGNED_BYTE, recorder->rect);
|
width, height);
|
||||||
|
|
||||||
s = recorder->rect;
|
s = recorder->rect;
|
||||||
p = recorder->rect;
|
p = recorder->rect;
|
||||||
@ -367,12 +367,15 @@ weston_recorder_create(struct weston_output *output, const char *filename)
|
|||||||
header.magic = WCAP_HEADER_MAGIC;
|
header.magic = WCAP_HEADER_MAGIC;
|
||||||
|
|
||||||
switch (output->compositor->read_format) {
|
switch (output->compositor->read_format) {
|
||||||
case GL_BGRA_EXT:
|
case PIXMAN_a8r8g8b8:
|
||||||
header.format = WCAP_FORMAT_XRGB8888;
|
header.format = WCAP_FORMAT_XRGB8888;
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case PIXMAN_a8b8g8r8:
|
||||||
header.format = WCAP_FORMAT_XBGR8888;
|
header.format = WCAP_FORMAT_XBGR8888;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
weston_log("unknown recorder format\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
header.width = output->current->width;
|
header.width = output->current->width;
|
||||||
|
Loading…
Reference in New Issue
Block a user